SlideShare a Scribd company logo
定理証明器 Coq と
証明付き DSL
2010/11/27
@tmiya_
あなたがCoqを学ぶべき理由
2	
どう考えても成り立つのは自明だけど、
総当たりで示すには状態爆発してしまう
テストで発見出来るのは間違いだけ。
正しい事は保証出来ないよ
網羅性のあるテストを書くのも、
何回も実施するのも大変だ
そんなあなたには証明駆動開発。
正しいと証明されたコードを生成。
全ケースを網羅しないと証明通らない。
一度証明したらテストは不要。
まさに定理証明系向きの課題。
正しい事を証明しよう。
最近はDSLが流行っているようだけど
オレオレ言語に信頼性あるのかなぁ?
正しさを保証する言語処理系を作るに
は定理証明系を使うのが一番
Domain
Specific
Languages
3
ドメイン固有言語
•  Domain Specific Languages
•  特定分野のタスクの為に作られた言語
•  利点
–  問題領域に適した抽象化、用語を使用
–  読みやすい/書きやすい/ドキュメントの代わり
•  自然言語より簡潔かつ厳密に記述可能
•  スクリプト言語(Ruby, Pythonなど)が使われる事多い
–  安全性
•  利用範囲を超えた機能は提供されない
•  それだけで満足?正しさをどう担保する?
–  DSLで書かれたものの正しさ。DSLそれ自体の正しさ。
•  Mechanized metatheory: ready for prime time? (ICFP 2010)
–  http://www.cis.upenn.edu/ bcpierce/wmm/wmm10/cheney.pdf
–  これまで:既にあるもの(言語とか)を定理証明系で検証
–  これから:定理証明系の存在を前提に言語のデザイン(例えば次の
XQueryとか)
金融商品DSL
•  発端
–  2010/4/7 : SECが金融商品を明確に記述する為に、自然言語
ではなくPythonを使う事を提案
–  なぜPython?もっと相応しい物があるのでは?例えば…
•  型付き関数型言語:型検査でDSLの安全性を担保可能
–  「金融取引契約の書き方」(Simon Peyton Jones and Jean-Marc Eber)
•  書籍「関数プログラミング言語の楽しみ」
•  金融取引はコンビネータを組み合わせて記述可能。
–  規格にあるものしか書けない金融商品 XML (FpML) は仕様が肥大化
するしか無い。
•  Haskellでライブラリ記述。
•  後にLexiFi社のMLFiに
•  ACMよりのSECへのコメント
–  http://www.sec.gov/comments/s7-08-10/s70810-89.pdf
–  「Pythonより適切な言語がある。静的型検査可能でsandboxがあるものが良
い」
–  「専用の適切なDSLあるいはライブラリを開発すべき」
–  まぁ当然の解答と言える
AURA:認可•監査論理の言語
•  論文: AURA: A Programming Language for
Authorization and Audit  (2008 ICFP)
•  「∼は∼をしても良い」を記述するDSL
–  依存型のある言語では静的型検査で証明を扱える
  「コンパイル時に」アクセス権限有無を判定可能
–  権限委譲は関数合成(モナド)として表現可能
•  AURAの実装
–  ある種の型付きλ計算として定義 (1.4k LOC)
–  soundness, decidability を Coq で証明 (6k + 5k
LOC)
 AURA言語の正しさを証明
–  F#での実装が入手可能
•  http://www.cis.upenn.edu/ stevez/sol/aura.html
Compcert Verified Compiler
•  http://compcert.inria.fr/
•  Coqで証明されたC言語コンパイラ
–  Compcert C PowerPC
•  Cのsubset : longjmp/setjmpとか一部サポートされない
–  生成されたコードは元のCコードと等価である事を証明
–  実用を考えた最適化:gcc ‒O1並みの速度
•  将来の応用
7	
Program	
  Prover	
  
Model	
  Checker	
  Sta3c	
  Analyzer	
  
Other	
  Language	
  
Clight	
  
Cminor	
  
