有人可以解释Prolog中==
和=
运算符之间的区别吗?我知道X = Y
表示X与Y统一,如果X已经与Y统一或可以制作,则为真,但我不明白它与==
的区别。
跟进:那(见接受的答案)是有道理的。还有一个问题是,X \= Y
是否为真且X \== Y
为假(反之亦然)?也就是说,X \= Y
是否会测试它们是否无法统一或者它们目前是否统一?
答案 0 :(得分:33)
Prolog中的=“运算符”实际上是一个谓词(使用中缀表示法) = / 2 ,当两个术语统一时会成功。因此,X = 2
或2 = 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.
第一个子句将尝试统一第三个和第二个参数,所以如果第三个是自由的,它现在具有与第二个相同的值。
==是平等而不试图绑定变量。