仅使用递增,循环,赋值,零的关系运算

时间:2016-01-16 17:06:22

标签: algorithm math logic equality lambda-calculus

这是以下问题:Subtraction operation using only increment, loop, assign, zero

我们只允许使用以下操作:

  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
    }
    

    如何使用这四项操作实施relational operators?关系操作是:

    1. eq(x,y) - x是否等于y?
    2. lt(x,y) - x是否小于y?
    3. gt(x,y) - x是否大于y?
    4. 我们也有他们的对立面:

      1. ne(x,y) - x是否不等于y?
      2. gte(x,y) - x是否大于或等于y?
      3. lte(x,y) - x是否小于或等于y?
      4. 任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:11)

自然数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操作:< / 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 ≥ yy ≤ 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 < yy > 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为false。因此:

ne(x, y) {
    z = eq(x, y)
    z = not(z)
    return z
}

现在,我们需要做的就是定义以下功能:

  1. 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
    }
    
  2. not函数与isZero函数相同:

    not(x) {
        y = isZero(x)
        return y
    }
    
  3. 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
    }
    
  4. 这就是你所需要的一切。希望有所帮助。