fetburner.core

コアダンプ

交差型を持つ単純型付きλ計算の型付け可能性について

これは型 Advent Calendar 2019 15日目の記事です. 交差型についてのよく知られた事実——交差型を持つ単純型付きλ計算において,強正規化する項は型付け可能であることを解説します.

はじめに

交差型 T_1 \land T_2とは,読んで字のごとく型 T_1と型 T_2の共通部分を表す型です.すなわち,型 T_1 \land T_2を持つ項e(つまり  e : T_1 \land T_2)とは,型 T_1を持ち( e : T_1),なおかつ型 T_2も持つ項( e : T_2)を指します.交差型のある体系では,SMLの+のようなアドホックな多相性1 (\mbox{int}\rightarrow\mbox{int}\rightarrow\mbox{int})\land(\mbox{real}\rightarrow\mbox{real}\rightarrow\mbox{real})のように表現できる嬉しさが知られています.しかし,真にヤバい点と言えば後述する性質でしょう.

交差型を含むある種の言語——交差型を持つ単純型付きλ計算——において,任意の項の型付け可能性と強正規化性は一致することが知られています.確かに左の性質から右の性質は導けそうです.単純型付きλ計算,System F,CoC等々,多くの言語において,型付けできる項は強正規化する2ことが知られています.しかし右——ある項が強正規化すること——から左——その項が型付け可能であること——導けるとはどういう事でしょう?もうそれを聞いただけでヤバそうです.与えられた項が型付け可能かどうか判定するプログラムが存在すれば停止性問題が解けてしまうので,無制限に交差型を入れてしまうと型推論が決定不能になってしまいます.3

この記事ではその右から左への性質,すなわち交差型を持つ単純型付きλ計算において,強正規化する項は型付け可能であることをふわっと解説します.左から右への性質,型付け可能な項は強正規化する事については,論理関係(logical relation)を使えば単純型付きλ計算の時と同じノリで証明できるので割愛します.

性質が成り立つ直感

この性質が成り立つ直感を得るには,この論文による証明を追うのが良いでしょう.この論文では,肝心の定理は大きく分けて以下の二つの性質から証明しています.

  • 正規形が型付け可能であること
  • 主部展開定理(subject expansion)

正規形が型付け可能であること

交差型を持つ単純型付きλ計算においては,全ての正規形——これ以上簡約できない項——は適当な型環境を持って来れば型を付けられます.

これは明らかに単純型付きλ計算では成り立たなかった性質です.例えば,正規形 \lambda x. x xに型を付けられるかどうか考えてみましょう.この項に型を付けようと思うと,引数 xの型 Xは,型 Xの値を受け取って適当な型 Aの値を返す関数の型 X\rightarrow Aと一致しなくてはなりません. X=X\rightarrow Aを満たす型なんて単純型では表現できないので, \lambda x. x xに型は付けられません.

一方で,交差型を認めれば \lambda x. x xに型を付けられるようになります.これは, X型の値としても使えるし, X \rightarrow A型の値としても使える値の型を, X\land (X \rightarrow A)として表現できるためです.型注釈を補ってやれば \lambda (x:X\land (X \rightarrow A)). x xみたいな感じですね.

主部展開定理

主部展開定理(subject expansion)とは,簡約の項Nが型付け可能ならば簡約の項Mも型付け可能になる性質です.良く知られた主部簡約定理(subject reduction)4の逆ですね.

単純型付きλ計算ではもちろん,主部展開定理は成り立ちません.説明のために\mathtt{int}\mathtt{bool},二つ組とかがあると仮定して,項M=(\lambda f. (f~0, f~\mathtt{true}))(\lambda x. x)に型を付けられるかどうか考えてみましょう.この項Mに型を付けるためには, f\mathtt{int}を受け取る関数であり,なおかつ\mathtt{bool}を受け取る関数でもあると表現できなくてはなりません.単純型ではそのような多相性を表現できないので,簡約結果{N=((\lambda x. x)0, (\lambda x. x) \mathtt{true})}に型が付くにもかかわらず,簡約前の項 Mには型が付きません.

一方,交差型があれば簡約前の項 Mにも型を付けられます.これは, f\mathtt{int}を受け取る関数であり,\mathtt{bool}を受け取る関数でもあることを{f:(\mathtt{int}\rightarrow A)\land(\mathtt{bool}\rightarrow B)}のように表現できるためです.

つまるところ,評価結果M[x\mapsto N] に型が付く5なら評価前の(\lambda x. M)Nにも型が付く主な理由は,交差型がアドホックな多相性を表現できるからに他なりません.M[x\mapsto N]に型が付くなら,項Mの変数xの出現に代入されたNそれぞれに適当な型{T_i}が付いているはずなので,その型付けを集めて(\lambda (x : T_1 \land \cdots \land T_n). M)Nみたいな感じに交差型で結んでやる感じです.

厳密に言うとMxが出現しない場合,M[x\mapsto N] に型が付いたからと言ってNに型が付くとは限らないので,論文で扱う主部展開定理のステートメントではNに少なくとも何かしらの型が付くことを仮定しています.M=\lambda y. yN=(\lambda z. zz)(\lambda z. zz)とか明らかにアウトですもんね.

主定理の証明

以上二つの性質を用いると,直感的には以下の手順で強正規化する項は型付け可能であることを示せます.

  • 正規形まで簡約し,正規形が型付け可能であることを用いる
  • 簡約を遡りながら主部展開定理を用い,簡約後の項が型付け可能であることから簡約前の項型付け可能であることを示していく

論文では,強正規化する項Mの考えうる簡約列の長さの和についての完全帰納法で証明しています. 論文で用いている主部展開定理はM[x\mapsto N] に型が付くことに加えてNに型が付くことも仮定していますが, これも帰納法の仮定から手に入ります.


  1. SMLの四則演算ってクッソアドホックオーバーロードされていて,文脈によって勝手にint上の二項演算になったりreal上の二項演算になったりするんですよね.マイナー言語で例えてしまったので,この辺りは各自お好きな言語で脳内補完して下さい…

  2. どう計算を進めたところで必ず評価が停止する,みたいな性質.とりあえず計算が停止するかどうかみたいに思っておけばよろしい.

  3. 流石にそれでは実用上不便なので,実際には初期の篩型(refinement types)みたいに,制限された形の交差型が使われがち.今の篩型って依存型っぽい雰囲気出してるけど,最初は制限された交差型だったんすよ

  4. TaPLで言うところの型保存(preservation)

  5. 後述するように,厳密には Nに型が付くことも必要