在上一节我们学到了 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 要求右侧 所有变量必须已绑定 | |
= 可以绑定任意结构,不要求可计算 |
发表回复