形式陈述
无类型 λ 演算的原始项由抽象语法
t ::= x ∣ λ x . t ∣ t t 归纳生成。三种构造依次是变量、函数抽象和函数应用。应用按左结合解析,t u v 表示 ( t u ) v ;抽象体尽量向右延伸,λ x . t u 表示 λ x . ( t u ) 。
抽象 λ x . t 中的 λ x 按词法作用域 公理库 变量绑定 Variable binding · Binding occurrence 把变量的使用出现关联到作用域内声明,并区分自由出现、绑定出现与遮蔽。 绑定 t 内相应的 x 。原始语法树相同是字面语法相等;只一致更换绑定变量得到的是 α-等价,不能与字面相等混写。理论中常把项按 α-等价识别。
核心计算规则是 β-收缩:
( λ x . t ) s → β t [ x := s ] , 其中右侧是无捕获替换 公理库 无捕获替换 Capture-avoiding substitution 用作用域感知的递归代入替换自由变量,同时保持代入项的自由变量不被捕获。 。把规则对应用两侧和抽象体作相容闭包,就得到完整 β-归约;它允许收缩任意 β-redex。调用值、调用名等求值策略只选择其中一部分位置和步骤,因此是完整 β-归约的特定子关系。
β-归约的自反、对称、传递闭包给出 β-可转换关系 = β ;它表达由若干正向或反向 β 步联系的项。一步归约 → β 、有限多步 → β ∗ 和等式关系 = β 的方向性不同,后续定理不能互换这些符号。
直觉
λ 演算把计算压缩成“抽象接受实参”。变量给出引用,抽象形成函数,应用把函数与实参相接,β-步骤再以代入实现调用。函数与参数采用同一种项语法,所以函数能够接收函数、返回函数,也能把自身作为数据传递。
极少的构造并不意味着执行行为简单。一个项可以同时含多个 redex,可能存在正规形,也可能无限归约;选择哪个 redex 属于策略,能否汇合或终止属于元理论。把这些问题分开,是 λ 演算作为核心语言的价值。
图片加载失败 左侧列出三种构造,右侧把应用 lambda x 点 x 到 y 展开为对应抽象语法树。
例子与边界
恒等函数满足 ( λ x . x ) y → β y 。下面的项暴露了绑定边界:
( λ x . λ y . x ) y . 若把参数 y 直接文本替换进函数体,会得到 λ y . y ,原本自由的 y 被内层抽象错误捕获,项的含义已经改变。正确做法先把内层绑定变量 α-换名:
( λ x . λ z . x ) y → β λ z . y . 结果中的 y 仍然自由,z 才是函数参数。两种结果 λ y . y 与 λ z . y 既不字面相等,也不 α-等价;错误捕获确实改变了项。
布尔值可由行为编码:
true = λ t . λ f . t , false = λ t . λ f . f . 于是 true a b → β ∗ a ,false a b → β ∗ b 。这里“数据”没有额外标签,只通过选择哪个分支表现自身。
无类型演算允许自应用。令
Ω = ( λ x . x x ) ( λ x . x x ) , 则 Ω → β Ω 。项 ( λ x . y ) Ω 收缩最外层可得正规形 y ,若持续归约参数却会发散。它同时说明三个边界:闭项未必终止,存在正规形不代表所有归约路径终止,完整 β-归约也不等于某个确定求值器。
推论与应用
λ 演算是函数式语言与操作语义 公理库 操作语义 Operational semantics 以配置、推导规则和转移关系规定程序怎样执行及其可观察结果。 的理论原型。替换语义直接把实参写入函数体;环境解释器则把函数表示为代码与定义环境组成的闭包 公理库 程序语言闭包 Programming-language closure · Function closure · Lexical closure 将函数代码与其定义位置的词法环境配对而成的运行时函数值。 。两种实现路径必须给出相同的词法绑定行为。
无类型演算可用不动点组合子 公理库 不动点组合子与递归 Fixed-point combinator · Y combinator · Z combinator 在无类型 λ 演算中把函数送到它自身的不动点,从而在没有递归原语时表达递归。 在没有 let rec 原语时构造一般递归,具体 Y / Z 展开与策略边界由专页承担。
β-归约 公理库 β-归约 Beta reduction 收缩函数应用 redex,以无捕获替换把实参代入函数体的一步改写关系。 、Church–Rosser 定理 公理库 Church–Rosser 定理 Church–Rosser theorem · Confluence theorem 完整 β-归约的合流定理:任意有限分叉都能继续归约到共同后继。 和正规化理论分别刻画局部计算、分叉汇合与终止。简单类型 λ 演算 公理库 简单类型 λ 演算 Simply typed lambda calculus · STLC 以基础类型和箭头类型约束 λ 项,获得类型安全与强正规化的最小函数演算。 加入类型限制,排除 Ω 一类项并获得强正规化。
在可计算性侧,无类型 λ 演算与图灵机刻画同一类可计算函数;在逻辑侧,类型化 λ 项通过 Curry–Howard 对应承担证明对象的角色。前者允许一般非终止,后者的终止性取决于具体类型系统。
参考资料
Henk Barendregt, The Lambda Calculus: Its Syntax and Semantics , revised ed., North-Holland, 1984, Chapters 2–3。
Benjamin C. Pierce, Types and Programming Languages , MIT Press, 2002, Chapters 5–7。
J. Roger Hindley and Jonathan P. Seldin, Lambda-Calculus and Combinators: An Introduction , Cambridge University Press, 2008, Chapters 1–4。