External vs Internal
•  外部DSLの話 : AURA
–  汎用的なプログラミング言語とは別に、DSL言語を作る
•  単なるXMLファイルという場合もあるが
•  コードジェネレーションなんかもここに入る
–  どうせならCoqとかを使って言語の正しさを証明したい
–  Operational Semantics : とりあえずTAPL勉強中
•  Ott : そういうツールがあるらしい。使い方を覚えたいなぁ。
•  内部DSL : 金融商品コンビネータの話
–  汎用プログラミング言語自体をDSLとして使える様にする
•  世間での評価「古くはLispで、最近はRubyとかで」
•  Haskellで内部DSLに、という話は昔から多い。(最近はScalaも割と)
•  要するにプログラム言語っぽく無くて、自然言語や専用言語っぽければOK
•  CoqでDSLってどうだろう?
–  実はCoqは向いているのでは?
Coq as a
DSL Host
Language
9
記法を定義出来る (1)
•  Coqではユーザ定義の記法を使える
Notation "A / B" := (and A B) (at level 80, right associativity).
•  表示のときも使ってくれる
Coq < Check (and True False).
True / False
: Prop
•  記号の意味を探すときはLocate
Coq < Locate "/".
Notation Scope
"A / B" := and A B : type_scope
(default interpretation)
10	
演算子 優先度
/ 85(低)	
/ 80	
~ 75	
=, <>, <, >,
<=, >=
70	
+, -, || 50	
*, /, && 40	
- (単項の-) 35(高)	
これを参考に
記法を定義出来る (2)
•  単項演算子、mix-fixな演算子もOK : かなりDSLっぽくなる
Notation "~ x" := (not x) (at level 75, right associativity).
Notation "’IF’ c1 ’then’ c2 ’else’ c3" :=
(IF_then_else c1 c2 c3).
Notation "{ x : A | P }” := (sigA (fun x => P))
(at level 0, x at level 99).
•  推論して欲しい場合は@を付けないと(使用時に)エラー
Notation "x = y" := (@eq _ x y) (at level 70, no associativity).
•  定義と一緒に記法を定義出来る
Fixpoint plus (n m:nat) {struct n} : nat :=
match n with
| O => m
| S p => S (p+m)
  end
