2013-03-13 2 views
3

Я изо всех сил пытаюсь разгадать эту основную концепцию Пролога.Предложение предлога предлога с использованием списков

Я понимаю, что основное условие для определения предка человека выглядит следующим образом:

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

Однако, я пытаюсь получить мою голову вокруг, как это работает для пролога программы, которая реализует списки, чтобы определить, дети родителей, то есть:

parent_of(simon, [matthew, andrea, joanne]). 

Чтобы определить, работает ли или нет кто является отцом кого-то, я использую это, который работает отлично:

father_of(X, Y) :- parent_of(X, List), my_member(Y, List), male(X). 

Однако я не могу понять, как заставить это работать в предложении предка выше.

ответ

4

член/2 это проще соотношение между элементом и списком:

ancestor_of(X, Y) :- parent_of(X, Ys), member(Y, Ys). 
ancestor_of(X, Y) :- parent_of(X, Zs), member(Z, Zs), ancestor_of(Z, Y). 

я добавил отношение к тесту правилу транзитивной

parent_of(simon, [matthew, andrea, joanne]). 
parent_of(andrea, [bill, joan]). 

урожаи

?- ancestor_of(andrea,A). 
A = bill ; 
A = joan ; 
false. 

?- ancestor_of(simon,A). 
A = matthew ; 
A = andrea ; 
A = joanne ; 
A = bill ; 
A = joan ; 
false. 

?- ancestor_of(X,bill). 
X = andrea ; 
X = simon ; 
false. 
+0

Отлично, большое спасибо за вашу помощь. –

Смежные вопросы