ancetre(X,Z):-parent(X,Z).
ancetre(X,Z):-parent(X,Y),ancetre(Y,Z).
parent(paul,bernard).
parent(thomas,bernard).
parent(thomas,lise).
parent(bernard,anne).
parent(bernard,pierre).
parent(pierre,jean).
ancetre2(X,Z):-parent(X,Y),ancetre2(Y,Z).
ancetre2(X,Z):-parent(X,Z).
ancetre3(X,Z):-parent(X,Z).
ancetre3(X,Z):-ancetre3(X,Y),parent(Y,Z).
ancetre4(X,Z):-ancetre4(X,Y),parent(Y,Z).
ancetre4(X,Z):-parent(X,Z).


%%%%%   Executions   %%%%%%

%       ?- ancetre(thomas,pierre).
%       Yes
%       ?- ancetre2(thomas,pierre).
%       Yes
%       ?- ancetre3(thomas,pierre).
%       Yes
%       ?- ancetre4(thomas,pierre).
%       ERROR: (user://1:35):
%               Out of local stack

%       ?- ancetre(thomas,X).
%       X = bernard ;
%       X = lise ;
%       X = anne ;
%       X = pierre ;
%       X = jean ;
%       No

%       ?- ancetre2(thomas,X).
%       X = jean ;
%       X = anne ;
%       X = pierre ;
%       X = bernard ;
%       X = lise ;
%       No

%       ?- ancetre3(thomas,X).
%       X = bernard ;
%       X = lise ;
%       X = anne ;
%       X = pierre ;
%       X = jean ;
%       ERROR: (user://1:81):
%               Out of local stack
%       
%       ?- ancetre4(thomas,X).
%       ERROR: (user://1:94):
%               Out of local stack
%       
