SlideShare une entreprise Scribd logo
1  sur  36
Coq and Why :Formal Verification Tools 2010/02/08 tmiya
自己紹介 ハンドル名 : tmiya Blog : Functional Programming Memo http://study-func-prog.blogspot.com/ Scalaとか主として関数型言語関係の勉強のメモ 仕事 :SIer勤務(時々プログラミングの仕事) 興味: 形式手法(モデル検査とか定理証明とか)、関数型言語とか 2007- : Scala普及活動 “A Scala Tutorial for Java Programmer” を和訳 Step by Step Scala講師を数回 ITproにScala 2.8の記事を書きました 形式仕様 : まだまだ勉強中 Coq : 社内勉強会向けにちょっと調べた Agda : 産総研のセミナーを聞いた B-method : 先日セミナーを聞いた という訳で、専門家じゃないです。
内容 形式手法とは? Coqとは? 理論的背景を少し Coqを動かしてみよう Design by Contract Whyを動かしてみよう まとめ 3
形式手法とは? 4
形式手法 (Formal Method) 自然言語の仕様 形式仕様記述: 機械的検証可能な記述 上流行程 仕様アニメーション: 実装前に仕様を動かして確認  (Lightweight FM) 形式仕様 モデル検査: モデルが仕様を満たす事を網羅的にチェック 動作確認 モデル 形式手法といっても色々。一つのツールが複数を行う場合あり。 最近は主として上流行程のミスを減らす為の手法として注目。 プログラム検証: 実装が仕様を満たす事を証明 プログラム生成: 陰仕様から陽仕様へと具体化⇒実装を生成 プログラム 下流行程 Coqは証明からプログラム生成 Whyはプログラム検証 5
定理証明系の色々 6 TheSeventeenProversoftheWorld http://math.boisestate.edu/~tconklin/MATH124/Main/Readings/2%20Logic/PDFs/The%20Seventeen%20Provers%20of%20the%20World.pdf 各種定理証明系での「√2 が無理数である」ことの証明を比較 上流下流揃っている ツールが最強? 全ての証明を自動化出来ない。 最後は人間が証明出来ないと画竜点睛を欠く。 証明について理解していないと良い事前条件や不変条件、停止を保証するループ変数を定義出来ない。 証明の行いやすさ重要
Coqとは? 7
Coqとは? 開発元:INRIA研究所@フランス http://coq.inria.fr/ 定理証明支援ツール (ある程度は自動証明) Coqでの有名な定理の証明例 “Essential Incompleteness of Arithmetic Verified by Coq” (不完全性定理)  http://r6.ca/Goedel/goedel1.html “A computer-checked proof of the Four Colour Theorem” (四色問題) プログラムの開発も出来る プログラムを開発&正しい事を証明(テスト不要) 実行可能なプログラムを抽出 (OCaml, Haskell) 8
Coq参考文献 Interactive Theorem Proving and Program Development: Coq'Art: The Calculus of Inductive 値段が¥12,000程度する… Certified Programming with Dependent Types http://adam.chlipala.net/cpdt/ Harvardの授業で使用 (PDF 360ページ程度) 定期的に改訂 (Latest 2010/2/3) 読書会するとしたらこれを使うのが良さそう 他にもINRIAのCoqのページからTutorialが幾つか 浅井研のゼミ資料 (第1回〜第8回) http://pllab.is.ocha.ac.jp/coq_print/nori_Coq1.pdf にわとり小屋でのプログラミング日記 http://d.hatena.ne.jp/yoshihiro503/ Coq を使った証明 : まとめ http://www.kmonos.net/pub/Presen/coq-matome.ppt 9
理論的背景を少し 10
Curry-Howard Isomorphism 述語論理と型付きλ計算の間に対応関係 狭義では、直観主義命題論理と自然演繹 ⇔ 単純型付きλ計算、の対応 証明λ計算の式、証明の検査型検査 例: 連言 P∧Q  (P,Q) : タプル型 含意P⇒Q P->Q : 関数型 Modus Ponens : (A∧(A⇒B))⇒B  (A, A->B)->B fun t -> (sndt) (fstt) : ‘a * (‘a -> ‘b) -> ‘b AとA->Bのタプル型を引数にしてBを返す関数という型 11
自然演繹 Gentzenによる形式化。公理が少なく推論規則が多い。判りやすく「自然」。 導入規則と除去規則(ここでは∧と⇒だけ) A  B                  A∧B    A∧B ------ (∧導入)       ------  ------  (∧除去)   A∧B                   A       B  [A] // 仮定   B                   A  A⇒B ------ (⇒導入)       ------- (⇒除去) A⇒B                     B NK:排中律ありの古典論理 NJ:無しの直観主義論理 (こちらを使う) 12
依存型 (dependent type) 値をパラメタとする型 = 値を引数に取って型を返す関数。 Agda, Gallina, Epigram, Isabelleとかが依存型をサポートする言語 型も言語のfirst-class citizen。 Vec 5 = 要素数5のべクトルの「型」。 append : Vecn -> Vecm -> Vec (n+m) 行列計算とか次数が一致している事が型で保証出来る。 コンパイラを通った時点でOutOfBoundsが起きないことを保証。 型命題論理 依存型一階述語論理 ∀x∈A.P(x) Πx:A. P x 13
Coqを動かしてみよう 14
CoqのInstall Macの場合 MacPortsで導入して終わり $ sudo port install coq ocaml, camlp5, coqをインストール coq-8.2-intel.dmg => Coq, CoqIde gtk2, Coqのpkg Winの場合 coq-8.2-1-win.exe => Coq, CoqIde 15
Coqを動かしてみる % coqtop// coqtopで対話環境に入る Welcome to Coq 8.2 (March 2009) Coq < Check 3.    // Check で型を調べる。文末のピリオド重要。 3      : nat Coq < Check and. and      : Prop -> Prop -> Prop Coq < Unset Printing Notations. Coq < Check 3.	// 3はsyntax sugarで、実はnatはペアノの自然数 S (S (S O))      : nat Coq < Quit.    // Quit.で終了 %  16
帰納的関数の定義 / プログラム抽出 Coq < Print plus.   // 予め定義されている plus =  fix plus (nm : nat) : nat := match n with                               | 0 => m                               | S p => S (p + m)                               end      : nat -> nat -> nat Coq < Extraction “plus.ml” plus.	// OCamlプログラムとして抽出 % cat plus.ml type nat =   | O   | S of nat (** val plus : nat -> nat -> nat **)// 普通のOcamlの関数 let rec plus nm =   match n with     | O -> m     | S p -> S (plus pm) 17
帰納的関数の性質の証明(1) Coq < Theorem t : forallnm : nat, n + m = m + n.	// これを証明する。 1 subgoal   ============================ forallnm : nat, n + m = m + n t < intros.	// forallの除去。初手は大抵intros. 1 subgoal n : nat m : nat   ============================ n + m = m + n t < induction n.	// nについて帰納法。0と(S n)とに場合分け 2 subgoals m : nat   ============================    0 + m = m + 0		// n=0 の場合 subgoal 2 is:  S n + m = m + S n t < simpl; trivial.	// 0 + m = m + 0 を簡単化すると自明な式に。 18
帰納的関数の性質の証明(2) 1 subgoal n : nat m : nat IHn : n + m = m + n // 帰納法の前提   ============================ S n + m = m + S n t < rewrite plus_Sn_m. 1 subgoal n : nat m : nat IHn : n + m = m + n   ============================ S (n + m) = m + S n t < rewrite <- plus_n_Sm. 1 subgoal n : nat m : nat IHn : n + m = m + n   ============================    S (n + m) = S (m + n) t < apply eq_S. 1 subgoal n : nat m : nat IHn : n + m = m + n   ============================ n + m = m + n t < exact IHn. Proof completed. t < Qed. 19 Coq < Check plus_Sn_m. plus_Sn_m : forallnm : nat, S n + m = S (n + m) Coq < Check eq_S. eq_S : forallxy : nat, x = y -> S x = S y
自然演繹の推論規則とtactic 20
その他のコマンド(tactic) Require Import ライブラリ. 例えばArithとか。 Undo. : 一手戻る。 Locate パターン. : 定義を探す Locate “_ < _”. LocateしたらPrintで内容確認。 Search 演算子 : 定理を探す(重要!!) Search eq. とか。 SearchPatternパターン : 定理を探す SearchPattern ((_ + _) * _ = _) とか 21
その他のtactic ,[object Object]
apply は(定理の仮定だけじゃなく)既存定理にも使える
書かれてないだけで仮定に入っていると考えても良い
apply 定理
apply 定理 with (変数 := 値) (変数 := 値)
apply (定理引数引数 …)
cut 中間ゴール, assert 中間ゴール : 証明の中間ゴールを設定する
rewrite仮定. : =を含む仮定をGoalに適用(左辺値を右辺値で置換)
Goalの右辺値を左辺値で、はrewite <- 仮定。
等式の証明では良く使う。
rewrite (仮定引数1 引数2 …) で仮定に代入出来る。
reflexivity. : apply refl_equal. (Goalがx=xの時使う)
unfold定義. : 関数の定義をGoalに適用。foldは逆。
自動証明 : auto, eauto, tauto, intuition, trivial, ring, omega, …
それぞれ微妙に違う。色々証明を自動的にやってくれます。

