2017-06-04 73 views
3

我在Prolog看過家族樹的各種實現,但是我還沒有找到一個做我想做的事情,那就是通過引用彼此來定義孩子和父母。 我想這樣做,因爲有時我有一個事實,即某人是某個人的孩子,而在其他時候,我有這樣的事實,即某人是某人的父母。從這兩種事實中,我希望能夠問誰是父母,誰是孩子。家族樹中的相互參照Prolog規則

我在編碼這樣的嘗試是: -

parent(mary, fred). 
child(john, peter). 
child(paul, peter). 

parent(P, C). 
parent(P, C) :- child(C, P). 
child (C, P). 
child(C, P) :- parent(P, C). 

這似乎是工作,只是它會不斷地給我重複一遍又一遍相同的結果確定。例如: -

[3] ?- parent(peter, X). 
true ; 
X = john ; 
X = paul ; 
true ; 
X = john ; 
X = paul ; 
true 

有沒有一種方法可以讓我得到它停止它給了我之後的全套結果的一次?

更一般地說,這種定義是一種想要做的奇怪事情(因爲相互遞歸)?據報道,我希望能夠得到父母或小孩的事實,但也可以從中推斷出「相反」的關係。

謝謝!

回答

2

你的程序的問題是你正在合併謂詞。 家長/ 2和孩子/ 2是事實,您不應該像您的程序中已經定義的事實那樣命名規則。

重命名規則,一切都會工作。此外,在規則基礎條款應增加一個條件,符合事實,這樣的事情是:

parent(mary, fred). 
child(john, peter). 
child(paul, peter). 

isparent(P, C):- parent(P, C). 
isparent(P, C):- child(C, P). 

ischild(C, P):- child(C, P). 
ischild(C, P) :- parent(P, C). 

現在查詢:

?- isparent(peter, X). 
X = john 
X = paul 

另外,不要使用在補充規則你的條件,這是沒有必要的,並會避免你的遞歸

+0

完美!謝謝 :) – guraaku