知识库:
loves(vincent,mia).
loves(marcellus,mia).
loves(pumpkin,honey_bunny).
loves(honey_bunny,pumpkin).
jealous(X,Y) :-
X \= Y,
loves(X,Z),
loves(Y,Z).
现在我输入
jealous(vincent, X).
,它返回 false
。难道不应该是X = marcellus
吗,因为marcellus不等于vincent,但他们都爱mia?我是不是错过了什么?
当您运行
jealous(vincent, Y).
时,它会尝试查看 vincent
是否不等于 Y
。然而,此时 Y
尚未实例化,因为无法从中进行选择。
一个简单的解决方法是将
X \= Y.
放在谓词末尾,如下所示:
jealous(X,Y) :-
loves(X,Z),
loves(Y,Z),
X \= Y.
这给出了预期的答案:
X = marcellus.
查看下次发生情况的一个简单方法是运行
trace.
;这可以让您轻松调试代码。 (SWI-Prolog 是这样,其他版本不确定)。