lambda演算中变量之间的Alpha等价

时间:2017-12-11 22:00:29

标签: haskell lambda-calculus

这是一个相当简单的问题(所以在我看来)。如果两个变量(x)(x)是alpha等价的。 (x1x2)(x2x1) alpha等价吗?

1 个答案:

答案 0 :(得分:8)

如果一个术语可以纯粹通过重命名绑定变量转换为另一个术语,则两个术语是等效的。

如果变量与某些封闭的lambda的参数名称匹配,则该变量被视为绑定变量。否则它是自由变量。以下是一些例子:

λx. x          -- x is bound
λx. y          -- y is free
λf. λx. f x y  -- f and x are bound, y is free
f (λf. f x)    -- the first f is free; the second is bound. x is free
z              -- z is free

基本上,“绑定”和“自由”大致对应于程序语言中“范围”和“范围外”的概念。

如果你还修复了对该变量的所有引用,那么Alpha等价基本上捕获了在程序中重命名变量是安全的想法。也就是说,当您更改lambda术语的参数时,您还必须进入lambda的主体并更改该变量的用法。 (如果名称由第一个lambda中的另一个lambda重新绑定,则最好确保不在内部lambda中执行重命名。)

以下是alpha等效术语的一些示例:

λx. x   <->   λy. y   <->   λberp. berp
λx. λf. f x   <->   λx. λg. g x   <->   λf. λx. x f   <->  λx1. λx2. x2 x1
λf. λf. f f   <->   λg. λf. f f   <->   λf. λg. g g

x x alpha等效于x1x2 x1x2吗? 不! x在第一个字词中免费,因为它不受封闭的lambda的约束。 (也许它是对全局变量的引用。)因此将它重命名为x1x2是不安全的。

我怀疑你的导师真的应该说λx. x xλx1x2. x1x2 x1x2相当。这里x由lambda绑定,因此您可以安全地重命名它。

x1 x2 alpha等效于x2 x1?出于同样的原因,

λx1. λx2. x1 x2相当于λx1. λx2. x2 x1?同样,,因为这不仅仅是重命名 - x1x2变量四处移动。

但是,λx1. λx2. x1 x2 alpha等效于λx2. λx1. x2 x1

  1. x1重命名为某个临时名称,例如zλz. λx2. z x2
  2. x2重命名为x1λz. λx1. z x1
  3. z重命名为x2λx2. λx1. x2 x1
  4. 在语言实现中正确地重命名是一个非常麻烦的问题,许多编译器编写者选择无名表示名为 de Bruijn indices 的术语。变量不是使用文本,而是表示一个数字,用于衡量变量绑定的lambdas数量。 λx2. λx1. x2 x1的无名表示看起来像λ. λ. 2 1。请注意,这与λx1. λx2. x1 x2的de Bruijn表示完全相同。 de Bruijn指数彻底解决了α等价问题(尽管它们很难阅读)。