Contenu connexe

Tendances

組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由kikairoya
 
Scala 初心者が米田の補題を Scala で考えてみた
Scala 初心者が米田の補題を Scala で考えてみたScala 初心者が米田の補題を Scala で考えてみた
Scala 初心者が米田の補題を Scala で考えてみたKazuyuki TAKASE
 
GC in C++0x
GC in C++0xGC in C++0x
GC in C++0xyak1ex
 
あまぁいRcpp生活
あまぁいRcpp生活あまぁいRcpp生活
あまぁいRcpp生活Masaki Tsuda
 
Wrapping a C++ library with Cython
Wrapping a C++ library with CythonWrapping a C++ library with Cython
Wrapping a C++ library with Cythonfuzzysphere
 
Cython ことはじめ
Cython ことはじめCython ことはじめ
Cython ことはじめgion_XY
 
Polyphony IO まとめ
Polyphony IO まとめPolyphony IO まとめ
Polyphony IO まとめryos36
 
ゆとりが数週間でC++を始めるようです
ゆとりが数週間でC++を始めるようですゆとりが数週間でC++を始めるようです
ゆとりが数週間でC++を始めるようですEric Sartre
 
Pythonを用いた高水準ハードウェア設計環境の検討
Pythonを用いた高水準ハードウェア設計環境の検討Pythonを用いた高水準ハードウェア設計環境の検討
Pythonを用いた高水準ハードウェア設計環境の検討Shinya Takamaeda-Y
 
