SlideShare a Scribd company logo
1 of 36
Download to read offline
.
.
Coq チュートリアル
ウィンタースクール「数学ソフトウェア・チュートリアル」
溝 口 佳 寛
九州大学マス・フォア・インダストリ研究所
 
http://imi.kyushu-u.ac.jp/∼ym/
2015 年 2 月 18 日 (水)
本スライド : http://www.slideshare.net/yoshihiromizoguchi/20150218tutorial-44796812
サンプルファイル : https://github.com/KyushuUniversityMathematics/CoqExamples/tree/master/20150218
溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 1 / 36
目次
. .
1 第 1 節: プログラムの正しさの証明
数学の定理
Coq の定理
証明付プログラム
. .
2 第 2 節: 自然数上の命題
否定の証明
帰納的に定義された命題の否定
3 第 3 節: まとめ
溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 2 / 36
数学定理の形式証明 (論文)
G. Gonthier, Formal Proof―The Four-Color Theorem. Notices of the American
Mathematical Society, 55(11), 1382―1393, 2008.
http://www.ams.org/notices/200811/tx081101382p.pdf
R. Affeldt and M. Hagiwara, Formalization of Shannon’s Therems in SSReflect-Coq,
Proc. 3rd Conference on Interactive Theorem Proving, LNCS 7406, 233―249, 2012.
G. Gonthier, et al., A Machine-Checked Proof of the Odd Order Theorem, Proc. 4th
Conference on Interactive Theorem Proving, LNCS 7998, 163―179, 2013.
https://hal.inria.fr/hal-00816699/file/main.pdf
F. Chyzak, A. Mahboubi et.al, A Computer-Algebra-Based Formal Proof of the
Irrationality of ζ (3), Proc. 5th International Conference on Interactive Theorem
Proving, LNCS 8558, 2014, https://hal.inria.fr/hal-00984057.
T. Hales, Dense Sphere Packings : A blueprint for formal proofs, Cambridge
University Press, 2012. (The Kepler Conjecture)
· · · · · ·
溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 3 / 36
数学定理の形式証明 (リンク, 広報, プロジェクト)
SSreflect in the world,
http://coqfinitgroup.gforge.inria.fr/ssreflect world.html
Coq Proof of the Four Color Theorem, 2006/04/26,
http://bit.ly/FourColorTheorem
Feit thompson proved in Coq, 2012/09/20,
http://bit.ly/FeitThompson
The announcement of the completion of the Flyspec project, 2014/8/10.
http://bit.ly/Flyspeck
(The Kepler Conjecture)
Univalent Foundations of Mathematics, 2012,2013.
http://bit.ly/UnivalentFoundations
(Homotopy Type Theory)
Computing close approximations of Pi,
http://www-sop.inria.fr/members/Yves.Bertot/proofs.html
溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 4 / 36
証明支援系 Coq を使うには
本スライドの例題は Coq8.4pl5, ssreflect-1.5rc1, mathcomp-1.5rc1 で確認されて
います. https://github.com/KyushuUniversityMathematics/CoqExamples/tree/master/20150218
現在, Coq8.5beta1, ssreflect-1.5.coq85beta1, mathcomp-1.5.coq85beta1 が公表
されています. https://coq.inria.fr/coq-85
Mathlibre (Linux)
ライブ DVD に, coq8.4pl3, ssreflect1.5, mathcomp1.5 が入っています.
http://mirror.math.kyushu-u.ac.jp/mathlibre/mathlibre-debian-amd64-20141110-ja.iso
Windows
Coq8.5beta1,ssr-mathcomp-1.5 のインストーラがあります.
https://coq.inria.fr/distrib/V8.5beta1/files/coq-installer-8.5beta1.exe
http://ssr.msr-inria.inria.fr/FTP/ssr-mathcomp-installer-1.5coq8.5beta1.exe
MacOSX
Coq8.5,ssr-mathcomp-1.5 のインストーラがありますが確認していません.
https://coq.inria.fr/coq-85
開発環境は CoqIDE, または, Emacs 上の ProofGeneral を使います. Coq8.5 から
は, Coq/jEdit も使えるらしいですが確認出来ていません.
溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 5 / 36
第 1 節: プログラムの正しさの証明 数学の定理
数学の定理 (1)
Let N = {0, 1, · · · } be the set of natural numbers.
Theorem
.
For any natural number n ∈ N, we have
n∑
k=0
k =
n(n + 1)
2
.
Where 


