Please send questions to st10@humboldt.edu .

/* this example is adapted from Clocksin and Mellish,
 "Programming in Prolog", Springer-Verlag, 1981. */

female(amelia).
female(victoria_s_c).
female(victoria).
female(alice).

male(george_iv).
male(edward_duke).
male(albert).
male(edward).

/* Child has parents Mother and Father */

has_parents(edward_duke, amelia, george_iv).
has_parents(victoria, victoria_s_c, edward_duke).
has_parents(edward, victoria, albert).
has_parents(alice, victoria, albert).

/* Has_sis has sister Is_sis */

has_sister(Has_sis, Is_sis) :- female(Is_sis),
                    has_parents(Has_sis, M, F),
                    has_parents(Is_sis, M, F),
                    \+(Has_sis==Is_sis).

is_parent(P) :- has_parents(_, P, _).
is_parent(P) :- has_parents(_, _, P).

/* P has ancestor A */

has_ancestor(P, A) :- has_parents(P, A, _).
has_ancestor(P, A) :- has_parents(P, _, A).
has_ancestor(P, A) :- has_parents(P, X, _), has_ancestor(X, A).
has_ancestor(P, A) :- has_parents(P, _, X), has_ancestor(X, A).