ATTAPL輪講 2007/06/06 9.3 Singleton Kinds 稲葉 一浩 [email protected] これまでのあらすじ λlet typedef 的なものがある型システム t ::= … | let X = T in t Γ::= (x:T | X::K | X::K=T)* (term) (context) λ(| |) モジュールにおける typedef を扱うシステム I ::= … | (|T|) | (|K|) | (|K=T|) (module interface) 今日の内容 λS を表現できる別のシステム let式やモジュールインターフェイスではなく “Singleton kind” を用いる typedef 導入 λlet は 型に関するλ抽象 型に関するlet式 (λX::K. t ) ( let X=T in t ) の両方をプリミティブに持っていた なぜ? let X = Nat in (λx:X. x+1)(4) (λX::*. (λx:X. x+1)(4)) [Nat] ← 型エラー 導入 なぜ型エラー? let X = Nat in (λx:X. x+1)(4) (λX::*. (λx:X. x+1)(4)) [Nat] ← 型エラー Xのkindが正確でない 実際は X には Nat しか入らないにもかかわらず X::* となっている 導入 そこで、新しいkindを導入 let X = Nat in (λx:X. x+1)(4) (λX::S(Nat). (λx:X. x+1)(4)) [Nat] S(Nat) Natと等価な型のみを含むkind ← OK Agenda λsの定義 Kind, kinding rules Type equivalence Higher order singleton kinds Algorithmic type equivalence Phase-splitting λSのkind : 定義 K ::= * S(T) ΠX::K. K ΣX::K. K (kind of proper types) (singleton kind) (dependent product, K⇒K) (dependent sum, K×K) ※ ただし、S(T) の T は T::* に限定 (Higher order singleton kind は表現力に影響しないので) Γ::= (x:T | X::K)* (context) λSのkind : kind付け規則 Γ├ T :: K pp.369 – 370参照 だいたい普通 Subkinding があるのが特徴 例 S(Nat) <: * * ⇒ S(Nat) <: S(Nat) ⇒ * λSのkind : 例 Nat Nat λX::*.X λX::*.X λX::*.X λX::*.X :: * :: S(Nat) :: *⇒* :: ΠX::*.* :: ΠX::*.S(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-BETA 則などがない! equivalence は kind に依存 Q-SELIM Γ├ 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) 証明せよ 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 :: * 構造 等価性 既に WHNF Y::略 |→ Y←→Y :: 略 |→ (λX::*.X)⇔(λX::*.Nat) :: (S(Nat)⇒*) Y::(S(Nat)⇒*)⇒* |→ Y(λX::*.X)←→Y(λX::*.Nat) :: * Y::(S(Nat)⇒*)⇒* |→ Y(λX::*.X) ⇔ Y(λX::*.Nat) :: * Exercise 9.3.9 (2) 証明できない X::* |→ (λX::*.X)X ~> X ~> Nat X::* |→ (λX::*.Nat)X ~> Nat X::* |→ Nat←→Nat :: * X::* |→ (λX::*.X)X⇔(λX::*.Nat)X :: * Y::略 |→ Y←→Y :: 略 |→ (λX::*.X)⇔(λX::*.Nat) :: (*⇒*) Y::(*⇒*)⇒* |→ Y(λX::*.X)←→Y(λX::*.Nat) :: * 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 おしまい
© Copyright 2024 ExpyDoc