Lambda微积分变量的变化及应用题

Lambda Calculus change of variable and application question

我正在学习 Haskell 我正在学习什么是抽象、替换(beta 等价)、应用、自由和绑定变量(alpha 等价),但我对解决这些练习有一些疑问,我不知道不知道我的解决方案是否正确。

进行以下替换

1. (λ x → y x x) [x:= f z] 
Sol. (\x -> y x x) =>α (\w -> y w w) =>α (\w -> x w w) =>β (\w -> f z w w)

2. ((λ x → y x x) x) [y:= x]
Sol. ((\x -> y x x)x) =>α (\w -> y w w)[y:= x] = (\w -> x w w)     

3. ((λ x → y x) (λ y → y x) y) [x:= f y]
Sol. aproximation, i don't know how to do it:  ((\x -> y x)(\y -> y x) y) =>β 
(\x -> y x)y x)[x:= f y] =>β  y x [x:= f y] = y f y

4. ((λ x → λ y → y x x) y) [y:= f z]
Sol aproximation, ((\x -> (\y -> (y x x))) y) =>β ((\y -> (y x x)) y) =>α ((\y -> (y x x)) f z)

我的另一个疑问是我是否可以在 this website 上 运行 这些表达式?这是一个 Lambda 微积分计算器,但我不知道如何 运行 这些测试。

1. (λ x → y x x) [x:= f z]
Sol. (\x -> y x x) =>α (\w -> y w w) =>α (\w -> x w w) =>β (\w -> f z w w)

不,您不能重命名 y,它在 (λ x → y x x) 中是免费的。只有 bound 变量可以(一致地)进行 α 重命名。但是只有 free 变量可以被替换,并且在那个 lambda 项中没有 free x

2. ((λ x → y x x) x) [y:= x]
Sol. ((\x -> y x x)x) =>α (\w -> y w w)[y:= x] = (\w -> x w w)

是的,将 x 替换为 y 将允许它被 λ x 捕获,因此您确实必须在 [=14] 中对 x 进行 α 重命名=] 像您一样首先使用一些新的唯一名称,但出于某种原因您已将应用程序丢弃到免费 x。你不能只省略一个术语的一部分,所以它是 ((\w -> y w w) x)[y:= x]。现在执行替换。请注意,系统不会要求您执行结果项的 β 归约,而只是替换。

我会留下另外两个。只要仔细遵守规则。如果您首先将所有绑定名称重命名为唯一名称,这很容易,即使重命名不是严格要求的,例如

((λ x → y x) (λ y → y x) y) [x:= f y]   -->
((λ w → y w) (λ z → z x) y) [x:= f y]

“唯一”部分还包括替换项中使用的自由变量,这些变量可能会在以其他方式替换后被捕获(即,在替换它们的项中,没有首先执行重命名)。这就是为什么我们必须在上面的项中重命名绑定 y,因为 y 在替换项中出现自由。我们不必重命名绑定 x,但这样做更容易。