类型系统
- 程序正确性 -> 过度关心 -> 世上没有灵丹妙药
- 测试
- 类型安全(type safety)
- 形式化方法 (formal methods) -> 定理证明
类型系统的研究与进展
周晓聪
计算机科学 2008
1 引言
- Rusell悖论
- \(\lambda\)演算
- System F
- 多态\(\lambda\)演算
- 直觉类型论
- 子类型(subtype)
- 受限量词(bounded quantification)
时间 | 事件 |
---|---|
本世纪初 | 罗素、怀特黑 《毅学原理》 |
30年代 | 邱奇 无类型\(\lambda\)演算 |
30~40 | 邱奇 简单类型化\(\lambda\)演算 |
50年代末 | Alglo语言 |
70年代 | 直觉类型理论 |
1969 | Curry-Howard 同构 |
1972 | System \(F\), \(F^{\omega}\) |
1974 | 多态\(\lambda\)演算 |
70年代 | LCF,ML |
78 | 交类型 |
80年代初 | 子类型 |
1984 | ADT 存在类型 |
80年代中 | 构造演算 |
80年代中 | 线性逻辑 |
1985 | 受限量词 |
1987 | Edinburgh 逻辑框架 |
80年代末 | 纯类型系统 |
80年代末 | 扩充构造演算 |
1990 | 高阶子类型 |
1996 | 对象演算 |
- 本文主要内容:
- 类型系统的一般思想
- 程序类型系统
- 逻辑类型系统
2 基本思想
类型系统研究的基本思想
??
- 分类
- 项
- 初始项(raw term): 尚未类型化的项
- 合式项(well-formed term):
\(\Gamma \vdash M: \tau\): 表示项\(M\)在上下文\(\Gamma\)中具有类型\(\tau\)
- 类型系统
- 程序类型系统 -> \(\lambda\)演算
- 多态\(\lambda\)演算
- ??
- 对象演算
- 逻辑类型系统 -> 直觉主义
- 直觉类型
- 构造演算: 高阶类型\(\lambda\)演算 -> Coq
- 程序类型系统 -> \(\lambda\)演算
3 程序类型系统
简单类型化\(\lambda\)演算 -> 多态\(\lambda\)演算 -> 对象演算
3.1 简单类型化\(\lambda\)演算
\(M,N := x | \lambda x.M | MN\)
-
\(x\)
-
\(\lambda\)演算中引入类型有两种方法
- Curry式: 项中不附带类型信息, 被认为是类型指派系统,类型化规则可看成给项指派类型的规则
- Church式: 项中附带类型信息, 类型
化规则不仅给项指派类型, 而且还给出项的构造方式
简单类型化\(\lambda\)演算通常记为\(\lambda^{\rightarrow}\)演算,参考Wiki
\(\lambda^{\rightarrow}\)演算BNF:
- Church式类型化\(\lambda\)演算
- vs. Curry式\(\lambda\)演算
上下文\(\Gamma\)
\(\Gamma := [] | T, x: \alpha\),
其中\([]\)代表空表, 而\(x\)是变量, \(\alpha\)是类型
\(\lambda^{\rightarrow}\)演算类型规则: \(\Gamma \vdash M: \alpha\)
表示在假设\(\Gamma\)下, 项\(M\)类型为\(\alpha\), 上下文\(\Gamma\)含义就是要给项\(M\)中的每个自由变量指派一个类型。
- \(\lambda^{\rightarrow}\)演算中类型化规则
- \(\rightarrow I\)规则
- \(\rightarrow E\)规则
结构性质: 设有\(\Gamma \vdash M: \alpha\), 则
- \(M\)中所有自由变量都出现在\(\Gamma\)中
- 集合无序性:改变\(\Gamma\)中变量顺序,上述判断仍成立
- 弱化规则:在\(\Gamma\)中增加\(M\)没有的自由变量, 判断仍成立
- 强化规则:去掉\(\Gamma\)中不出现在\(M\)中的自由变量, 判断仍成立
- 替换规则: 若又有$\Gamma,x: \alpha \vdash N: \beta \(,则有\)\Gamma \vdash N[M/x]: \beta $
- 类型唯一性: 若又有\(\Gamma \vdash N: \beta\), 则有\(\alpha = \beta\)
判定问题
- 类型检查问题, 给定\(M\)和\(\alpha\),是否有\(\Gamma\) 使得\(\Gamma \vdash M: \alpha\)
- 类型推导问题,给定\(M\),是否有\(\Gamma\)和\(\alpha\)使得\(\Gamma \vdash M: \alpha\)?
- 类型下有否项(inhabitation) 的问题, 给定一个
类型\(\alpha\), 是否有\(M\), 使得\(\vdash M: \alpha\)?
3.2 多态\(\lambda\)演算
- \(\lambda 2\)演算
- 多态性基本含义: 一个项可能具有多个类型
- System F
- 首先引入类型变量
- 其次引入量词类型, 主要是全称量词
- 类型集合+项变量集合
上下文\(\Gamma\)不仅包括项变量及其类型, 还包括类型
变量, 其构造方式可用类BNF描述为
\(\Gamma := [] | \Gamma,X | \Gamma, x: \alpha\)
多态类型: \(\forall X.\alpha\)
- 增加新的规则
- kind: 类别
- 算子: 类型 \(\rightarrow\) 类型
Type
: 类型之类型
与泛函何关系?
- \(\lambda \omega\): 高阶多态\(\lambda\)演算
- System F\(\omega\)
System F\(\omega\)构造方式用类BNF可描述为
- 类别:\(K,L := Type | K \rightarrow L\)
- 算子:\(\alpha, \beta := X | \Lambda X:K. \alpha | \alpha \beta | \alpha \rightarrow \alpha | \forall X:K. \alpha\)
- 项:$M,N := x | \lambda x: \alpha .M | MN | \Lambda X.M | M \alpha $
上下文的构造方式用类BNF可描述为:
\(\Gamma := [] | \Gamma,X:K | \Gamma, x: \alpha\)
\(\lambda \omega\)演算中最重要的类别化规则包括:
上下文\(\Gamma\)的构造更严格地说, 只有当\(\Gamma \vdash \alpha: Type\)时, \(\Gamma \vdash x: \alpha\)才是合式的上下文
3.3 子类型和受限量词
-
Cardeil: 子类型+多态
-
子类型: 类型系统中类型集上的一个序关系
- \(\alpha \le \beta\)
类型系统中子类型转换方式
-
一是显式转换方式, 即如果\(\alpha \le \beta\), 那么类型系统中引入一个特殊项\(C_{\alpha, \beta}(M)\),其中\(M\)类型为\(\alpha\), 而\(C_{\alpha, \beta}(M)\)类型则为\(\beta\)。
-
另一是隐式转换方式, 即如果\(\alpha \le \beta\), 那么若\(\Gamma \vdash M: \alpha\), 则有\(\Gamma \vdash M: \beta\), 这规则称为Subsumption(归类规则)
-
\(\lambda_{\omega \le}\)演算
-
\(\lambda_{\omega \le}\)演算的研究对象:
构造方式用类BNF可描述为
- 类别:\(K,L := Type | K \rightarrow K\)
- 算子:$\alpha, \beta := X | \Lambda X:K. \alpha | \alpha \beta | \alpha \rightarrow \alpha | \forall X \le \alpha: K.\beta $
- 项:$M,N := x | \lambda x: \alpha .M | MN | \Lambda X \le \alpha: K.M $
\(\lambda_{\omega \le}\)演算中上下文包含子类型关系, 即在上下文中引入类型变量时的一般形式为\(X \le \alpha: K\), 称\(\alpha\)为类型变量\(X\)的界声明。
上下文的构造方式可描述为:
\(\Gamma := [] | \Gamma,X \le \alpha:K | \Gamma, x: \alpha\)
3.4 对象的表示与对象演算系统
- 子类型 vs. 继承
4 逻辑类型系统
4.1 Curry-Howard对应与直觉类型理论
- 类型系统 -> 逻辑系统
- Curry-Howard同构, 即命题 -> 类型 -> 证明
4.2 构造演算与扩充的构造演算
4.3 纯类型系统
- 研究纯类型系统一个重要目标
5 类型系统的应用
- 函数式语言 + OOP -> OML, ML2000
国内2000年左右最好的类型系统的综述!