ATTAPL輪講 2007/06/06 9.3 Singleton Kinds 稲葉 一浩 [email protected] これまでのあらすじ λlet typedef 的なものがある型システム t ::= … | let X = T in t Γ::= (x:T | X::K.
Download
Report
Transcript ATTAPL輪講 2007/06/06 9.3 Singleton Kinds 稲葉 一浩 [email protected] これまでのあらすじ λlet typedef 的なものがある型システム t ::= … | let X = T in t Γ::= (x:T | X::K.
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
おしまい