MiniML2 のための型推論 (2): 型推論アルゴリズム
型推論アルゴリズムの入出力と,その設計の方針
前節の内容を踏まえて,型推論アルゴリズムを定義しよう.型推論アルゴリズムの仕様は,以下のように考えることができる.
- 入力: 型環境 $\Gamma$ と式 $e$.
- 出力: $\Gamma \vdash e : \tau$ という型判断が導出できるような型 $\tau$.もしそのような型がなければエラーを報告する.
さて,このような仕様を満たすアルゴリズムを,どのように設計したらよいだろうか.これは,$\Gamma \vdash e : \tau$ を根とする導出木を構築すればよい.では,このような導出木をどのように作ればよいだろうか.
この答えは型付け規則から得られる.上に挙げた型付け規則は 構文主導な規則 (syntax-directed rules) になっているというよい性質を持っている.これは,$\Gamma$と$e$が与えられたときに,$\Gamma \vdash e : \tau$が成り立つような$\tau$が存在するならば,これを導くような規則が$e$の形から一意に定まるという性質である.例えば,$\Gamma$と$e$が与えられ,$e$が$e_1 + e_2$という形をしていたとしよう.このとき,型推論アルゴリズムは$\Gamma \vdash e : \tau$を根とする導出木を構築しようとする.型付け規則をよく見ると,このような導出木は(存在するならば)最後の導出規則が$\textrm{T-Plus}$でしかありえない.すなわち,
\[\begin{array}{c}
\vdots\\
\rule{6cm}{1pt}\\
\Gamma \vdash e_1 + e_2 : \tau_2
\end{array}
\textrm{T-Plus}\]
という形の導出木だけを探索すればよいことになる.このように適用可能な最後の導出規則が$e$の形から一意に定まる型付け規則を構文主導であるという.
構文主導な型付け規則を持つ型システムでは,各規則を下から上に読むことによって型推論アルゴリズムを得ることができることが多い.
- 例えば,$\textrm{T-Int}$ は入力式が整数リテラルならば,型環境に関わらず,$\mathbf{int}$ を出力する,と読むことができる.
- $\textrm{T-Plus}$は,入力式$e$が$e_1+e_2$の形をしていたならば,$\Gamma$と$e_1$を再帰的に型推論アルゴリズムに入力して型を求めて(これを$\tau_1$とする)$\Gamma$と$e_2$とを再帰的に型推論アルゴリズムに入力して型を求めて(これを$\tau_2$とする)$\tau_1$も$\tau_2$も両方とも $\mathbf{int}$ であった場合には $\mathbf{int}$ 型を出力する,と読むことができる.再帰呼び出しと導出木の構造についての注
再帰呼び出しと導出木の構造: 明示的に導出木を構築していないので,なぜこれで「導出木を構築している」ことになるのかよくわからないかもしれない.この型推論アルゴリズムは再帰呼出しをしているが,この再帰呼出しの構造が導出木に対応している.
Exercise 4.2.1 [必修]
MiniML2 のための型推論アルゴリズムを実装するためにコードに加えるべき変更を以下に示す.これを参考にしつつ,上記の$\textrm{T-Int}$と$\textrm{T-Plus}$のケースにならって,すべての場合について型推論アルゴリズムを完成させよ.また,インタプリタに変更を加え,型推論ができるようにせよ.
syntax.ml
への変更
cui.ml
への変更
main.ml
への変更
typing.ml
への変更