ここで Print MP.
を実行すると
MP =
fun (Pis : P) (PimpliesQ : P -> Q) =>
PimpliesQ Pis
: P -> (P -> Q) -> Q
Arguments MP _ _%function_scope
のように表示される。
つまりMP
とは、引数としてPis
(値)とPimpliesQ
(関数)を受け取ってPimpliesQ Pis
を返す関数。
Coqの(正確にはGallinaの)書式は変数名 : 型
。
MP
の型P -> (P -> Q) -> Q
は、P
型の値とP->Q
型の値(関数)を受け取ってQ
型の値を返す関数、を意味する。
これを、「Pという言明の証明とP->Qという言明の証明を受け取ってQという言明の証明を作る」ことと同一視する。
<div style="text-align: right; font-weight:bold">→ Curry-Howard同型対応</div>(はじめから
Definition MP := fun (x : P) (y : P -> Q) => y x.
のようにGallinaの項を与えても同じ。証明が長くなってくると困難。)
論理演算 | 解釈 |
---|---|
の証明との証明のペアの集合(直積集合) | |
の証明の集合との証明の集合の和集合 | |
の証明からのの証明の構成方法の集合 | |
の証明からのの構成方法の集合(依存型) | |
の証明とのペアの集合(依存型) |
依存型は、証明の型がに依存する。
Print bool.
を行うと
Inductive bool : Set := true : bool | false : bool.
と表示される。bool
型はtrue
とfalse
から構成されている。
自然数も帰納的に定義されている。Print nat.
を行うと
Inductive nat : Set := O : nat | S : nat -> nat.
O
(これはのこと)はnat
型でnat
型の値にS
を作用させたものもnat
型でnat
型であることが分かる。
S
を作用させることは次に大きい自然数を作ることに対応している。
O
↔0, S O
↔1, S (S O)
↔2, S (S (S O))
↔3......。
命題としてのTrue
, False
(bool
型のtrue
, false
とは異なる)やand
, or
も帰納的に定義されている。
Coq には標準ライブラリに加えて,SSReflect,MathComp という強力なライブラリがある.(この2つは現在は同じライブラリとしてまとめられている.)
このライブラリを読み込むことで,定理だけでなく新しいタクティックまで導入することができる.
move=>->
: intro TMP; rewrite TMP; clear TMP
。move->
とも書ける。Coq クィックリファレンス
事例集をみればとりあえず証明が書ける。
TopProver
競プロのCoq版。最近はコンテストは開かれていないが過去問で証明の練習ができる。
Coq/SSReflect/MathComp Tutorial
スライドとかExample がいろいろ載ってる。
ソフトウェアの基礎
網羅的に勉強できそう。