解释基本Prolog结果

解释基本Prolog结果,prolog,Prolog,我对Prolog的基础知识感到困惑 如果我有这个知识库: loves(vincent, mia). loves(marcellus, mia). loves(pumpkin, honey_bunny). loves(honey_bunny, pumpkin). jealous(X, Y) :- loves(X, Z), loves(Y, Z). 那么我想 “如果X爱Z,Y爱Z,X就会嫉妒Y” 当我运行查询时嫉妒(X,Y)。 我明白了 我可以看出文森特嫉妒马塞利厄斯,马塞利厄斯

我对Prolog的基础知识感到困惑

如果我有这个知识库:

loves(vincent, mia).
loves(marcellus, mia).
loves(pumpkin, honey_bunny).
loves(honey_bunny, pumpkin).

jealous(X, Y) :-
    loves(X, Z),
    loves(Y, Z).
那么我想

“如果X爱Z,Y爱Z,X就会嫉妒Y”

当我运行查询时
嫉妒(X,Y)。

我明白了

我可以看出文森特嫉妒马塞利厄斯,马塞利厄斯嫉妒文森特,但是
X=Y,Y=vincent
表格中的行告诉我什么?我假设当存在匹配项时,下一行给出查询为true的值,如中所示

X = Y, Y = vincent
X = vincent,
Y = marcellus
X = marcellus,
Y = vincent
下面没有类似的东西,意味着没有匹配。但是,
X=Y,Y=vincent
对我来说毫无意义。如果它的意思是“X是某个值
Y
,让我们假设
Y
是vincent”,这是有道理的。但这不能解释结果中的
X=marcellus,Y=vincent

非常感谢理解这一点的任何帮助

请告诉我
X=Y,Y=vincent
表格中的行是什么

文森特嫉妒自己:-)

您是对的,输出令人困惑,如果它是
X=vincent,Y=vincent
,则更清晰,这是等效的。prolog并没有强迫您使用您提到的奇怪的输出形式,它是prolog系统的一种实现选择,可能是因为他们希望得到非常简短的答案

如果你想排除某人嫉妒自己的可能性,你需要改变你对嫉妒的定义,并要求X与Y不同,例如:

jealous(X, Y) :-
    loves(X, Z),
    loves(Y, Z),
    X\=Y.
jealous(X, Y) :-
    loves(X, Z),
    loves(Y, Z),
    X\=Y.