在上一节我们学到了 is/2 是 Prolog 中执行数值运算的关键操作符。
本节我们来进一步探究:为什么 is 不等于 =,它们的行为有何差异。
🧠 回顾:= 是结构匹配(unification)
在 Prolog 中,= 并不是我们在数学里熟悉的“等于”符号。它实际上意味着“尝试让两边变成相同的结构”,即结构统一(unification)。
举例:
?- X = 3 + 4.
X = 3+4. % 没有计算,只是把结构 3+4 赋给 X
?- 3 + 4 = 3 + 4.
true. % 两边结构完全相同
?- 3 + 4 = 7.
false. % 一个是结构,一个是数值,无法统一
🧮 is/2 的行为
is 是求值的操作符。它先对右边的算术表达式进行求值,再将结果赋值给左边。
?- X is 3 + 4.
X = 7. % 正确地完成了加法运算
但要注意:is 不会进行求值以“反推”一个变量。
?- 7 is X + 4.
ERROR: Arguments are not sufficiently instantiated
上例中 X 没有值,因此 Prolog 无法计算 X + 4。
🧪 更具体的比较:= vs is
让我们看看两个操作在相同表达式下的区别:
✅ = 的行为(结构匹配):
?- A = 3 + 4.
A = 3+4.
✅ is 的行为(表达式求值):
?- A is 3 + 4.
A = 7.
❌ 试图反向使用 is 会失败:
?- 7 is A + 4.
ERROR: Arguments are not sufficiently instantiated
❗ 提醒:is/2 的右侧表达式必须完全可求值
?- A is B + 4.
ERROR: Arguments are not sufficiently instantiated
此时 B 没有绑定,Prolog 无法求值。
解决办法:
?- B = 3, A is B + 4.
B = 3,
A = 7.
🧠 思考题
看看下面这些例子,思考输出结果:
?- A = 3 + 4, B is A.
你觉得输出是什么?
答案:错误!
is 要求右边是“表达式”而不是“结构”。A 被绑定为结构 3 + 4,而不是数值 7,所以 B is A 会报错。
✅ 正确写法:
?- A is 3 + 4, B is A.
A = 7,
B = 7.
这样,A 是值 7,B is A 就可以执行了。
🧾 小结
| 操作符 | 含义 |
|---|---|
= | 结构统一,不进行计算 |
is | 执行右边表达式的数值求值,赋给左边 |
is 要求右侧 所有变量必须已绑定 | |
= 可以绑定任意结构,不要求可计算 |
发表回复