ATTAPL輪講 (第4回) 続 Dependent Types

Slides:



Advertisements
Similar presentations
プログラミング言語論 第3回 BNF 記法について(演習付き) 篠埜 功. 構文の記述 プログラミング言語の構文はどのように定式化できるか? 例1 : for ループの中に for ループが書ける。 for (i=0; i
Advertisements

プログラミング言語論 第10回(演習) 情報工学科 木村昌臣   篠埜 功.
人工知能特論2011 No.4 東京工科大学大学院 担当教員:亀田弘之.
人工知能特論2007 No.4 東京工科大学大学院 担当教員:亀田弘之.
Coq を使った証明 : まとめ 稲葉.
ソフトウェア基礎科学 授業資料: 論理関係(logical relations)のお話
プログラム理論特論 第2回 亀山幸義
プログラミングパラダイム さまざまな計算のモデルにもとづく、 プログラミングの方法論 手続き型 関数型 オブジェクト指向 代数 幾何.
計算の理論 I ー DFAとNFAの等価性 ー 月曜3校時 大月 美佳.
Reed-Solomon 符号と擬似ランダム性
型宣言 (Type Declarations)
プログラミング言語論 第6回 型 情報工学科 篠埜 功.
型宣言(Type Declarations)
Survey: A Type System for Certified Binaries
条件式 (Conditional Expressions)
データ構造と アルゴリズム 知能情報学部 新田直也.
プログラム理論特論 第2回 亀山幸義
プログラミング言語論 第1回 導入 情報工学科 篠埜 功.
米澤研究室 全体ミーティング 2010/12/22 M2 渡邊裕貴.
ML 演習 第 7 回 新井淳也、中村宇佑、前田俊行 2011/05/31.
プログラミング言語論 第12回 関数型プログラミング 情報工学科 篠埜 功.
論文紹介: A Second Look at Overloading
Solving Shape-Analysis Problems in Languages with Destructive Updating
第2章 「有限オートマトン」.
プログラミング言語論 第2回 情報工学科 篠埜 功.
4 ソフトウェア工学 Software Engineering 抽象データ型 ABSTRACT DATA TYPE.
PROGRAMMING IN HASKELL
“Purely Functional Data Structures” セミナー
プログラミング言語論プログラミング言語論 プログラムの意味論 水野嘉明
プログラミング言語論 第3回 BNF記法について(演習付き)
PROGRAMMING IN HASKELL
2006年10月31日 木下佳樹 高橋孝一 田辺良則 湯浅能史 産業技術総合研究所 システム検証研究センター
Macro Tree Transducer の 型検査アルゴリズム
お仕事にまったく役にたたない内容のコードレビューやりたいと思います。
 型推論1(単相型) 2007.
依存型で型付けされた 副作用のある関数のための 型保存コンパイラ
書き換え型プログラムの生成・検証 研究課題:適切な実行戦略を効率よく探索する、 より自動化された手続きの実現 書き換え型プログラム
知能情報システム特論 Introduction
SUNFLOWER B4 岡田翔太.
プログラミング言語論 第9回 情報工学科 木村昌臣 篠埜 功.
 型推論3(MLの多相型).
モデル検査(5) CTLモデル検査アルゴリズム
形式言語とオートマトン 中間試験解答例 2016年11月15実施 中島毅.
Type Systems and Programming Languages
復習 Cにおけるループからの脱出と制御 break ループを強制終了する.if文と組み合わせて利用するのが一般的. continue
米澤研究室 全体ミーティング 2010/07/07 M2 渡邊裕貴.
国立情報学研究所 ソフトウェア研究系 助教授/
第7回  命題論理.
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
PROGRAMMING IN HASKELL
プログラミング言語論 第2回 篠埜 功.
~sumii/class/proenb2009/ml6/
PROGRAMMING IN HASKELL
Eijiro Sumii and Naoki Kobayashi University of Tokyo
関数型言語の基礎 型なしl計算 型理論 構成的プログラミング GUIにあらわれる関数概念 PBD VL
18. Case Study : Imperative Objects
全体ミーティング 2010/05/19 渡邊 裕貴.
~sumii/class/proenb2010/ml5/
SMP/マルチコアに対応した 型付きアセンブリ言語
弱最内戦略を完全にするためのTRSの等価変換について
PROGRAMMING IN HASKELL
型理論 ラッセルのパラドックス: 「集合の集合」は矛盾を引き起こす。 ラッセル、ホワイトヘッド 「プリンキピアマセマティカ」
Haskell Programming Language
全体ミーティング(9/15) 村田雅之.
オブジェクト指向言語論 第三回 知能情報学部 新田直也.
プログラミング演習II 2003年12月10日(第7回) 木村巌.
計算の理論 II 多テープTuring機械 月曜4校時 大月美佳 平成16年11月29日 佐賀大学知能情報システム学科.
数理論理学 最終回 茨城大学工学部情報工学科 佐々木 稔.
Static Enforcement of Security with Types
Presentation transcript:

ATTAPL輪講 (第4回) 続 Dependent Types 2006/06/21 稲葉 一浩

今日の内容 Dependent Types と多相型 Dependent Types を使ったプログラミング Calculus of Construction (2.6) λ-cube (2.7) Dependent Types を使ったプログラミング DML (2.8)

Calculus of Construction (CC) λLF の拡張 t ::= x | λx:T.t | t t | all x:T.t T ::= X | Πx:T.T | T t | Prop | Prf K ::= * | Π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 のメンバ

例 自然数のエンコーディング 自然数というデータ型を項 nat として表現 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 succ : Prf nat → 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 項に依存する項 λ→ Πx:T. T 項に依存する型 λLF ふつうのλ抽象 Πx:T. T 項に依存する型 λLF Dependent Types ΛX::*.t 型に依存する項 F ∀X::*.T 型に依存する型 F 多相型 id = ΛX::*.λx:X. x : ∀X.X→X ΛX::K. t 高階の型に依存する項 Fω ∀X::K. T 高階の型に依存する型 Fω 高階の多相型 λx:Prop. t all x:Prop. T λx:Prop→Prop. t 等 all x:Prop→Prop. T 等

論理結合子と推論規則の表現 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 Strong Normalization of Well-Typed Terms 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ω CC F ・ ・ λ→ λ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 Γ├t1 :Πx:S.T Γ├t2:S Γ├t1 t2 : [x→t2]T Γ├t:T T≡S Γ├S:s Γ├ t: S Γ├ S : si Γ,x:S ├ T : sj Γ├Πx:S.T : sj where (si, sj) ∈ {(*,*)} λ← {(*,*) (*,□)} λP {(*,*) (□, *)} F {(*,*) (□, *), (□,□)} Fω {(*,*) (*,□) (□, *), (□,□)} CC

今日の内容 Dependent Types と多相型 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