2017-01-10 54 views
0

如果您有這些事實:這個Prolog代碼是如何工作的(祖父母)?

parent(albert, bob). 
parent(albert, betsy). 
parent(albert, bill). 

parent(alice, bob). 
parent(alice, betsy). 
parent(alice, bill). 

parent(bob, carl). 
parent(bob, charlie). 

,然後將此代碼:

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

如果你鍵入:

grand_parent(carl, A) 

然後返回:

A = albert ? ; 
A = alice ? ; 
no 

如何?是工作嗎?
這有點令人困惑。尤其是「Z」部分。

+0

什麼問題? –

+0

抱歉搞砸了。我現在重新輸入了它。 謝謝。 – F1R3

回答

3

我敢打賭,它看起來少混亂,如果你使用更好的變量名:

grand_parent(Grandchild, Grandparent) :- 
    parent(Parent, Grandchild), 
    parent(Grandparent, Parent). 

你看,當你問查詢grand_parent(carl, X),Prolog的是要找到grand_parent/2的定義和替代carlGrandchild。爲了證明這一點,它必須證明parent(Parent, carl)。那麼,這個成功一次,統一Parentbob。逗號的作用類似於「和」,所以現在Prolog必須證明parent(Grandparent, bob)。它成功,統一Grandparentalbert。 Prolog總是按照您提供事實的順序搜索數據庫,這就是爲什麼我們在得到Alice之前得到了Albert。

當您點擊;就好像您正在與Prolog進行對話,並且您在說「或?」彷彿要提示另一個解決方案。所以Prolog備份到最後的選擇點並開始向前掃描。最後的選擇點在parent(Grandparent, bob),因此它向前掃描,直到找到parent(alice, bob)哪個成功,統一Grandparentalice。你問它的另一個解決方案,它將用盡parent(Grandparent, bob)所有可能性,所以它將備份到parent(Parent, carl),這沒有找到任何更多的解決方案。在這一點上,Prolog說false因爲它沒有想法。

希望這會有所幫助!