Prolog 序言链接赢家?

Prolog 序言链接赢家?,prolog,Prolog,我试着比较两个人,如果这个人以前和别人打过球,赢了之后输给了新的那个人,那么这个人在技术上比其他人都高 例如,它的设置如下: 如何设置的示例:赢家(赢了,输了)。 如果我打电话:winner(马特,迈克)。它会返回true,因为马特打败了斯科特,这意味着他也打败了迈克,因为迈克输给了斯科特 本质上,我希望能够调用winner(matt,jacob)。然后返回true 我有它只查询层与目前的规则,我将如何进行查询通过无限层?我不知道如何处理这个问题。您需要两个谓词。一个用于基本事实,winner/

我试着比较两个人,如果这个人以前和别人打过球,赢了之后输给了新的那个人,那么这个人在技术上比其他人都高

例如,它的设置如下:

如何设置的示例:
赢家(赢了,输了)。

如果我打电话:
winner(马特,迈克)。
它会返回true,因为马特打败了斯科特,这意味着他也打败了迈克,因为迈克输给了斯科特

本质上,我希望能够调用
winner(matt,jacob)。
然后返回true


我有它只查询层与目前的规则,我将如何进行查询通过无限层?我不知道如何处理这个问题。

您需要两个谓词。一个用于基本事实,
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\u winner/2将导致堆栈溢出错误。

谢谢您的回答!我无法控制自己的情绪,我知道我已经接近了
transitive_winner(X, Z) :-
    transitive_winner(Y, Z),
    winner(X, Y).