没有为什么=/2
并不意味着assign在 Prolog 中,而是unify。统一算法根本不知道算术,只知道结构。因此,您可以在 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 语法之间进行转换,使您能够以通用的方式进行有趣的结构构建和分解。
Now, is/2
, 另一方面,does了解算术。它将左参数与其右参数的算术简化结果统一起来。Do note它只在一个方向上起作用:
?- 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.
但这是另一天的问题。
简而言之: