Prolog is和=,之间的区别是什么?
我已经将这些语句输入到prolog解释器中,并且对结果感到困惑。他们不应该退回同样的东西吗;是吗Prolog is和=,之间的区别是什么?,prolog,Prolog,我已经将这些语句输入到prolog解释器中,并且对结果感到困惑。他们不应该退回同样的东西吗;是吗 1 ?- 7 = 5 + 2. false. 2 ?- 7 is 5 + 2. true. 不,因为在Prolog中,=/2并不意味着赋值,而是统一。统一算法对算术一无所知,只知道结构。因此,您可以使用Prolog中的算术表达式做一些有趣的事情,而在其他语言中很难做到: ?- X = 5 + 2. X = 5+2. 看起来这里什么也没发生,但实际发生的是X被赋予了值“5+2”作为一个结构。换句
1 ?- 7 = 5 + 2.
false.
2 ?- 7 is 5 + 2.
true.
不,因为在Prolog中,
=/2
并不意味着赋值,而是统一。统一算法对算术一无所知,只知道结构。因此,您可以使用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
对结构感兴趣,对数字相等感兴趣。但这确实意味着教授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
触发算术求值
谢谢您,特别是感谢您的支持!我很好奇为什么在=之后加上/2,答案中有吗?斜杠将谓词的名称与其“arity”(它接受的参数数量)分开。对于像“is”和“=”这样的中缀运算符,这个值永远只能是2,但是对于其他谓词,您可以使用相同的名称和具有不同数量参数的版本,因此您需要这个值来保持foo/2
与foo/3
或foo/4
之间的一致性。这只是一个很好的会议。