2011-11-21 136 views
26

有人可以解释在Prolog中===运算符之间的区别吗?我知道X = Y意味着X与Y相结合,如果X已经与Y相结合或者可以与Y相结合,则为真,但我不明白这与==有什么不同。在Prolog中==和= =有什么区别?

后续行动:那(看接受答案)是有道理的。还有一个问题,是否存在X \= Y为真并且X \== Y为假(或反之亦然)?也就是说,X \= Y测试它们是否不能统一或者它们目前是不是统一的?

+1

“这是有道理的。”:你可以添加一些有意义的东西,或者将其从问题中删除,并最终将其添加为答案的评论? –

+0

@moose:“后续”(将否定与'='和'=='组合)开始作为对我的答案的评论。我怀疑“这是有道理的”是指我的前两段,之后我作出了进一步的回应。看看我的Edit是否足以清除这种感觉。 – hardmath

回答

29

Prolog中的=“操作符”实际上是谓词(带中缀符号)=/2当两个术语统一时成功。因此X = 22 = X或量的同样的事情,一个目标统一X与2.

的==“经营者”不同之处在于它成功只有当这两个术语都已经无需进一步统一相同。因此X == 2是真实的,只有当变量X此前被分配值2

补充:有趣通过时“而不是”被约翰斯低于混合到这些目标,每个评论发生了什么工作。在Amzi看到漂亮的set of examples! Prolog文档。

\=表示这两个术语不能统一,即统一失败。与所有的否定作为失败的应用一样,“不统一”不会(并且不能)导致术语之间的统一。

\==表示两个术语不相同。即使这样做也没有统一。

最后想想not(not(X = Y))会做什么。如果X和Y(可以是任意的项)可以统一,那么内在的目标就会成功,对此的双重否定也是如此。然而,将双重否定的内在目标包裹在内产生一个成功的目标如果这两个术语可以统一但没有统一这些术语

作为练习,读者可以考虑not(not(X == Y))是否有类似的用途。

+0

这是有道理的。还有一个问题,是否存在“X \ = Y”为真,“X \ == Y”为假(或反之亦然)的情况?也就是说,'X'= Y'测试它们是不是统一的,还是它们目前不统一? – JohnS

+0

@JohnS:请注意,'X \ = Y'与'not(X = Y)'相同,或者像某些Prolog实现中那样,'\ +(X = Y)'。请参阅我的答案的添加部分以获得进一步的评论。 – hardmath

+0

“因此,只有变量X先前被赋值为2,X == 2才为真。”是非常重要的要注意,因为你可以有两个计算与相同的结果不通过'=='。例如'2/2 * 2 == *(2,(/(2,2)))。“,因为左边的术语实际上并没有被分解为算术术语,直到它被评估为止。 –

5

=表示统一,表示它会尝试绑定自由变量以使其与其他成员相匹配。例如: 例如: 如果A是空闲的,A = h(X)将使A变成期限h(X),并且如果A被约束为5将失败。 统一是很好的,因为你可以对它进行模式匹配,例如:

X-Y:Z = 5-[a, b, c]:y 

会给你

X = 5, Y = [a, b, c] and Z = y 

因为序言试图使XY位:Z适合表达5- [A,b,C]:Y。 这非常有用。

需要注意的是,当你调用一个谓词和一些技术接踵而至统一使用: 说你要返回递归谓词累加器的值,你可以这样做:

recursive_predicate([], Accumulator, Accumulator). 
recursive_predicate(Input, Accumulator, Output) :- %recursive stuff. 

第一条将试图统一第三和第二个参数,所以如果第三个参数是空闲的,它现在与第二个参数具有相同的值。

==是没有试图绑定变量的相等。