Document

型推論3(MLの多相型)
MLの型多相
• ML言語設計では、任意の式に多相を許すわけ
ではない。
• let-polymorphism
– let pr = λx. Print(x) in…pr(3)…pr(x=3)…
– let <名前> = <式1> in <式2>
<式2>の中で使われる<名前>の複数の出現に
ついてのみ異なる型を持ってよい。この形の制限され
た
型多相のみが許されている。
MLの多相型の形式化に向けて
• ナイーブなアプローチ: λ→の型式の中に導入したような
“型変数”をもちこみ、次のような単純な推論規則を付加する。
A |- E : T
------------- (*)
A |- E : T’ 但し T’はT中の型変数に代入を施したインスタンス
• この方式では次の2つの問題が生じる:
問題点(1) λx. [succ x not x] :α -> (int x bool)
が証明されてしまう。
(課題: ナイーブなアプローチでこれを証明せよ。)この証明の結
果は、我々の“λ抽象”に対する直感から外れたものである。即
ちf x =<関数本体>に現われるxは全て同じ値をもつ、ゆえに
同じ型を持つはず、という直感に反する!!!
問題点(2) MLでは、いわゆる let-polymorphismという制限され
た形の多相型の使用のみが言語設計上許されている。これを
表すのに上で示した簡単な推論規則(*)では対処できない。即
ち:
let id = λx.x in [id(3), id(true)] におけるidはlet内で定義
されたもので、型多相な関数として、この定義が正しく型づけが
できるようにしたい。
( letの定義では id : α→α,
本体の中では id : int  int, id : bool  bool )
二つの推論規則の導入
•
以上の考察から、λ抽象する変数(名前)と、局
所定義(let定義)の本体に現われる変数(名前)
の型推論規則を区別する必要がありそうである。
1. λ抽象の場合、本体中のλ変数である変数の複数の
出現は同じ値・型としてinstantiateされる。
2. let定義で定義される名前は、let式の本体では異なる
出現は異なる値・型をinstantiateすることができる。
•
型推論において上の1,2を区別するために、い
くつかの概念を導入する(Robin Milner)。
総称型と型スキーマ
• 総称型変数(generic type variable)
– 同じ型変数で、異なる出現で異なるinstantiationする
ことができるものをいう。
– 同じ型変数で、全ての出現に対して、常に同じ
instantiationしか許されないものを非総称型変数
(non-generic type variable)とよぶ。
• 型スキーマ(shallow types)
– 型式Tが型変数α1, … ,αnを含むことがあり得て、
かつその中に が現われないとき、
α1, …, αn T の形をした型式を
型スキームとよぶ。またshallow type とも呼ばれる。
( α. α →α) → ( α. α →α)
非例
型スキームのinstantiation/特化の規則
• 型スキームをinstantiateした結果の型も、
型スキームでなければならない。すなわち、
shallow type の特化したものはshallow type
でなければならない。
– α. (α →α)のαにintを代入すると int → intとなりこれは
shallow typeであるのでこの代入は型スキームの特化として
OKである。
– α. (α →α)のαに β.β→intを代入して得られるとこの
( β.β→ int) → ( β.β→ int)は型スキーム/shallow type
でないので、この代入は型スキームのinstantiationではない。
Generic Instance
•
より形式的な定義:
S, S’ をtype schemeとする。S’がSのgeneric instanceとは S > S’
と書き、次の条件を満たす。
– S’はSの限量化されている幾つかあるいは全ての型変数に
代入を行い、さらに必要があれば、代入の結果、もとのSで
自由であった型変数以外のものを限量化して得られる型ス
キームである。
– More precisely, S = α1… αm.τ
S’ = β1… βn.τ’
•
•
–
τ’= [τi/αi]τ for some τ1,…τm’ (m’ ≦ m)
βi はSで自由でない。
例: α. (β →α) > γ.(β→(βxγ)) OK
α. (β →α) > β. γ.(β→(βxγ))
NG
MLについて
•
•
Meta Languageの略。‘70はじめに、R.Milnerが基本
設計。LCF(Language for Computable Logic)という表
示的意味論にもとづく、computable functionに関する
verification systemのために証明戦略等を記述するメ
タ言語をもとにして、発展した。
特徴
–
–
–
–
基本的に関数型言語
非明示的な型多相言語
実用的言語
全ての単純な構文単位がterm(項/式)とみなせる。
・ SML(Standard ML): 抽象データ型(ADT)と
“module”機能を持つ。
MLの型推論の特徴
1. 多相型を持ち、それはshallow typeである。
2. 型推論アルゴリズムは決定可能である。
shallow typeより表現力の強い多相型を許すと
決定可能でなくなる。
fix ( letrec) があるので、MLは全ての部分帰納的関
数を表現できる。このために型をもつ全てのプログラ
ムが停止するわけではない。(cf. λ→において型をも
つλ式は強正規化可能であった。)
4. 課題:λ→の枠組みで不動点演算子が型付けできる
か??
3.
μMLの型推論システム1
μMLの型推論システム2
μMLの型推論システム3
αはτ’に出現する全ての
型変数のうち、前提Aにも
現われないもの。
let-polymorphismの推論例
課題
1. let f = λx.x in f f の型を求めよ。
2. (λf. f f )(λx.x)の型付けを試みよ。
3. |- let f =λx.x in f f : α→α という型判定を
証明せよ。
型推論アルゴリズム
Unification(1)
Most general unifier
Unification(2)
推論アルゴリズムの導出
推論手続きWのアイデア
推論手続きWのアイデア(2)
μMLの型推論アルゴリズム