Prolog问题: 刚刚开始学习prolog,这是我们给出的一个练习测验。
avenger(thor).
avenger(captainAmerica).
sibling(thor,loki).
asgardian(thor).
asgardian(X) :- sibling(Y,X),asgardian(Y).
train1(X,Y) :- avenger(X),!,avenger(Y).
train2(X,Y) :- avenger(X),X\=Y,avenger(Y).
train2(A, captainAmerica). %returns A=thor.
train2(captainAmerica, A). %returns false.
我的问题是关于第二个查询。为什么这不会返回A = thor。 ? 我搞砸了一下,如果我把train2改为
train2(X,Y) :- avenger(X),avenger(Y),X\=Y.
当我运行第二个查询时,我得到了
A=thor.
快速解释为什么查询中的规则顺序对此非常重要。谢谢。
答案 0 :(得分:2)
\=
是一个奇怪的谓词......它说,“如果两个论证的统一成功,就会失败;如果统一失败,那就成功”。因此,随着自由变量与原子的统一将始终成功,它将失败。
Y
与thor
统一后,captainAmerica
与thor
的统一失败,X \= Y
成功。
无论如何,在这种情况下你不应该使用\=
。相反,请使用dif/2
。尝试使用定义为:
train3(X, Y) :-
dif(X, Y),
avenger(X),
avenger(Y).
在几个方面比其他两个更好。您可以使用dif/2
搜索其他问题。
答案 1 :(得分:0)
\=/2
标准谓词在其参数未统一时为真。因此,它要求两个参数绑定(即不是变量)才有意义。你的解决方案:
train2(X,Y) :- avenger(X), avenger(Y), X \= Y.
是正确的,因为对avenger/1
谓词进行的两次调用确保在调用X
谓词之前,Y
和\=/2
都会得到充分的实例化。
正如鲍里斯在他的回答中所解释的那样,使用dif/2
谓词的替代方法具有使上述条款中的目标顺序无关紧要的优点。然而,有一个警告。 dif/2
谓词不是标准谓词,并非所有Prolog实现都提供它。