以下是 《Learn Prolog Now!》第五章 第一节 “Prolog 中的数字运算” 的中文翻译与讲解


📘 第五章 第一节:Prolog 中的数字运算(Arithmetic in Prolog)

✨ 引子

Prolog 并不是为数值计算设计的语言,但它确实提供了进行算术计算的能力。
在这一节中,我们将学习:

  • 如何编写可以执行基本数学运算的规则;
  • 如何在 Prolog 中表示数字;
  • is/2 的工作方式;
  • 为什么 = 与 is 的含义不同;
  • 比较运算符的使用方式。

🔢 数字和 is 操作符

在 Prolog 中,要执行算术运算,我们不能使用 =,而要用 is

❌ 错误示例:

X = 3 + 4.

这不会让 X 变成 7,而是:

X = 3 + 4.

即:Prolog 会把 3 + 4 看作一个结构体(compound term),而不是去计算它。

✅ 正确做法:

X is 3 + 4.

这时 X 将被赋值为 7

注意:

  • is 的右边必须是一个可以求值的算术表达式
  • 所有参与运算的变量必须已经有了数值,否则会出错。

示例代码:

?- X is 2 + 3.
X = 5.

?- X is (7 * 3) + (4 * 2).
X = 29.

?- Y = 5, X is Y * 2.
X = 10,
Y = 5.

⚠️ 等号 = 与 is 的区别

?- X = 3 + 4.
X = 3+4.          % 结构,不做计算

?- X is 3 + 4.
X = 7.            % 执行加法

再来看一个例子:

?- A = 6, B = 2, A is B + 4.
A = 6,
B = 2.

而如果你反过来写:

?- A is B + 4, B = 2.
ERROR: Arguments are not sufficiently instantiated

这说明:is 要求其右侧的变量必须已被绑定


📊 Prolog 中的算术运算符

运算表达式说明
加法X is A + B
减法X is A - B
乘法X is A * B
除法(浮点)X is A / B得到小数
整除X is A // B向下取整
取余X is A mod B求余数
幂运算X is A ** B幂(A 的 B 次方)

🧮 比较运算符

Prolog 还提供了数值比较操作:

比较含义
=:=数值相等
=\=数值不等
<小于
=<小于或等于
>大于
>=大于或等于

示例:

?- 3 + 4 =:= 7.
true.

?- X is 3 + 4, X > 5.
X = 7.

注意:这些比较操作符只能比较数值,不能比较结构。结构比较要用 @<@>== 等。


🧠 总结

  • 使用 is 来进行数学运算;
  • 不要混淆 is 和 =
  • 比较运算符只能用于数值;
  • is 要求右边的表达式必须完全可计算(所有变量必须已赋值)。