在上一节我们学到了 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 是值 7B is A 就可以执行了。


🧾 小结

操作符含义
=结构统一,不进行计算
is执行右边表达式的数值求值,赋给左边
is 要求右侧 所有变量必须已绑定
= 可以绑定任意结构,不要求可计算