Prolog Chaining获奖者?

时间:2014-05-17 00:18:02

标签: 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).因为迈克击败斯科特,这意味着他也击败迈克,因为迈克输给了斯科特。

基本上我希望能够拨打winner(matt, jacob).并且它会返回true。

我只有查询当前规则的层级,我将如何通过无限层查询?我对如何解决这个问题感到困惑。

1 个答案:

答案 0 :(得分: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).

在不支持 tabling 的Prolog系统中,调用transitive_winner/2会导致堆栈溢出错误。