和=有什么区别?

Dan*_*her 6 prolog

我已将这些陈述输入prolog解释器,并对结果感到困惑.他们不应该回归同样的事情; 真正?

1 ?- 7 = 5 + 2.
false.

2 ?- 7 is 5 + 2.
true.
Run Code Online (Sandbox Code Playgroud)

Dan*_*ons 11

不,因为=/2并不意味着在Prolog中分配,而是统一.统一算法对算术,结构都不了解.因此,您可以使用Prolog中的算术表达式做一些有趣的事情,这些表达式在其他语言中非常难以实现:

?- X = 5 + 2.
X = 5+2.
Run Code Online (Sandbox Code Playgroud)

看起来没有发生任何事情,但实际发生的事情是X被赋予值"5 + 2" 作为结构.换一种方式:

?- A + B = 5 + 2.
A = 5,
B = 2.
Run Code Online (Sandbox Code Playgroud)

甚至:

?- X = 5 + 2, X =.. [Op|_]. 
X = 5+2,
Op = (+).
Run Code Online (Sandbox Code Playgroud)

最后一个可能对整个列表更有意义:

?- X = 5 + 2, X =.. Y.
X = 5+2,
Y = [+, 5, 2].
Run Code Online (Sandbox Code Playgroud)

这是非凡的"univ"操作符的效果=../2,它能够在类似Lisp的列表和Prolog语法之间进行转换,使您能够以通用方式进行有趣的构造和结构分解.

现在is/2,在另一方面,知道算术.它将其左参数与其右边的算术简化结果统一起来.请注意它只适用于一个方向:

?- 7 is 5 + 2.
true.

?- 5 + 2 is 7.
false.
Run Code Online (Sandbox Code Playgroud)

你可以说=/2对结构is/2感兴趣并且对数字相等感兴趣.但这确实意味着教授Prolog代数异常容易:

simplify(X * Y + X * Z, X * (Y + Z)).  % distributive property
simplify(X, X).

?- simplify(A * 3 + A * 4, Q).
Q = A* (3+4)
Run Code Online (Sandbox Code Playgroud)

现在,这并不完美(请注意,我们得到了3 + 4而不是7),要让它变得非常聪明,还有很多工作要做:

?- simplify(3 * A + 4 * A, Q).
Q = 3*A+4*A.
Run Code Online (Sandbox Code Playgroud)

但那是另一天的问题.

概括地说:

  • =/2 触发统一
  • is/2 触发算术评估