計算モデル特論 型付ラムダ計算 国立情報学研究所 ソフトウェア研究系 助教授/ 科学技術振興事業団 さきがけ研究21 研究員 佐藤一郎 E-mail: [email protected] Ichiro Satoh 型とは プログラミングにおけるデータ型 Pascal: var x,y: integer, a:real Ichiro Satoh 型の必要性 プログラム設計を明確化 プログラムの誤り防止 関数やモジュールの仕様 コンパイラ最適化への補助情報 プログラム停止性への補助保証 可読性の向上 Ichiro Satoh プログラミング言語の型 基本データ型 整数、浮動小数点、文字、真偽値 構造データ型 配列、直積型、直和型、レコード型、ストラクチャ型 ユーザ定義型 Ichiro Satoh 型付プログラミング言語 プログラミング言語と型 型なしプログラミング言語 ○プロトタイピング、×インタープリタ実行 弱い型付プログラミング言語 ○手っ取り早く設計・記述、×信頼性が低い 強い型付プログラミング言語 ○安全なプログラム、×慎重な設計と冗長な記述 型検査 静的検査 動的検査 Ichiro Satoh 型推論 強い型付プログラミング言語を利用しながら簡潔な記述を実現するには 型は文面から推定可能 例: f(x) = if x == 0 then 1 else x * f(x-1) 推定により冗長な記述を現象 形式的な体型により型を厳密に決定 Ichiro Satoh 型推論の例 式要素の型と式全体の型 例: if e0 then e1 else e2 「もし e0 が真偽値型(bool型)で、e1とe2が T という型を持つことが示されれば、 if e0 then e1 else e2は T という型を持つ(ことがわかる)」 型推論の目的 与えられた式がある型を持つことを証明する 与えられた式がもつ型を求める 推論規則 e0: bool型 かつ e1:T型 かつ e2:T型 仮定 (if e0 then e1 else e2):T型 結論 Ichiro Satoh 型付ラムダ計算 型理論体系 項(term) 型(type) 判定(judgment) 推論規則(inference) Ichiro Satoh 型付ラムダ式(基本) BNF文法による型 τ ::= b | (τ→τ) ここで b は基底型、 τ×・・・×τは組、 τ→τは関数 BNF文法による型付ラムダ式 M ::= cτ | x | (λx:τ.M) | (M1 M2) Ichiro Satoh 型付ラムダ式 型 τ ::= b | (τ×・・・×τ) | (τ→τ) ここで b は基底型、 τ×・・・×τは組、 τ→τは関数 型付ラムダ式 M ::= | cτ | x | (λx:τ.M) | (M1 M2) (M1 ,...,M2) | M.i Ichiro Satoh 型付ラムダ式 BNF文法による型 基本型: 直積型: 関数型: b (τ×・・・×τ) (τ→τ) 括弧の省略 型における矢印は右結合 例: (t1→(t2 →(t3 →t4) = t1→t2 →t3 →t4 Ichiro Satoh 型付ラムダ式の直感的意味 基本式: (M1 M2) 関数M1に引数M2を与えたときの値 (λx:τ.M) 型がτである仮引数 x をもつ、関数本体をMと定義される関数 Ichiro Satoh 型付きラムダ式の例 f(x)=x+1なる関数fは lx:int.x+1 fに実引数3を与えた式f(3)は (lx:int.x+1)(3int) Ichiro Satoh 自由変数 ラムダ式Mに含まれる自由変数の集合FV(M) FV(c) = 0 FV(x) = {x} FV(M1 M2) = FV(M1) FV(M2) FV(lx:t.M) = FV(M) - {x} FV((M1 ,..,M2)) = FV(M1) .. FV(M2) FV(M.i) = FV(M) 自由変数でない変数を束縛変数と呼ぶ Ichiro Satoh 型付ラムダの計算 簡約規則 [N/x]c = c [N/x](M1,...,Mn) = ([N/x]M1,...,[N/x]Mn) [N/x](M.i) = ([N/x]M).I (lx:t.M)=(ly:t.[y/x]M) ((lx:t.M) N:t) → [N/x]M Ichiro Satoh 記法 前提(assumption): e:t ある式eが型tを持つこと 判定(judgement): A ├ e:t (0個以上の)前提A(型環境)から、ある式eが型tを持つことが示される 推論(inference): A1├ M1:t1 ・・・・・ An├ Mn:tn A├ M:t 式Miがそれぞれの前提Aiにおいて型tを持つならば、結論が示される Ichiro Satoh 型推論規則 型推論規則 (app) (const) ├ ct : t ├M 1 : t 1 t 2 ├M 2 : t 1 ├M 1M 2 : t 2 (prod) (var) ├x : t (abs) ( ( x ) t ) {x : t 1├ } M :t 2 ├lx : t 1.M : t 1 t 2 ├M 1 : t 1 ├M n : t n ├ ( M 1 , , M n ) : t 1 t n (proj) ├M : t 1 t n (1 i n) ├M .i : t i Ichiro Satoh 型推論規則の記法 前提への操作と表記 {x:t} 前提に x:t を追加、ただし、 に変数xに関する勝たし体があった場合 は、もっとも右側を優先する (x)=t 前提のもとで、定数あるいは変数xが型tを持つことをあわす。 Ichiro Satoh 型推論規則(詳細) 型推論規則 (const) ├ ct : t (var) ├x : t (abs) {x : t 1├ } M :t 2 ├lx : t 1.M : t 1 t 2 ( ( x ) t ) 関数lx:t1.Mが関数型t1→t2を持つ のは、仮引数の型t1と仮定したとき、 関数Mが型t2をもつときである。 Ichiro Satoh 型推論規則(詳細) 型推論規則 (app) ├M 1 : t 1 t 2 ├M 2 : t 1 ├M 1M 2 : t 2 関数は、関数がその定められた値 にのみ適用可能であり、その結果 は関数の値の型を持つこと (prod) ├M 1 : t 1 ├M n : t n ├ ( M 1 , , M n ) : t 1 t n 関数の組(M1,...,M2)はM1,...,M2の 直積となる (proj) ├M : t 1 t n (1 i n) ├M .i : t i 関数の組(M1,...,M2)からI番目の 要素を取り出したときはM1の型 となる Ichiro Satoh 型推論の例 型推論では推論規則により変形していく 型付ラムダ式 K=lx.(ly.x) {x : t 1├ } x :t1 {x : t 1├ } ly : t 2 .x : t 2 t 1 ├lx : t 1.(ly : t 2 .x) : t 1 (t 2 t 1 ) Ichiro Satoh 型推論の性質 健全性 型推論できるならば、その結果が正しい(型安全)ことを意味する 完全性 正しいことはすべての型において推論することができる 有用性 決定可能かつ効率がよいこと Ichiro Satoh 多相型 プログラム中に現れる同一の式やデータが複数の型をもつこと L.CardelliとP.Wegnerによる分類 アドホックな多相型 文脈によって型を決定。例、等号、オーバーローディング演算子 系統的な多相型 共通の性質をもった型に作用。例:パラメトリック多相型 パラメトリック多相型の例: twice関数 (twice f(3)) = f(f(3)) fがint型ときのtwice関数の型: (int→int)→int→int fがfloat型ときのtwice関数の型: (float→float)→float→float Ichiro Satoh
© Copyright 2024 ExpyDoc