Lambda 微积分 beta 归约

Lambda Calculus beta reduction

我有以下 lambda 演算:

( x ( λyz.xz ) ( λxy.zyx )) (( λyx.xyz ) ( λy.xz ))

我已经减少了:

alpha => ( x ( λyz.xz ) ( λxy.zyx )) (( λyx1.x1yz )) ( λy.xz ))
beta  => ( x ( λyz.xz ) ( λxy.zyx )) ( λx1.x1 ( λy.xz ) z )

我的问题:为什么下面的归约是错误的?他们似乎简化了我的表达方式:

beta1 => ( x ( λyz.xz ) ( λxy.zyx )) ( λx1.x1 ( xz ))
beta2 => ( x ( λy.x ( λxy.zyx ))) ( λx1.x1 ( xz ))

为避免混淆,我建议多进行 alpha 重命名。 所以看起来你在 "scope" 中有 xz(它们不受你术语中任何 λ 的约束),最好确定你是否是否指的是他们。

我会这样改写你的术语:

(x (λy1,z1. x z1) (λx2,y2. z y2 x2)) ((λy3,x3. x3 y3 z) (λy4. x z))

重命名我走得很远(当然这是不必要的,但这样,我们就知道哪个是哪个了)。

这个词 beta-reduces 到

(x (λy1,z1. x z1) (λx2,y2. z y2 x2)) ((λx3. x3 (λy4. x z) z))

然后

(x (λy1,z1. x z1) (λx2,y2. z y2 x2)) ((λx3. x3 (λy4. x z) z))

这确实与您所写的 alpha 等效。 然后你要做的是将 (λy4. x z) 应用到 z。 这不是你应该阅读 x3 (λy4. x z) z 的方式,它也可以像 (x3 (λy4. x z)) z 这样用更多的括号写成。 这个术语不知何故被卡住了,因为它的头是一个变量。

您对此无能为力,因为该术语还涉及您无法减少的应用程序。 也许你也可以通过 eta-reduction 将 (λy1,z1. x z1) 重写为 (λy1. x)

所以你不能得到 (x (λyz.xz) (λxy.zyx)) (λx1.x1 (x z)) 并且出于同样的原因,你不能将它减少到 (x (λy.x (λxy.zyx))) (λx1.x1 (x z)) 因为你把括号弄错了。

f x y 从左到右读取,你取 f 并将其应用到 x,然后将结果应用到 y.

我会保持这个答案非常简单。

要减少到 beta1 或 beta2,请注意您已减少 ( λy.xz ) z in "x1 ( λy.xz ) z" 就像 "x1 ( ( λy.xz ) z ) ",所以你可以减少。,即 parenthesize/group 最后两个表达式 ( λy.xz ) 和 z 在一起,这是错误的。

这不是它应该的工作方式。在减少 lambda 表达式的同时,您应该保持 左结合性., 即,始终将最左边的表达式组合在一起,例如“ ( x1 ( λy.xz ) ) z” 而不是 "x1 ( ( λy.xz ) z )" [这是错误的]。

左结合性,如果有E1 E2 E3 E4这样的表达式,

您应该将其分组为 ( ( (E1 E2) E3 ) E4 )

因此,对于 beta2,您不能将 x1 ( λy.xz ) z 减少到 "x1 ( xz )"。 beta1 的逻辑相同。

我希望这对你有意义。