仅使用递增,循环,赋值,零的减法运算

时间:2015-12-03 23:27:16

标签: math logic addition subtraction lambda-calculus

我正在尝试使用以下内容构建减法,加法,除法,乘法和其他操作:

  1. incr(x) - 调用此函数后,它会将x + 1分配给x
  2. assign(x,y) - 此函数将y的值赋给x(x = y)
  3. 零(x) - 此函数将0分配给x(x = 0)
  4. 循环X {} - 括号内的操作将执行X次
  5. 使用以下规则,可以直接实现这样的添加(添加):

    ADD (x, y) {
     loop X {
       y = incr (y)
     }
    return y
    }
    

    但是,我正在努力实施减法。我认为所有其他所需的操作都可以使用减法完成。

    任何提示都将非常受欢迎。

1 个答案:

答案 0 :(得分:9)

Stephen Cole Kleene设计了一种使用整数加法执行整数减法的方法。但是,它假定您不能有负整数。例如:

$('.site-header').outerHeight(true); // With vertical margins included.

在您的问题中,您使用增量操作实现了添加操作。

类似地,您可以使用递减操作实现减法操作,如下所示:

0 - 1 = 0
1 - 1 = 0
2 - 1 = 1
3 - 1 = 2
4 - 1 = 3
5 - 2 = 3
6 - 3 = 3
6 - 4 = 2
6 - 5 = 1
6 - 6 = 0
6 - 7 = 0

现在,我们需要做的就是实现减量操作。

这是Kleene的风格所在:

sub(x, y) {
    loop y
        { x = decr(x) }
    return x
}

我们已经使用了所有这四项操作。这是它的工作原理:

  1. 我们有两个基本案例,decr(x) { y = 0 z = 0 loop x { y = z z = incr(z) } return y } y的基本情况)和0z的基本情况):

    1

    因此,我们将它们初始化为y = 0 - 1 = 0 z = 1 - 1 = 0

  2. 0x时,我们会循环0次(即从不),然后我们只返回0

  3. y = 0x时,我们会运行一次循环,指定1,然后返回y = z

  4. 请注意,每次运行循环y = z = 0都会保存当前迭代的结果,而y保存下一次迭代的结果。这就是我们需要两个基本案例的原因。递减函数不是连续函数。这是一个piecewise函数:

    z
    当克莱恩去看牙医并且牙医拔出他的两颗牙齿时,他意识到了这一点。他在试图解决这个问题时感到很沮丧,当牙医拔出两颗牙齿时,他意识到他需要两个基础病例。