这是一个相当简单的问题(所以在我看来)。如果两个变量(x)(x)
是alpha等价的。 (x1x2)(x2x1)
alpha等价吗?
答案 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
?同样,否,因为这不仅仅是重命名 - x1
和x2
变量四处移动。
但是,λx1. λx2. x1 x2
alpha等效于λx2. λx1. x2 x1
:
x1
重命名为某个临时名称,例如z
:λz. λx2. z x2
x2
重命名为x1
:λz. λx1. z x1
z
重命名为x2
:λx2. λx1. x2 x1
在语言实现中正确地重命名是一个非常麻烦的问题,许多编译器编写者选择无名表示名为 de Bruijn indices 的术语。变量不是使用文本,而是表示一个数字,用于衡量变量绑定的lambdas数量。 λx2. λx1. x2 x1
的无名表示看起来像λ. λ. 2 1
。请注意,这与λx1. λx2. x1 x2
的de Bruijn表示完全相同。 de Bruijn指数彻底解决了α等价问题(尽管它们很难阅读)。