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)?

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值