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