Java SE 8 lambdaで変わる プログラミングスタイル
Java SE 8 lambdaで変わる プログラミングスタイルJava SE 8 lambdaで変わる プログラミングスタイル
Java SE 8 lambdaで変わる プログラミングスタイルなおき きしだ
 
Brief introduction of Boost.ICL
Brief introduction of Boost.ICLBrief introduction of Boost.ICL
Brief introduction of Boost.ICLyak1ex
 
V6でJIT・部分適用・継続
V6でJIT・部分適用・継続V6でJIT・部分適用・継続
V6でJIT・部分適用・継続7shi
 
C++による数値解析の並列化手法
C++による数値解析の並列化手法C++による数値解析の並列化手法
C++による数値解析の並列化手法dc1394
 
Cloud TPU Driver API ソースコード解析
Cloud TPU Driver API ソースコード解析Cloud TPU Driver API ソースコード解析
Cloud TPU Driver API ソースコード解析Mr. Vengineer
 
D言語会議#1
D言語会議#1D言語会議#1
D言語会議#19rnsr
 
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかBoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかYuki Miyatake
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門natrium11321
 
おいしいLisp
おいしいLispおいしいLisp
おいしいLispKent Ohashi
 
C++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプC++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプKohsuke Yuasa
 
言語処理系入門€10
言語処理系入門€10言語処理系入門€10
言語処理系入門€10Kenta Hattori
 

Tendances (20)

組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
 
Scala 初心者が米田の補題を Scala で考えてみた
Scala 初心者が米田の補題を Scala で考えてみたScala 初心者が米田の補題を Scala で考えてみた
Scala 初心者が米田の補題を Scala で考えてみた
 
GC in C++0x
GC in C++0xGC in C++0x
GC in C++0x
 
あまぁいRcpp生活
あまぁいRcpp生活あまぁいRcpp生活
あまぁいRcpp生活
 
Wrapping a C++ library with Cython
Wrapping a C++ library with CythonWrapping a C++ library with Cython
Wrapping a C++ library with Cython
 
Cython ことはじめ
Cython ことはじめCython ことはじめ
Cython ことはじめ
 
Polyphony IO まとめ
Polyphony IO まとめPolyphony IO まとめ
Polyphony IO まとめ
 
ゆとりが数週間でC++を始めるようです
ゆとりが数週間でC++を始めるようですゆとりが数週間でC++を始めるようです
ゆとりが数週間でC++を始めるようです
 
Pythonを用いた高水準ハードウェア設計環境の検討
Pythonを用いた高水準ハードウェア設計環境の検討Pythonを用いた高水準ハードウェア設計環境の検討
Pythonを用いた高水準ハードウェア設計環境の検討
 
