如何解决为什么 (( (λf.λx.f(f(f(x)))) (λg.λy.g(g(y))) ) (λz.z + 1)) (0) 求值为 8?
所以我有这个 lambda 表达式:(λf.λx.f(f(f(x)))) (λg.λy.g(g(y)))(λz.z + 1)(0)
并且我正在尝试手动评估它。他们的想法是,(λf.λx.f(f(f(x))))
基本上代表表达式 f(f(f(x)))
。那么同样 (λg.λy.g(g(y)))
表示表达式 g(g(y))
。然后传入 g(g(y))
来替换 f。所以我们得到 g(g(g(g(g(g(y))))))
。或 g
与自身组合 6
次。然后我们为 z+1
传入 g
,然后将 0
插入到最终表达式中,我们最终得到 6
。
>>>(((lambda f: lambda x: f(f(f(x))))(lambda g: lambda y: g(g(y))))(lambda z: z+1))(0)
8
问题是,当我使用 python 的内置 lambda 演算工具验证这个答案时,我得到 8 作为答案。
很明显,我的评估是错误的。我正在考虑将 2 g 组合乘以 3 f 组合以获得 6。但显然我应该将其视为 2^3 组合,但我不明白为什么。
解决方法
你的直觉让你有些失望。尝试以“直观”的方式组合这两个表达式是很诱人的,但这样做过于简单化了问题。让我们来看看前几个步骤。
这是您的 lambda 表达式,为了便于阅读,删除了一些无关的括号
(λf.λx.f(f(fx))) (λg.λy.g(gy)) (λz.z+1) 0
现在,您的直觉告诉您,我们通过让 f
成为 λy.g(gy)
来“组合”前两个函数。但事实并非如此。看,我们不会让 f
成为 λy.g(gy)
;我们让 f
成为 λg.λy.g(gy)
(此时 g
仍然是一个参数)。所以第一个简化适用于
(λx.(λg.λy.g(gy))((λg.λy.g(gy))((λg.λy.g(gy))x))) (λz.z+1) 0
这是一个令人困惑的混乱,但重点是重复的位仍然有 g
参数。然后我们为 λz.z+1
插入 x
,这无疑相当简单
(λg.λy.g(gy)) ((λg.λy.g(gy))((λg.λy.g(gy))(λz.z+1))) 0
好的。现在在最里面的 redex 中,我们将让 g
为 (λz.z+1)
。所以,忽略这个过程的几个步骤,我们将在 y
上得到一个函数,它说“向这个东西添加两次”。即
(λg.λy.g(gy)) ((λg.λy.g(gy))(λy.y+2)) 0
好的,现在让我们再做一次。 redex 的左侧和以前一样,所以我们将在右侧做两次。右边的东西是“给这个数字加一”,所以我们得到
(λg.λy.g(gy)) (λy.y+4) 0
最后,做最后一次。我们将 4 与一个数字相加两次。
(λy.y+8) 0
对于大奖,零加八是...
8
,
像 Silvio 一样循序渐进地完成它绝对是一个很好的练习,但更简单:
你把f->f^3应用到g->g^2上,不就是g->(((g^2)^2)^2) = g^8吗? 所以 (+1)^8 (0) = 8
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。