2014-05-17 42 views
2

我試圖比較兩個人,如果這個人之前曾經扮演過某個人,然後贏得那麼輸給了這個新人,那麼這個人在技術上已經超過了其他人。Prolog鏈接優勝者?

例如,它的設置是這樣的:

它是如何建立

例子:winner(won, lost).

winner(john, jacob). 
winner(mike, john). 
winner(scott, mike). 
winner(matt, scott). 

winner(X, Z) :- winner(X, Y), winner(Y, Z). 

如果我稱之爲:winner(matt, mike).它會因爲亞光擊敗斯科特返回true,這意味着他也因爲邁克輸給斯科特而擊敗邁克。

本質上我想能夠打電話winner(matt, jacob).它會返回true。

我只能用當前的規則查詢下一層,我該如何去查詢無限層次?我很困惑如何解決這個問題。

回答

2

您需要兩個謂詞。一個用於基本事實winner/2,另一個用於傳遞關係。例如:

transitive_winner(X, Y) :- 
    winner(X, Y). 
transitive_winner(X, Z) :- 
    winner(X, Y), 
    transitive_winner(Y, Z). 

有了這個定義和winner/2的事實,你可以詢問例如:

?- transitive_winner(mike, Y). 
Y = john ; 
Y = jacob ; 
false. 

您需要定義此傳遞關係時要小心,不過,爲了避免左遞歸如:

transitive_winner(X, Z) :- 
    transitive_winner(Y, Z), 
    winner(X, Y). 

在不支持的Prolog系統製表,將呼叫transitive_winner/2會導致堆棧溢出錯誤。

+0

感謝您的回答!我無法把頭圍住它,我知道我很近。 :) – user3646479