[英]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.
快速解释一下为什么查询中规则的顺序如此重要的原因。 谢谢。
\\=
是一个奇怪的谓词……它说:“如果两个参数的统一成功,则失败;如果统一失败,则成功”。 因此,由于自由变量与原子的统一总是成功的,所以失败了。
一旦Y
与thor
统一,则captainAmerica
与thor
的统一失败,因此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
谓词的调用之前, X
和Y
都将被充分实例化。
正如鲍里斯(Boris)在回答中所解释的那样,使用dif/2
谓词的替代方法具有使上述条款中的目标顺序无关紧要的优点。 但是,有一个警告。 dif/2
谓词不是标准谓词,并非所有Prolog实现都提供它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.