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