2017-10-08 190 views
2

我有序言謂詞male, female, parent,如下所示:現在擴展Prolog的謂詞

parent(bob, rick). 
parent(jane, rick). 
parent(rick, alice). 
parent(betsy, alice). 
male(rick). 
female(jane). 

,一種方式來推斷殘缺的性別信息是看如果父母一方是男性,那麼其他的必須是女性,副反之亦然,所以我試圖延長女:

female(X) :- parent(X, Y), parent(Z, Y), male(Z). 

因此,我最後female謂語是:

female(jane). 
female(X) :- parent(X, Y), parent(Z, Y), male(Z). 

但是,當我嘗試:

?- female(jane). 
true ; 
false. 

?- female(betsy). 
true ; 
false. 

爲什麼錯誤會出現在那裏?當我嘗試爲male做類似的事情時會出現更多問題,因爲這會導致無限遞歸。

回答

2

讓我們看看會發生什麼,如果你詢問女/ 1:

?- female(jane). 

的Prolog試圖通過努力你爲它編寫的所有事實和規則來證明謂語。首先,事實female(jane).匹配成功和前導告訴你:

?- female(jane). 
true 

後你打; - 鍵的Prolog尋找進一步的解決辦法:

?- female(jane). 
true ; 

有女性/ 1,但通常沒有更多的事實,所以Prolog試圖通過按照你寫的順序來證明它的目標來證明規則。規則頭部的Xjane統一。第一個目標parent(jane,Y)成功爲Y=rick。然後Prolog正試圖證明parent(Z,rick),其成功爲Z=bob。現在Prolog試圖證明male(bob)但由於您的事實不包括male(bob)而失敗。因此,Prolog回溯到之前的目標parent(Z,rick),並找到第二個解決方案Z=jane(畢竟您的規則未指定XZ必須不同)。但是,目標male(jane)失敗。 Prolog回溯到之前的進球,但沒有找到更多parent(Z,rick)的解決方案,因此回溯到第一個進球parent(jane,Y)。 由於是沒有更多的解決方案,無論是Prolog的告訴你:

?- female(jane). 
true ; 
false 

爲了進一步說明是如何工作的,我建議你添加一個事實:

male(bob). 

現在查詢得到:

?- female(jane). 
true ; 
true ; 
false. 

現在按照上述推理:第一個true是因爲事實female(jane)。第二個true你得到,因爲規則成功,因爲Prolog現在可以證明male(bob)。而你得到的是false,因爲沒有更多的解決方案。

您的第二個查詢的答案可以用相同的方式解釋:您可以得到答案true,因爲male(rick)可以在規則中證明。 false告訴你沒有更多的解決方案。

+0

謝謝,明白了。我很困惑,因爲'真的;虛假「似乎表明」簡「是一個邏輯女性而不是另一個女性,這不應該是女性。現在我明白,這意味着它意味着沒有更多的解決方案。並且很好的瞭解我忘記了'X \ == Z'的條件。 – forumulator

0

在這種情況下,任何人幫助,我想進一步補充說,在這種情況下,如果我也想同樣延長male,它會導致無窮遞歸,因爲male引用femalefemale引用male

爲了避免這種情況,最好是分開的事實和規則,就像這樣:

male(rick). 
is_male(X) :- male(X). 
is_male(X) :- parent(X, Y), parent(Z, Y), X \== Z, female(Z). 

female(jane). 
is_female(X) :- female(X). 
is_female(X) :- parent(X, Y), parent(Z, Y), X \== Z, male(Z). 

(這是唯一適當的這裏,是因爲遞歸的進一步水平不會產生任何額外的信息,這可能不是對於其他情況爲真)。

+0

使用內置的\ ==/2時要小心。考慮下面的查詢:'? - X = Y,X'== Y.'如預期的那樣產生'no',但是'? - X \ == Y,X = Y.'由於X = Y'成功,因爲\ = =/2對變量沒有任何影響,因此它們可以隨後統一。如果在Prolog系統中可用,請考慮使用dif/2。這樣上述查詢都失敗了:'? - X = Y,dif(X,Y).'產生'no'和'? - dif(X,Y),X = Y.'也產生'no'。 – tas