什么是“捕获避免替代”?

时间:2012-06-28 06:38:39

标签: programming-languages lambda-calculus

在Wiki中阅读Lambda微积分时,遇到了“强>捕获 - 避免替换”一词。有人可以解释它的含义,因为我无法从任何地方找到定义。

谢谢

PS

我想知道的是告诉操作捕获避免替换的原因。如果有人能做到这一点,那将是一个很大的帮助

3 个答案:

答案 0 :(得分:49)

通常,我们在lambda演算中选择的特定变量名称是无意义的 - x的函数与ab或{{1}的函数相同}}。换句话说:

(λx。(λy.yx))相当于(λa。(λb.ba)) - 将c重命名为x而将a重命名为y 改变任何事情。

由此可以得出结论,允许任何替换 - 即任何lambda术语中的任何变量都可以被任何其他变量替换。事实并非如此。考虑上面第一个表达式中的内部lambda:

(λy.yx)

在这个表达式中,b是“自由的” - 它不受lambda抽象的“约束”。如果我们要将x替换为y,则表达式将变为:

(λx.xx)

这有着完全不同的含义。 x现在都引用了lambda抽象的参数。最后x(最初是“免费”)已被“捕获”;它被lambda抽象“束缚”。

避免意外捕获自由变量的替代品被称为“捕获 - 避免替换”。

现在,如果我们在lambda演算中所关心的只是将一个变量替换为另一个变量,那么生活将会非常无聊。更现实的是,我们想要做的是用 lambda术语替换变量。因此,我们可以用 lambda抽象(λx.t)或应用程序(x t)替换变量。在任何一种情况下,同样的考虑都适用 - 当我们进行替换时,我们希望确保不会通过意外“捕获”最初自由的变量来改变原始表达式的含义。

答案 1 :(得分:7)

如果变量被放置在绑定变量的lambda(或其他绑定结构,如果它们存在)下,则捕获。它被称为捕获 - 避免替换,因为该过程避免意外地允许在原始表达式中捕获替换中的自由变量。

答案 2 :(得分:5)

用E代替E'(写成[E'/ x] E)

  • 步骤1.重命名E和E'中的绑定变量,使它们是唯一的
  • 步骤2.在E
    中对E进行文本替换E' 被称为捕获 - 避免替换

示例: [y(λx.x)/ x]λy。 (λx.x)y x

重命名后:[y(λv.v)/ x]λz。 (λu.u)z x
替换后:λz。 (λu.u)z(y(λv.v))