36

有人可以解释Prolog中的==和运算符之间的区别吗?=我知道这X = Y意味着 X 与 Y 统一,并且如果 X 已经与 Y 统一或可以做到,则为真,但我不明白这与==.

跟进:那(见接受的答案)是有道理的。还有一个问题,是否存在X \= Y真假X \== Y(反之亦然)的情况?也就是说,是否X \= Y测试它们是否无法统一或当前是否不统一?

4

2 回答 2

42

Prolog 中的=“运算符”实际上是一个谓词(带有中缀符号)=/2,当两个术语统一时成功。因此X = 22 = X等于同一件事,一个目标X与 2 统一。

==运算符”的不同之处在于,只有当这两个术语已经相同而没有进一步统一时,它才会成功。因此X == 2,仅当变量X先前被赋值为 2 时才成立。

补充: 根据下面 JohnS 的评论,研究当“不”混入这些目标时会发生什么是很有趣的。请参阅Amzi 中的一组不错的示例!序言文档。

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

\==表示这两个术语不相同。即使成功,这里也不会发生统一。

最后想想怎么not(not(X = Y))办。如果 X 和 Y(可以是任意项)可以统一,那么内部目标就成功了,那么它的双重否定也将成功。但是,如果两个术语可以统一但没有统一这些术语,则将内部目标包含在双重否定中会产生一个成功的目标。

留给读者作为练习来考虑是否not(not(X == Y))有任何类似的效用。

于 2011-11-22T00:08:54.180 回答
7

= 代表统一,这意味着它将尝试绑定自由变量以使它们与其他成员匹配。例如:如果 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

因为 prolog 试图使 XY:Z 适合表达式 5-[a, b, c]:y。它非常有用。

请注意,当您调用谓词时会使用统一,并且会出现一些技术:假设您想在递归谓词中返回累加器的值,您可以这样做:

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

第一个子句将尝试统一第三个和第二个参数,因此如果第三个是自由的,它现在与第二个具有相同的值。

== 是相等而不试图绑定变量。

于 2011-11-22T00:05:37.223 回答