这是以下问题:Subtraction operation using only increment, loop, assign, zero
我们只允许使用以下操作:
例如,可以按如下方式实现添加:
add(x, y) {
loop x
{ y = incr(y) }
return y
}
如何使用这四项操作实施relational operators?关系操作是:
我们也有他们的对立面:
任何帮助将不胜感激。
答案 0 :(得分:11)
自然数N
的集合在加法和减法下关闭:
N + N = N
N - N = N
这意味着两个自然数的加法或减法也是一个自然数(考虑0 - 1
是0
而不是-1
,我们不能有负自然数)。
但是,在关系操作下,自然数N
的集合未关闭:
N < N = {0, 1}
N > N = {0, 1}
这意味着比较两个自然数的结果是真实性(即1
)或虚假(即0
)。
因此,我们将布尔值集(即{0, 1}
)视为一组受限制的自然数(即N
)。
false = 0
true = incr(false)
我们必须回答的第一个问题是“我们如何编码if
语句,以便我们可以根据真实性或虚假性进行分支?”答案很简单,我们使用loop
操作:< / p>
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
为false。因此:
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
为真,则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 = 0
loop 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
}
这就是你所需要的一切。希望有所帮助。