0∑
k=0
k = 0,
n+1∑
k=0
k = (n + 1) +
n∑
k=0
k (n ∈ N).
溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 6 / 36
第 1 節: プログラムの正しさの証明 数学の定理
関数 (プログラム) の定義
2 つの関数 f : N → N, g : N → N を以下のように定義する.
1
{
f(0) = 0
f(n + 1) = (n + 1) + f(n)
2
g(n) =
n(n + 1)
2
但し, n ∈ N とします.
溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 7 / 36
第 1 節: プログラムの正しさの証明 数学の定理
数学の定理 (2)
先の定理は関数 f, g を用いて, 次のように書き換えられます.
Theorem
.
.
For any natural number n ∈ N, we have
f(n) = g(n).
溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 8 / 36
第 1 節: プログラムの正しさの証明 数学の定理
数学の証明
(i) n = 0 のとき
f(0) = 0 =
0(0 + 1)
2
= g(0).
(ii) f(n) = g(n)
(
=
n(n + 1)
2
)
を仮定するとき
f(n + 1) = (n + 1) + f(n)
= (n + 1) +
n(n + 1)
2
=
(n + 1)((n + 1) + 1)
2
= g(n + 1)
(i),(ii) により数学的帰納法により全ての n ∈ N に対して,
f(n) = g(n) が成立する.
溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 9 / 36
第 1 節: プログラムの正しさの証明 数学の定理
数学の補題 (1)
先の証明には次の補題が必要です.
Lemma
.
.
For any natural number n ∈ N, we have
(n + 1) +
n(n + 1)
2
=
(n + 1)((n + 1) + 1)
2
.
この証明は演算 + や /2 の帰納的な定義に従い証明されます.
溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 10 / 36
第 1 節: プログラムの正しさの証明 数学の定理
自然数と加算の帰納的定義
Definition
.
.
0 ∈ N,
p ∈ N → (S p) ∈ N.
Definition
.
.
0 + m = m,
(S p) + m = (S (p + m)).
一般に関数適用 S(p) と書きますが, ここでは, Coq の記法に従い, (S p) と
書いています. さらに, (S p) を p. + 1 と書きます. 加算の + と同じ記号を
含みますが注意して区別します. すなわち, . + 1 : N → N に対し,
+ : N → (N → N) です. (注. Coq では, (n + m) は +(n)(m) を意味します.)
(p . + 1) + m = (p + m) . + 1
溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 11 / 36
第 1 節: プログラムの正しさの証明 数学の定理
数学の補題 (2)
次の簡単な式も定義に従った数学的帰納法での証明が必要です.
Lemma
.
.
For any natural number n ∈ N, we have
n + 0 = n
(i) n = 0 のとき
0 + 0 = 0.
(ii) n + 0 = n を仮定するとき
(n. + 1) + 0 = (n + 0). + 1
= n. + 1.
(i),(ii) により数学的帰納法により全ての n ∈ N に対して, n + 0 = n が成立する.
溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 12 / 36
第 1 節: プログラムの正しさの証明 Coq の定理
Coq の定理と証明 (1)
Coq による簡単な定理 (補題) とその証明を紹介します.
 
Lemma lemma0: forall n:nat, n + 0 = n.
Proof.
elim. (* n に対する数学的帰納法で証明 *)
rewrite /addn/addn_rec/plus.
apply (erefl 0). (* n=0 のときは明らか *)
move = n H.
rewrite /addn/addn_rec/plus.
fold plus.
rewrite plusE.
rewrite H. (* n のときの仮定を使って *)
apply (erefl (n.+1)). (* n+1 のときの証明が出来る *)
Qed.
 
※ Proof. と Qed. の間は証明ではなく証明を作るためのコマンド列です!
溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 13 / 36
第 1 節: プログラムの正しさの証明 Coq の定理
Coq の定理と証明 (2)
証明を作るためのコマンドで作成された証明そのものは
命題の型を持つ関数 (プログラム) です.
 
lemma0 =
fun _top_assumption_ : nat =
(fun _evar_0_ : (fun n : nat = n + 0 = n) 0 =
(nat_ind (fun n : nat = n + 0 = n) _evar_0_)ˆ˜ _top_assumption_)
(erefl 0)
(fun (n : nat) (H : n + 0 = n) =
(fun _evar_0_ : (n + 0).+1 = n.+1 =
eq_ind_r
(fun _pattern_value_ : nat - nat - nat =
(_pattern_value_ n 0).+1 = n.+1) _evar_0_ plusE)
((fun _evar_0_ : n.+1 = n.+1 =
eq_ind_r (fun _pattern_value_ : nat = _pattern_value_.+1 = n.+1)
_evar_0_ H) (erefl n.+1)))
: forall n : nat, n + 0 = n
 
溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 14 / 36
第 1 節: プログラムの正しさの証明 Coq の定理
Coq の補題 (1)
既に証明された Ssreflect.ssrnat 中にある補題たち
 
Lemma add0n: forall n:nat, 0 + n = n.
Lemma addn0: forall n:nat, n + 0 = n.
Lemma addSn: forall m n:nat, m.+1 + n = (m + n).+1.
Lemma addnS: forall m n:nat, m + n.+1 = (m + n).+1.
Lemma addnC: forall n m:nat, m + n = n + m.
  
Lemma muln_divA d m n : d %| n - m * (n %/ d) = m * n %/ d.
Lemma dvdnn m : m %| m.
Lemma muln1 n: n * 1 = n.
Lemma dvdn_mull d m n : d %| n - d %| m * n.
Lemma divnDl m n d : d %| m - (m + n) %/ d = m %/ d + n %/ d.
 
※ http://ssr.msr-inria.inria.fr/doc/ssreflect-1.5/Ssreflect.ssrnat.html
※ http://ssr.msr-inria.inria.fr/doc/mathcomp-1.5/MathComp.div.html
溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 15 / 36
第 1 節: プログラムの正しさの証明 Coq の定理
Coq の補題 (2)
一旦, 自然数上で成立する演算の性質がわかると, その性質の補題を用い
れば帰納法を用いることなく複雑な証明を構成することが出来ます.
また, 数式を簡潔な方向に変換して適用する補題を自動で探して証明する
手続きがあります (ring など).
このような手続きを Tactic と呼びます. 以下は ring の利用例.
 
Lemma lemma1: forall n:nat,
(n.+1)*2 + (n * (n.+1)) = (n.+1 * (n.+2)).
Proof.
move = n.
ring.
Qed.
 
Tactic を自分で作ることも出来ます.
溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 16 / 36
第 1 節: プログラムの正しさの証明 Coq の定理
Coq の補題 (3)
 
Lemma lemma2: forall n:nat,
(n.+1 * 2) %/ 2 = n.+1.
Proof.
move = n.
rewrite -(muln_divA (n.+1)).
rewrite (divnn 2).
simpl.
by [rewrite muln1].
apply (dvdnn 2).
Qed.
Lemma lemma3: forall n:nat,
2 %| (n.+1 * 2).
Proof.
move = n.
apply dvdn_mull.
apply (dvdnn 2).
Qed.
 
溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 17 / 36
第 1 節: プログラムの正しさの証明 Coq の定理
Coq の補題 (4)
Lemma
.
.
For any natural number n ∈ N, we have
(n + 1) +
n(n + 1)
2
=
(n + 1)((n + 1) + 1)
2
.
 
Lemma lemma4: forall n:nat,
n.+1 + (n * n.+1) %/ 2 = (n.+1 * n.+2) %/ 2.
Proof.
move = n.
rewrite -lemma1.
rewrite (divnDl (n*n.+1) (lemma3 n)).
by [rewrite lemma2].
Qed.
 
溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 18 / 36
第 1 節: プログラムの正しさの証明 証明付プログラム
Coq による関数実装と定理 (1)
2 つの関数 f, g は, Coq では以下のように実装出来ます.
 
Fixpoint f (n:nat) :=
match n with
| O = 0
| p.+1 = (p.+1) + (f p)
end.
 
 
Definition g (n:nat) := ((n * (n.+1)) %/ 2).
 
先の定理は, Coq では以下のように記述されます.
 
Theorem sigma: forall n:nat, (f n) = (g n).
 
溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 19 / 36
第 1 節: プログラムの正しさの証明 証明付プログラム
Coq による関数実装と定理 (2)
Theorem
.
.
For any natural number n ∈ N, we have
f(n) = g(n).
 
Theorem sigma: forall n:nat, (f n) = (g n).
Proof.
elim. (* n に対する数学的帰納法で証明 *)
by [compute]. (* n=0 のときは計算で明らか *)
move = n H.
rewrite /f.
fold f.
rewrite H. (* n のときの仮定を使うと *)
rewrite /g.
apply lemma4. (* lemma4 の計算から証明できる *)
Qed.
 
溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 20 / 36
第 1 節: プログラムの正しさの証明 証明付プログラム
証明された関数を実際に使う (1)
性質が証明された実装関数 f と g を Extraction を用いて, ファイル
sigma.hs に Haskell 言語の関数として出力する.
出力前のおまじないとして, いくつか (list, symbol, bool, nat) の型定義
が必要.
 
Extraction Language Haskell.
Extract Inductive list = ([]) [[] (:)].
Extract Inductive sumbool = Prelude.Bool
[Prelude.True Prelude.False].
Extract Inductive bool = Prelude.Bool
[Prelude.True Prelude.False].
Extract Inductive nat = Prelude.Int
[0 Prelude.succ]
(fO fS n - if (n Prelude.== 0)
then fO () else fS (n Prelude.- 1)).
Extraction sigma.hs f g.
 
溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 21 / 36
第 1 節: プログラムの正しさの証明 証明付プログラム
証明された関数を実際に使う (2)
出力されたファイル sigma.hs 中の 1 行
import qualified GHC.Base
を型定義文の上へ移動する必要がある.
 
import qualified Prelude
import qualified GHC.Base -- (ここに移動)
unsafeCoerce :: a - b
#ifdef __GLASGOW_HASKELL__
-- import qualified GHC.Base -- (この行を移動)
unsafeCoerce = GHC.Base.unsafeCoerce#
#else
-- HUGS
import qualified IOExts
unsafeCoerce = IOExts.unsafeCoerce
#endif
 
溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 22 / 36
第 1 節: プログラムの正しさの証明 証明付プログラム
証明された関数を実際に使う (3)
出力された Haskell 言語の関数を Glasgow Haskell Interpreter1
で実行して
みる.
 
ym$ ghci sigma.hs
GHCi, version 7.6.3: http://www.haskell.org/ghc/ :? for help
[1 of 1] Compiling Sigma ( sigma.hs, interpreted )
Ok, modules loaded: Sigma.
*Sigma f 5
15
*Sigma g 5
15
*Sigma :q
 
※ 関数 f と関数 g の値が常に等しいことは証明されています!
具体的なデータに対する試験 (テスト) での結果の確認は不要です.
1
https://www.haskell.org/ghc/
溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 23 / 36
第 1 節: プログラムの正しさの証明 証明付プログラム
証明された関数を実際に使う (4)
自動生成された証明済の Haskell 言語のプログラム.
 
f :: Int - Int
f n =
(fO fS n - if (n == 0) then fO () else fS (n - 1))
(_ -
0)
(p -
addn (succ p) (f p))
n
g :: Int - Int
g n =
divn (muln n (succ n)) (succ (succ 0))
 
溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 24 / 36
第 2 節: 自然数上の命題 否定の証明
自然数上の命題 (1)
与えられた自然数 x に対して,
真 (True) か偽 (False) を返す関数の例として E1 を考える.
 
Definition E1 (x:nat):Prop :=
match x with
| 0 = False
| n.+1 = match n with
| 0 = True
| _.+1 = False
end
end.
Compute [:: (E1 0); (E1 1); (E1 2); (E1 3)].
= [:: False; True; False; False]
 
真偽を返す関数は自然数上の命題でもあり,
命題 (E1 x) は, x = 1 のときだけ真で x 1 のときは偽である.
溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 25 / 36
第 2 節: 自然数上の命題 否定の証明
否定の証明 (1)
Coq では否定は False を導く命題として定義される.
¬P は P → False と考える.
False は何でも証明出来る命題として定義されている.
何でも証明できるという証明の名前は False_rect である.
(False_rect P) は False → P の証明である.
 
Lemma lemma5: (E1 0) - False.
Proof.
compute.
apply (False_rect False).
Qed.
 
溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 26 / 36
第 2 節: 自然数上の命題 否定の証明
否定の証明 (2)
命題 1 0 は, (1 = 0) → False である.
(E1 1) は計算で証明出来る.
仮定の 1 = 0 から, (E1 1) → (E1 0) が証明出来る.
(E1 0) → False を lemma5 で証明した.
従って, (1 = 0) → False が証明出来る.
 
Lemma lemma6: (1 = 0) - False.
Proof.
have: (E1 1).
compute.
apply I.
move = H1 H2; move: H1.
rewrite H2.
apply lemma5.
Qed.
 
溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 27 / 36
第 2 節: 自然数上の命題 否定の証明
自然数上の命題 (2)
関数 NE1 を以下のようにする.
 
Definition NE1 (x:nat):Prop :=
match x with
| 0 = True
| n.+1 = match n with
| 0 = False
| _.+1 = True
end
end.
 
このとき,
Lemma
∀x, ¬(E1 x) ↔ (NE1 x)
は殆ど計算だけで証明出来る.
溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 28 / 36
第 2 節: 自然数上の命題 帰納的に定義された命題の否定
自然数上の命題 (3)
自然数上の命題は真偽を計算する関数で与えるだけでなく
帰納的な定義も出来る.
 
Inductive even: nat - Prop :=
|even_0: even 0
|even_SS: forall n, (even n) - (even (n.+2)).
 
言葉で書けば,
1. 0 は偶数である.
2. n が偶数ならば, n + 2 は偶数である.
で, 命題「x は偶数である」を定義出来る.
1. の証明の名前が even_0, そして, 2. の証明の名前が even_SS である.
溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 29 / 36
第 2 節: 自然数上の命題 帰納的に定義された命題の否定
帰納的に定義された命題の証明
Lemma
.
.
.
2 は偶数である
を証明する.
(even_SS n): (even n) - (even (n.+2))
なのと, 0. + 2 = 2 の計算が出来るので, (even_SS 0) は
(even 0) - (even 2)
の証明である. (even 0) は even_0 で証明されているので,
((even_SS 0) even_0) が, (even 2) の証明になる.
 
Lemma lemma7: (even 2).
Proof.
apply (even_SS 0 even_0).
Qed.
 
溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 30 / 36
第 2 節: 自然数上の命題 帰納的に定義された命題の否定
帰納的に定義された命題の否定命題の証明 (1)
Lemma
.
.
1 は偶数でない
の証明を考える. ¬(even 1) は, (even 1) → False である. (even n)
を帰納的に証明する証明 even_0, even_SS のように, ¬(even n) を帰納
的に構成する odd_1, odd_SS のような証明を準備して計算で証明する方
針も考えられる. 偶数の集合の場合は補集合である奇数の集合を帰納的に
定義出来るが, 一般には任意の帰納的可算集合の補集合を帰納的可算集合
として定義することは出来ない.
 
任意の帰納的可算集合が帰納的集合であるわけではない.
 
溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 31 / 36
第 2 節: 自然数上の命題 帰納的に定義された命題の否定
帰納的に定義された命題の否定命題の証明 (2)
帰納的に定義された命題 even を関数で定義された命題 NE1 と関係付ける
ことにより, 計算による性質の証明が可能になる.
 
Lemma lemma8: forall n, (even n) - (NE1 n).
Proof.
move = n.
case. (* even の構成の帰納法で証明 *)
compute. (* (even 0) のときは計算で明らか *)
apply I.
move = n0 H.
compute. (* (even (n.+2)) のときも計算で明らか *)
apply I.
Qed.
 
(even n) を仮定した命題は, even の構成の帰納法によって証明する. こ
のとき, (NE1 n.+2)=True は計算で証明出来ることに注意する.
溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 32 / 36
第 2 節: 自然数上の命題 帰納的に定義された命題の否定
帰納的に定義された命題の否定命題の証明 (3)
(NE1 1) → False は計算で証明出来るので先の補題 lemma8 で n = 1 と
置いた場合を考えて, (even 1) → False が証明出来る.
 
Lemma lemma9: (even 1) - False.
Proof.
apply (lemma8 1).
Qed.
 
実は, inversion という Tactic は, NE1 のような関数を自動生成してく
れる.
 
Lemma lemma10: (even 1) - False.
Proof.
move = H.
inversion H.
Qed.
 
溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 33 / 36
第 3 節: まとめ
まとめ
本来, 定理証明器は正しいプログラムを書くために開発されて来た.
数式や論理式で記述されたプログラムの正しさは数式や論理式の正しさ, す
なわち, 数学の命題の正しさに含まれる.
近年は検証の難しい数学の定理の証明検証にも定理証明器が利用されて
いる.
形式証明で利用しやすい命題とそうでない命題がある.
同値, あるいは, 包含関係のある利用しやすい命題が必要.
要. 数学理論の再編成. (Abstract が Nonsense でなくなった!)
証明検証しやすい作法でプログラムを書く事も大切.
基本的にプログラムは実応用のために書かれるものであり, 一般的には, そ
れそのものを楽しんだり, 鑑賞したりするものではない.
数学の証明は鑑賞したり, それそのものを楽しむことも考えられる.
数学とプログラムの中間に定理証明器がいる.
溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 34 / 36
第 3 節: まとめ
参考文献 (1)
Reynald Affeldt, 定理証明支援系 Coq 入門, 日本ソフトウェア科学会チュートリア
ル, 2014.
https://staff.aist.go.jp/reynald.affeldt/ssrcoq/
Adam Chlipala, Certified Programming with Dependent Types, MIT Press, 2013.
http://adam.chlipala.net/cpdt/
G.Gonthier et.al., A Small Scale Reflection Extension for the Coq system, Inria
Research Report, 2014.
https://hal.inria.fr/inria-00258384/en
G.Gonthier, R. St´ephane Le, An Ssreflect Tutorial, 2009.
https://hal.inria.fr/inria-00407778/file/RT-367.pdf
The Coq Development Team, The Coq Proof Assistant Reference Manual,
Ver.8.4pl5, 2014.
https://coq.inria.fr/distrib/V8.4pl5/files/Reference-Manual.pdf
溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 35 / 36
第 3 節: まとめ
参考文献 (2)
TPP2014, 高信頼な理論と実装のための定理証明および定理証明器, 九州大学, 2014.
http://imi.kyushu-u.ac.jp/lasm/tpp2014/index ja.html
Y. Bertot, Interactive Theorem Proving and Program Development, Springer, 2004.
(Coq’Art)
The Univelent Foundations Program, Homotopy Type Theory: Univalent Foundations
of Mathematics, http://homotopytypetheory.org/book, Institute for Advanced
Study, 2013.
溝口佳寛, 田上真, ケプラー予想の計算機による証明と検証について, 数学セミナー
12 月号, 48–54, 2014.
http://bit.ly/KeplerConjecture
溝口佳寛他, 有限オートマトンとスティッカー系に関する Coq による形式証明につ
いて, 日本数学会年会講演スライド, 2014.
http://www.slideshare.net/yoshihiromizoguchi/coq-32356516
溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 36 / 36

More Related Content

What's hot

GAN(と強化学習との関係)
GAN(と強化学習との関係)GAN(と強化学習との関係)
GAN(と強化学習との関係)Masahiro Suzuki
 
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.kiki utagawa
 
レプリカ交換モンテカルロ法で乱数の生成
レプリカ交換モンテカルロ法で乱数の生成レプリカ交換モンテカルロ法で乱数の生成
レプリカ交換モンテカルロ法で乱数の生成Nagi Teramo
 
「内積が見えると統計学も見える」第5回 プログラマのための数学勉強会 発表資料
「内積が見えると統計学も見える」第5回 プログラマのための数学勉強会 発表資料 「内積が見えると統計学も見える」第5回 プログラマのための数学勉強会 発表資料
「内積が見えると統計学も見える」第5回 プログラマのための数学勉強会 発表資料 Ken'ichi Matsui
 
[DL輪読会]ドメイン転移と不変表現に関するサーベイ
[DL輪読会]ドメイン転移と不変表現に関するサーベイ[DL輪読会]ドメイン転移と不変表現に関するサーベイ
[DL輪読会]ドメイン転移と不変表現に関するサーベイDeep Learning JP
 
最適化超入門
最適化超入門最適化超入門
最適化超入門Takami Sato
 
チームメイトのためにdocstringを書こう! pyconjp2019
チームメイトのためにdocstringを書こう! pyconjp2019チームメイトのためにdocstringを書こう! pyconjp2019
チームメイトのためにdocstringを書こう! pyconjp2019cocodrips
 
深層生成モデルと世界モデル
深層生成モデルと世界モデル深層生成モデルと世界モデル
深層生成モデルと世界モデルMasahiro Suzuki
 
Visual Studio CodeでRを使う
Visual Studio CodeでRを使うVisual Studio CodeでRを使う
Visual Studio CodeでRを使うAtsushi Hayakawa
 
不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarray不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarrayRyosuke839
 
【DL輪読会】An Image is Worth One Word: Personalizing Text-to-Image Generation usi...
【DL輪読会】An Image is Worth One Word: Personalizing Text-to-Image Generation usi...【DL輪読会】An Image is Worth One Word: Personalizing Text-to-Image Generation usi...
【DL輪読会】An Image is Worth One Word: Personalizing Text-to-Image Generation usi...Deep Learning JP
 
ブースティング入門
ブースティング入門ブースティング入門
ブースティング入門Retrieva inc.
 
最適輸送の計算アルゴリズムの研究動向
最適輸送の計算アルゴリズムの研究動向最適輸送の計算アルゴリズムの研究動向
最適輸送の計算アルゴリズムの研究動向ohken
 
Coq Tutorial
Coq TutorialCoq Tutorial
Coq Tutorialtmiya
 
ゼロから始める深層強化学習(NLP2018講演資料)/ Introduction of Deep Reinforcement Learning
ゼロから始める深層強化学習(NLP2018講演資料)/ Introduction of Deep Reinforcement Learningゼロから始める深層強化学習(NLP2018講演資料)/ Introduction of Deep Reinforcement Learning
ゼロから始める深層強化学習(NLP2018講演資料)/ Introduction of Deep Reinforcement LearningPreferred Networks
 
[DL輪読会]Attentive neural processes
[DL輪読会]Attentive neural processes[DL輪読会]Attentive neural processes
[DL輪読会]Attentive neural processesDeep Learning JP
 
Semi supervised, weakly-supervised, unsupervised, and active learning
Semi supervised, weakly-supervised, unsupervised, and active learningSemi supervised, weakly-supervised, unsupervised, and active learning
Semi supervised, weakly-supervised, unsupervised, and active learningYusuke Uchida
 
【DL輪読会】Flow Matching for Generative Modeling
【DL輪読会】Flow Matching for Generative Modeling【DL輪読会】Flow Matching for Generative Modeling
【DL輪読会】Flow Matching for Generative ModelingDeep Learning JP
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14Ryo Suzuki
 
全力解説!Transformer
全力解説!Transformer全力解説!Transformer
全力解説!TransformerArithmer Inc.
 

What's hot (20)

GAN(と強化学習との関係)
GAN(と強化学習との関係)GAN(と強化学習との関係)
GAN(と強化学習との関係)
 
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
 
レプリカ交換モンテカルロ法で乱数の生成
レプリカ交換モンテカルロ法で乱数の生成レプリカ交換モンテカルロ法で乱数の生成
レプリカ交換モンテカルロ法で乱数の生成
 
「内積が見えると統計学も見える」第5回 プログラマのための数学勉強会 発表資料
「内積が見えると統計学も見える」第5回 プログラマのための数学勉強会 発表資料 「内積が見えると統計学も見える」第5回 プログラマのための数学勉強会 発表資料
「内積が見えると統計学も見える」第5回 プログラマのための数学勉強会 発表資料
 
[DL輪読会]ドメイン転移と不変表現に関するサーベイ
[DL輪読会]ドメイン転移と不変表現に関するサーベイ[DL輪読会]ドメイン転移と不変表現に関するサーベイ
[DL輪読会]ドメイン転移と不変表現に関するサーベイ
 
最適化超入門
最適化超入門最適化超入門
最適化超入門
 
チームメイトのためにdocstringを書こう! pyconjp2019
チームメイトのためにdocstringを書こう! pyconjp2019チームメイトのためにdocstringを書こう! pyconjp2019
チームメイトのためにdocstringを書こう! pyconjp2019
 
深層生成モデルと世界モデル
深層生成モデルと世界モデル深層生成モデルと世界モデル
深層生成モデルと世界モデル
 
Visual Studio CodeでRを使う
Visual Studio CodeでRを使うVisual Studio CodeでRを使う
Visual Studio CodeでRを使う
 
不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarray不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarray
 
【DL輪読会】An Image is Worth One Word: Personalizing Text-to-Image Generation usi...
【DL輪読会】An Image is Worth One Word: Personalizing Text-to-Image Generation usi...【DL輪読会】An Image is Worth One Word: Personalizing Text-to-Image Generation usi...
【DL輪読会】An Image is Worth One Word: Personalizing Text-to-Image Generation usi...
 
ブースティング入門
ブースティング入門ブースティング入門
ブースティング入門
 
最適輸送の計算アルゴリズムの研究動向
最適輸送の計算アルゴリズムの研究動向最適輸送の計算アルゴリズムの研究動向
最適輸送の計算アルゴリズムの研究動向
 
Coq Tutorial
Coq TutorialCoq Tutorial
Coq Tutorial
 
ゼロから始める深層強化学習(NLP2018講演資料)/ Introduction of Deep Reinforcement Learning
ゼロから始める深層強化学習(NLP2018講演資料)/ Introduction of Deep Reinforcement Learningゼロから始める深層強化学習(NLP2018講演資料)/ Introduction of Deep Reinforcement Learning
ゼロから始める深層強化学習(NLP2018講演資料)/ Introduction of Deep Reinforcement Learning
 
[DL輪読会]Attentive neural processes
[DL輪読会]Attentive neural processes[DL輪読会]Attentive neural processes
[DL輪読会]Attentive neural processes
 
Semi supervised, weakly-supervised, unsupervised, and active learning
Semi supervised, weakly-supervised, unsupervised, and active learningSemi supervised, weakly-supervised, unsupervised, and active learning
Semi supervised, weakly-supervised, unsupervised, and active learning
 
【DL輪読会】Flow Matching for Generative Modeling
【DL輪読会】Flow Matching for Generative Modeling【DL輪読会】Flow Matching for Generative Modeling
【DL輪読会】Flow Matching for Generative Modeling
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
 
全力解説!Transformer
全力解説!Transformer全力解説!Transformer
全力解説!Transformer
 

Viewers also liked

よくわかるCoqプログラミング
よくわかるCoqプログラミングよくわかるCoqプログラミング
よくわかるCoqプログラミングReal_analysis
 
証明プログラミング超入門
証明プログラミング超入門証明プログラミング超入門
証明プログラミング超入門Kyoko Kadowaki
 
Coqによる証明駆動開発
Coqによる証明駆動開発Coqによる証明駆動開発
Coqによる証明駆動開発Hiroki Mizuno
 
Gallinaによる証明駆動開発の魅力
Gallinaによる証明駆動開発の魅力Gallinaによる証明駆動開発の魅力
Gallinaによる証明駆動開発の魅力Hiroki Mizuno
 
定理証明支援系Coqについて
定理証明支援系Coqについて定理証明支援系Coqについて
定理証明支援系CoqについてYoshihiro Mizoguchi
 

Viewers also liked (6)

すごいCoq入門
すごいCoq入門すごいCoq入門
すごいCoq入門
 
よくわかるCoqプログラミング
よくわかるCoqプログラミングよくわかるCoqプログラミング
よくわかるCoqプログラミング
 
証明プログラミング超入門
証明プログラミング超入門証明プログラミング超入門
証明プログラミング超入門
 
Coqによる証明駆動開発
Coqによる証明駆動開発Coqによる証明駆動開発
Coqによる証明駆動開発
 
Gallinaによる証明駆動開発の魅力
Gallinaによる証明駆動開発の魅力Gallinaによる証明駆動開発の魅力
Gallinaによる証明駆動開発の魅力
 
定理証明支援系Coqについて
定理証明支援系Coqについて定理証明支援系Coqについて
定理証明支援系Coqについて
 

Similar to Coqチュートリアル

Coq 20100208a
Coq 20100208aCoq 20100208a
Coq 20100208atmiya
 
Cython intro prelerease
Cython intro prelereaseCython intro prelerease
Cython intro prelereaseShiqiao Du
 
NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門Shiqiao Du
 
ディープニューラルネット入門
ディープニューラルネット入門ディープニューラルネット入門
ディープニューラルネット入門TanUkkii
 
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 informationSony Network Communications Inc.
 
ji-5. 繰り返し計算
ji-5. 繰り返し計算ji-5. 繰り返し計算
ji-5. 繰り返し計算kunihikokaneko1
 
PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編
PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編
PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編Yosuke Onoue
 
Introduction to NumPy & SciPy
Introduction to NumPy & SciPyIntroduction to NumPy & SciPy
Introduction to NumPy & SciPyShiqiao Du
 
2015年9月18日 (GTC Japan 2015) 深層学習フレームワークChainerの導入と化合物活性予測への応用
2015年9月18日 (GTC Japan 2015) 深層学習フレームワークChainerの導入と化合物活性予測への応用 2015年9月18日 (GTC Japan 2015) 深層学習フレームワークChainerの導入と化合物活性予測への応用
2015年9月18日 (GTC Japan 2015) 深層学習フレームワークChainerの導入と化合物活性予測への応用 Kenta Oono
 
Hello, Guava ! samples
Hello, Guava ! samplesHello, Guava ! samples
Hello, Guava ! samples輝 子安
 
準同型暗号の実装とMontgomery, Karatsuba, FFT の性能
準同型暗号の実装とMontgomery, Karatsuba, FFT の性能準同型暗号の実装とMontgomery, Karatsuba, FFT の性能
準同型暗号の実装とMontgomery, Karatsuba, FFT の性能MITSUNARI Shigeo
 
“Symbolic bounds analysis of pointers, array indices, and accessed memory reg...
“Symbolic bounds analysis of pointers, array indices, and accessed memory reg...“Symbolic bounds analysis of pointers, array indices, and accessed memory reg...
“Symbolic bounds analysis of pointers, array indices, and accessed memory reg...Masahiro Sakai
 
新しい並列for構文のご提案
新しい並列for構文のご提案新しい並列for構文のご提案
新しい並列for構文のご提案yohhoy
 
ji-3. 条件分岐と場合分け
ji-3. 条件分岐と場合分けji-3. 条件分岐と場合分け
ji-3. 条件分岐と場合分けkunihikokaneko1
 
第2回 JavaScriptから始めるプログラミング2016
第2回 JavaScriptから始めるプログラミング2016第2回 JavaScriptから始めるプログラミング2016
第2回 JavaScriptから始めるプログラミング2016kyoto university
 
Python physicalcomputing
Python physicalcomputingPython physicalcomputing
Python physicalcomputingNoboru Irieda
 
Why Reactive Matters #ScalaMatsuri
Why Reactive Matters #ScalaMatsuriWhy Reactive Matters #ScalaMatsuri
Why Reactive Matters #ScalaMatsuriYuta Okamoto
 

Similar to Coqチュートリアル (20)

Coq 20100208a
Coq 20100208aCoq 20100208a
Coq 20100208a
 
Cython intro prelerease
Cython intro prelereaseCython intro prelerease
Cython intro prelerease
 
NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門
 
2023_freshman
2023_freshman2023_freshman
2023_freshman
 
ディープニューラルネット入門
ディープニューラルネット入門ディープニューラルネット入門
ディープニューラルネット入門
 
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
 
ji-5. 繰り返し計算
ji-5. 繰り返し計算ji-5. 繰り返し計算
ji-5. 繰り返し計算
 
PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編
PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編
PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編
 
Introduction to NumPy & SciPy
Introduction to NumPy & SciPyIntroduction to NumPy & SciPy
Introduction to NumPy & SciPy
 
Rの高速化
Rの高速化Rの高速化
Rの高速化
 
2015年9月18日 (GTC Japan 2015) 深層学習フレームワークChainerの導入と化合物活性予測への応用
2015年9月18日 (GTC Japan 2015) 深層学習フレームワークChainerの導入と化合物活性予測への応用 2015年9月18日 (GTC Japan 2015) 深層学習フレームワークChainerの導入と化合物活性予測への応用
2015年9月18日 (GTC Japan 2015) 深層学習フレームワークChainerの導入と化合物活性予測への応用
 
Hello, Guava ! samples
Hello, Guava ! samplesHello, Guava ! samples
Hello, Guava ! samples
 
準同型暗号の実装とMontgomery, Karatsuba, FFT の性能
準同型暗号の実装とMontgomery, Karatsuba, FFT の性能準同型暗号の実装とMontgomery, Karatsuba, FFT の性能
準同型暗号の実装とMontgomery, Karatsuba, FFT の性能
 
機械学習
機械学習機械学習
機械学習
 
“Symbolic bounds analysis of pointers, array indices, and accessed memory reg...
“Symbolic bounds analysis of pointers, array indices, and accessed memory reg...“Symbolic bounds analysis of pointers, array indices, and accessed memory reg...
“Symbolic bounds analysis of pointers, array indices, and accessed memory reg...
 
新しい並列for構文のご提案
新しい並列for構文のご提案新しい並列for構文のご提案
新しい並列for構文のご提案
 
ji-3. 条件分岐と場合分け
ji-3. 条件分岐と場合分けji-3. 条件分岐と場合分け
ji-3. 条件分岐と場合分け
 
第2回 JavaScriptから始めるプログラミング2016
第2回 JavaScriptから始めるプログラミング2016第2回 JavaScriptから始めるプログラミング2016
第2回 JavaScriptから始めるプログラミング2016
 
Python physicalcomputing
Python physicalcomputingPython physicalcomputing
Python physicalcomputing
 
Why Reactive Matters #ScalaMatsuri
Why Reactive Matters #ScalaMatsuriWhy Reactive Matters #ScalaMatsuri
Why Reactive Matters #ScalaMatsuri
 

More from Yoshihiro Mizoguchi

DockerでAlmaLinux(web, php, pukiwiki)環境構築
DockerでAlmaLinux(web, php, pukiwiki)環境構築DockerでAlmaLinux(web, php, pukiwiki)環境構築
DockerでAlmaLinux(web, php, pukiwiki)環境構築Yoshihiro Mizoguchi
 
DockerでCoq インストール
DockerでCoq インストールDockerでCoq インストール
DockerでCoq インストールYoshihiro Mizoguchi
 
Homebrewによるソフトウェアの実装 (3)
Homebrewによるソフトウェアの実装 (3)Homebrewによるソフトウェアの実装 (3)
Homebrewによるソフトウェアの実装 (3)Yoshihiro Mizoguchi
 
Homebrewによるソフトウェアの実装 (2)
Homebrewによるソフトウェアの実装 (2)Homebrewによるソフトウェアの実装 (2)
Homebrewによるソフトウェアの実装 (2)Yoshihiro Mizoguchi
 
Homebrewによるソフトウェアの実装(1)
Homebrewによるソフトウェアの実装(1)Homebrewによるソフトウェアの実装(1)
Homebrewによるソフトウェアの実装(1)Yoshihiro Mizoguchi
 
Overleafを使った文書作成
Overleafを使った文書作成Overleafを使った文書作成
Overleafを使った文書作成Yoshihiro Mizoguchi
 
Symbolic Computations in Conformal Geometric Algebra for Three Dimensional O...
Symbolic Computations in Conformal Geometric Algebra for Three Dimensional  O...Symbolic Computations in Conformal Geometric Algebra for Three Dimensional  O...
Symbolic Computations in Conformal Geometric Algebra for Three Dimensional O...Yoshihiro Mizoguchi
 
Theory of Relational Calculus and its Formalization
Theory of Relational Calculus and its FormalizationTheory of Relational Calculus and its Formalization
Theory of Relational Calculus and its FormalizationYoshihiro Mizoguchi
 
数式処理ソフトMathematicaで数学の問題を解く
数式処理ソフトMathematicaで数学の問題を解く数式処理ソフトMathematicaで数学の問題を解く
数式処理ソフトMathematicaで数学の問題を解くYoshihiro Mizoguchi
 
Verification of a brick wang tiling algorithm
Verification of a brick wang tiling algorithmVerification of a brick wang tiling algorithm
Verification of a brick wang tiling algorithmYoshihiro Mizoguchi
 
計算機を用いて数学の問題を解くということ
計算機を用いて数学の問題を解くということ計算機を用いて数学の問題を解くということ
計算機を用いて数学の問題を解くということYoshihiro Mizoguchi
 
A Coq Library for the Theory of Relational Calculus
A Coq Library for the Theory of Relational CalculusA Coq Library for the Theory of Relational Calculus
A Coq Library for the Theory of Relational CalculusYoshihiro Mizoguchi
 
Algebras for programming languages
Algebras for programming languagesAlgebras for programming languages
Algebras for programming languagesYoshihiro Mizoguchi
 
Coq関係計算ライブラリの開発と写像の性質の証明
Coq関係計算ライブラリの開発と写像の性質の証明Coq関係計算ライブラリの開発と写像の性質の証明
Coq関係計算ライブラリの開発と写像の性質の証明Yoshihiro Mizoguchi
 
Mac bookでwebサーバーを起動する方法
Mac bookでwebサーバーを起動する方法Mac bookでwebサーバーを起動する方法
Mac bookでwebサーバーを起動する方法Yoshihiro Mizoguchi
 
有限オートマトンとスティッカー系に関するCoqによる形式証明について
有限オートマトンとスティッカー系に関するCoqによる形式証明について有限オートマトンとスティッカー系に関するCoqによる形式証明について
有限オートマトンとスティッカー系に関するCoqによる形式証明についてYoshihiro Mizoguchi
 
複素数・四元数と図形の回転
複素数・四元数と図形の回転複素数・四元数と図形の回転
複素数・四元数と図形の回転Yoshihiro Mizoguchi
 

More from Yoshihiro Mizoguchi (20)

DockerでAlmaLinux(web, php, pukiwiki)環境構築
DockerでAlmaLinux(web, php, pukiwiki)環境構築DockerでAlmaLinux(web, php, pukiwiki)環境構築
DockerでAlmaLinux(web, php, pukiwiki)環境構築
 
DockerでCoq インストール
DockerでCoq インストールDockerでCoq インストール
DockerでCoq インストール
 
Homebrewによるソフトウェアの実装 (3)
Homebrewによるソフトウェアの実装 (3)Homebrewによるソフトウェアの実装 (3)
Homebrewによるソフトウェアの実装 (3)
 
Homebrewによるソフトウェアの実装 (2)
Homebrewによるソフトウェアの実装 (2)Homebrewによるソフトウェアの実装 (2)
Homebrewによるソフトウェアの実装 (2)
 
Homebrewによるソフトウェアの実装(1)
Homebrewによるソフトウェアの実装(1)Homebrewによるソフトウェアの実装(1)
Homebrewによるソフトウェアの実装(1)
 
Overleafを使った文書作成
Overleafを使った文書作成Overleafを使った文書作成
Overleafを使った文書作成
 
Amazon AWSの使い方
Amazon AWSの使い方Amazon AWSの使い方
Amazon AWSの使い方
 
ShareLaTeXの使い方
ShareLaTeXの使い方ShareLaTeXの使い方
ShareLaTeXの使い方
 
Symbolic Computations in Conformal Geometric Algebra for Three Dimensional O...
Symbolic Computations in Conformal Geometric Algebra for Three Dimensional  O...Symbolic Computations in Conformal Geometric Algebra for Three Dimensional  O...
Symbolic Computations in Conformal Geometric Algebra for Three Dimensional O...
 
Theory of Relational Calculus and its Formalization
Theory of Relational Calculus and its FormalizationTheory of Relational Calculus and its Formalization
Theory of Relational Calculus and its Formalization
 
数式処理ソフトMathematicaで数学の問題を解く
数式処理ソフトMathematicaで数学の問題を解く数式処理ソフトMathematicaで数学の問題を解く
数式処理ソフトMathematicaで数学の問題を解く
 
Verification of a brick wang tiling algorithm
Verification of a brick wang tiling algorithmVerification of a brick wang tiling algorithm
Verification of a brick wang tiling algorithm
 
計算機を用いて数学の問題を解くということ
計算機を用いて数学の問題を解くということ計算機を用いて数学の問題を解くということ
計算機を用いて数学の問題を解くということ
 
A Coq Library for the Theory of Relational Calculus
A Coq Library for the Theory of Relational CalculusA Coq Library for the Theory of Relational Calculus
A Coq Library for the Theory of Relational Calculus
 
Algebras for programming languages
Algebras for programming languagesAlgebras for programming languages
Algebras for programming languages
 
Coq関係計算ライブラリの開発と写像の性質の証明
Coq関係計算ライブラリの開発と写像の性質の証明Coq関係計算ライブラリの開発と写像の性質の証明
Coq関係計算ライブラリの開発と写像の性質の証明
 
Mac bookでwebサーバーを起動する方法
Mac bookでwebサーバーを起動する方法Mac bookでwebサーバーを起動する方法
Mac bookでwebサーバーを起動する方法
 
有限オートマトンとスティッカー系に関するCoqによる形式証明について
有限オートマトンとスティッカー系に関するCoqによる形式証明について有限オートマトンとスティッカー系に関するCoqによる形式証明について
有限オートマトンとスティッカー系に関するCoqによる形式証明について
 
計算可能実数とは
計算可能実数とは計算可能実数とは
計算可能実数とは
 
複素数・四元数と図形の回転
複素数・四元数と図形の回転複素数・四元数と図形の回転
複素数・四元数と図形の回転
 

Recently uploaded

UniProject Workshop Make a Discord Bot with JavaScript
UniProject Workshop Make a Discord Bot with JavaScriptUniProject Workshop Make a Discord Bot with JavaScript
UniProject Workshop Make a Discord Bot with JavaScriptyuitoakatsukijp
 
ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学ssusere0a682
 
TokyoTechGraduateExaminationPresentation
TokyoTechGraduateExaminationPresentationTokyoTechGraduateExaminationPresentation
TokyoTechGraduateExaminationPresentationYukiTerazawa
 
リアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライド
リアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライドリアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライド
リアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライドKen Fukui
 
TEAMIN Service overview for customer_20240422.pdf
TEAMIN Service overview for customer_20240422.pdfTEAMIN Service overview for customer_20240422.pdf
TEAMIN Service overview for customer_20240422.pdfyukisuga3
 
リアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライド
リアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライドリアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライド
リアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライドKen Fukui
 
リアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライド
リアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライドリアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライド
リアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライドKen Fukui
 
リアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライド
リアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライドリアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライド
リアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライドKen Fukui
 
The_Five_Books_Overview_Presentation_2024
The_Five_Books_Overview_Presentation_2024The_Five_Books_Overview_Presentation_2024
The_Five_Books_Overview_Presentation_2024koheioishi1
 
リアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライド
リアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライドリアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライド
リアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライドKen Fukui
 

Recently uploaded (10)

UniProject Workshop Make a Discord Bot with JavaScript
UniProject Workshop Make a Discord Bot with JavaScriptUniProject Workshop Make a Discord Bot with JavaScript
UniProject Workshop Make a Discord Bot with JavaScript
 
ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学
 
TokyoTechGraduateExaminationPresentation
TokyoTechGraduateExaminationPresentationTokyoTechGraduateExaminationPresentation
TokyoTechGraduateExaminationPresentation
 
リアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライド
リアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライドリアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライド
リアル戦国探究in米沢 当日講座1(スタッフ共有用)『兵は詐をもって立つ』についてのスライド
 
TEAMIN Service overview for customer_20240422.pdf
TEAMIN Service overview for customer_20240422.pdfTEAMIN Service overview for customer_20240422.pdf
TEAMIN Service overview for customer_20240422.pdf
 
リアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライド
リアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライドリアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライド
リアル戦国探究in米沢 事前講座1スライド(スタッフ共有用)『川中島の謎』についてのスライド
 
リアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライド
リアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライドリアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライド
リアル戦国探究in米沢 当日講座3スライド(スタッフ共有用)『糧は三度はさいせず』についてのスライド
 
リアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライド
リアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライドリアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライド
リアル戦国探究in米沢 当日講座2スライド(スタッフ共有用)『人を致すも人に致されず』についてのスライド
 
The_Five_Books_Overview_Presentation_2024
The_Five_Books_Overview_Presentation_2024The_Five_Books_Overview_Presentation_2024
The_Five_Books_Overview_Presentation_2024
 
リアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライド
リアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライドリアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライド
リアル戦国探究in米沢 事前講座2スライド(スタッフ共有用)『両雄の強さの秘密』についてのスライド
 

Coqチュートリアル

  • 1. . . Coq チュートリアル ウィンタースクール「数学ソフトウェア・チュートリアル」 溝 口 佳 寛 九州大学マス・フォア・インダストリ研究所   http://imi.kyushu-u.ac.jp/∼ym/ 2015 年 2 月 18 日 (水) 本スライド : http://www.slideshare.net/yoshihiromizoguchi/20150218tutorial-44796812 サンプルファイル : https://github.com/KyushuUniversityMathematics/CoqExamples/tree/master/20150218 溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 1 / 36
  • 2. 目次 . . 1 第 1 節: プログラムの正しさの証明 数学の定理 Coq の定理 証明付プログラム . . 2 第 2 節: 自然数上の命題 否定の証明 帰納的に定義された命題の否定 3 第 3 節: まとめ 溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 2 / 36
  • 3. 数学定理の形式証明 (論文) G. Gonthier, Formal Proof―The Four-Color Theorem. Notices of the American Mathematical Society, 55(11), 1382―1393, 2008. http://www.ams.org/notices/200811/tx081101382p.pdf R. Affeldt and M. Hagiwara, Formalization of Shannon’s Therems in SSReflect-Coq, Proc. 3rd Conference on Interactive Theorem Proving, LNCS 7406, 233―249, 2012. G. Gonthier, et al., A Machine-Checked Proof of the Odd Order Theorem, Proc. 4th Conference on Interactive Theorem Proving, LNCS 7998, 163―179, 2013. https://hal.inria.fr/hal-00816699/file/main.pdf F. Chyzak, A. Mahboubi et.al, A Computer-Algebra-Based Formal Proof of the Irrationality of ζ (3), Proc. 5th International Conference on Interactive Theorem Proving, LNCS 8558, 2014, https://hal.inria.fr/hal-00984057. T. Hales, Dense Sphere Packings : A blueprint for formal proofs, Cambridge University Press, 2012. (The Kepler Conjecture) · · · · · · 溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 3 / 36
  • 4. 数学定理の形式証明 (リンク, 広報, プロジェクト) SSreflect in the world, http://coqfinitgroup.gforge.inria.fr/ssreflect world.html Coq Proof of the Four Color Theorem, 2006/04/26, http://bit.ly/FourColorTheorem Feit thompson proved in Coq, 2012/09/20, http://bit.ly/FeitThompson The announcement of the completion of the Flyspec project, 2014/8/10. http://bit.ly/Flyspeck (The Kepler Conjecture) Univalent Foundations of Mathematics, 2012,2013. http://bit.ly/UnivalentFoundations (Homotopy Type Theory) Computing close approximations of Pi, http://www-sop.inria.fr/members/Yves.Bertot/proofs.html 溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 4 / 36
  • 5. 証明支援系 Coq を使うには 本スライドの例題は Coq8.4pl5, ssreflect-1.5rc1, mathcomp-1.5rc1 で確認されて います. https://github.com/KyushuUniversityMathematics/CoqExamples/tree/master/20150218 現在, Coq8.5beta1, ssreflect-1.5.coq85beta1, mathcomp-1.5.coq85beta1 が公表 されています. https://coq.inria.fr/coq-85 Mathlibre (Linux) ライブ DVD に, coq8.4pl3, ssreflect1.5, mathcomp1.5 が入っています. http://mirror.math.kyushu-u.ac.jp/mathlibre/mathlibre-debian-amd64-20141110-ja.iso Windows Coq8.5beta1,ssr-mathcomp-1.5 のインストーラがあります. https://coq.inria.fr/distrib/V8.5beta1/files/coq-installer-8.5beta1.exe http://ssr.msr-inria.inria.fr/FTP/ssr-mathcomp-installer-1.5coq8.5beta1.exe MacOSX Coq8.5,ssr-mathcomp-1.5 のインストーラがありますが確認していません. https://coq.inria.fr/coq-85 開発環境は CoqIDE, または, Emacs 上の ProofGeneral を使います. Coq8.5 から は, Coq/jEdit も使えるらしいですが確認出来ていません. 溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 5 / 36
  • 6. 第 1 節: プログラムの正しさの証明 数学の定理 数学の定理 (1) Let N = {0, 1, · · · } be the set of natural numbers. Theorem . For any natural number n ∈ N, we have n∑ k=0 k = n(n + 1) 2 . Where    0∑ k=0 k = 0, n+1∑ k=0 k = (n + 1) + n∑ k=0 k (n ∈ N). 溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 6 / 36
  • 7. 第 1 節: プログラムの正しさの証明 数学の定理 関数 (プログラム) の定義 2 つの関数 f : N → N, g : N → N を以下のように定義する. 1 { f(0) = 0 f(n + 1) = (n + 1) + f(n) 2 g(n) = n(n + 1) 2 但し, n ∈ N とします. 溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 7 / 36
  • 8. 第 1 節: プログラムの正しさの証明 数学の定理 数学の定理 (2) 先の定理は関数 f, g を用いて, 次のように書き換えられます. Theorem . . For any natural number n ∈ N, we have f(n) = g(n). 溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 8 / 36
  • 9. 第 1 節: プログラムの正しさの証明 数学の定理 数学の証明 (i) n = 0 のとき f(0) = 0 = 0(0 + 1) 2 = g(0). (ii) f(n) = g(n) ( = n(n + 1) 2 ) を仮定するとき f(n + 1) = (n + 1) + f(n) = (n + 1) + n(n + 1) 2 = (n + 1)((n + 1) + 1) 2 = g(n + 1) (i),(ii) により数学的帰納法により全ての n ∈ N に対して, f(n) = g(n) が成立する. 溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 9 / 36
  • 10. 第 1 節: プログラムの正しさの証明 数学の定理 数学の補題 (1) 先の証明には次の補題が必要です. Lemma . . For any natural number n ∈ N, we have (n + 1) + n(n + 1) 2 = (n + 1)((n + 1) + 1) 2 . この証明は演算 + や /2 の帰納的な定義に従い証明されます. 溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 10 / 36
  • 11. 第 1 節: プログラムの正しさの証明 数学の定理 自然数と加算の帰納的定義 Definition . . 0 ∈ N, p ∈ N → (S p) ∈ N. Definition . . 0 + m = m, (S p) + m = (S (p + m)). 一般に関数適用 S(p) と書きますが, ここでは, Coq の記法に従い, (S p) と 書いています. さらに, (S p) を p. + 1 と書きます. 加算の + と同じ記号を 含みますが注意して区別します. すなわち, . + 1 : N → N に対し, + : N → (N → N) です. (注. Coq では, (n + m) は +(n)(m) を意味します.) (p . + 1) + m = (p + m) . + 1 溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 11 / 36
  • 12. 第 1 節: プログラムの正しさの証明 数学の定理 数学の補題 (2) 次の簡単な式も定義に従った数学的帰納法での証明が必要です. Lemma . . For any natural number n ∈ N, we have n + 0 = n (i) n = 0 のとき 0 + 0 = 0. (ii) n + 0 = n を仮定するとき (n. + 1) + 0 = (n + 0). + 1 = n. + 1. (i),(ii) により数学的帰納法により全ての n ∈ N に対して, n + 0 = n が成立する. 溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 12 / 36
  • 13. 第 1 節: プログラムの正しさの証明 Coq の定理 Coq の定理と証明 (1) Coq による簡単な定理 (補題) とその証明を紹介します. Lemma lemma0: forall n:nat, n + 0 = n. Proof. elim. (* n に対する数学的帰納法で証明 *) rewrite /addn/addn_rec/plus. apply (erefl 0). (* n=0 のときは明らか *) move = n H. rewrite /addn/addn_rec/plus. fold plus. rewrite plusE. rewrite H. (* n のときの仮定を使って *) apply (erefl (n.+1)). (* n+1 のときの証明が出来る *) Qed. ※ Proof. と Qed. の間は証明ではなく証明を作るためのコマンド列です! 溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 13 / 36
  • 14. 第 1 節: プログラムの正しさの証明 Coq の定理 Coq の定理と証明 (2) 証明を作るためのコマンドで作成された証明そのものは 命題の型を持つ関数 (プログラム) です. lemma0 = fun _top_assumption_ : nat = (fun _evar_0_ : (fun n : nat = n + 0 = n) 0 = (nat_ind (fun n : nat = n + 0 = n) _evar_0_)ˆ˜ _top_assumption_) (erefl 0) (fun (n : nat) (H : n + 0 = n) = (fun _evar_0_ : (n + 0).+1 = n.+1 = eq_ind_r (fun _pattern_value_ : nat - nat - nat = (_pattern_value_ n 0).+1 = n.+1) _evar_0_ plusE) ((fun _evar_0_ : n.+1 = n.+1 = eq_ind_r (fun _pattern_value_ : nat = _pattern_value_.+1 = n.+1) _evar_0_ H) (erefl n.+1))) : forall n : nat, n + 0 = n 溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 14 / 36
  • 15. 第 1 節: プログラムの正しさの証明 Coq の定理 Coq の補題 (1) 既に証明された Ssreflect.ssrnat 中にある補題たち Lemma add0n: forall n:nat, 0 + n = n. Lemma addn0: forall n:nat, n + 0 = n. Lemma addSn: forall m n:nat, m.+1 + n = (m + n).+1. Lemma addnS: forall m n:nat, m + n.+1 = (m + n).+1. Lemma addnC: forall n m:nat, m + n = n + m. Lemma muln_divA d m n : d %| n - m * (n %/ d) = m * n %/ d. Lemma dvdnn m : m %| m. Lemma muln1 n: n * 1 = n. Lemma dvdn_mull d m n : d %| n - d %| m * n. Lemma divnDl m n d : d %| m - (m + n) %/ d = m %/ d + n %/ d. ※ http://ssr.msr-inria.inria.fr/doc/ssreflect-1.5/Ssreflect.ssrnat.html ※ http://ssr.msr-inria.inria.fr/doc/mathcomp-1.5/MathComp.div.html 溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 15 / 36
  • 16. 第 1 節: プログラムの正しさの証明 Coq の定理 Coq の補題 (2) 一旦, 自然数上で成立する演算の性質がわかると, その性質の補題を用い れば帰納法を用いることなく複雑な証明を構成することが出来ます. また, 数式を簡潔な方向に変換して適用する補題を自動で探して証明する 手続きがあります (ring など). このような手続きを Tactic と呼びます. 以下は ring の利用例. Lemma lemma1: forall n:nat, (n.+1)*2 + (n * (n.+1)) = (n.+1 * (n.+2)). Proof. move = n. ring. Qed. Tactic を自分で作ることも出来ます. 溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 16 / 36
  • 17. 第 1 節: プログラムの正しさの証明 Coq の定理 Coq の補題 (3) Lemma lemma2: forall n:nat, (n.+1 * 2) %/ 2 = n.+1. Proof. move = n. rewrite -(muln_divA (n.+1)). rewrite (divnn 2). simpl. by [rewrite muln1]. apply (dvdnn 2). Qed. Lemma lemma3: forall n:nat, 2 %| (n.+1 * 2). Proof. move = n. apply dvdn_mull. apply (dvdnn 2). Qed. 溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 17 / 36
  • 18. 第 1 節: プログラムの正しさの証明 Coq の定理 Coq の補題 (4) Lemma . . For any natural number n ∈ N, we have (n + 1) + n(n + 1) 2 = (n + 1)((n + 1) + 1) 2 . Lemma lemma4: forall n:nat, n.+1 + (n * n.+1) %/ 2 = (n.+1 * n.+2) %/ 2. Proof. move = n. rewrite -lemma1. rewrite (divnDl (n*n.+1) (lemma3 n)). by [rewrite lemma2]. Qed. 溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 18 / 36
  • 19. 第 1 節: プログラムの正しさの証明 証明付プログラム Coq による関数実装と定理 (1) 2 つの関数 f, g は, Coq では以下のように実装出来ます. Fixpoint f (n:nat) := match n with | O = 0 | p.+1 = (p.+1) + (f p) end. Definition g (n:nat) := ((n * (n.+1)) %/ 2). 先の定理は, Coq では以下のように記述されます. Theorem sigma: forall n:nat, (f n) = (g n). 溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 19 / 36
  • 20. 第 1 節: プログラムの正しさの証明 証明付プログラム Coq による関数実装と定理 (2) Theorem . . For any natural number n ∈ N, we have f(n) = g(n). Theorem sigma: forall n:nat, (f n) = (g n). Proof. elim. (* n に対する数学的帰納法で証明 *) by [compute]. (* n=0 のときは計算で明らか *) move = n H. rewrite /f. fold f. rewrite H. (* n のときの仮定を使うと *) rewrite /g. apply lemma4. (* lemma4 の計算から証明できる *) Qed. 溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 20 / 36
  • 21. 第 1 節: プログラムの正しさの証明 証明付プログラム 証明された関数を実際に使う (1) 性質が証明された実装関数 f と g を Extraction を用いて, ファイル sigma.hs に Haskell 言語の関数として出力する. 出力前のおまじないとして, いくつか (list, symbol, bool, nat) の型定義 が必要. Extraction Language Haskell. Extract Inductive list = ([]) [[] (:)]. Extract Inductive sumbool = Prelude.Bool [Prelude.True Prelude.False]. Extract Inductive bool = Prelude.Bool [Prelude.True Prelude.False]. Extract Inductive nat = Prelude.Int [0 Prelude.succ] (fO fS n - if (n Prelude.== 0) then fO () else fS (n Prelude.- 1)). Extraction sigma.hs f g. 溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 21 / 36
  • 22. 第 1 節: プログラムの正しさの証明 証明付プログラム 証明された関数を実際に使う (2) 出力されたファイル sigma.hs 中の 1 行 import qualified GHC.Base を型定義文の上へ移動する必要がある. import qualified Prelude import qualified GHC.Base -- (ここに移動) unsafeCoerce :: a - b #ifdef __GLASGOW_HASKELL__ -- import qualified GHC.Base -- (この行を移動) unsafeCoerce = GHC.Base.unsafeCoerce# #else -- HUGS import qualified IOExts unsafeCoerce = IOExts.unsafeCoerce #endif 溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 22 / 36
  • 23. 第 1 節: プログラムの正しさの証明 証明付プログラム 証明された関数を実際に使う (3) 出力された Haskell 言語の関数を Glasgow Haskell Interpreter1 で実行して みる. ym$ ghci sigma.hs GHCi, version 7.6.3: http://www.haskell.org/ghc/ :? for help [1 of 1] Compiling Sigma ( sigma.hs, interpreted ) Ok, modules loaded: Sigma. *Sigma f 5 15 *Sigma g 5 15 *Sigma :q ※ 関数 f と関数 g の値が常に等しいことは証明されています! 具体的なデータに対する試験 (テスト) での結果の確認は不要です. 1 https://www.haskell.org/ghc/ 溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 23 / 36
  • 24. 第 1 節: プログラムの正しさの証明 証明付プログラム 証明された関数を実際に使う (4) 自動生成された証明済の Haskell 言語のプログラム. f :: Int - Int f n = (fO fS n - if (n == 0) then fO () else fS (n - 1)) (_ - 0) (p - addn (succ p) (f p)) n g :: Int - Int g n = divn (muln n (succ n)) (succ (succ 0)) 溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 24 / 36
  • 25. 第 2 節: 自然数上の命題 否定の証明 自然数上の命題 (1) 与えられた自然数 x に対して, 真 (True) か偽 (False) を返す関数の例として E1 を考える. Definition E1 (x:nat):Prop := match x with | 0 = False | n.+1 = match n with | 0 = True | _.+1 = False end end. Compute [:: (E1 0); (E1 1); (E1 2); (E1 3)]. = [:: False; True; False; False] 真偽を返す関数は自然数上の命題でもあり, 命題 (E1 x) は, x = 1 のときだけ真で x 1 のときは偽である. 溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 25 / 36
  • 26. 第 2 節: 自然数上の命題 否定の証明 否定の証明 (1) Coq では否定は False を導く命題として定義される. ¬P は P → False と考える. False は何でも証明出来る命題として定義されている. 何でも証明できるという証明の名前は False_rect である. (False_rect P) は False → P の証明である. Lemma lemma5: (E1 0) - False. Proof. compute. apply (False_rect False). Qed. 溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 26 / 36
  • 27. 第 2 節: 自然数上の命題 否定の証明 否定の証明 (2) 命題 1 0 は, (1 = 0) → False である. (E1 1) は計算で証明出来る. 仮定の 1 = 0 から, (E1 1) → (E1 0) が証明出来る. (E1 0) → False を lemma5 で証明した. 従って, (1 = 0) → False が証明出来る. Lemma lemma6: (1 = 0) - False. Proof. have: (E1 1). compute. apply I. move = H1 H2; move: H1. rewrite H2. apply lemma5. Qed. 溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 27 / 36
  • 28. 第 2 節: 自然数上の命題 否定の証明 自然数上の命題 (2) 関数 NE1 を以下のようにする. Definition NE1 (x:nat):Prop := match x with | 0 = True | n.+1 = match n with | 0 = False | _.+1 = True end end. このとき, Lemma ∀x, ¬(E1 x) ↔ (NE1 x) は殆ど計算だけで証明出来る. 溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 28 / 36
  • 29. 第 2 節: 自然数上の命題 帰納的に定義された命題の否定 自然数上の命題 (3) 自然数上の命題は真偽を計算する関数で与えるだけでなく 帰納的な定義も出来る. Inductive even: nat - Prop := |even_0: even 0 |even_SS: forall n, (even n) - (even (n.+2)). 言葉で書けば, 1. 0 は偶数である. 2. n が偶数ならば, n + 2 は偶数である. で, 命題「x は偶数である」を定義出来る. 1. の証明の名前が even_0, そして, 2. の証明の名前が even_SS である. 溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 29 / 36
  • 30. 第 2 節: 自然数上の命題 帰納的に定義された命題の否定 帰納的に定義された命題の証明 Lemma . . . 2 は偶数である を証明する. (even_SS n): (even n) - (even (n.+2)) なのと, 0. + 2 = 2 の計算が出来るので, (even_SS 0) は (even 0) - (even 2) の証明である. (even 0) は even_0 で証明されているので, ((even_SS 0) even_0) が, (even 2) の証明になる. Lemma lemma7: (even 2). Proof. apply (even_SS 0 even_0). Qed. 溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 30 / 36
  • 31. 第 2 節: 自然数上の命題 帰納的に定義された命題の否定 帰納的に定義された命題の否定命題の証明 (1) Lemma . . 1 は偶数でない の証明を考える. ¬(even 1) は, (even 1) → False である. (even n) を帰納的に証明する証明 even_0, even_SS のように, ¬(even n) を帰納 的に構成する odd_1, odd_SS のような証明を準備して計算で証明する方 針も考えられる. 偶数の集合の場合は補集合である奇数の集合を帰納的に 定義出来るが, 一般には任意の帰納的可算集合の補集合を帰納的可算集合 として定義することは出来ない. 任意の帰納的可算集合が帰納的集合であるわけではない. 溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 31 / 36
  • 32. 第 2 節: 自然数上の命題 帰納的に定義された命題の否定 帰納的に定義された命題の否定命題の証明 (2) 帰納的に定義された命題 even を関数で定義された命題 NE1 と関係付ける ことにより, 計算による性質の証明が可能になる. Lemma lemma8: forall n, (even n) - (NE1 n). Proof. move = n. case. (* even の構成の帰納法で証明 *) compute. (* (even 0) のときは計算で明らか *) apply I. move = n0 H. compute. (* (even (n.+2)) のときも計算で明らか *) apply I. Qed. (even n) を仮定した命題は, even の構成の帰納法によって証明する. こ のとき, (NE1 n.+2)=True は計算で証明出来ることに注意する. 溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 32 / 36
  • 33. 第 2 節: 自然数上の命題 帰納的に定義された命題の否定 帰納的に定義された命題の否定命題の証明 (3) (NE1 1) → False は計算で証明出来るので先の補題 lemma8 で n = 1 と 置いた場合を考えて, (even 1) → False が証明出来る. Lemma lemma9: (even 1) - False. Proof. apply (lemma8 1). Qed. 実は, inversion という Tactic は, NE1 のような関数を自動生成してく れる. Lemma lemma10: (even 1) - False. Proof. move = H. inversion H. Qed. 溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 33 / 36
  • 34. 第 3 節: まとめ まとめ 本来, 定理証明器は正しいプログラムを書くために開発されて来た. 数式や論理式で記述されたプログラムの正しさは数式や論理式の正しさ, す なわち, 数学の命題の正しさに含まれる. 近年は検証の難しい数学の定理の証明検証にも定理証明器が利用されて いる. 形式証明で利用しやすい命題とそうでない命題がある. 同値, あるいは, 包含関係のある利用しやすい命題が必要. 要. 数学理論の再編成. (Abstract が Nonsense でなくなった!) 証明検証しやすい作法でプログラムを書く事も大切. 基本的にプログラムは実応用のために書かれるものであり, 一般的には, そ れそのものを楽しんだり, 鑑賞したりするものではない. 数学の証明は鑑賞したり, それそのものを楽しむことも考えられる. 数学とプログラムの中間に定理証明器がいる. 溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 34 / 36
  • 35. 第 3 節: まとめ 参考文献 (1) Reynald Affeldt, 定理証明支援系 Coq 入門, 日本ソフトウェア科学会チュートリア ル, 2014. https://staff.aist.go.jp/reynald.affeldt/ssrcoq/ Adam Chlipala, Certified Programming with Dependent Types, MIT Press, 2013. http://adam.chlipala.net/cpdt/ G.Gonthier et.al., A Small Scale Reflection Extension for the Coq system, Inria Research Report, 2014. https://hal.inria.fr/inria-00258384/en G.Gonthier, R. St´ephane Le, An Ssreflect Tutorial, 2009. https://hal.inria.fr/inria-00407778/file/RT-367.pdf The Coq Development Team, The Coq Proof Assistant Reference Manual, Ver.8.4pl5, 2014. https://coq.inria.fr/distrib/V8.4pl5/files/Reference-Manual.pdf 溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 35 / 36
  • 36. 第 3 節: まとめ 参考文献 (2) TPP2014, 高信頼な理論と実装のための定理証明および定理証明器, 九州大学, 2014. http://imi.kyushu-u.ac.jp/lasm/tpp2014/index ja.html Y. Bertot, Interactive Theorem Proving and Program Development, Springer, 2004. (Coq’Art) The Univelent Foundations Program, Homotopy Type Theory: Univalent Foundations of Mathematics, http://homotopytypetheory.org/book, Institute for Advanced Study, 2013. 溝口佳寛, 田上真, ケプラー予想の計算機による証明と検証について, 数学セミナー 12 月号, 48–54, 2014. http://bit.ly/KeplerConjecture 溝口佳寛他, 有限オートマトンとスティッカー系に関する Coq による形式証明につ いて, 日本数学会年会講演スライド, 2014. http://www.slideshare.net/yoshihiromizoguchi/coq-32356516 溝口佳寛 (九大 IMI) Coq チュートリアル 2015/02/18 36 / 36