添加 (X \= Y) 子句时,Prolog 不会返回正确的查询(据我所知)

问题描述 投票:0回答:1

知识库:

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?我是不是错过了什么?

prolog
1个回答
2
投票

当您运行

jealous(vincent, Y).
时,它会尝试查看
vincent
是否不等于
Y
。然而,此时
Y
尚未实例化,因为无法从中进行选择。

一个简单的解决方法是将

X \= Y.
放在谓词末尾,如下所示:

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

这给出了预期的答案:

X = marcellus.

查看下次发生情况的一个简单方法是运行

trace.
;这可以让您轻松调试代码。 (SWI-Prolog 是这样,其他版本不确定)。

© www.soinside.com 2019 - 2024. All rights reserved.