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

Alpha equivalence between variables in lambda calculus

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

两个术语是 alpha 等价的,当且仅当一个可以完全通过 重命名绑定变量.

转换为另一个

一个变量被认为是一个 绑定变量 如果它匹配一些封闭的 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

基本上,"bound"和"free"大致对应过程语言中"in scope"和"out of scope"的概念。

Alpha-equivalence 基本上抓住了这样的想法,即如果您还修复了对该变量的所有引用,则在程序中重命名该变量是安全的。也就是说,当您更改 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 吗? No! 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

在语言实现中正确重命名是一个非常棘手的问题,许多编译器编写者选择 nameless 术语表示,称为 de Bruijn indices.变量不是使用文本,而是表示为一个数字,用于测量变量绑定了多少个 lambda。 λx2. λx1. x2 x1 的无名表示看起来像 λ. λ. 2 1。请注意,这与 λx1. λx2. x1 x2 的 de Bruijn 表示完全相同。 de Bruijn 索引彻底解决了 alpha 等效问题(尽管它们很难阅读)。