查询规则的Prolog顺序

时间:2014-12-05 14:48:19

标签: prolog prolog-dif

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. 

快速解释为什么查询中的规则顺序对此非常重要。谢谢。

2 个答案:

答案 0 :(得分:2)

\=是一个奇怪的谓词......它说,“如果两个论证的统一成功,就会失败;如果统一失败,那就成功”。因此,随着自由变量与原子的统一将始终成功,它将失败。

Ythor统一后,captainAmericathor的统一失败,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实现都提供它。