Document

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
おしまい