自然数集
N在加法和减法下是封闭的:
N + N = NN - N = N
这意味着两个自然数的加法或减法也是自然数(考虑到
0 - 1is
0和not
-1,我们不能有负自然数)。
但是,自然数集
N在关系运算下不会关闭:
N < N = {0, 1}N > N = {0, 1}这意味着比较两个自然数的结果是真实性(即
1)或虚假性(即
0)。
因此,我们将布尔值集(即
{0, 1})视为自然数的受限集(即N)。
false = 0true = incr(false)
我们必须回答的第一个问题是“我们如何对
if语句进行编码,以便我们可以基于真实性或虚假性进行分支?” 答案很简单,我们使用以下
loop操作:
isZero(x) { y = true loop x { y = false } return y}如果循环条件为
true(即
1),则循环仅执行一次。如果循环条件为
false(即
0),则循环不会执行。我们可以用它来编写分支代码。
那么,我们如何定义关系运算呢?事实证明,所有内容都可以通过以下方式定义
lte:
lte(x, y) { z = sub(x, y) z = isZero(z) return z}我们知道这
x ≥ y与相同
y ≤ x。因此:
gte(x, y) { z = lte(y, x) return z}我们知道,如果
x > y为真
x ≤ y则为假。因此:
gt(x, y) { z = lte(x, y) z = not(z) return z}我们知道这
x < y与相同
y > x。因此:
lt(x, y) { z = gt(y, x) return z}我们知道,如果
x ≤ y和
y ≤ x再
x = y。因此:
eq(x, y) { l = lte(x, y) r = lte(y, x) z = and(l, r) return z}最后,我们知道如果
x = y为true,
x ≠ y则为false。因此:
ne(x, y) { z = eq(x, y) z = not(z) return z}现在,我们需要做的就是定义以下功能:
该
sub
函数定义如下:sub(x, y) {loop y { x = decr(x) }return x}
decr(x) {
y = 0
z = 0loop x { y = z z = incr(z)}return y}
该
not
功能与该isZero
功能相同:not(x) {y = isZero(x)return y}
该
and
功能与该mul
功能相同:and(x, y) {z = mul(x, y)return z}
mul(x, y) {
z = 0
loop x { z = add(y, z) }
return z
}add(x, y) {
loop x
{ y = incr(y) }
return y
}
这就是您所需要的。希望有帮助。



