Transcript PowerPoint
プログラム理論特論
第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が与えられたとき、その、うまい表現を計算
するアルゴリズム(型推論アルゴリズム)は?