我试图比较两个人和那两个人,如果这个人之前曾经玩过一个人并且赢了然后输给了新人,那么这个人在技术上就高于其他人。
例如,它的设置如下:
如何设置示例: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。
我只有查询当前规则的层级,我将如何通过无限层查询?我对如何解决这个问题感到困惑。
答案 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
会导致堆栈溢出错误。