1 / 24

ATTAPL 輪講 2007/06/06 9.3 Singleton Kinds

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 を扱うシステム

johnna
Télécharger la présentation

ATTAPL 輪講 2007/06/06 9.3 Singleton Kinds

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. ATTAPL輪講 2007/06/06 9.3 Singleton Kinds 稲葉 一浩 kinaba@is.s.u-tokyo.ac.jp

  2. これまでのあらすじ • λ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)

  3. 今日の内容 • λS • typedef を表現できる別のシステム • let式やモジュールインターフェイスではなく“Singleton kind” を用いる

  4. 導入 • λ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] ← 型エラー

  5. 導入 • なぜ型エラー? • Xのkindが正確でない • 実際は X には Nat しか入らないにもかかわらず • X::* となっている let X = Nat in (λx:X. x+1)(4) (λX::*. (λx:X. x+1)(4)) [Nat] ← 型エラー

  6. 導入 • そこで、新しいkindを導入 • S(Nat) • Natと等価な型のみを含むkind let X = Nat in (λx:X. x+1)(4) (λX::S(Nat). (λx:X. x+1)(4)) [Nat] ← OK

  7. Agenda • λsの定義 • Kind, kinding rules • Type equivalence • Higher order singleton kinds • Algorithmic type equivalence • Phase-splitting

  8. λ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 は表現力に影響しないので)

  9. λSのkind : kind付け規則 • Γ├ T :: K • pp.369 – 370参照 • だいたい普通 • Subkinding があるのが特徴 • 例 • S(Nat) <: * • * ⇒ S(Nat) <: S(Nat) ⇒ *

  10. λ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)

  11. 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]

  12. λ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

  13. 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

  14. equivalence は kind 依存 • ├ (λX::*.X) ≡ (λX::*.Nat) :: *⇒* • ├ (λX::*.X) ≡ (λX::*.Nat) :: S(Nat)⇒* • 以下の導出可能性に帰着 • X::* ├ Nat ≡ X :: * • X::S(Nat) ├ Nat ≡ X :: *

  15. このあとの話題 • Singleton at Higher Kinds • Algorithmic Type Equivalence • Phase-Splitting • λ(||)からλsへの変換

  16. Singleton at Higher Kinds • S( (λX::*. X→X) :: *⇒*) • λX::*. X→X と*⇒*で等価な型のみを含むkind • ΠX::*. S(X→X) こう表現できる 一般的な定義はp.373

  17. Aspinall(1994) • Higher kind singleton をプリミティブにする • Γ├ S≡T :: K def= Γ├ S :: S(T::K)

  18. 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 を調べる

  19. Natural Kind • Kindはいつ型定義をもつことができるか • Singleton kindを持っているとき • K-SINTROは実際に情報をふやすわけではない ⇒ Natural Kind • K-SINTRO規則を用いずに導ける、もっとも詳細なkindのこと

  20. 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

  21. 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) :: *

  22. 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での表現)

  23. λ(| |)のλ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

  24. おしまい

More Related