parent(tom, mary).   % tom is a parent of mary
parent(liz, mary).
parent(bob, tom).


% Parent(x,z) ^ Parent(z,y) => Grandparent(x,y)
grandparent(X, Y) :-  
    parent(X, Z),
    parent(Z, Y).


% Parent(x,y) => Ancestor(x,y)
% Parent(x,z) ^ Ancestor(z,y) => Ancestor(x,y)

% version 1
ancestor(X, Y) :-
    parent(X, Y).

ancestor(X, Y) :-
    parent(X, Z),
    ancestor(Z, Y).

% version 2
/*
ancestor(X, Y) :-
    parent(X, Z),
    ancestor(Z, Y).

ancestor(X, Y) :-
    parent(X, Y).
*/

% version 3
/*
ancestor(X, Y) :-
    parent(X, Y).

ancestor(X, Y) :- % changing the ordering gets it into an infinite recursion
    ancestor(Z, Y),
    parent(X, Z).
*/

% version 4
/*
ancestor(X, Y) :- % changing the ordering gets it into an infinite recursion
    ancestor(Z, Y),
    parent(X, Z).

ancestor(X, Y) :-
    parent(X, Y).
*/

%parent(tom, mary).
%%yes
%
%parent(W, mary).
%%W=tom;
%%W=liz
%
%grandparent(bob, mary).
%%yes
%
%grandparent(W, mary).
%%W=bob
%
%ancestor(W, mary).
%%W = tom ;
%%W = liz ;
%%W = bob ;
%
%ancestor(W, bob).
