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