Programming languages “是什么意思?”;捕获避免替换;?

Programming languages “是什么意思?”;捕获避免替换;?,programming-languages,lambda-calculus,Programming Languages,Lambda Calculus,在Wiki上阅读Lambda演算时,遇到了术语捕获避免替换。有人能解释一下这是什么意思吗?因为我在任何地方都找不到定义 谢谢 PS 我想知道的是,为什么要告诉你这个操作捕获避免替换。如果有人能做到这一点,那将是一个很大的帮助用E'代替E中的x(写为[E'/x]E) 第一步。重命名E和E'中的绑定变量,使其唯一 第二步。在E中用E'替换x 称为捕获避免替换 示例:[y(λx.x)/x]λy。(λx.x)yx 重命名后:[y(λv.v)/x]λz。(λu.u)zx 替换后:λz。(λu.u)z(

在Wiki上阅读Lambda演算时,遇到了术语捕获避免替换。有人能解释一下这是什么意思吗?因为我在任何地方都找不到定义

谢谢

PS


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

用E'代替E中的x(写为[E'/x]E)

  • 第一步。重命名E和E'中的绑定变量,使其唯一
  • 第二步。在E中用E'替换x
    称为捕获避免替换
示例:[y(λx.x)/x]λy。(λx.x)yx

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

替换后:λz。(λu.u)z(y(λv.v))

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

通常,我们在lambda演算中选择的特定变量名称是没有意义的,
x
的函数与
a
b
c
的函数是一样的。换言之:

(λx.(λy.yx))相当于(λa.(λb.ba))-将
x
重命名为
a
y
重命名为
b
不会改变任何东西

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

(λy.yx)

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

(λx.xx)

这具有完全不同的含义。现在,两个
x
都引用lambda抽象的参数。最后一个
x
(最初是“免费的”)已被“捕获”;它受到lambda抽象的“约束”

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


现在,如果我们在lambda微积分中所关心的只是用一个变量替换另一个变量,那么生活会很无聊。更现实地说,我们要做的是用lambda项替换变量。因此,我们可以用lambda抽象(λx.t)或应用程序(x t)替换变量。在这两种情况下,同样的考虑也适用——当我们进行替换时,我们希望确保不会因为意外地“捕获”了一个原本自由的变量而改变原始表达式的含义。

我真正想知道的是为什么称之为捕获避免替换。我的意思是在概念上,@Jaguar,x在(λx.(λy.yx))中有界吗?因为外部表达式有x作为参数。或者它是关于(λx.(λy.yx))的约束,关于(λy.yx)的自由?非常感谢!“捕获”一词的相关性在我正在阅读的材料中没有得到解释,这使我对其意图一无所知。@Ord,x是否绑定在(λx.(λy.yx))?因为外部表达式有x作为参数。或者它相对于(λx.(λy.yx))是有界的,相对于(λy.yx)是自由的?x在表达式(λx.(λy.yx))中是有界的,在表达式(λy.yx)中是自由的。