再帰 on 7つの言語7つの世界

father(zeb,         john_boy_sr).
father(john_boy_sr, john_boy_jr).

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

father(zeb, john_boy_sr).
zebはjohn_boy_srの父親である。

father(john_boy_sr, john_boy_jr).
john_boy_srはjohn_boy_jrの父親である。

ancestor(X, Y) :-
father(X, Y).
「XはYの祖先である。」とは、「XはYの父親である。」を満たすこと。

ancestor(X, Y) :-
father(X, Z), ancestor(Z, Y).
「XはYの祖先である。」とは、
「XはZの父親である。」かつ「ZはYの父親である」を満たすこと。

zebとjohn_boy_jrの関係を見ると
ancestor(zeb, john_boy_jr)は
ancestor(zeb, john_boy_jr) :-
father(zeb, Z), ancestor(Z, john_boy_jr).
となり、
father(zeb, Z)のZは、john_boy_srになり、続いて
ancestor(Z, john_boy_jr)のZも、john_boy_srになる。
ancestor(john_boy_sr, john_boy_jr)は、father(X, Y)を満たすので

ancestor(zeb, john_boy_jr)はtrueになると。

以下の関係性を追加してみる。
father(zeb_sr, zeb).
father(john_boy_jr, tom).
zeb_sr→zeb→john_boy_sr→john_boy_jr→tom

john_boy_jrの先祖を聞いてみる。
2 ?- ancestor(X, john_boy_jr).
X = john_boy_sr ;
X = zeb ;
X = zeb_sr ;
false.

zeb_srの子孫を聞いてみる。
4 ?- ancestor(zeb_sr, Y).
Y = zeb ;
Y = john_boy_sr ;
Y = john_boy_jr ;
Y = tom ;
false.

OK。良好だ。