问题描述
我刚刚阅读了 Raul Rojas 的“Lambda 微积分教程介绍1”。我将 lambda 表达式放入 Scheme (TinyScheme) 中进行尝试。除了递归函数使用内存不足的 Y 组合器计算教堂数字 0,1,...,N 的总和外,一切都有效。奇怪的是,如果我使用常规数字计算总和,Y 组合器就可以工作。
这是我的 Y 组合器,
(define myY
(lambda (y)
((lambda (x) (x x))
(lambda (x)
(y (lambda (a) ((x x) a)))))))
这里是一个递归函数,用于得到N个正则数之和,
(define sum1
(lambda (r)
(lambda (x)
(cond
((zero? x) 0)
(else (+ x (r (sub1 x))))))))
这有效
> ((myY sum1) 10)
55
在教程第 15 页的底部,递归函数 R=Lrx.Zx0(NS(r(PN))) 用于计算 N 个数字的总和(L=lambda)。在这个表达式中,r 将是递归函数,x 将是一个教堂数,Z 是零函数的测试,0 是一个作为教堂数的零,N 是一个教堂数,S 是后继函数,P 是前任函数。我已将其翻译成 Scheme 为,
(define myR
(lambda (r)
(lambda (x)
(((myZ x) my0) ((x myS) (r (myP x))))
)))
然而,即使取 0 数的总和也会爆炸。
> ((((myY myR) my0) add1) 0)
No memory!
在上面的行中,((myY myR) my0) 应该返回教会编号零。我只是让教会编号对 add1 采取行动,以获得人类可读的教会编号。
最初,我认为 Y 组合器是问题所在,但是,正如我所展示的,这适用于使用常规数字的递归函数。 Church 数的定义与适用于算术(加法、乘法、不等式)的 lambda 表达式的教程和 Scheme 版本相同。
编辑: 函数 myZ 是 lambda 表达式 Z=Lx.xF¬F,其中 F=Lxy.y 是 False(True 是 T=Lxy.x),而 ¬=Lx.xFT 不是。函数 Z 执行条件测试,因为 Z0=T 和 ZN=F,其中 0 是零的教堂数 (0=Lxy.y),N 是非零的教堂数 (1=Lxy.xy,2=Lxy。 x(xy) 等)实现 Z 的 Scheme 代码 myZ 是,
(define myZ
(lambda (x)
(((x myF) myNeg) myF)
))
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)