Skip to content

定义Definition

无捕获替换

施工中 · 内容逐步修订

Capture-avoiding substitution

用作用域感知的递归代入替换自由变量,同时保持代入项的自由变量不被捕获。

形式陈述 ​

先固定带名字的项语法 t::=x∣λx.t∣tt,沿用α-等价中的绑定、自由变量与新鲜改名约定。这里尚不需要给项任何求值规则。t[x:=s] 表示把 t 中每个自由出现的 x 换成 s,并保持 s 的自由变量仍然自由。按 α-等价类看,它是良定义的递归函数;若直接操作带名字的原始项,则还须固定一个确定的新鲜名选择策略。核心递归子句为

x[x:=s]=s,y[x:=s]=y(y≠x),(t1t2)[x:=s]=t1[x:=s]t2[x:=s],(λx.t)[x:=s]=λx.t,(λy.t)[x:=s]=λy.t[x:=s](y≠x, y∉FV(s)).

若 y≠x 且 y∈FV(s),选择

z∉Var(t)∪Var(s)∪{x,y},

先把显示的绑定器α-换名为 λz.t{y⇝z},再递归替换。新鲜名字的选择可能产生不同原始语法树,但结果彼此 α-等价。

自由变量满足可核对的边界:若 x∈FV(t),则

FV(t[x:=s])=(FV(t)∖{x})∪FV(s);

若 x∉FV(t),则 t[x:=s]≡αt。若实现先检查目标不存在并直接返回,才保证原始语法树也相同;否则递归规则仍可能给无关的冲突绑定器换名。这两种自由变量情形不能用同一无条件等式合并,因为未实际代入时不应凭空加入 s 的自由变量。

直觉

替换把一棵带作用域的语法树嵌入另一棵树。代入项中的自由变量携带原来的外部依赖;穿过同名绑定器时,它们不能突然改为引用该绑定器。遇到冲突先改绑定器名字,正是在移动子树时保留绑定连线。

同名绑定器还形成一道停止边界。进入 λx.t 时,体内的 x 已由新声明接管,外部针对 x 的替换不能越过它。这与避免捕获是两项不同检查:前者保护目标项原有绑定,后者保护代入项的自由变量。

无捕获替换示意图
例子与边界

计算 (λy.x)[x:=y] 时,文本替换得到 λy.y,使代入的自由变量 y 被捕获。先改绑定变量,才有

(λz.x)[x:=y]=λz.y.

遮蔽给出另一结果:

(λx.xy)[x:=s]=λx.xy,

因为体内的 x 由该 λ 绑定,而 y 与替换目标不同。相比之下,(xx)[x:=s]=ss 会复制代入项;替换因此可能增大语法树,不能用“项大小必下降”证明 β-归约终止。

替换组合也需要侧条件。若 x≠y 且 x∉FV(u),则

t[x:=s][y:=u]≡αt[y:=u][x:=s[y:=u]].

侧条件的作用可以直接算出。取 t=y,s=z,u=x,三个名字互异,此时 x∈FV(u)。左边是 y[x:=z][y:=x]=x,右边是 y[y:=x][x:=z[y:=x]]=z,所以两边确实不同。该公式是顺序代入、β-归约交换和许多归纳证明的常用工具,不能丢掉侧条件。

推论与应用

无捕获替换直接定义β-归约,并出现在量词实例化、宏展开和函数内联中。类型安全证明使用类型替换引理:

Γ,x:A⊢t:B,Γ⊢s:A⟹Γ⊢t[x:=s]:B.

这里是简单类型语境,B 不依赖项变量 x,且 x 不已声明于 Γ。若是依赖类型,结论中的类型也必须替换为 B[x:=s],后续语境同样随之变化。上下文的弱化条件、变量新鲜性和绑定器分支必须在证明中明确处理;它不是从替换的记号自动得到的结论。

实际实现常用 de Bruijn 索引、显式替换演算或 locally nameless 表示,把选新鲜名字的义务转成索引提升、显式代换规则或有限支持运算。表示改变后仍须证明实现与名字式无捕获替换一致。

索引替换把本页的绑定保持义务转成实际数字变化;同一 (λx.λy.x) z 在Γ=[z]下由 (λ.λ.1) 0 收缩为 λ.1。局部无名开启得到 λ.f(z),但其无需提升的接口要求实参没有悬空绑定索引。

参考资料
  • Cornell University, Functional Programming in OCaml, §10.2.3 Capture-Avoiding Substitution, CS 3110, Spring 2021。
  • Robert Harper, Practical Foundations for Programming Languages, 2nd ed., Cambridge University Press, 2016, Chapters 1–4。
  • Benjamin C. Pierce, Types and Programming Languages, MIT Press, 2002, Chapters 5–6。
  • Henk Barendregt, The Lambda Calculus: Its Syntax and Semantics, revised ed., North-Holland, 1984, §2.1。
关系图谱34 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系