Prolog中==和=有什么区别?

时间:2011-11-21 22:40:31

标签: prolog

有人可以解释Prolog中===运算符之间的区别吗?我知道X = Y表示X与Y统一,如果X已经与Y统一或可以制作,则为真,但我不明白它与==的区别。

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

2 个答案:

答案 0 :(得分:33)

Prolog中的=“运算符”实际上是一个谓词(使用中缀表示法) = / 2 ,当两个术语统一时会成功。因此,X = 22 = X相同,是X与2统一的目标。

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

已添加:根据下面JohnS的评论,了解“不”与这些目标混合时所发生的事情很有意思。看看Amzi中的好set of examples! Prolog文档。

\=表示两个术语无法统一,即统一失败。正如所有否定的应用都是失败一样,“不统一”不会(也不会)导致术语之间的任何统一。

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

最后考虑一下not(not(X = Y))会做什么。如果X和Y(可以是任意项)可以统一,内部目标成功,那么双重否定就会成功。然而,将内部目标包含在双重否定中会产生一个成功的目标,如果这两个术语可以统一但不统一这些术语

读者可以考虑not(not(X == Y))是否具有相似的效用。

答案 1 :(得分: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

因为prolog试图使X-Y:Z符合表达式5- [a,b,c]:y。 这非常有用。

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

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

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

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