虽然 is/2
和算术运算符让我们能在 Prolog 中处理数字运算,但在某些情况下,我们不想要小数,而是整数,比如:取整除值或求余。
本节将讲解:
- 整数除法(整除)操作符
//
- 取余数 的操作符
mod
- 相关运算符的优先级和组合方式
📐 浮点除法 vs 整数除法
✅ 普通除法 /
会产生 浮点数(小数):
?- X is 7 / 2.
X = 3.5.
✅ 整数除法 //
会向下取整:
?- X is 7 // 2.
X = 3.
这很适合在需要整数结果的场景中使用,比如分页逻辑、循环步长等。
🔁 取余(mod)
我们也可以用 mod
来获取 余数:
?- X is 7 mod 2.
X = 1.
再看一些例子:
?- 10 mod 3 =:= 1.
true.
?- X is 15 mod 6.
X = 3.
🧠 总结://
与 mod
配对使用
这些两个操作经常一起使用。
示例:计算整数商和余数
?- N = 17, Q is N // 5, R is N mod 5.
N = 17,
Q = 3,
R = 2.
这就像我们在学校里学的:
17 ÷ 5 = 商 3,余 2
🧮 更多运算符
运算符 | 描述 | 示例 |
---|---|---|
+ | 加 | 3 + 4 |
- | 减 | 5 - 2 |
* | 乘 | 4 * 3 |
/ | 除(结果为小数) | 7 / 2 = 3.5 |
// | 整数除法(向下取整) | 7 // 2 = 3 |
mod | 求余 | 7 mod 2 = 1 |
** | 幂(乘方) | 2 ** 3 = 8 |
^ | 位异或(某些系统) | 5 ^ 3 |
🔧 运算符优先级与结合性(可选进阶)
有时你会看到像这样没有括号的表达式:
X is 2 + 3 * 4.
它的求值顺序是:3 * 4 = 12
,再 2 + 12 = 14
。
因为乘法 *
优先级高于加法 +
,所以 Prolog 按照正常数学规则来。
如果你想改变顺序,显式使用括号即可:
X is (2 + 3) * 4. % 结果为 20
✏️ 小练习(建议你动手尝试)
- 计算 29 除以 5 的整数商和余数。
- 判断
12 mod 4 =:= 0
是否成立。 - 编写规则
even(Number)
:判断一个数是否是偶数。even(X) :- X mod 2 =:= 0.
✅ 小结
//
执行 整数除法;mod
得到 除法的余数;- 运算符优先级与数学一致;
- 括号可以控制运算顺序;
- 这些运算符都可以与
is/2
和比较运算符搭配使用。
发表回复