再帰 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。良好だ。