Skip to content

无捕获替换

Capture-avoiding substitution

把项代入自由变量时通过重命名避免自由变量被意外绑定。

形式陈述

t[x:=s] 表示把项 t 中自由出现的 x 替换为 s,同时避免 s 的自由变量被 t 中绑定子捕获。对 λy.t1,若 yxyFV(s),则

(λy.t1)[x:=s]=λy.(t1[x:=s]);

yFV(s),应先对 y 作新鲜的 α-改名。

直觉

替换不是文本搜索替换,而是保持绑定图的结构操作。新插入项的自由变量必须继续自由。

例子与边界

(λy.x)[x:=y] 不能变成 λy.y,因为右侧原本自由的 y 被捕获;可先改名为 λz.x,再替换为 λz.y。对被同名绑定子遮蔽的变量不继续替换。

推论与应用

β-归约、操作语义、类型替换引理和宏展开都依赖无捕获替换。实现可使用新鲜名、De Bruijn 索引或显式替换演算。

参考资料
  • 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。