not(P) :- P, !, fail ; true. different(X,Y) :- not(X = Y). parent(norman, richard). parent(norman, judith). parent(norman, susan). parent(norman, karen). parent(margaret, richard). parent(margaret, judith). parent(margaret, susan). parent(margaret, karen). parent(richard, casey). parent(richard, jena). parent(nancy, casey). parent(nancy, jena). parent(karen, fiona). parent(bruce, fiona). parent(judith, alex). parent(judith, chris). parent(bob, chris). parent(bob, alex). parent(susan, conner). parent(susan, cameron). parent(barry, conner). parent(barry, cameron). parent(kathleen, norman). parent(herbert, norman). parent(john, margaret). parent(madge, margaret). male(richard). male(norman). male(casey). male(chris). male(alex). male(cameron). male(conner). male(barry). male(bruce). male(bob). male(john). male(herbert). female(margaret). female(susan). female(karen). female(judith). female(jena). female(nancy). female(fiona). female(kathleen). female(madge). grandparent(X,Y) :- parent(X,Z), parent(Z,Y). grandfather(X,Y) :- male(X), grandparent(X,Y). grandmother(X,Y) :- female(X), grandparent(X,Y). father(X,Y) :- male(X), parent(X,Y). mother(X,Y) :- female(X), parent(X,Y). child(X,Y) :- parent(Y,X). son(X,Y) :- male(X), child(X,Y). daughter(X,Y) :- female(X), child(X,Y). sibling(X,Y) :- child(X, Z), child(Y, Z), different(X, Y). cousin(X, Y) :- child(X, A), sibling(A, B), child(Y, B). brother(X, Y) :- male(X), sibling(X, Y). sister(X, Y) :- female(X), sibling(X, Y). uncle(X, Y) :- brother(X, Z), parent(Z, Y). aunt(X, Y) :- sister(X, Z), parent(Z, Y). ancestor(X,Y) :- parent(X,Y). ancestor(X,Y) :- parent(X,Z), ancestor(Z, Y). descendent(X,Y) :- ancestor(Y,X)