微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么 (( (λf.λx.f(f(f(x)))) (λg.λy.g(g(y))) ) (λz.z + 1)) (0) 求值为 8?

如何解决为什么 (( (λ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 举报,一经查实,本站将立刻删除。