Java SE 8 lambdaで変わる プログラミングスタイル
Java SE 8 lambdaで変わる プログラミングスタイルJava SE 8 lambdaで変わる プログラミングスタイル
Java SE 8 lambdaで変わる プログラミングスタイル
 
Brief introduction of Boost.ICL
Brief introduction of Boost.ICLBrief introduction of Boost.ICL
Brief introduction of Boost.ICL
 
V6でJIT・部分適用・継続
V6でJIT・部分適用・継続V6でJIT・部分適用・継続
V6でJIT・部分適用・継続
 
C++による数値解析の並列化手法
C++による数値解析の並列化手法C++による数値解析の並列化手法
C++による数値解析の並列化手法
 
Cloud TPU Driver API ソースコード解析
Cloud TPU Driver API ソースコード解析Cloud TPU Driver API ソースコード解析
Cloud TPU Driver API ソースコード解析
 
D言語会議#1
D言語会議#1D言語会議#1
D言語会議#1
 
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかBoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうか
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
 
おいしいLisp
おいしいLispおいしいLisp
おいしいLisp
 
C++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプC++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプ
 
言語処理系入門€10
言語処理系入門€10言語処理系入門€10
言語処理系入門€10
 

Similaire à Coq 20100208a

Introduction to NumPy & SciPy
Introduction to NumPy & SciPyIntroduction to NumPy & SciPy
Introduction to NumPy & SciPyShiqiao Du
 
Using PyFoam as library(第25回オープンCAE勉強会@関西)
Using PyFoam as library(第25回オープンCAE勉強会@関西)Using PyFoam as library(第25回オープンCAE勉強会@関西)
Using PyFoam as library(第25回オープンCAE勉強会@関西)TatsuyaKatayama
 
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)啓 小笠原
 
Tokyor14 - R言語でユニットテスト
Tokyor14 - R言語でユニットテストTokyor14 - R言語でユニットテスト
Tokyor14 - R言語でユニットテストYohei Sato
 
有限オートマトンとスティッカー系に関するCoqによる形式証明について
有限オートマトンとスティッカー系に関するCoqによる形式証明について有限オートマトンとスティッカー系に関するCoqによる形式証明について
有限オートマトンとスティッカー系に関するCoqによる形式証明についてYoshihiro Mizoguchi
 
私とOSS活動とPerl
私とOSS活動とPerl私とOSS活動とPerl
私とOSS活動とPerlShunsuke Maeda
 
第2回 JavaScriptから始めるプログラミング2016
第2回 JavaScriptから始めるプログラミング2016第2回 JavaScriptから始めるプログラミング2016
第2回 JavaScriptから始めるプログラミング2016kyoto university
 
Synthesijer.Scala (PROSYM 2015)
Synthesijer.Scala (PROSYM 2015)Synthesijer.Scala (PROSYM 2015)
Synthesijer.Scala (PROSYM 2015)Takefumi MIYOSHI
 
Cookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
Cookpad 17 day Tech internship 2017 言語処理系入門 RubyをコンパイルしようCookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
Cookpad 17 day Tech internship 2017 言語処理系入門 RubyをコンパイルしようKoichi Sasada
 
第3回 JavaScriptから始めるプログラミング2016
第3回 JavaScriptから始めるプログラミング2016第3回 JavaScriptから始めるプログラミング2016
第3回 JavaScriptから始めるプログラミング2016kyoto university
 
Python physicalcomputing
Python physicalcomputingPython physicalcomputing
Python physicalcomputingNoboru Irieda
 

Similaire à Coq 20100208a (20)

Coqチュートリアル
CoqチュートリアルCoqチュートリアル
Coqチュートリアル
 
Introduction to NumPy & SciPy
Introduction to NumPy & SciPyIntroduction to NumPy & SciPy
Introduction to NumPy & SciPy
 
Subprocess no susume
Subprocess no susumeSubprocess no susume
Subprocess no susume
 
Using PyFoam as library(第25回オープンCAE勉強会@関西)
Using PyFoam as library(第25回オープンCAE勉強会@関西)Using PyFoam as library(第25回オープンCAE勉強会@関西)
Using PyFoam as library(第25回オープンCAE勉強会@関西)
 
Coqでsprintf
CoqでsprintfCoqでsprintf
Coqでsprintf
 
MoteMote Compiler Plugin
MoteMote Compiler PluginMoteMote Compiler Plugin
MoteMote Compiler Plugin
 
Rの高速化
Rの高速化Rの高速化
Rの高速化
 
