繁体   English   中英

查询规则的序言顺序

[英]Prolog order of query rules

序言问题:刚开始学习序言,这是我们得到的一项实践测验。

鉴于:

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. 

快速解释一下为什么查询中规则的顺序如此重要的原因。 谢谢。

\\=是一个奇怪的谓词……它说:“如果两个参数的统一成功,则失败;如果统一失败,则成功”。 因此,由于自由变量与原子的统一总是成功的,所以失败了。

一旦Ythor统一,则captainAmericathor的统一失败,因此X \\= Y成功。

无论如何,在这种情况下,您不应使用\\= 而是使用dif/2 尝试弄乱定义为的谓词:

train3(X, Y) :-
    dif(X, Y),
    avenger(X),
    avenger(Y).

在几个方面都比其他两个更好。 您可以使用dif/2搜索其他问题。

当其参数不统一时, \\=/2标准谓词为true。 因此,它要求绑定两个参数(即不是变量)才有意义。 您的解决方案:

train2(X,Y) :- avenger(X), avenger(Y), X \= Y.

是正确的,因为对avenger/1谓词的两个进行中的调用确保在对\\=/2谓词的调用之前, XY都将被充分实例化。

正如鲍里斯(Boris)在回答中所解释的那样,使用dif/2谓词的替代方法具有使上述条款中的目标顺序无关紧要的优点。 但是,有一个警告。 dif/2谓词不是标准谓词,并非所有Prolog实现都提供它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM