Lambda演算前身功能减少步骤

use*_*246 17 lambda-calculus reduction

我对lambda演算中的前身函数的维基百科描述感到困惑.

维基百科所说的如下:

PRED:=λnfx.n(λgh.h(gf))(λu.x)(λu.u)

有人可以一步一步地解释减少过程吗?

谢谢.

C. *_*ann 25

好吧,所以教会数字的想法是用函数编码"数据",对吧?可行的方法是通过您使用它执行的某些通用操作来表示值.因此,我们也可以走向另一个方向,这有时可以使事情变得更加清晰.

教会数字是自然数字的一元表示.所以,让我们Z用来表示零,并Sn代表继承者n.现在,我们可以算这样的:Z,SZ,SSZ,SSSZ...等效教会数字有两个参数-第一个对应S,二来Z--then使用它们来构建上面的图案.因此,给定的参数fx,我们可以算这样的:x,f x,f (f x),f (f (f x))...

让我们来看看PRED的作用.

首先,它创建了一个带有三个参数的lambda-- n是教会数字,我们想要的前任,当然,这意味着f并且x是结果数字的参数,这意味着该lambda的主体将被f应用于x一次少于n.

接下来,它适用n三个参数.这是棘手的部分.

Z与之前对应的第二个参数是 - ?u.x一个忽略一个参数并返回的常量函数x.

S与之前相对应的第一个参数是?gh.h (g f).我们可以重写这一点,?g. (?h.h (g f))以反映只有最外面的lambda被应用的事实n.这个函数的作用是将累积的结果带到目前为止g并返回一个带有一个参数的新函数,该函数将该参数g应用于f.当然,这绝对令人困惑.

那么......这里发生了什么?考虑用S和直接替换Z.在非零数字中Sn,n对应于绑定的参数g.所以,记住,fx在外部范围的约束,我们可以算这样的:?u.x,?h. h ((?u.x) f),?h'. h' ((?h. h ((?u.x) f)) f)...表演明显下降,我们得到:?u.x,?h. h x,?h'. h' (f x)...这里的模式是一个功能被传递"向内"一层,一个S将应用它,而一个Z将忽略它.所以我们除了最外层之外f每个应用程序都有一个应用程序.S

第三个参数只是身份函数,它由最外面的人尽职尽责地应用S,返回最终结果 - f应用的次数少于S层数n对应的次数.


xin*_*ang 7

麦肯的答案很好地解释了它.让我们来看看Pred 3 = 2的一个具体例子:

考虑表达式:n(λgh.h(gf))(λu.x).设K =(λgh.h(gf))

对于n = 0,我们进行编码0 = ?fx.x,因此当我们应用beta减少时,(?fx.x)(?gh.h(gf))均值(?gh.h(gf))被替换为0次.进一步降低beta后,我们得到:

?fx.(?u.x)(?u.u)

减少到

?fx.x

在哪里?fx.x = 0,如预期.

对于n = 1,我们应用K 1次:

(?gh.h (g f)) (?u.x) => ?h. h((?u.x) f) => ?h. h x

对于n = 2,我们应用K 2次:

(?gh.h (g f)) (?h. h x) => ?h. h ((?h. h x) f) => ?h. h (f x)

对于n = 3,我们应用K 3次:

(?gh.h (g f)) (?h. h (f x)) => ?h.h ((?h. h (f x)) f) => ?h.h (f (f x))

最后,我们得到了这个结果并对它应用了一个id函数

?h.h (f (f x)) (?u.u) => (?u.u)(f (f x)) => f (f x)

这是2号的定义.

基于列表的实现可能更容易理解,但需要许多中间步骤.所以它不如教会最初的实施IMO那么好.