Coqでsprintf
CoqでsprintfCoqでsprintf
Coqでsprintf
 
R -> Python
R -> PythonR -> Python
R -> Python
 
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)
 
Tokyor14 - R言語でユニットテスト
Tokyor14 - R言語でユニットテストTokyor14 - R言語でユニットテスト
Tokyor14 - R言語でユニットテスト
 
有限オートマトンとスティッカー系に関するCoqによる形式証明について
有限オートマトンとスティッカー系に関するCoqによる形式証明について有限オートマトンとスティッカー系に関するCoqによる形式証明について
有限オートマトンとスティッカー系に関するCoqによる形式証明について
 
私とOSS活動とPerl
私とOSS活動とPerl私とOSS活動とPerl
私とOSS活動とPerl
 
第2回 JavaScriptから始めるプログラミング2016
第2回 JavaScriptから始めるプログラミング2016第2回 JavaScriptから始めるプログラミング2016
第2回 JavaScriptから始めるプログラミング2016
 
Synthesijer.Scala (PROSYM 2015)
Synthesijer.Scala (PROSYM 2015)Synthesijer.Scala (PROSYM 2015)
Synthesijer.Scala (PROSYM 2015)
 
Cookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
Cookpad 17 day Tech internship 2017 言語処理系入門 RubyをコンパイルしようCookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
Cookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
 
第3回 JavaScriptから始めるプログラミング2016
第3回 JavaScriptから始めるプログラミング2016第3回 JavaScriptから始めるプログラミング2016
第3回 JavaScriptから始めるプログラミング2016
 
Python physicalcomputing
Python physicalcomputingPython physicalcomputing
Python physicalcomputing
 
競プロでGo!
競プロでGo!競プロでGo!
競プロでGo!
 
Introduction of Python
Introduction of PythonIntroduction of Python
Introduction of Python
 

Plus de tmiya

Coq for ML users
Coq for ML usersCoq for ML users
Coq for ML userstmiya
 
Proofsummit2011a
Proofsummit2011aProofsummit2011a
Proofsummit2011atmiya
 
Coq Tutorial at Proof Summit 2011
Coq Tutorial at Proof Summit 2011Coq Tutorial at Proof Summit 2011
Coq Tutorial at Proof Summit 2011tmiya
 
Typeclass
TypeclassTypeclass
Typeclasstmiya
 
Coq Tutorial
Coq TutorialCoq Tutorial
Coq Tutorialtmiya
 
RegExp20110305
RegExp20110305RegExp20110305
RegExp20110305tmiya
 
Coq setoid 20110129
Coq setoid 20110129Coq setoid 20110129
Coq setoid 20110129tmiya
 
Coq Party 20101127
Coq Party 20101127Coq Party 20101127
Coq Party 20101127tmiya
 
Maude20100719
Maude20100719Maude20100719
Maude20100719tmiya
 
Formal methods20100529
Formal methods20100529Formal methods20100529
Formal methods20100529tmiya
 

Plus de 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
 
Coq Party 20101127
Coq Party 20101127Coq Party 20101127
Coq Party 20101127
 
Maude20100719
Maude20100719Maude20100719
Maude20100719
 
Formal methods20100529
Formal methods20100529Formal methods20100529
Formal methods20100529
 

Dernier

プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価sugiuralab
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxAtomu Hidaka
 
プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールsugiuralab
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directoryosamut
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000Shota Ito
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 

Dernier (8)

プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
 
プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツール
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
 

