|
A sister of a parent is an aunt of the child.
A brother of a parent is an uncle.
A wife of an uncle is an uncle
and a husband of an aunt is an uncle:
parents(william, diana, charles).
parents(henry, diana, charles).
parents(charles, elizabeth, philip).
parents(diana, frances, edward).
parents(anne, elizabeth, philip).
parents(andrew, elizabeth, philip).
parents(edwardW, elizabeth, philip).
married(diana, charles).
married(elizabeth, philip).
married(frances, edward).
married(anne, mark).
parent(C,M) <= parents(C,M,D).
parent(C,D) <= parents(C,M,D).
sibling(X,Y) <= parents(X,M,D)
and parents(Y,M,D). {NB. sibling(X, X)}
aORuDirect(C, A) <= parent(C,P) and sibling(P,A).
aORuMarr(C, A) <= aORuDirect(C,X) and married(X,A).
aORuMarr(C, A) <= aORuDirect(C,X) and married(A,X).
aORu(C,A) <= aORuDirect(C,A).
aORu(C,A) <= aORuMarr(C,A).
? aORu(william, A).
{\fB The Aunt/Uncle Relation. \fP}
|
Unfortunately
these rules, while finding correct aunts and uncles,
return parents as aunts or uncles,
and also give repeated solutions.
The
cure is to insist that siblings
while sharing the same parents
must be different individuals:
parents(william, diana, charles).
parents(henry, diana, charles).
parents(charles, elizabeth, philip).
parents(diana, frances, edward).
parents(anne, elizabeth, philip).
parents(andrew, elizabeth, philip).
parents(edwardW, elizabeth, philip).
married(diana, charles).
married(elizabeth, philip).
married(frances, edward).
married(anne, mark).
parent(C,M) <= parents(C,M,D).
parent(C,D) <= parents(C,M,D).
equal(X, X).
sibling(X,Y) <= parents(X,M,D)
and parents(Y,M,D) and not equal(X,Y).
aORuDirect(C, A) <= parent(C,P) and sibling(P,A).
aORuMarr(C, A) <= aORuDirect(C,X) and married(X,A).
aORuMarr(C, A) <= aORuDirect(C,X) and married(A,X).
aORu(C,A) <= aORuDirect(C,A).
aORu(C,A) <= aORuMarr(C,A).
? aORu(william, A).
{\fB The Aunt/Uncle Relation. \fP}
|
|
|
|