Transcript Document
ATTAPL輪講 (第4回)
続 Dependent Types
2006/06/21
稲葉 一浩
今日の内容
ﻪDependent Types と多相型
ﻩCalculus of Construction (2.6)
ﻩλ-cube (2.7)
ﻪDependent Types を使ったプログラミング
ﻩDML (2.8)
Calculus of Construction (CC)
ﻪλLF の拡張
t
T
K
::= x | λx:T.t | t t | all x:T.t
::= X | Πx:T.T | T t | Prop | Prf
::= * | Πx:T.K
Γ├ Prop
Γ├ Prf
:: *
:: Πx:Prop.*
Γ├ T :: *
Γ,x:T ├ t : Prop
Γ├ all x:T.t : Prop
Γ├ T :: *
Γ,x:T ├ t : Prop________
Γ├ Prf(all x:T.t) ≡ Πx:T.(Prf t) :: *
Calculus of Construction (CC)
ﻪおおまかな気持ち
ﻩ型 Prop を持つ term とは
ﻯ命題
ﻯデータ型
ﻩ型 Prf p を持つ term とは
ﻯ命題 p の証明
ﻯデータ型 p のメンバ
例
ﻪ自然数のエンコーディング
ﻩzero = λz.λs.z
: ∀X. (X→(X→X)→X)
ﻩone = λz.λs. s z : ∀X. (X→(X→X)→X)
ﻩsucc = λm.λz.λs. s (m s z)
:略
ﻪ自然数というデータ型を項 nat として表現
ﻩnat : Prop
ﻯall a:Prop. all z:Prf a. all s:Prf a→Prf a. a
ﻩPrf nat
≡ Πa:Prop. Πz:Prf a Πs:Prf a→Prf a. Prf a
例
ﻪPrf nat 型をもつ項
ﻩzero : Prf nat
ﻯλa:Prop. λz:Prf a. λs:Prf a→Prf a.
z
ﻩsucc : Prf nat → Prf nat
ﻯλn:Prf nat. λa:Prop.
λz:Prf a. λs:Prf a→Prf a.
s (n a z s)
CCのできること
ﻪさまざまなAbstraction
ﻩλx:T. t
項に依存する項
λ→
項に依存する型
λLF
ﻯふつうのλ抽象
ﻩΠx:T. T
ﻯDependent Types
ﻩΛX::*.t
型に依存する項
∀ ﻩX::*.T 型に依存する型
ﻯ多相型 id = ΛX::*.λx:X. x : ∀X.X→X
F
Fλx:Prop. t
all x:Prop. T
ﻩΛX::K. t高階の型に依存する項
Fω λx:Prop→Prop. t 等
T等
∀ ﻩX::K. T
高階の型に依存する型 all x:Prop→Prop.
Fω
ﻯ高階の多相型
論理結合子と推論規則の表現
ﻪand = λp:Prop. λq:Prop.
all a:Prop. all pair:Prf p→Prf q→Prf a. a
ﻪleft : Prf(and p q) → Prf(p)
ﻩλx:Prf(and p q). (x p) (λa.λb.a)
ﻪright: Prf(and p q) → Prf(q)
ﻩλx:Prf(and p q). (x q) (λa.λb.b)
論理結合子と推論規則の表現
ﻪeq = λa:Prop. λx:Prf a. λy:Prf a.
all p:Prf a→Prop. all h:Prf (p x). p y
ﻪeqRefl : Πa:Prop. Πx:Prf a. Prf (eq a x x)
ﻩλa:Prop. λx:Prf a. λp:Prf a→Prop. λh:Prf(p x). h
ﻪeqSym : Πa:Prop. Πx:Prf a. Πy:Prf a.
Prf (eq a x y) → Prf (eq a y x)
ﻪeqRefl : 略
いろいろ
ﻪAlgorithmic Typing
ﻩ67ページ
ﻪStrong Normalization of Well-Typed Terms
ﻩFω に帰着して証明するなど
ﻪCC + Sigma Types
ﻩT ::= ... | Σx:S.T
「 × ﻯex y:T.t : Prop」 「Prf(ex y:T.t) ≡ Σy:T.Prf t」
「 ○ ﻯσy:Prf s.t : Prop」 「Prf(σy:Prf s.t)≡Σy:Prf s.Prf t」
Calculus of Inductive Construction
ﻪさっきのやり方では、「数学的帰納法」が
「証明」できない
ﻩ以下の型をもつterm natIndが構成できない
ﻪnatInd : Πp:Prf nat→Prop.
Prf (p zero)
→Πx:Prf nat. (Prf (p x) → Prf (p succ(x))
→Πx:Prf nat. Prf (p x)
CIC
ﻪプリミティブとして、帰納法を表すtermを追加
ﻩnat:Prop
ﻯzero : Prf nat
ﻯsucc : Prf nat → Prf nat
ﻩnatInd : Πp:Prf nat→Prop.
自動的に宣言
Prf (p zero)
→Πx:Prf nat. (Prf (p x) → Prf (p succ(x))
→Πx:Prf nat. Prf (p x)
ﻩnatInd p hz hs zero
≡ hz
ﻩnatInd p hz hs (succ n) ≡ hs n (nadInt p hz hs n)
CIC
ﻪ任意の帰納的なPropに対しても同様
ﻩlist : Prop
nil: Prf list
cons: Prf nat → Prf list → Prf list
ﻩlistInd : Πp:Prf list→Prop.
Prf (p nil)
→ Πx:Prf nat. Πy:Prf list.
(Prf (p y) → Prf (p (cons x y))
→Πx:Prf list. Prf (p x)
ﻩlistInd p hn hc nil
≡ hn
ﻩlistInd p hn hc (cons x y) ≡hc x (listInd p hn hc y)
自動的に宣言
注: 帰納法と再帰関数
ﻪStrong Normalization を保証する言語では、
任意の再帰関数は定義できない(停止しな
い可能性があるため)
ﻪCICでは、Induction termを使ってある程度
の再帰関数は記述できる
Coq (Barras et al., 1997)
ﻪCICに基づく
ﻩT ::= .. | Prop | Set
ﻩCC の Prop を「Prop」と「Set」に分割
ﻯ命題として使うところではProp
ﻯデータ型として使うところではSet を使う
ﻯあとでProp部分を除いてSet部分だけ残したプログ
ラムを抽出すると、普通の関数型言語のプログラ
ムが抽出できる
λ-cube
ﻪさまざまなAbstraction
Fω
F
CC
・
・
λ→
λP
Pure Type Systems
Γ├*:□
t ::= s | x| λx:t.t
| t t | Πx:t.t
s ::= * | □
Γ├ S : * Γ,x:S├ t:T
Γ├λx:S.t : Πx:S.T
Γ├ S : si Γ,x:S ├ T : sj
Γ├Πx:S.T : sj
where (si, sj) ∈
{(*,*)}
{(*,*) (*,□)}
{(*,*)
(□, *)}
{(*,*)
(□, *), (□,□)}
{(*,*) (*,□) (□, *), (□,□)}
x:t ∈ Γ
Γ├ x:t
λ←
λP
F
Fω
CC
Γ├t1 :Πx:S.T Γ├t2:S
Γ├t1 t2 : [x→t2]T
Γ├t:T
T≡S Γ├S:s
Γ├ t: S
今日の内容
ﻪDependent Types と多相型
ﻩCalculus of Construction (2.6)
ﻩλ-cube (2.7)
ﻪDependent Types を使ったプログラミング
ﻩDML (2.8)
Dependent Typesを導入した言語
ﻪ古くは
ﻩPebble (Lampson and Burstall, 1988)
ﻩQuest(Cardelli and Longo, 1991)
ﻪ最近では
ﻩCayenne (Augustsson, 1998)
ﻯHaskell ベース
ﻩDependent ML (Xi and Pfenning, 1998)
ﻯSML ベース
ﻯCaml ベースの実装 (de Caml) もあり
問題点と解決策
ﻪDependent Types の型チェックはtermのequality検査が必要
ﻪ一般の言語では、termのreductionは止まらないことがある
ﻪ停止性は決定不能
ﻪCayenne
ﻩ任意のtermへの依存を許す
ﻩ十分長い時間走らせて計算が止まらなければ型エラー
ﻪDependent ML
ﻩ依存できるtermを制限して、
効率的にequalityを決定可能な範囲に限る
Dependent ML (Simplified)
ﻪ依存できるtermを、
整数の線形な部分集合に限る
I ::= int | {x:I | P}
P ::= P ∧ P | i≦i
i ::= x | q | qi | i + i
(q∈Z)
t ::= x | λx:I.t | λx:T.t | t[i] | t t
T ::= X | Πx:I.T | T→T
Dependent ML 例
ﻪappend
ﻪbrake