Я расширил ваши факты, чтобы привести некоторые рабочие данные.
/* Facts */
male(roy).
male(lee).
female(joy).
female(ana).
parent_of(roy,joy).
parent_of(joy,ana).
parent_of(lee,ana).
Теперь мы можем построить некоторые правила. Давайте начнем с grand_parent_of/2
.
grand_parent_of(X,Z) :-
parent_of(X,Y),
parent_of(Y,Z).
Это делает правила для grand_father_of/2
и grand_mother_of/2
довольно простыми.
grand_father_of(X,Y) :-
male(X),
grand_parent_of(X,Y).
grand_mother_of(X,Y) :-
female(X),
grand_parent_of(X,Y).
Теперь, каждый предикат до сих пор был предком слева и потомок справа, поэтому, чтобы сохранить последовательность, давайте сначала определим ancestor_of/2
, а не descendent_of/2
.
ancestor_of(X,Y) :-
parent_of(X,Y).
ancestor_of(X,Y) :-
parent_of(X,Z),
ancestor_of(Z,Y).
Обратите внимание, что второй предикат является рекурсивным.
Теперь мы можем легко определить descendent_of/2
просто в терминах ancestor_of/2
.
descendent_of(X,Y) :-
ancestor_of(Y,X).
Вот результаты выполнения следующего запроса и запроса пролога, чтобы он продолжал давать мне результаты.
?- descendent_of(X,Y).
X = joy,
Y = roy ;
X = ana,
Y = joy ;
X = ana,
Y = lee ;
X = ana,
Y = roy ;
false.