Hi Yuri,
It is indeed the case that in so-called “regular logic”, there isn’t support for disjunction; if you allow disjunction, then the chase may not give a single answer. How would you chase a database with a rule like Person(X) -> Old(X) or Young(X) and get a unique answer? You really can’t.
Anyway, the usual “trick” is to rely on the custom that CQL and other chase engines will halt with an error if they detect contradictions / non-conservativity. So although Person(X) -> Old(X) or Young(X) just doesn’t work, we could write a rule that says Old(X) and Young(X) -> 1=2, and then CQL would halt with a contradiction if it ever encountered a Person X such that Old(X) and Young(X).
As for disjoint sub-classes, the usual trick is to rely on the custom that CQL and other multi-sorted logics have disjoint sorts, and use a type coercion “function” in the schema:
youngToPerson : Young -> Person
oldToPerson : Old -> Person
Or equivalent encoding with regular logic.