我已将这些陈述输入prolog解释器,并对结果感到困惑。他们不应该回归同样的事情;真?
1 ?- 7 = 5 + 2.
false.
2 ?- 7 is 5 + 2.
true.
答案 0 :(得分:10)
不,因为=/2
并不意味着在Prolog中分配,而是统一。统一算法对算术,结构都不了解。因此,您可以使用Prolog中的算术表达式做一些有趣的事情,这些表达式在其他语言中很难实现:
?- X = 5 + 2.
X = 5+2.
看起来没有任何事情发生,但实际发生的事情是X被赋予值“5 + 2”作为结构。换句话说:
?- A + B = 5 + 2.
A = 5,
B = 2.
甚至:
?- X = 5 + 2, X =.. [Op|_].
X = 5+2,
Op = (+).
最后一个可能对整个列表更有意义:
?- X = 5 + 2, X =.. Y.
X = 5+2,
Y = [+, 5, 2].
这是卓越的“univ”运算符=../2
的效果,它能够在类似Lisp的列表和Prolog语法之间进行转换,使您能够以通用方式进行有趣的构造和结构分解。
现在,is/2
,另一方面, 知道算术。它将其左参数与其右边的算术简化结果统一起来。 请注意它只能在一个方向上运作:
?- 7 is 5 + 2.
true.
?- 5 + 2 is 7.
false.
你可以说=/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)
现在,这并不完美(注意我们得到的是3 + 4而不是7)而且要让它变得非常聪明还有很多工作要做:
?- simplify(3 * A + 4 * A, Q).
Q = 3*A+4*A.
但这是另一天的问题。
果壳:
=/2
触发统一is/2
触发算术评估