プログラム理論特論 第4回 亀山幸義 [email protected] http://logic.is.tsukuba.ac.jp/~kam/progtheory ソフトウェアの 安全性、堅牢性、高信頼性 安全な(safe)ソフトウェア 堅牢な(robust)ソフトウェア 授業と関係のな い寄り道です Fault-tolerance, fail-safe:部分的に失敗しても全体としてはおかしくなら ない 信頼性(reliable, trustful)の高いソフトウェア Security:(悪意のある)攻撃者に対する安全性 上の2つを含む? Verified: 正しさに関する保障がある 用語は定まっていない プログラム言語の安全性、堅牢性:強い型システム等により 実現 Java言語の byte-code verifier: 外付けの信頼性向上の手段 復習 プログラム言語の型システムの構造を深く観 察するために、非常に単純なプログラム言語 (型付きラムダ計算 Church流)を導入した 型付きラムダ計算の構文、計算規則を定義し た 例題 Δ|- f : α→α Δ|- x : α Δ|- f : α→α Δ|- f x : α Δ|- f (f x) : α Γ|- λx. f (f x) : α→α {}|- λf. λx. f (f x) : (α→α) →(α→α) Γ={fα→α} Δ={fα→α, xα} Curry流の体系:構文 項の構成規則 Γ|- M : B 具体例 (自然数の)階乗を計算する関数fact 型検査 (type-checking) 問題:Γ、M、Aが与えられたとき、 となるかどうか検査する(YES か NO か答え る) 型推論 (type-inference) 問題:Mが与えられたとき、 となるΓとAがあるかどうか判定する。YES/NOだけでな く、YESの場合は具体的に与える 今日の目標 Church流の型付きラムダ計算の体系に対する型推 論アルゴリズムを学ぶ。 型推論ができれば、型検査も容易 Curry流の体系に対する型推論アルゴリズムも基本的に は同じ 型推論ができてしまえば、Church流もCurry流も差はない 階乗関数の例題 (revisited) まず、具体的なラムダ計算の体系を定めよう 上記の例題を記述できるミニ言語を、型付きラム ダ計算の一種として定式化しよう。 型定数は何だろうか? 定数とその型は何だろうか? ミニ言語 型定数 int (整数)、bool (真理値) 定数とその型 *: int の引数を2つもらってintを返す関数 (これまでに学習した)型付きラムダ計算の体系では、関数の引数は 1つだけであった。 では、どうやって、2引数関数を表現するか? 方法1: 2引数関数を新たに導入する 方法2: 直積型を導入する *: (int, int) → int *(2,3) ⇒ 6 *: (int × int) → int *(<2,3>) ⇒ 6 方法3: 高階関数を使う(Currying) *: int → (int → int) *(2)(3) ⇒ 6 ここでは、方法3を採用、*(2)(3) を *(2,3) と書くこともある ミニ言語 型定数 int (整数)、bool (真理値) 定数とその型 ==: int の引数を2つもらってboolを返す関数 if: bool型の値1つと int型の値2つをもらってint型の値を 返す関数 if: bool→(int→(int→int)) そのほか ==: int→(int→bool) =と紛らわしいので以下では eq と表記する *: int→(int→int), -: int→(int→int), 0:int, 1:int これで全てだろうか? ミニ言語 まだ = を定式化していない 定式化1 =: ある型Aをもつ値2つをもらって、なにか(?)を返す関数 定式化2 =:定義の導入 factを定義したいのだが、右辺にも出てくるので定義になって いない 再帰呼び出しを表す定数を導入する ミニ言語 R はなんだろうか? Recursor (再帰呼出しを生成するもの) 型は (関数→関数)→関数 という形をしている 計算規則: RM ⇒ M(RM) すなわち f = M f という形の「方程式」の解 f が RM である 一般には、R: ((A→A)→(A→A))→(A→A) という型をもつものを recursor とよぶ。上記のRは一般的なrecursorの一例 上のようにすると = は単なる定義(右辺のプログラムに名前をつ けているだけ)なので、= の型付けを考える必要はない 右辺に型がつけば、それでおしまい ミニ言語のまとめ ミニ言語:型付きラムダ計算の体系で、型定 数、定数を以下のように定めたもの 型定数 int、bool 定数とその型 A→B→C は、 A→(B→C)のこと eq: int→int→bool if: bool→int→int→int *: int→int→int, -: int→int→int 0:int, 1:int R: ((int→int)→(int→int))→(int→int) 階乗プログラムの型付け どのようにしたら、このプログラムの型が整合的かどう か判定できるか? また、このプログラム(全体)の型は 何であるか? top-down approach プログラム全体から部分を見ていく 型推論図を、下から上へ作っていく bottom-up approach top-downの逆 その他の例 自由変数がある例 Church流でも、いきなり難しくなる Curry流と同等な難しさ 休憩 再開後は、型推論アルゴリズム について 型推論の準備 問題:1つのMに対してΓ|- M:A が成立するΓ、 Aが多数(しかも無限に多く)存在する可能性 があるため、これらをどう表現すればよい か? f(x)というプログラムは f: int→int, x:int でも、 f:bool→int, x:bool でも型がつく 型推論の準備 問題に対する答え:「最も一般的な型付け」が 一意的に存在することが知られている [Principal Typing Theorem] f(x) は f: A→B x: A f(x): B という型付けがもっとも一般的 型変数、代入 型変数 型は、型定数と→から構成されていた。 型推論を行うため、「型をあらわす変数」が必要になる。 ここでは、α、β 等を使う(以後では、型定数には K1, K2, ..を使う) 以下では、型といえば、型変数を含んでもよいものとする。一般的な型を A,B,C 等であらわす 型に対する代入 [A/α, B/β, ...] の形のもの 意味としては、型変数αに型Aを代入する、等を同時に行った代入を表す 型の世界は、項の世界と違ってλがないので、代入は単純に定義できる K [A/α,...] = K α[A/α...] = A (B→C)[A/α...] = (B[A/α,...]) (C[A/α,...]) 単一化 (unification) 2つの型A,Bに対して、 Aτ = Bτ となる最も一般的な代入(mgu)を見つけ るアルゴリズム 型推論問題の再定式化 Γ|- M:A となる、Γ,A (型変数をふくんでいるか もしれない)のうち、代入に関してもっとも一般的 なものを見つける 次回 単一化アルゴリズム 型推論アルゴリズム 簡単なレポート出題 訂正 型推論規則におけるΓ-{xA} という表記につ いて 型推論規則の説明ではすっとばしてしまったが、 きちんと型推論するためには、以下の条件が必 要。 Γに、xB という要素が含まれているとき(AとBは 異なる型)、Γー{xA}は定義されない、と定める。 また、同じΓの中に同時に、xA, xB (AとBは異な る)という2つの要素はふくまれないとする。 int bool}は文脈ではない たとえば、{x , x Curry流の文脈でも同様の条件が必要
© Copyright 2024 ExpyDoc