where "n + m" := (plus n m).
11
記法を定義出来る (3)
•  パーサコンビネータと組み合わせて使っている例
http://www.seas.upenn.edu/~cis500/current/sf/html/ImpParser.html
Notation “‘DO’ ( x , y ) <-- e1 ;; e2 ‘OR’ e3” :=
  (match e1 with
| SomeE (x,y) => e2
| NoneE err => e3
end) (right associativity, at level 60, e2 at next level).
•  使っている例
Fixpoint parsePrimaryExp (steps:nat) symtable (xs : list token)
: optionE (aexp * list token) :=
match steps with
| 0 => NoneE "Too many recursive calls"
| S steps' =>
DO (i, rest) <-- parseIdentifier symtable xs ;;
SomeE (AId i, rest)
OR DO (n, rest) <-- parseNumber xs ;;
SomeE (ANum n, rest)
OR (DO (e, rest) <== firstExpect "(" (parseSumExp steps' symtable) xs;;
DO (u, rest') <== expect ")" rest ;;
SomeE(e,rest'))
end 12
記法を定義出来る (4)
•  繰り返しのあるパターン : .. を使って繰り返しを再帰的に表現出来る
–  可変長引数みたいなものを扱いたいときは便利
Coq < Notation "[ x ; .. ; y ]" :=
  (@cons _ x .. (@cons _ y (@nil _) ) .. ).
Setting notation at level 0.
Coq < Check ([1 ; 2 ; 3]).
[1; 2; 3]
: list nat
•  実は下記でもOK
Coq < Notation "[ x ; .. ; y ]" := (cons x .. (cons y nil) ..).
Setting notation at level 0.
13
記法定義の落とし穴
•  えっ?定義が無いの?本当?
Coq < Locate "->".
Unknown notation
•  定義出来た!?
Notation "A -> B" := (and A B) (at level 80, right associativity).
•  本当に定義が上書きされたのか?
Coq < Lemma test : True -> True.
test < intros.
1 subgoal
============================
True -> True  (* 変化が無い *)
test < split.
2 subgoals
============================
True  (* and なので split される *)
subgoal 2 is:
True
•  Locate信用出来ない。重要な予約語の上書きには注意。 14
Tacticの定義の方法
CPDTに載っているTactic定義の例 (p.217)
Coq < Ltac my_tauto :=
Coq < repeat match goal with
Coq < | [ H : ?P |- ?P ] => exact H
Coq < | [ |- True ] => constructor
Coq < | [ |- _ / _ ] => constructor
Coq < | [ |- _ -> _ ] => intro
Coq < | [ H : False |- _ ] => destruct H
Coq < | [ H : _ / _ |- _ ] => destruct H
Coq < | [ H : _ / _ |- _ ] => destruct H
Coq < | [ H1 : ?P -> ?Q, H2 : ?P |- _ ] =>
Coq < let H := fresh “H” in (* Hなんとかみたいな新しい名前をつける *)
Coq < generalize (H1 H2); clear H1; intro H
Coq < end.
my_tauto is defined
repeatを外したmy_tauto1を作って、何度も適用すると動作の具合が良く解る
…これって、DSLに使えない?
•  パターンマッチとかどう見ても高機能なんだが…
15
Ltac定義の中で出来る事
•  順次処理(expr1; expr2)
•  繰り返し(repeat expr)(do num expr)
•  ローカル定義(let)
•  パターンマッチ(match)
•  計算(eval redexpr in term)
•  メッセージ表示(idtac msg_token … msg_token)
•  外部呼び出し(external “command” “request” tacarg…)
–  元々、外部の定理証明器を呼び出す為の機能
–  XML形式で外と通信出来る
–  これを使って外部コマンドを実行出来たらどうか?
–  例えば “ls” コマンドを実行して、ファイルリストをCoqに返せたら?
–  makeの真似事ぐらい出来そうな…
と、考えてみたんですが、そこで行き詰まりました。
•  Coq内部とかOcamlに詳しい人が引き継いでくれるといいなぁ…
•  気をつけないと矛盾をCoqに持ち込んでFalsoみたいになるかも…
16
まとめ
•  Domain Specific Languages
–  やっぱり正しさが証明されているDSLを使いたいですよね。
–  ならばCoqでDSLを。
•  Coq as a DSL Host Language
–  CoqのNotation定義で自由なDSL記法を
–  Tacticから外部コマンド実行とか出来ると、色々出来るんじゃ
ないかな?
17

More Related Content

What's hot

プログラミング技法特論第5回
プログラミング技法特論第5回プログラミング技法特論第5回
プログラミング技法特論第5回guest61bed5f
 
機械学習を用いた予測モデル構築・評価
機械学習を用いた予測モデル構築・評価機械学習を用いた予測モデル構築・評価
機械学習を用いた予測モデル構築・評価Shintaro Fukushima
 
最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)
Akihiko Matuura
 
shared_ptr & weak_ptr (ppt 第2版, DL 専用)
shared_ptr & weak_ptr (ppt 第2版, DL 専用)shared_ptr & weak_ptr (ppt 第2版, DL 専用)
shared_ptr & weak_ptr (ppt 第2版, DL 専用)
Cryolite
 
Clojure programming-chapter-2
Clojure programming-chapter-2Clojure programming-chapter-2
Clojure programming-chapter-2
Masao Kato
 
Continuation with Boost.Context
Continuation with Boost.ContextContinuation with Boost.Context
Continuation with Boost.ContextAkira Takahashi
 
ADVENTURE_Solid Ver.1.2の概要
ADVENTURE_Solid Ver.1.2の概要ADVENTURE_Solid Ver.1.2の概要
ADVENTURE_Solid Ver.1.2の概要
ADVENTURE Project
 
DTrace for biginners part(2)
DTrace for biginners part(2)DTrace for biginners part(2)
DTrace for biginners part(2)
Shoji Haraguchi
 
Lotus DEvCon 2000 - LotusScript Tips and Techniques
Lotus DEvCon 2000 - LotusScript Tips and TechniquesLotus DEvCon 2000 - LotusScript Tips and Techniques
Lotus DEvCon 2000 - LotusScript Tips and Techniques
Hiroaki Komine
 
Boost.Coroutine
Boost.CoroutineBoost.Coroutine
Boost.Coroutinemelpon
 

What's hot (11)

プログラミング技法特論第5回
プログラミング技法特論第5回プログラミング技法特論第5回
プログラミング技法特論第5回
 
機械学習を用いた予測モデル構築・評価
機械学習を用いた予測モデル構築・評価機械学習を用いた予測モデル構築・評価
機械学習を用いた予測モデル構築・評価
 
最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)
 
shared_ptr & weak_ptr (ppt 第2版, DL 専用)
shared_ptr & weak_ptr (ppt 第2版, DL 専用)shared_ptr & weak_ptr (ppt 第2版, DL 専用)
shared_ptr & weak_ptr (ppt 第2版, DL 専用)
 
Bluespec @waseda(PDF)
Bluespec @waseda(PDF)Bluespec @waseda(PDF)
Bluespec @waseda(PDF)
 
Clojure programming-chapter-2
Clojure programming-chapter-2Clojure programming-chapter-2
Clojure programming-chapter-2
 
Continuation with Boost.Context
Continuation with Boost.ContextContinuation with Boost.Context
Continuation with Boost.Context
 
ADVENTURE_Solid Ver.1.2の概要
ADVENTURE_Solid Ver.1.2の概要ADVENTURE_Solid Ver.1.2の概要
ADVENTURE_Solid Ver.1.2の概要
 
DTrace for biginners part(2)
DTrace for biginners part(2)DTrace for biginners part(2)
DTrace for biginners part(2)
 
Lotus DEvCon 2000 - LotusScript Tips and Techniques
Lotus DEvCon 2000 - LotusScript Tips and TechniquesLotus DEvCon 2000 - LotusScript Tips and Techniques
Lotus DEvCon 2000 - LotusScript Tips and Techniques
 
Boost.Coroutine
Boost.CoroutineBoost.Coroutine
Boost.Coroutine
 

Similar to Coq Party 20101127

ji-3. 条件分岐と場合分け
ji-3. 条件分岐と場合分けji-3. 条件分岐と場合分け
ji-3. 条件分岐と場合分け
kunihikokaneko1
 
Enjoy handwritten digits recognition AI !!
Enjoy handwritten digits recognition AI !!Enjoy handwritten digits recognition AI !!
Enjoy handwritten digits recognition AI !!
KAIKenzo
 
Introduction to Spock
Introduction to SpockIntroduction to Spock
Introduction to Spock
Takahiro Sugiura
 
【macOSにも対応】AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」
【macOSにも対応】AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」【macOSにも対応】AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」
【macOSにも対応】AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」
fukuoka.ex
 
AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」【旧版】※新版あります
AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」【旧版】※新版ありますAI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」【旧版】※新版あります
AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」【旧版】※新版あります
fukuoka.ex
 
テストコードの定型化
テストコードの定型化テストコードの定型化
テストコードの定型化
Shinichi Hirauchi
 
タダで始めるテストファースト入門 ~ C# Express + NUnit
タダで始めるテストファースト入門 ~ C# Express + NUnitタダで始めるテストファースト入門 ~ C# Express + NUnit
タダで始めるテストファースト入門 ~ C# Express + NUnit
Yasuhiko Yamamoto
 
Introduction to programming competition [revised][PDF]
Introduction to programming competition [revised][PDF]Introduction to programming competition [revised][PDF]
Introduction to programming competition [revised][PDF]
yak1ex
 
復習も兼ねて!C#6.0-7.0
復習も兼ねて!C#6.0-7.0復習も兼ねて!C#6.0-7.0
復習も兼ねて!C#6.0-7.0
Yuta Matsumura
 
2018/06/23 Sony"s deep learning software and the latest information
2018/06/23 Sony"s deep learning software and the latest information2018/06/23 Sony"s deep learning software and the latest information
2018/06/23 Sony"s deep learning software and the latest information
Sony Network Communications Inc.
 
Why Reactive Matters #ScalaMatsuri
Why Reactive Matters #ScalaMatsuriWhy Reactive Matters #ScalaMatsuri
Why Reactive Matters #ScalaMatsuri
Yuta Okamoto
 
第3回BDD勉強会
第3回BDD勉強会第3回BDD勉強会
第3回BDD勉強会zakihaya
 
第3回 JavaScriptから始めるプログラミング2016
第3回 JavaScriptから始めるプログラミング2016第3回 JavaScriptから始めるプログラミング2016
第3回 JavaScriptから始めるプログラミング2016
kyoto university
 
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr
Genya Murakami
 
Toxic comment classification
Toxic comment classificationToxic comment classification
Toxic comment classification
Nasuka Sumino
 
Learning Template Library Design using Boost.Geomtry
Learning Template Library Design using Boost.GeomtryLearning Template Library Design using Boost.Geomtry
Learning Template Library Design using Boost.GeomtryAkira Takahashi
 
C# design note sep 2014
C# design note sep 2014C# design note sep 2014
C# design note sep 2014
信之 岩永
 
Rustで始める競技プログラミング
Rustで始める競技プログラミングRustで始める競技プログラミング
Rustで始める競技プログラミング
Naoya Okanami
 
Infer.netによるldaの実装
Infer.netによるldaの実装Infer.netによるldaの実装
Infer.netによるldaの実装池田 直哉
 
JavaScriptクイックスタート
JavaScriptクイックスタートJavaScriptクイックスタート
JavaScriptクイックスタート
Shumpei Shiraishi
 

Similar to Coq Party 20101127 (20)

ji-3. 条件分岐と場合分け
ji-3. 条件分岐と場合分けji-3. 条件分岐と場合分け
ji-3. 条件分岐と場合分け
 
Enjoy handwritten digits recognition AI !!
Enjoy handwritten digits recognition AI !!Enjoy handwritten digits recognition AI !!
Enjoy handwritten digits recognition AI !!
 
Introduction to Spock
Introduction to SpockIntroduction to Spock
Introduction to Spock
 
【macOSにも対応】AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」
【macOSにも対応】AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」【macOSにも対応】AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」
【macOSにも対応】AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」
 
AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」【旧版】※新版あります
AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」【旧版】※新版ありますAI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」【旧版】※新版あります
AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」【旧版】※新版あります
 
テストコードの定型化
テストコードの定型化テストコードの定型化
テストコードの定型化
 
タダで始めるテストファースト入門 ~ C# Express + NUnit
タダで始めるテストファースト入門 ~ C# Express + NUnitタダで始めるテストファースト入門 ~ C# Express + NUnit
タダで始めるテストファースト入門 ~ C# Express + NUnit
 
Introduction to programming competition [revised][PDF]
Introduction to programming competition [revised][PDF]Introduction to programming competition [revised][PDF]
Introduction to programming competition [revised][PDF]
 
復習も兼ねて!C#6.0-7.0
復習も兼ねて!C#6.0-7.0復習も兼ねて!C#6.0-7.0
復習も兼ねて!C#6.0-7.0
 
2018/06/23 Sony"s deep learning software and the latest information
2018/06/23 Sony"s deep learning software and the latest information2018/06/23 Sony"s deep learning software and the latest information
2018/06/23 Sony"s deep learning software and the latest information
 
Why Reactive Matters #ScalaMatsuri
Why Reactive Matters #ScalaMatsuriWhy Reactive Matters #ScalaMatsuri
Why Reactive Matters #ScalaMatsuri
 
第3回BDD勉強会
第3回BDD勉強会第3回BDD勉強会
第3回BDD勉強会
 
第3回 JavaScriptから始めるプログラミング2016
第3回 JavaScriptから始めるプログラミング2016第3回 JavaScriptから始めるプログラミング2016
第3回 JavaScriptから始めるプログラミング2016
 
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr
 
Toxic comment classification
Toxic comment classificationToxic comment classification
Toxic comment classification
 
Learning Template Library Design using Boost.Geomtry
Learning Template Library Design using Boost.GeomtryLearning Template Library Design using Boost.Geomtry
Learning Template Library Design using Boost.Geomtry
 
C# design note sep 2014
C# design note sep 2014C# design note sep 2014
C# design note sep 2014
 
Rustで始める競技プログラミング
Rustで始める競技プログラミングRustで始める競技プログラミング
Rustで始める競技プログラミング
 
Infer.netによるldaの実装
Infer.netによるldaの実装Infer.netによるldaの実装
Infer.netによるldaの実装
 
JavaScriptクイックスタート
JavaScriptクイックスタートJavaScriptクイックスタート
JavaScriptクイックスタート
 

More from tmiya

Coq for ML users
Coq for ML usersCoq for ML users
Coq for ML users
tmiya
 
Proofsummit2011a
Proofsummit2011aProofsummit2011a
Proofsummit2011a
tmiya
 
Coq Tutorial at Proof Summit 2011
Coq Tutorial at Proof Summit 2011Coq Tutorial at Proof Summit 2011
Coq Tutorial at Proof Summit 2011
tmiya
 
Typeclass
TypeclassTypeclass
Typeclass
tmiya
 
Coq Tutorial
Coq TutorialCoq Tutorial
Coq Tutorial
tmiya
 
RegExp20110305
RegExp20110305RegExp20110305
RegExp20110305
tmiya
 
Coq setoid 20110129
Coq setoid 20110129Coq setoid 20110129
Coq setoid 20110129
tmiya
 
Maude20100719
Maude20100719Maude20100719
Maude20100719
tmiya
 
Formal methods20100529
Formal methods20100529Formal methods20100529
Formal methods20100529tmiya
 
Coq 20100208a
Coq 20100208aCoq 20100208a
Coq 20100208a
tmiya
 

More from tmiya (10)

Coq for ML users
Coq for ML usersCoq for ML users
Coq for ML users
 
Proofsummit2011a
Proofsummit2011aProofsummit2011a
Proofsummit2011a
 
Coq Tutorial at Proof Summit 2011
Coq Tutorial at Proof Summit 2011Coq Tutorial at Proof Summit 2011
Coq Tutorial at Proof Summit 2011
 
Typeclass
TypeclassTypeclass
Typeclass
 
Coq Tutorial
Coq TutorialCoq Tutorial
Coq Tutorial
 
RegExp20110305
RegExp20110305RegExp20110305
RegExp20110305
 
Coq setoid 20110129
Coq setoid 20110129Coq setoid 20110129
Coq setoid 20110129
 
Maude20100719
Maude20100719Maude20100719
Maude20100719
 
Formal methods20100529
Formal methods20100529Formal methods20100529
Formal methods20100529
 
Coq 20100208a
Coq 20100208aCoq 20100208a
Coq 20100208a
 

Recently uploaded

「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
嶋 是一 (Yoshikazu SHIMA)
 
Humanoid Virtual Athletics Challenge2024 技術講習会 スライド
Humanoid Virtual Athletics Challenge2024 技術講習会 スライドHumanoid Virtual Athletics Challenge2024 技術講習会 スライド
Humanoid Virtual Athletics Challenge2024 技術講習会 スライド
tazaki1
 
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
Osaka University
 
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMMハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
osamut
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
CRI Japan, Inc.
 
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
t m
 
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援しますキンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
Takayuki Nakayama
 
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
Matsushita Laboratory
 
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
Toru Tamaki
 
This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.
chiefujita1
 
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobodyロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
azuma satoshi
 
Generating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language ModelsGenerating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language Models
harmonylab
 

Recently uploaded (12)

「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
 
Humanoid Virtual Athletics Challenge2024 技術講習会 スライド
Humanoid Virtual Athletics Challenge2024 技術講習会 スライドHumanoid Virtual Athletics Challenge2024 技術講習会 スライド
Humanoid Virtual Athletics Challenge2024 技術講習会 スライド
 
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
 
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMMハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
 
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
 
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援しますキンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
 
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
 
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
 
This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.
 
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobodyロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
 
Generating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language ModelsGenerating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language Models
 

Coq Party 20101127

  • 1. 定理証明器 Coq と 証明付き DSL 2010/11/27 @tmiya_
  • 4. ドメイン固有言語 •  Domain Specific Languages •  特定分野のタスクの為に作られた言語 •  利点 –  問題領域に適した抽象化、用語を使用 –  読みやすい/書きやすい/ドキュメントの代わり •  自然言語より簡潔かつ厳密に記述可能 •  スクリプト言語(Ruby, Pythonなど)が使われる事多い –  安全性 •  利用範囲を超えた機能は提供されない •  それだけで満足?正しさをどう担保する? –  DSLで書かれたものの正しさ。DSLそれ自体の正しさ。 •  Mechanized metatheory: ready for prime time? (ICFP 2010) –  http://www.cis.upenn.edu/ bcpierce/wmm/wmm10/cheney.pdf –  これまで:既にあるもの(言語とか)を定理証明系で検証 –  これから:定理証明系の存在を前提に言語のデザイン(例えば次の XQueryとか)
  • 5. 金融商品DSL •  発端 –  2010/4/7 : SECが金融商品を明確に記述する為に、自然言語 ではなくPythonを使う事を提案 –  なぜPython?もっと相応しい物があるのでは?例えば… •  型付き関数型言語:型検査でDSLの安全性を担保可能 –  「金融取引契約の書き方」(Simon Peyton Jones and Jean-Marc Eber) •  書籍「関数プログラミング言語の楽しみ」 •  金融取引はコンビネータを組み合わせて記述可能。 –  規格にあるものしか書けない金融商品 XML (FpML) は仕様が肥大化 するしか無い。 •  Haskellでライブラリ記述。 •  後にLexiFi社のMLFiに •  ACMよりのSECへのコメント –  http://www.sec.gov/comments/s7-08-10/s70810-89.pdf –  「Pythonより適切な言語がある。静的型検査可能でsandboxがあるものが良 い」 –  「専用の適切なDSLあるいはライブラリを開発すべき」 –  まぁ当然の解答と言える
  • 6. AURA:認可•監査論理の言語 •  論文: AURA: A Programming Language for Authorization and Audit  (2008 ICFP) •  「∼は∼をしても良い」を記述するDSL –  依存型のある言語では静的型検査で証明を扱える   「コンパイル時に」アクセス権限有無を判定可能 –  権限委譲は関数合成(モナド)として表現可能 •  AURAの実装 –  ある種の型付きλ計算として定義 (1.4k LOC) –  soundness, decidability を Coq で証明 (6k + 5k LOC)  AURA言語の正しさを証明 –  F#での実装が入手可能 •  http://www.cis.upenn.edu/ stevez/sol/aura.html
  • 7. Compcert Verified Compiler •  http://compcert.inria.fr/ •  Coqで証明されたC言語コンパイラ –  Compcert C PowerPC •  Cのsubset : longjmp/setjmpとか一部サポートされない –  生成されたコードは元のCコードと等価である事を証明 –  実用を考えた最適化:gcc ‒O1並みの速度 •  将来の応用 7 Program  Prover   Model  Checker  Sta3c  Analyzer   Other  Language   Clight   Cminor  
  • 8. External vs Internal •  外部DSLの話 : AURA –  汎用的なプログラミング言語とは別に、DSL言語を作る •  単なるXMLファイルという場合もあるが •  コードジェネレーションなんかもここに入る –  どうせならCoqとかを使って言語の正しさを証明したい –  Operational Semantics : とりあえずTAPL勉強中 •  Ott : そういうツールがあるらしい。使い方を覚えたいなぁ。 •  内部DSL : 金融商品コンビネータの話 –  汎用プログラミング言語自体をDSLとして使える様にする •  世間での評価「古くはLispで、最近はRubyとかで」 •  Haskellで内部DSLに、という話は昔から多い。(最近はScalaも割と) •  要するにプログラム言語っぽく無くて、自然言語や専用言語っぽければOK •  CoqでDSLってどうだろう? –  実はCoqは向いているのでは?
  • 9. Coq as a DSL Host Language 9
  • 10. 記法を定義出来る (1) •  Coqではユーザ定義の記法を使える Notation "A / B" := (and A B) (at level 80, right associativity). •  表示のときも使ってくれる Coq < Check (and True False). True / False : Prop •  記号の意味を探すときはLocate Coq < Locate "/". Notation Scope "A / B" := and A B : type_scope (default interpretation) 10 演算子 優先度 / 85(低) / 80 ~ 75 =, <>, <, >, <=, >= 70 +, -, || 50 *, /, && 40 - (単項の-) 35(高) これを参考に
  • 11. 記法を定義出来る (2) •  単項演算子、mix-fixな演算子もOK : かなりDSLっぽくなる Notation "~ x" := (not x) (at level 75, right associativity). Notation "’IF’ c1 ’then’ c2 ’else’ c3" := (IF_then_else c1 c2 c3). Notation "{ x : A | P }” := (sigA (fun x => P)) (at level 0, x at level 99). •  推論して欲しい場合は@を付けないと(使用時に)エラー Notation "x = y" := (@eq _ x y) (at level 70, no associativity). •  定義と一緒に記法を定義出来る Fixpoint plus (n m:nat) {struct n} : nat := match n with | O => m | S p => S (p+m)   end where "n + m" := (plus n m). 11
  • 12. 記法を定義出来る (3) •  パーサコンビネータと組み合わせて使っている例 http://www.seas.upenn.edu/~cis500/current/sf/html/ImpParser.html Notation “‘DO’ ( x , y ) <-- e1 ;; e2 ‘OR’ e3” :=   (match e1 with | SomeE (x,y) => e2 | NoneE err => e3 end) (right associativity, at level 60, e2 at next level). •  使っている例 Fixpoint parsePrimaryExp (steps:nat) symtable (xs : list token) : optionE (aexp * list token) := match steps with | 0 => NoneE "Too many recursive calls" | S steps' => DO (i, rest) <-- parseIdentifier symtable xs ;; SomeE (AId i, rest) OR DO (n, rest) <-- parseNumber xs ;; SomeE (ANum n, rest) OR (DO (e, rest) <== firstExpect "(" (parseSumExp steps' symtable) xs;; DO (u, rest') <== expect ")" rest ;; SomeE(e,rest')) end 12
  • 13. 記法を定義出来る (4) •  繰り返しのあるパターン : .. を使って繰り返しを再帰的に表現出来る –  可変長引数みたいなものを扱いたいときは便利 Coq < Notation "[ x ; .. ; y ]" :=   (@cons _ x .. (@cons _ y (@nil _) ) .. ). Setting notation at level 0. Coq < Check ([1 ; 2 ; 3]). [1; 2; 3] : list nat •  実は下記でもOK Coq < Notation "[ x ; .. ; y ]" := (cons x .. (cons y nil) ..). Setting notation at level 0. 13
  • 14. 記法定義の落とし穴 •  えっ?定義が無いの?本当? Coq < Locate "->". Unknown notation •  定義出来た!? Notation "A -> B" := (and A B) (at level 80, right associativity). •  本当に定義が上書きされたのか? Coq < Lemma test : True -> True. test < intros. 1 subgoal ============================ True -> True  (* 変化が無い *) test < split. 2 subgoals ============================ True  (* and なので split される *) subgoal 2 is: True •  Locate信用出来ない。重要な予約語の上書きには注意。 14
  • 15. Tacticの定義の方法 CPDTに載っているTactic定義の例 (p.217) Coq < Ltac my_tauto := Coq < repeat match goal with Coq < | [ H : ?P |- ?P ] => exact H Coq < | [ |- True ] => constructor Coq < | [ |- _ / _ ] => constructor Coq < | [ |- _ -> _ ] => intro Coq < | [ H : False |- _ ] => destruct H Coq < | [ H : _ / _ |- _ ] => destruct H Coq < | [ H : _ / _ |- _ ] => destruct H Coq < | [ H1 : ?P -> ?Q, H2 : ?P |- _ ] => Coq < let H := fresh “H” in (* Hなんとかみたいな新しい名前をつける *) Coq < generalize (H1 H2); clear H1; intro H Coq < end. my_tauto is defined repeatを外したmy_tauto1を作って、何度も適用すると動作の具合が良く解る …これって、DSLに使えない? •  パターンマッチとかどう見ても高機能なんだが… 15
  • 16. Ltac定義の中で出来る事 •  順次処理(expr1; expr2) •  繰り返し(repeat expr)(do num expr) •  ローカル定義(let) •  パターンマッチ(match) •  計算(eval redexpr in term) •  メッセージ表示(idtac msg_token … msg_token) •  外部呼び出し(external “command” “request” tacarg…) –  元々、外部の定理証明器を呼び出す為の機能 –  XML形式で外と通信出来る –  これを使って外部コマンドを実行出来たらどうか? –  例えば “ls” コマンドを実行して、ファイルリストをCoqに返せたら? –  makeの真似事ぐらい出来そうな… と、考えてみたんですが、そこで行き詰まりました。 •  Coq内部とかOcamlに詳しい人が引き継いでくれるといいなぁ… •  気をつけないと矛盾をCoqに持ち込んでFalsoみたいになるかも… 16
  • 17. まとめ •  Domain Specific Languages –  やっぱり正しさが証明されているDSLを使いたいですよね。 –  ならばCoqでDSLを。 •  Coq as a DSL Host Language –  CoqのNotation定義で自由なDSL記法を –  Tacticから外部コマンド実行とか出来ると、色々出来るんじゃ ないかな? 17