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
© Copyright 2025 ExpyDoc