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

Joh*_*hnS 29 prolog

有人可以解释Prolog中===运营商之间的区别吗?我知道这X = Y意味着X与Y统一并且如果X已经与Y统一或者可以与之结合,则为真,但我不明白这是如何不同的==.

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

har*_*ath 35

Prolog中的="运算符"实际上是一个谓词(带有中缀表示法)=/2,当两个术语统一时会成功.因此X = 22 = X相当于同一件事,一个X与2 统一的目标.

=="运算符"的不同之处在于,只有当两个项已经相同而没有进一步统一时,它才会成功.因此X == 2,只有X先前已为变量赋值2时才会出现这种情况.

补充: 根据下面JohnS的评论,通过"不"混入这些目标时所发生的事情很有意思.看看Amzi中的一很好的例子!Prolog文档.

\=意味着这两个术语不能统一,即统一失败.正如所有否定的应用都是失败一样,"不统一"不会(也不会)导致术语之间的任何统一.

\==意味着这两个词不相同.即使这成功,也不会发生统一.

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

读者可以考虑是否not(not(X == Y))有任何类似的效用.


m09*_*m09 5

=代表统一,这意味着它将尝试绑定自由变量以使它们与其他成员匹配.例如:如果A是空闲的,A = h(X)将把A变成术语h(X),如果A必然说5,则会失败.统一很好,因为你可以用它进行模式匹配,例如:

X-Y:Z = 5-[a, b, c]:y
Run Code Online (Sandbox Code Playgroud)

会给你

X = 5, Y = [a, b, c] and Z = y
Run Code Online (Sandbox Code Playgroud)

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

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

recursive_predicate([], Accumulator, Accumulator).
recursive_predicate(Input, Accumulator, Output) :- %recursive stuff.
Run Code Online (Sandbox Code Playgroud)

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

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