仅使用增量、循环、赋值、零的关系运算
Posted
技术标签:
【中文标题】仅使用增量、循环、赋值、零的关系运算【英文标题】:Relational operations using only increment, loop, assign, zero 【发布时间】:2016-04-22 03:28:45 【问题描述】:这是针对Subtraction operation using only increment, loop, assign, zero的后续问题
我们只能使用以下操作:
-
incr(x) - 一旦这个函数被调用,它会将 x + 1 分配给 x
assign(x, y) - 这个函数会将 y 的值赋给 x (x = y)
zero(x) - 此函数会将 0 分配给 x (x = 0)
循环 X - 括号内的操作将被执行 X 次
例如加法可以这样实现:
add(x, y)
loop x
y = incr(y)
return y
如何使用这四个操作实现relational operators?关系操作是:
-
eq(x, y) - x 是否等于 y?
lt(x, y) - x 是否小于 y?
gt(x, y) - x 是否大于 y?
我们也有他们的对立面:
-
ne(x, y) - x 不等于 y 吗?
gte(x, y) - x 是否大于或等于 y?
lte(x, y) - x 是否小于或等于 y?
任何帮助将不胜感激。
【问题讨论】:
也许您有兴趣了解Lambda calculus 和Church encoding。这两篇文章直接回答了您的问题。 如果它解决了您的问题,您应该接受我的回答。点击我的答案旁边的勾号。 【参考方案1】:自然数集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
操作:
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
为真,那么x ≠ y
为假。因此:
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
这就是你所需要的。希望对您有所帮助。
【讨论】:
非常感谢 Aadit.Interesting 解释得很好。 谢谢@LeandroCaniglia。以上是关于仅使用增量、循环、赋值、零的关系运算的主要内容,如果未能解决你的问题,请参考以下文章