类型系统


  • 程序正确性 -> 过度关心 -> 世上没有灵丹妙药
    • 测试
    • 类型安全(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

3 程序类型系统

简单类型化\(\lambda\)演算 -> 多态\(\lambda\)演算 -> 对象演算

3.1 简单类型化\(\lambda\)演算

\(M,N := x | \lambda x.M | MN\)

  • \(x\)

  • \(\lambda\)演算中引入类型有两种方法

    • Curry式: 项中不附带类型信息, 被认为是类型指派系统,类型化规则可看成给项指派类型的规则
    • Church式: 项中附带类型信息, 类型
      化规则不仅给项指派类型, 而且还给出项的构造方式

简单类型化\(\lambda\)演算通常记为\(\lambda^{\rightarrow}\)演算,参考Wiki

\(\lambda^{\rightarrow}\)演算BNF:

\[\begin{array}{l} \hline \alpha,\beta := \tau | \alpha \rightarrow \alpha, \quad \tau \in T \text{是基类型} \\ M,N := x | \lambda x: \alpha.M | MN \\ \hline \end{array} \]

  • 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\), 则

  1. \(M\)中所有自由变量都出现在\(\Gamma\)
  2. 集合无序性:改变\(\Gamma\)中变量顺序,上述判断仍成立
  3. 弱化规则:在\(\Gamma\)中增加\(M\)没有的自由变量, 判断仍成立
  4. 强化规则:去掉\(\Gamma\)中不出现在\(M\)中的自由变量, 判断仍成立
  5. 替换规则: 若又有$\Gamma,x: \alpha \vdash N: \beta \(,则有\)\Gamma \vdash N[M/x]: \beta $
  6. 类型唯一性: 若又有\(\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
    • 首先引入类型变量
    • 其次引入量词类型, 主要是全称量词

\[\begin{array}{l} \hline \alpha,\beta := \tau | \alpha \rightarrow \alpha | \forall X.\alpha, \quad X \text{是类型变量} \\ M,N := x | \lambda x: \alpha.M | MN | \Lambda X.M | M \alpha \\ \hline \end{array} \]

  • 类型集合+项变量集合

上下文\(\Gamma\)不仅包括项变量及其类型, 还包括类型
变量, 其构造方式可用类BNF描述为
\(\Gamma := [] | \Gamma,X | \Gamma, x: \alpha\)

多态类型: \(\forall X.\alpha\)

  • 增加新的规则

\[\begin{array}{cl} \hline \forall \text{-I} & \frac{\Gamma, X \vdash M:\alpha}{\Gamma \vdash \Lambda X.M: \forall X.\alpha} \\ \forall \text{-E} & \frac{\Gamma \vdash M:\forall X:\alpha}{\Gamma \vdash M \beta: \alpha [\beta /X]} \\ \hline \end{array} \]

  • kind: 类别
    • 算子: 类型 \(\rightarrow\) 类型
    • Type: 类型之类型

与泛函何关系?

  • \(\lambda \omega\): 高阶多态\(\lambda\)演算
    • System F\(\omega\)

System F\(\omega\)构造方式用类BNF可描述为

  1. 类别:\(K,L := Type | K \rightarrow L\)
  2. 算子:\(\alpha, \beta := X | \Lambda X:K. \alpha | \alpha \beta | \alpha \rightarrow \alpha | \forall X:K. \alpha\)
  3. 项:$M,N := x | \lambda x: \alpha .M | MN | \Lambda X.M | M \alpha $

上下文的构造方式用类BNF可描述为:
\(\Gamma := [] | \Gamma,X:K | \Gamma, x: \alpha\)

\(\lambda \omega\)演算中最重要的类别化规则包括:

\[\begin{array}{cl} \hline \text{K-Fun-I} & \frac{\Gamma, X:K \vdash \alpha: L}{\Gamma \vdash \Lambda X.K. \alpha: K \rightarrow L} \\ \text{K-Fun-E} & \frac{\Gamma \vdash \alpha: K \rightarrow L \quad \Gamma \vdash \beta: K}{\Gamma \vdash \alpha \beta: L} \\ \text{K-Arrow} & \frac{\Gamma \vdash \alpha: Type \quad \Gamma \vdash \beta: Type}{\Gamma \vdash \alpha \rightarrow \beta: Type} \\ \text{K-Poly} & \frac{\Gamma, X:K \vdash \alpha: Type}{\Gamma \vdash \forall X :K. \alpha : Type} \\ \hline \end{array} \]

上下文\(\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可描述为

  1. 类别:\(K,L := Type | K \rightarrow K\)
  2. 算子:$\alpha, \beta := X | \Lambda X:K. \alpha | \alpha \beta | \alpha \rightarrow \alpha | \forall X \le \alpha: K.\beta $
  3. 项:$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年左右最好的类型系统的综述!

佟丽娅

posted @ 2016-06-25 10:02  westRiver  阅读(390)  评论(0)    收藏  举报