lambda演算中的教会数字

时间:2018-04-30 20:35:49

标签: lambda-calculus

我需要找到一个函数P(使用Beta - reduction)

P(g, h, i) ->* (h, i, i+1).

我被允许使用后继函数succ。从维基百科我得到了

succ = λn.λf.λx.f(n f x)

我的回答是P = λx.λy.λz.yz(λz.λf.λu.f(z f u))z

但我不太确定。我的逻辑是λx会有效地摆脱g字词,然后λyλz会带来hi通过yz。然后succ函数最后会引入i+1。我只是不知道我的功能是否真的复制了这个。

感谢任何帮助

1 个答案:

答案 0 :(得分:0)

@melpomene指出,如果不考虑具体的实现方式(例如,对于元组),此问题是无法回答的。我要假定,将您的元组实现为:

T = λabcf.f a b c

或者,如果您喜欢非速记:

T = (λa.(λb.(λc.(λf.f a b c))))

也就是说,一个函数将关闭abc,然后等待函数f传递这些变量。

如果这是实现的考虑,并假设使用正常的教堂数字,那么您指定的功能:

P(g, h, i) ->* (h, i, i+1)

需要:

  1. 加入三元组(已应用abc
  2. 构建一个新的三元组,
    • 旧三元组的第二个值
    • 旧三元组的第三个值
    • 旧三元组的第三个值的succ

P是这样的功能:

P = λt.t (λghi.T h i (succ i))

或者再次,如果您更喜欢非速记:

P = (λt.t(λg.(λh.(λi.T h i (succ i)))))

可以使用一些帮助器功能部分清除它:

SND = λt.t (λabc.b)
TRD = λt.t (λabc.c)

在这种情况下,我们可以将P写为:

P = λt.T (SND t) (TRD t) (succ (TRD t))