Skip to content

模型Model

简单类型 λ 演算

施工中 · 内容逐步修订

Simply typed lambda calculus · STLC

以基础类型和箭头类型约束 λ 项,获得类型安全与强正规化的最小函数演算。

形式陈述 ​

简单类型 λ 演算(STLC)在λ 演算上加入简单类型。给定基础类型 ι,类型和带注解项由

T::=ι∣T→T,t::=x∣λx:T.t∣tt

生成。箭头向右结合,A→B→C 表示 A→(B→C)。类型判断 Γ⊢t:T 由三条核心规则生成:

x:T∈ΓΓ⊢x:T,Γ,x:A⊢t:BΓ⊢λx:A.t:A→B,Γ⊢t1:A→BΓ⊢t2:AΓ⊢t1t2:B.

抽象规则在扩展上下文 Γ,x:A 下检查函数体,应用规则要求函数的定义域类型与实参类型完全吻合。项的计算使用β-归约;可以研究完整 β-归约,也可另选调用值或调用名小步策略。

STLC 是System F去掉全称类型、类型抽象和类型应用后的单态片段。纯 STLC 不含一般递归、递归类型或固定点常量;在这一精确边界内,每个良类型项强正规化。

直觉

A→B 是函数接口:输入须有 A 型,应用结果获得 B 型。推导树把每次变量使用、抽象和应用的接口匹配记录下来;执行前无法构造推导的项被静态排除。

简单类型没有解递归类型方程的机制。给 xx 定型会要求同一声明中的 x 既有某个参数类型 A,又有函数类型 A→B,进而需要有限类型满足 A=A→B。右侧比 A 多一个箭头构造子及一个 B 子树,有限语法树不可能与自己的严格扩张相等,所以方程无解。因而循环项 Ω=(λx.xx)(λx.xx) 被挡在类型推导之外。

例子与边界

恒等项可由

x:A⊢x:A∅⊢λx:A.x:A→A

定型。若上下文含 f:A→B 与 x:A,应用规则得到 fx:B,连续两次抽象便有

∅⊢λf:A→B.λx:A.fx:(A→B)→A→B.

这棵推导同时展示箭头右结合与上下文中临时假设的解除。顺序不能颠倒:先解除 x:A 得到 f:A→B⊢λx:A.fx:A→B,再解除 f,才得到最外面的 (A→B)→(A→B)。

自应用被排除并不表示所有嵌套调用被排除。若 f:A→A 且 x:A,先推出 fx:A,再推出 f(fx):A;两次调用中的参数类型均为 A,没有要求 A 等于箭头类型。类型检查限制的是接口是否一致,而不是应用次数。

类型判断不等于运行结果。开项 x:A⊢x:A 良类型,却在没有环境时不能独立执行;闭项 (λx:A.x)(λy:B.y) 是否良类型取决于实参类型是否正好是 A。原始语法相似不能替代推导。

加入固定点常量 fix:(T→T)→T 后,可以写出良类型发散项;进展与保持仍可能成立,强正规化却立即失效。类型安全与终止是不同元定理。

推论与应用

另一种更小的非终止扩充见上下文等价:在含 Bool、布尔常量和条件式的 STLC 扩充上,再增加原始常量 Ω:Bool 及规则 Ω→Ω,便足以研究严格性和高阶观察。该语言沿用简单类型规则,发散由新增常量及其自环产生;本页纯 STLC 的强正规化定理适用于加入它之前的语言。

STLC 是静态语义与动态语义相互作用的最小实验场。进展与保持定理说明良类型闭项不会因类型错误卡住,强正规化定理另外证明每条完整 β-归约路径都有限。后者严格强于某个求值策略终止。

在Curry–Howard 对应下,箭头类型对应蕴含,项对应自然演绎证明,β-归约对应证明化简。积、和、多态与依赖类型可继续扩展这条对应,但每项扩展都需重新检查类型规则、动态规则与元定理。

参考资料
  • 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。
关系图谱19 个相邻概念 · 3 类关系

拖动节点调整位置。

显示关系

显示:依赖

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

上位 / 更一般

下位 / 直接特例

暂未标注直接特例。

类型化关系

被这些条目使用