Coq 20100208a

  • 1. Coq and Why :Formal Verification Tools 2010/02/08 tmiya
  • 2. 自己紹介 ハンドル名 : tmiya Blog : Functional Programming Memo http://study-func-prog.blogspot.com/ Scalaとか主として関数型言語関係の勉強のメモ 仕事 :SIer勤務(時々プログラミングの仕事) 興味: 形式手法(モデル検査とか定理証明とか)、関数型言語とか 2007- : Scala普及活動 “A Scala Tutorial for Java Programmer” を和訳 Step by Step Scala講師を数回 ITproにScala 2.8の記事を書きました 形式仕様 : まだまだ勉強中 Coq : 社内勉強会向けにちょっと調べた Agda : 産総研のセミナーを聞いた B-method : 先日セミナーを聞いた という訳で、専門家じゃないです。
  • 3. 内容 形式手法とは? Coqとは? 理論的背景を少し Coqを動かしてみよう Design by Contract Whyを動かしてみよう まとめ 3
  • 5. 形式手法 (Formal Method) 自然言語の仕様 形式仕様記述: 機械的検証可能な記述 上流行程 仕様アニメーション: 実装前に仕様を動かして確認 (Lightweight FM) 形式仕様 モデル検査: モデルが仕様を満たす事を網羅的にチェック 動作確認 モデル 形式手法といっても色々。一つのツールが複数を行う場合あり。 最近は主として上流行程のミスを減らす為の手法として注目。 プログラム検証: 実装が仕様を満たす事を証明 プログラム生成: 陰仕様から陽仕様へと具体化⇒実装を生成 プログラム 下流行程 Coqは証明からプログラム生成 Whyはプログラム検証 5
  • 6. 定理証明系の色々 6 TheSeventeenProversoftheWorld http://math.boisestate.edu/~tconklin/MATH124/Main/Readings/2%20Logic/PDFs/The%20Seventeen%20Provers%20of%20the%20World.pdf 各種定理証明系での「√2 が無理数である」ことの証明を比較 上流下流揃っている ツールが最強? 全ての証明を自動化出来ない。 最後は人間が証明出来ないと画竜点睛を欠く。 証明について理解していないと良い事前条件や不変条件、停止を保証するループ変数を定義出来ない。 証明の行いやすさ重要
  • 8. Coqとは? 開発元:INRIA研究所@フランス http://coq.inria.fr/ 定理証明支援ツール (ある程度は自動証明) Coqでの有名な定理の証明例 “Essential Incompleteness of Arithmetic Verified by Coq” (不完全性定理) http://r6.ca/Goedel/goedel1.html “A computer-checked proof of the Four Colour Theorem” (四色問題) プログラムの開発も出来る プログラムを開発&正しい事を証明(テスト不要) 実行可能なプログラムを抽出 (OCaml, Haskell) 8
  • 9. Coq参考文献 Interactive Theorem Proving and Program Development: Coq&apos;Art: The Calculus of Inductive 値段が¥12,000程度する… Certified Programming with Dependent Types http://adam.chlipala.net/cpdt/ Harvardの授業で使用 (PDF 360ページ程度) 定期的に改訂 (Latest 2010/2/3) 読書会するとしたらこれを使うのが良さそう 他にもINRIAのCoqのページからTutorialが幾つか 浅井研のゼミ資料 (第1回〜第8回) http://pllab.is.ocha.ac.jp/coq_print/nori_Coq1.pdf にわとり小屋でのプログラミング日記 http://d.hatena.ne.jp/yoshihiro503/ Coq を使った証明 : まとめ http://www.kmonos.net/pub/Presen/coq-matome.ppt 9
  • 11. Curry-Howard Isomorphism 述語論理と型付きλ計算の間に対応関係 狭義では、直観主義命題論理と自然演繹 ⇔ 単純型付きλ計算、の対応 証明λ計算の式、証明の検査型検査 例: 連言 P∧Q  (P,Q) : タプル型 含意P⇒Q P->Q : 関数型 Modus Ponens : (A∧(A⇒B))⇒B  (A, A->B)->B fun t -&gt; (sndt) (fstt) : ‘a * (‘a -&gt; ‘b) -&gt; ‘b AとA->Bのタプル型を引数にしてBを返す関数という型 11
  • 12. 自然演繹 Gentzenによる形式化。公理が少なく推論規則が多い。判りやすく「自然」。 導入規則と除去規則(ここでは∧と⇒だけ) A B A∧B A∧B ------ (∧導入) ------ ------ (∧除去) A∧B A B [A] // 仮定 B A A⇒B ------ (⇒導入) ------- (⇒除去) A⇒B B NK:排中律ありの古典論理 NJ:無しの直観主義論理 (こちらを使う) 12
  • 13. 依存型 (dependent type) 値をパラメタとする型 = 値を引数に取って型を返す関数。 Agda, Gallina, Epigram, Isabelleとかが依存型をサポートする言語 型も言語のfirst-class citizen。 Vec 5 = 要素数5のべクトルの「型」。 append : Vecn -&gt; Vecm -&gt; Vec (n+m) 行列計算とか次数が一致している事が型で保証出来る。 コンパイラを通った時点でOutOfBoundsが起きないことを保証。 型命題論理 依存型一階述語論理 ∀x∈A.P(x) Πx:A. P x 13
  • 15. CoqのInstall Macの場合 MacPortsで導入して終わり $ sudo port install coq ocaml, camlp5, coqをインストール coq-8.2-intel.dmg =&gt; Coq, CoqIde gtk2, Coqのpkg Winの場合 coq-8.2-1-win.exe =&gt; Coq, CoqIde 15
  • 16. Coqを動かしてみる % coqtop// coqtopで対話環境に入る Welcome to Coq 8.2 (March 2009) Coq &lt; Check 3. // Check で型を調べる。文末のピリオド重要。 3 : nat Coq &lt; Check and. and : Prop -&gt; Prop -&gt; Prop Coq &lt; Unset Printing Notations. Coq &lt; Check 3. // 3はsyntax sugarで、実はnatはペアノの自然数 S (S (S O)) : nat Coq &lt; Quit. // Quit.で終了 % 16
  • 17. 帰納的関数の定義 / プログラム抽出 Coq &lt; Print plus. // 予め定義されている plus = fix plus (nm : nat) : nat := match n with | 0 =&gt; m | S p =&gt; S (p + m) end : nat -&gt; nat -&gt; nat Coq &lt; Extraction “plus.ml” plus. // OCamlプログラムとして抽出 % cat plus.ml type nat = | O | S of nat (** val plus : nat -&gt; nat -&gt; nat **)// 普通のOcamlの関数 let rec plus nm = match n with | O -&gt; m | S p -&gt; S (plus pm) 17
  • 18. 帰納的関数の性質の証明(1) Coq &lt; Theorem t : forallnm : nat, n + m = m + n. // これを証明する。 1 subgoal ============================ forallnm : nat, n + m = m + n t &lt; intros. // forallの除去。初手は大抵intros. 1 subgoal n : nat m : nat ============================ n + m = m + n t &lt; induction n. // nについて帰納法。0と(S n)とに場合分け 2 subgoals m : nat ============================ 0 + m = m + 0 // n=0 の場合 subgoal 2 is: S n + m = m + S n t &lt; simpl; trivial. // 0 + m = m + 0 を簡単化すると自明な式に。 18
  • 19. 帰納的関数の性質の証明(2) 1 subgoal n : nat m : nat IHn : n + m = m + n // 帰納法の前提 ============================ S n + m = m + S n t &lt; rewrite plus_Sn_m. 1 subgoal n : nat m : nat IHn : n + m = m + n ============================ S (n + m) = m + S n t &lt; rewrite &lt;- plus_n_Sm. 1 subgoal n : nat m : nat IHn : n + m = m + n ============================ S (n + m) = S (m + n) t &lt; apply eq_S. 1 subgoal n : nat m : nat IHn : n + m = m + n ============================ n + m = m + n t &lt; exact IHn. Proof completed. t &lt; Qed. 19 Coq &lt; Check plus_Sn_m. plus_Sn_m : forallnm : nat, S n + m = S (n + m) Coq &lt; Check eq_S. eq_S : forallxy : nat, x = y -&gt; S x = S y
  • 21. その他のコマンド(tactic) Require Import ライブラリ. 例えばArithとか。 Undo. : 一手戻る。 Locate パターン. : 定義を探す Locate “_ &lt; _”. LocateしたらPrintで内容確認。 Search 演算子 : 定理を探す(重要!!) Search eq. とか。 SearchPatternパターン : 定理を探す SearchPattern ((_ + _) * _ = _) とか 21
  • 22.
  • 26. apply 定理 with (変数 := 値) (変数 := 値)
  • 28. cut 中間ゴール, assert 中間ゴール : 証明の中間ゴールを設定する
  • 32. rewrite (仮定引数1 引数2 …) で仮定に代入出来る。
  • 33. reflexivity. : apply refl_equal. (Goalがx=xの時使う)
  • 35. 自動証明 : auto, eauto, tauto, intuition, trivial, ring, omega, …
  • 37. Coq/tactics : Tacticの一覧と解説 (日本語)。お薦め。22
  • 38. 練習問題 Coq本より Theorem ex561 : forall A B C : Prop, A/B/) -&gt; (A/)/. Theorem ex562 : forall A B C D : Prop, (A-&gt;B)/C-&gt;D)// -&gt; B/. Theorem ex563 : forall A : Prop, ~(A/A). Theorem ex564 : forall A B C : Prop, A(BC) -&gt; (AB)C. Theorem ex565 : forall A : Prop, ~~(A~A). Theorem ex566 : forall A B : Prop, (AB)/A -&gt; B. Theorem ex567 : forallA:Set, forall P Q:A-&gt;Prop, (forallx, P x)(forally, Q y)-&gt;forallx, P xQ x. パズルゲーム感覚で解けます。 というか端から色々試すアドヴェンチャーゲーム? 適用出来ないtacticはエラーメッセージが出るだけ。 23
  • 40. Design by Contract Design by Contract : 契約プログラミング プログラムが満たすべき仕様記述をコードに埋め込む設計の安全性向上 事前条件、事後条件、不変条件 Eiffel で有名。Dとかも。 JML (Java Modeling Language) : コメントでアノテーションする Hoare論理 「事前条件が成立する状態で、プログラムを実行したら、事後条件が成立する」 テスト有限な場合しかテスト出来ない。 数学的に証明常に正しい 25
  • 41. Hoare論理 Hoare : プログラムが仕様に対して部分正当であることを証明する為の公理的手法 (1969) Hoare Triplet : {P}S{Q} 事前条件Pを満たすとき、 プログラムSを実行すると 事後条件Qを満たす 命令型プログラミング言語の公理 代入文/複合文/if文/while文/帰結の公理 関数型言語の方がHoare Tripletを書きやすいはず 再帰を用いた帰納的関数のほうが相性がいい 良いループ不変条件を抽出するのは難しいが再帰なら楽 再代入、副作用が無い方が簡単に書ける 逆にグローバル変数、ポインタ、共用体とかあると困難 26
  • 42. Hoare論理の公理 {Q[e/x]}x:=e{Q} {P}S1{R}, {R}S2{Q} ------------------------ {P}S1;S2{Q} {P∧B}S1{Q}, {P∧¬B}S2{Q} ----------------------------- {P} if B then S1 else S2 {Q} {P∧B}S{P} ----------------------------- {P} while B do S end {P∧¬B} PP1, {P1}S{Q1}, Q1Q ------------------------------ {P}S{Q} 27
  • 43. Why プログラムから証明へ Why: プログラム検証用ツール CaduceusはobsolateFrama-C へ移行 外部の各種の証明器と連携 gwhy : GUI環境 Eclipse plugin有 *.java (JML) Krakatoa *.v他 Coq 手動証明 *.c Caduceus 他にPVS, Isabelle/HOL, etc. 自動証明。他にSimplify, CVCL, … Alt-Ergo他 28
  • 45. whyをインストール(1) Windows : whyダウンロードページにinstaller Linux, Mac, etc.: ソースからmakeする 前提:OCaml, Coq // 既にインストールしてあるはず 前提:LablGTK// GUI環境のため lablgtk-2.14.0.tar.gz 入手⇒gunzip, tar –xf ⇒ ./configure ⇒ make world ⇒ sudo make install why の導入 % ls why-2.23.tar.gz % gunzip why-2.23.tar.gz % tar -xf why-2.23.tar % cdwhy-2.23 % ./configure % make % sudo make install % why –version 30
  • 46.
  • 47. Krakatoaを動かす(1) % cat Lesson1.java public class Lesson1 { /*@ ensures esult &gt;= x && esult &gt;= y && @ orall integer z; z &gt;= x && z &gt;= y ==&gt; z &gt;= esult; @*/ public static intmax(intx, inty) { if (x&gt;y) { return x; } else { returnx; } // わざと間違い } } % why-config最初の1回だけ % gwhy Lesson1.java  GUI起動 32
  • 49. Whyを動かす(1) % cat test.why logic min: int, int -&gt; int axiom min_ax: forallx,y:int. min(x,y) &lt;= x parameter r: int ref let f (n:int) = {} r := min !rn { r &lt;= r@ } % gwhytest.why// GUI起動自動証明器で確認 あるいは why –-simplify で % why --coq test.why// Coq用にproof obligationを生成する % cat test_why.v ... (*Why goal*) Lemma f_po_1 : forall (n: Z), forall (r0: Z), forall (r: Z), forall (HW_1: r = (min r0 n)), r &lt;= r0. Proof. (* FILL PROOF HERE *) Save. ... 34
  • 51. まとめ Coq面白いよ! 関数型言語ブームの次は依存型が来るよね(多分) See “Why Dependent Types Matter” (PDF) Javaのジェネリクスの有無同様、依存型の有無が 「証明=難しい」じゃなくて「証明=パズルゲーム」 でも、覚えるべきtacticが多過ぎて大変 多分、練習問題を沢山解かないと使い方は身に付かない でも、事前条件、不変条件をうまく書けば事後条件はかなり自動証明されるのでは? 人工無脳との対話めいた感もあり 一昔前で言うところのエキスパートシステム コードレヴューで人間に説明する代わりに、定理証明系に説明すると思えば良い Coq/Whyの勉強会やりません? 私もプレゼン用に上っ面を撫でただけなので… 36