形式陈述
简单类型 λ 演算(STLC)在λ 演算公理库λ 演算Lambda calculus · Untyped lambda calculus以变量、抽象、应用和 β-归约表达高阶函数计算的无类型核心演算。上加入简单类型。给定基础类型 ,类型和带注解项由
生成。箭头向右结合, 表示 。类型判断公理库类型判断Typing judgment由类型规则推导的上下文判断,记录项在给定变量假设下具有的静态类型。 由三条核心规则生成:
抽象规则在扩展上下文 下检查函数体,应用规则要求函数的定义域类型与实参类型完全吻合。项的计算使用β-归约公理库β-归约Beta reduction收缩函数应用 redex,以无捕获替换把实参代入函数体的一步改写关系。;可以研究完整 β-归约,也可另选调用值或调用名小步策略。
STLC 是System F公理库System FSystem F · Polymorphic lambda calculus具有显式类型抽象与类型应用的二阶多态 λ 演算。去掉全称类型、类型抽象和类型应用后的单态片段。纯 STLC 不含一般递归、递归类型或固定点常量;在这一精确边界内,每个良类型项强正规化。
直觉
是函数接口:输入须有 型,应用结果获得 型。推导树把每次变量使用、抽象和应用的接口匹配记录下来;执行前无法构造推导的项被静态排除。
简单类型没有解递归类型方程的机制。给 定型会要求 既有某个参数类型 ,又有函数类型 ,进而需要有限类型满足 。这个方程无解,因而循环项 被挡在类型推导之外。
例子与边界
恒等项可由
定型。若上下文含 与 ,应用规则得到 ,连续两次抽象便有
这棵推导同时展示箭头右结合与上下文中临时假设的解除。
类型判断不等于运行结果。开项 良类型,却在没有环境时不能独立执行;闭项 是否良类型取决于实参类型是否正好是 。原始语法相似不能替代推导。
加入固定点常量 后,可以写出良类型发散项;进展与保持仍可能成立,强正规化却立即失效。类型安全与终止是不同元定理。
推论与应用
STLC 是静态语义与动态语义相互作用的最小实验场。进展与保持定理公理库进展与保持定理Progress and preservation · Type safety在固定动态语义下,良类型闭项可继续或已是结果,且每一步都保持其类型。说明良类型闭项不会因类型错误卡住,强正规化定理公理库简单类型 λ 演算强正规化Strong normalization of simply typed lambda calculus每个良类型简单 λ 项都强正规化:任意完整 β-归约路径都在有限步后结束。另外证明每条完整 β-归约路径都有限。后者严格强于某个求值策略终止。
在Curry–Howard 对应公理库Curry–Howard 对应Curry–Howard correspondence · Propositions as types把命题对应为类型、证明对应为程序、证明化简对应为程序求值。下,箭头类型对应蕴含,项对应自然演绎证明,β-归约对应证明化简。积、和、多态与依赖类型可继续扩展这条对应,但每项扩展都需重新检查类型规则、动态规则与元定理。
参考资料
- Benjamin C. Pierce, Types and Programming Languages, MIT Press, 2002, Chapters 8–9.
- Robert Harper, Practical Foundations for Programming Languages, 2nd ed., Cambridge University Press, 2016, Chapter 10.
- Jean-Yves Girard, Yves Lafont, and Paul Taylor, Proofs and Types, Cambridge University Press, 1989, Chapters 3–4。