プログラム理論特論 第3回 亀山幸義 [email protected] http://logic.is.tsukuba.ac.jp/~kam/progtheory 型のないλ計算(復習) 「関数」の概念(のみ)を定式化 変数 関数の構成(λ式、λ抽象) 関数呼び出し(関数適用) 非常に小さなプログラム言語 構文論と意味論 理論的な性質 計算規則の健全性 非決定的な計算と合流性 停止性は不成立 計算の健全性 計算規則の健全性 Γ|- M:Λ かつ M⇒。。。⇒Nならば Γ|- N:Λ である プログラムを計算(式の変形)をしている途中 でプログラムでないものが現れない(おかしな 状態になったりしない)ことを保証 証明は、計算列の長さに関する帰納法 合流性 非決定的な計算と合流性 λ式Mからはじめて複数の経路で計算できる (λx.x)((λy.y)z) しかし、どの経路も合流させることができる M⇒。。。⇒N かつ M⇒。。。⇒L ならば、 あるλ式Pがあって、 N⇒。。。⇒P かつ L⇒。。。⇒P とできる 計算が停止すれば、その値(計算結果となるλ 式)は一意的である、どういう順番で計算して もよい プログラムの最適化などに応用(定数のみを 含む式などはコンパイル時に計算) 停止性 停止しない計算がある ω ≡ (λx. x x)(λx. xx) とすると {} |- ω:Λ が成立する ω ⇒ ω ⇒ … (無限ループ) このようなωはいったいどういう計算をあら わしているのだろうか? 答え1: 無意味だからプログラムとして認める べきでない 答え2: 意味を与えるべき 型付きλ計算 ーInformal Introductionー 型付きλ計算とは? 型のないλ計算に型の概念を加えたもの 型とは データ型の概念 (の一般化) データの種類;同じ操作ができるデータの集合 基本型:Int (整数型)、real (実数型)、、、、 型構成子: array, record, variable record, pointer (PASCAL言語), array, struct, union, pointer (C言語) 基本型から型構成子を使って構成したもの 計算機上の表現(実装)から考えると 同じサイズおよび同じ形式で表現できるデータの集合 型の有用性 型の有用性 プログラムがわかりやすくなる プログラムにおけるバグが早期に発見できる コンパイラが型の整合性を自動的にチェック 整数型の変数に関数へのポインタを代入しようと する、等の誤りの発見 型情報を用いて、より高速なコードを生成でき る可能性がある x+y という式は整数の場合と実数の場合とを見分 けなければならないが、整数とわかっていれば機 械語の加算命令をいきなり呼べばよい 型の有用性(つづき) 型の有用性 型システムがきちんとできている場合、以下の 性質が成立する 型検査をプログラム実行前にしておけば、プログラ ム実行中は型エラーは起きない これが、この講義の眼目 詳細は後で 関数の型とは? 実は、関数のない場合の型の整合性検査 はやさしい 本質的なのは、関数に対する型があるとき 関数の型の整合性とは? f(x)=x+1 という関数定義に対して、 f(“abc”) という呼び出しはエラー f(f(3)) はOK f(x,g)=g(x) という定義の場合は? 型付きλ計算 ーFormal Introductionー 構文 型(Type) 型定数 α, β, …は型 (有限個または無限個) A,Bが型ならば、A→Bは型 (型構成子は→だけ) A : Type α : Type B : Type A→B : Type 構文 変数 文脈 型Aごとに、変数 xA, yA, … がある(無限個の変数が ある) 変数の有限集合を文脈と呼び、Γ、Δ等であらわす 例: Γ={xα, y(α→β)→(α→β)} 判断 Γ|- M : A と言う形の表現 Γという文脈のもとで、項Mは型Aをもつλ式である 項Mは型Aをもつλ式であり、その自由変数はΓである。 構文 項の構成規則 Γ|- M : B Γ|-x : A (xA∈Γ) Δ|- λxA.M : A→B Δ=Γ-{xA} Γ|- M : A→B Γ|- N : A Γ|- MN : B 例題 Δ|- f : α→α Δ|- x : α Δ|- f : α→α Δ|- f x : α Δ|- f (f x) : α Γ|- λx. f (f x) : α→α {}|- λf. λx. f (f x) : (α→α) →(α→α) Γ={fα→α} Δ={fα→α, xα} 定義 型なしλ計算と同じ定義 自由変数、束縛変数 束縛変数を一斉に名前換え 計算規則 代入 計算:例題 (λfint→int. λxint. f (f x))(λyint. y+5) ⇒λxint.(λyint.y+5)((λyint.y+5)x) ⇒λxint.(λyint.y+5)(x+5) ⇒λxint.(x+5)+5 int→int. λxint. f (f x))(λyint. y+x) (λf ⇒λzint.(λyint.y+x)((λyint.y+x)z) ⇒λxint. (x+z)+z 型があると何が違うか? 型のないλ式Mに対して Γ|- M:A となるようなΓとA を見つけることはいつでもできるだろうか? 答え: NO 前述のωに型をつけることはできない A=A→Bとなる型Aは(この範囲では)存在しない 型付きλ計算は、ωのような式を排除 型のないλ式であるかどうかの判定は容易であった が、型がつけられるかどうかの判定は容易とは限ら ない(考える必要がある) 型の整合性の検査 型検査 入力:Γ,M,A 出力:Γ|-M:A が成立するかどうかの情報 型推論 入力:型がつくかどうかわからない式M 出力:Γ|-M:AとなるΓ、A が存在するかどう かの情報と、存在する場合はそのΓとA 型検査や型推論が自動的にできることが、 望ましいプログラム言語としての必要条件 型推論が自動的にできれば、型検査も自 動的にできる 型検査 単純型付きλ計算の体系に対して、型検査 のアルゴリズムが存在する 入力:Γ, M, A 出力:Γ|-M:A が成立するかどうか Mの構成に応じて場合わけをすればよい その際に、定まっていない型をあらわす型変 数を導入する必要がある 型推論 単純型付きλ計算の体系に対して、型推論 のアルゴリズムが存在する 入力:型がつくかどうかわからない式M 出力:Γ|-M:AとなるΓ、A が存在するかどう かの情報と、存在する場合はそのΓとA 次回までに考えてください 式Mが与えられたとき、Γ|-M:Aが成立するΓ、 Aはいくつあるか? たくさんあるとき、それらをうまく表現する方法 はあるか? Mが与えられたとき、その、うまい表現を計算 するアルゴリズム(型推論アルゴリズム)は?
© Copyright 2025 ExpyDoc