lambda演算,为何将邱奇数带入一个后继函数后化简错误?
1.
这个约定在帖子https://zhuanlan.zhihu.com/p/30510749中。这个帖子第一次在注释中提到了这个约定(我的理解):如果lambda项的返回值是另一个lambda项,那么这个lambda表达式的形参可以和返回值的形参写在一起
如图:lambda s.lambda z.z => lambda ab.b
2.
还是上面那个帖子。我的理解:当lambda表达式的形参叠在一起时,形参将每次分割一个,传入lambda项中
如图:(lambda y.xy)(ab)或者 (lambda y.xy)ab ,ab每次分割一个,也就是第一次取a,第二次取b,传入lambda项lambda y.xy中。
将a传入,使用bate规约,得到xa(b) (虽然是个错误的表达式但我应该没化简错).
此时结合以上两点,可以继续读这篇帖子了:
lambda abc.b(abc) 是啥意思?先使用约定1:
lambda abc.b(abc) =>
lambda a.lambda b.lambda c.b(abc) 再使用约定2=>
(((lambda a.lambda b.lambda c.b)a)b)c
使用bate 规约=>
(lambda c.b)c => b最终结果就是b。然后帖子又开始声明一个匿名函数s0(用后继函数计算0大概是说把0当做参数传入一个好的后继函数之中,将最终返回值赋值给S0,反正下面的例子是这么做的)
(lambda abc.b(abc))(0) 使用alpha 变换=>
(lambda abc.b(abc))(lambda sz.z)=>
b(lambda sz.z)=>
b(lambda s.lambda z.z) 好,我做错了。为什么邱奇0传给了一个常数?
观察帖子中给出的计算规则,他先使用alpha变换将0作为参数放入了表达式中=>
( (((lambda a.lambda b.lambda c.b)a)b)c ) (lambda sz.z)为什么?
仔细看维基百科中关于alpha变换中的描述:
首先要明白这句机翻的话是什么意思:
同时....那么....且...有 到底是啥意思?因为是机翻,机器不想把“那么”和“且”都翻译为且,所以第一个翻译为“那么”。这时候把“那么”替换为“且”,就变成了:同时...且...且...有 意思是在“同时”的基础上,满足两个“且”的条件,就有结论“有”。
然后看下面的表达式 lambda v.e == lambda w.e[v:=w] 概括起来就是,当w不是lambda表达式中的自由变量时,才能使用alpha变换,否则 lambda x.(lambda x.x) =>lambda y.(lambda x.x)y (虽然我觉得最后举得这个反例是错误的,但只能这么理解)
于是我理解:上面我的错误是因为我使用alpha变换的时候误将自由变量当做绑定变量给替换了:
(lambda abc.b(abc))(lambda sz.z)=>第一个表达式,也就是“好的后调函数”中,第二个参数b不是表达式中最后一个lambda表达式的最终返回结果b
于是:
(lambda abc.b(abc))(lambda sz.z)=>(lambda abc.p(abc))(lambda sz.z)=>
((((lambda a.lambda b.lambda c.p)a)b)c ) (lambda sz.z) => p(lambda sz.z)
这样,因为p是个自由变量,所以p可能是个函数,它的参数隐藏在p本身中。假设p== lambda a.a
则p(lambda sz.z) => (lambda a.a)(lambda sz.z)使用bate变换,就有了
lambda sz.z
似乎lambda bc.c == lambda bc.b(c)?