在Lambda Calculus中定义二进制指数运算符CARAT

时间:2013-12-09 04:02:31

标签: lambda-calculus church-encoding

我试图在lambda演算中定义运算符CARAT的二进制指数运算符。例如,这个运算符可能有两个参数,数字2的lambda编码和数字4的lambda编码,并计算数字16的lambda编码。我不是我的答案是对还是错但我花了一天时间这样做。我用过教堂数字定义。

这是我的答案。如果我的回答有误,请纠正我。我不知道如何以正确的方式做到这一点。如果有人知道那么请帮我找出简短的答案。

后续函数next,可以添加一个,可以用zeronext来定义自然数:

1 = (next 0)    
2 = (next 1)
  = (next (next 0))    
3 = (next 2)
  = (next (next (next 0)))

根据上述结论,我们可以将函数next定义如下:

next = λ n. λ f. λ x.(f ((n f) x))
one  = (next zero)
     => (λ n. λ f. λ x.(f ((n f) x)) zero)
     => λ f. λ x.(f ((zero f) x))
     => λ f. λ x.(f ((λ g. λ y.y f) x)) -----> (* alpha conversion avoids clash *)
     => λ f. λ x.(f (λ y.y x))
     => λ f. λ x.(f x)

因此,我们可以安全地证明......。

zero = λ f. λ x.x
one = λ f. λ x.(f x)
two = λ f. λ x.(f (f x))
three = λ f. λ x.(f (f (f x)))
four = λ f. λ x.(f (f (f (f x))))
:
:
:
Sixteen = λ f. λ x.(f (f (f (f (f (f (f (f (f (f (f (f (f (f (f (f x))))))))))))))))

添加只是后继的迭代。我们现在可以根据next

来定义添加
m next n => λx.(nextm x) n => nextm n => m+n
add = λ m. λ n. λ f. λ x.((((m next) n) f) x)
four = ((add two) two)
     => ((λ m. λ n. λ f. λ x.((((m next) n) f) x) two) two)
     => (λ n. λ f. λ x.((((two next) n) f) x)two)
     => λ f. λ x.((((two next) two) f x)
     => λ f. λ x.(((( λ g. λ y.(g (g y)) next) two) f x)
     => λ f. λ x.((( λ y.(next (next y)) two) f) x)
     => λ f. λ x.(((next (next two)) f) x)
     => λ f. λ x.(((next (λ n. λ f. λ x.(f ((n f) x)) two)) f) x)

在将值替换为“next”并随后替换为“two”之后,我们可以进一步将上述形式减少为

     => λ f. λ x.(f (f (f (f x)))) 

即。 4。

类似地,乘法是一个加法的迭代。因此,乘法定义如下:

mul = λ m. λ n. λ x.(m (add n) x)
six = ((mul two) three)
 => ((λ m. λ n. λ x.(m (add n) x) two) three)
 => (λ n. λ x.(two (add n) x) three)
 => λ x.(two (add three) x
 => ( λf. λx.(f(fx)) add three) 
 =>( λx.(add(add x)) three)
 => (add(add 3))
 => ( λ m. λ n. λ f. λ x.((((m next) n) f) x)add three)
 => ( λ n. λ f. λ x.((( three next)n)f)x)add)
 => ( λ f. λ x.((three next)add)f)x)

将值替换为“三”,“下一步”,然后“添加”,然后再替换为“下一步”,上述表格将减少为

 => λ f. λ x.(f (f (f (f (f (f x)))))) 

即。 6。

最后,取幂可以通过迭代乘法来定义

假设求幂函数被称为CARAT

CARAT = λm.λn.(m (mul n) )
sixteen => ((CARAT four) two)
 => (λ m. λ n.(m (mul n) four) two)
 => (λ n.(two (mul n)four
 => (two (mul four))
 => ((λ f. λ x.(f (f x))))mul)four)
 => (λ x. (mul(mul x))four)
 => (mul(mul four))))
 => (((((λ m. λ n. λ x.(m (add n) x)mul)four)
 => ((((λ n. λ x.(mul(add n) x)four)
 => (λ x.(mul(add four) x))
 => (λ x (λ m. λ n. λ x.(m (add n) x add)four) x
 => (λ x (λ n. λ x. (add(add n) x)four)x
 => (λ x (λ x (add (add four) x) x)
 => (λ x (λ x (λ m. λ n. λ f. λ x((((m next) n) f) x)add )four) x) x)
 => (λ x (λ x (λ n. λ f. λ x(((add next)n)f)x)four)x)x)
 => (λ x (λ x (λ f. λ x((add next)four)f)x)x)x) 
 => (λ x (λ x (λ f. λ x((λ m. λ n. λ f. λ x((((m next) n) f) x)next)four)f)x)x)x)
 => (λ x (λ x (λ f. λ x((λ n. λ f. λ x.(((next next)n)f)x)four)f)x)x)x)
 => (λ x (λ x (λ f. λ x((λ f. λ x ((next next)four)f)x)f)x)x)x)
 => (λ x (λ x (λ f. λ x((λ f. λ x(((λ n. λ f. λ x.(f ((n f) x))next)four)f)x)f)x)x)x)

现在,减少上面的表达并替换'next'和'four'并进一步减少,我们得到以下表格

λ f. λ x.(f (f (f (f (f (f (f (f (f (f (f (f (f (f (f (f x)))))))))))))))) 

即。 16。

1 个答案:

答案 0 :(得分:1)

首先,重新编写next = λ n. λ f. λ x.(f ((n f) x))

next = λ num. λ succ. λ zero. succ (num succ zero)

在lambda-calculus中,括号仅用于分组;一个应用程序通过术语的并置来表示,即只是将一个术语写在另一个术语旁边,并且与左侧相关联。

我们如何阅读以上内容?这是一个lambda术语。当它应用于其他一些lambda术语时,比如NUM,它将减少为lambda术语λ succ. λ zero. succ (NUM succ zero)。这将是直接结果,表示由NUM表示的给定数字的下一个数字。我们可以读 it 对我们说,“我不知道如何计算继承者,或者它意味着什么是零,但如果两者都提供给我,我将生产根据它们的一些结果,并根据用于创建我的lambda-term NUM,通过向NUM提供这些计算方法,然后将其结果再次应用于给定的后继函数我“的。

这当然是假设NUM尊重相同的假设并以一致的方式运作。特别是ZERO,当应用于sz时,必须返回z

ZERO = λ s. λ z. z  ; == λ a. λ b. b == ...

其他所有内容都来自此。