仅使用增量、循环、赋值、零的关系运算

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 - 10 而不是-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 ≥ yy ≤ x 相同。因此:

gte(x, y) 
    z = lte(y, x)
    return z

我们知道如果x &gt; y 为真,那么x ≤ y 为假。因此:

gt(x, y) 
    z = lte(x, y)
    z = not(z)
    return z

我们知道x &lt; yy &gt; x 相同。因此:

lt(x, y) 
    z = gt(y, x)
    return z

我们知道如果x ≤ yy ≤ 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。

以上是关于仅使用增量、循环、赋值、零的关系运算的主要内容,如果未能解决你的问题,请参考以下文章

使用增量、循环、赋值、归零进行除法运算

java循环语句与数组学习

为啥赋值运算符和相等运算符之间没有 1:1 的关系?

JavaScript关系运算符 赋值运算符

Learing-Python:Python中的基本运算符

C++基础-5-运算符重载(加号,左移,递增,赋值,关系,函数调用)