240 likes | 335 Views
ATTAPL 輪講 2007/06/06 9.3 Singleton Kinds. 稲葉 一浩 kinaba@is.s.u-tokyo.ac.jp. これまでのあらすじ. λ let typedef 的なものがある型システム t ::= … | let X = T in t (term) Γ::= (x:T | X::K | X::K=T )* (context) λ (| |) モジュールにおける typedef を扱うシステム
E N D
ATTAPL輪講 2007/06/06 9.3 Singleton Kinds 稲葉 一浩 kinaba@is.s.u-tokyo.ac.jp
これまでのあらすじ • λlet • typedef 的なものがある型システム • t ::= … | let X = T in t (term) • Γ::= (x:T | X::K | X::K=T)* (context) • λ(| |) • モジュールにおける typedef を扱うシステム • I ::= … | (|T|) | (|K|) | (|K=T|) (module interface)
今日の内容 • λS • typedef を表現できる別のシステム • let式やモジュールインターフェイスではなく“Singleton kind” を用いる
導入 • λletは • 型に関するλ抽象 (λX::K. t ) • 型に関するlet式 ( let X=T in t ) の両方をプリミティブに持っていた • なぜ? let X = Nat in (λx:X. x+1)(4) (λX::*. (λx:X. x+1)(4)) [Nat] ← 型エラー
導入 • なぜ型エラー? • Xのkindが正確でない • 実際は X には Nat しか入らないにもかかわらず • X::* となっている let X = Nat in (λx:X. x+1)(4) (λX::*. (λx:X. x+1)(4)) [Nat] ← 型エラー
導入 • そこで、新しいkindを導入 • S(Nat) • Natと等価な型のみを含むkind let X = Nat in (λx:X. x+1)(4) (λX::S(Nat). (λx:X. x+1)(4)) [Nat] ← OK
Agenda • λsの定義 • Kind, kinding rules • Type equivalence • Higher order singleton kinds • Algorithmic type equivalence • Phase-splitting
λSのkind : 定義 • K ::= • * (kind of proper types) • S(T) (singleton kind) • ΠX::K. K (dependent product, K⇒K) • ΣX::K. K (dependent sum, K×K) • Γ::= (x:T | X::K)* (context) ※ ただし、S(T) の T は T::* に限定 (Higher order singleton kind は表現力に影響しないので)
λSのkind : kind付け規則 • Γ├ T :: K • pp.369 – 370参照 • だいたい普通 • Subkinding があるのが特徴 • 例 • S(Nat) <: * • * ⇒ S(Nat) <: S(Nat) ⇒ *
λSのkind : 例 • Nat :: * • Nat :: S(Nat) • λX::*.X :: *⇒* • λX::*.X :: ΠX::*.* • λX::*.X :: ΠX::*.S(X) • λX::*.X :: S(Nat)⇒S(Nat) (↓の略記) (dependencyを使った より正確なkind) (subkinding)
Exercise 9.3.1 • 「もし型にsubtype関係があったとしたら、subkindingの規則はどうなるべきだろうか?Nat<:Top の時S(Nat)とS(Top)の関係は?」 • S(Top) <: S(Nat) ではない • (λX::S(Nat). (λx:X. x+1)) [Top] • S(Nat) <: S(Top) でもない • (λX::S(Top). (λf:X→(). f ┬)) [Nat]
λSのtype equivalence • Γ├ S ≡ T :: K • p.370 参照 • 基本的にはFω×μと同じ • 特徴 • Q-SELIM 則がある • Q-BETA 則などがない! • equivalence は kind に依存 Γ├ S :: S(T) ─ ─ ─ ─ ─ ─ ─ ─ Γ├ S≡T :: S(S) … Γ├ (λX::K.T)S ≡ [X→T]S :: K
Q-BETA 則がない Γ├T :: * Γ├T :: S(T) Γ├ S :: * Γ├ {T,S} :: S(T)×* Γ├π1{T,S} :: S(T) Γ├π1{T,S}≡T :: S(π1{T,S}) Γ├π1{T,S}≡T :: * (kinding) Q-SELIM
equivalence は kind 依存 • ├ (λX::*.X) ≡ (λX::*.Nat) :: *⇒* • ├ (λX::*.X) ≡ (λX::*.Nat) :: S(Nat)⇒* • 以下の導出可能性に帰着 • X::* ├ Nat ≡ X :: * • X::S(Nat) ├ Nat ≡ X :: *
このあとの話題 • Singleton at Higher Kinds • Algorithmic Type Equivalence • Phase-Splitting • λ(||)からλsへの変換
Singleton at Higher Kinds • S( (λX::*. X→X) :: *⇒*) • λX::*. X→X と*⇒*で等価な型のみを含むkind • ΠX::*. S(X→X) こう表現できる 一般的な定義はp.373
Aspinall(1994) • Higher kind singleton をプリミティブにする • Γ├ S≡T :: K def= Γ├ S :: S(T::K)
Algorithmic Type Equivalence • Γ |→ S⇔T :: K • ほぼλletとおなじ • Γ|→S⇔T::* は、Weak Head Normalization後に構造等価性を判定 • λletと違い、kind が型情報を持つ • X::S(Nat) |→ X⇔Nat :: * は成立してほしい • !W が型定義をもつλ(||)と事情は同じ→“Natural Kind” • Γ|→S⇔T::S(T’) は常に成立 • Γ|→S⇔T::ΠX::K1.K2 は SX⇔TX を調べる • Γ|→S⇔T::ΣX::K1.K2 は π1/2S⇔π1/2T を調べる
Natural Kind • Kindはいつ型定義をもつことができるか • Singleton kindを持っているとき • K-SINTROは実際に情報をふやすわけではない ⇒ Natural Kind • K-SINTRO規則を用いずに導ける、もっとも詳細なkindのこと
Exercise 9.3.9 (1) 証明せよ Y::(S(Nat)⇒*)⇒* |→ Y(λX::*.X) ⇔ Y(λX::*.Nat) :: * X::S(Nat) |→ (λX::*.X)X ~> X ~> Nat X::S(Nat) |→ (λX::*.Nat)X ~> Nat X::S(Nat) |→ Nat←→Nat :: * X::S(Nat) |→ (λX::*.X)X⇔(λX::*.Nat)X :: * |→ (λX::*.X)⇔(λX::*.Nat) :: (S(Nat)⇒*) Y::略 |→ Y←→Y :: 略 構造等価性 Y::(S(Nat)⇒*)⇒* |→ Y(λX::*.X)←→Y(λX::*.Nat) :: * 既に WHNF
Exercise 9.3.9 (2) 証明できない Y::(*⇒*)⇒* |→ Y(λX::*.X) ⇔ Y(λX::*.Nat) :: * X::* |→ (λX::*.X)X ~> X ~> Nat X::* |→ (λX::*.Nat)X ~> Nat X::* |→ Nat←→Nat :: * X::* |→ (λX::*.X)X⇔(λX::*.Nat)X :: * |→ (λX::*.X)⇔(λX::*.Nat) :: (*⇒*) Y::略 |→ Y←→Y :: 略 Y::(*⇒*)⇒* |→ Y(λX::*.X)←→Y(λX::*.Nat) :: *
Phase-Splitting • λ(| |)や ML のモジュールは、型定義とtermが混ざっている • これは分離可能 (Phase-Splitting) module diag = λ(p: sig type t; val x:t end). mod type u = p.t×p.t; val y:u = {p.x, p.x} end module diag_s = λ(p: sig type t end). mod type u = p.t×p.t end module diag_d = λ(p: sig type t end). λ(q: sig val x:p.t end). mod val y:p.t = {q.x,q.x} end diags = ΠX::*. S(X×X) diagd = ∀X::*. X → diags(X) (λSでの表現)
λ(| |)のλsへの埋め込み • Type part (Static part) • Module → (Pair of) types • Module Interface → Kind • Type equation →Singleton Kind • Value part (Dynamic part) • Module → (Pair of) Values • Module Interface → Type 完全な定義はp.380