なぜCoqが重要か

@yoshihiro503

平成26年4月26日

なぜCoqが重要か

結論

最強のプログラム検証器

Coqは最強の表現力を持つ仕様記述言語を使う

最強のプログラム検証器

Coqを使うためにはPhDが必要?

最強のプログラム検証器

証明を人間が与えるのが大変?

最強の関数型言語

Coqは(型の表現力が)最強の関数型言語

注意: ここでの関数型言語とは
(ラムダ計算を基礎とした)(静的型付き)関数型(プログラミング)言語

Coqのインストール

Unix系 ソースからインストール

Debian系

opamユーザー

Coqのインストール

Windows, Mac OS X

Coqを使う

一覧: http://coq.inria.fr/distrib/current/refman/

Coqの基本

Coqではいろんなモノが式

Coqで証明するという事

「ある論理式PをCoqで証明する」 ≡ 「(a : P)となる式aを見つける」

☆ a をPの証明と呼ぶ

Coqで証明するという事

例えば、

「任意のf, xsについて、(map f xs)の長さとxsの長さは同じ」

を証明するためには

??? : forall f xs, length (map f xs) = length xs

となる式を見つければよい。


fun (A B : Type) (f : A -> B) (xs : list A) =>
list_ind (fun xs0 : list A => length (map f xs0) = length xs0) eq_refl
  (fun (_ : A) (xs0 : list A) (IHxs : length (map f xs0) = length xs0) =>
   eq_ind_r (fun n : nat => S n = S (length xs0)) eq_refl IHxs) xs

Coqで証明するという事

実際はタクティックを試しながら、対話的にゴールを変形していく。

Theorem map_length: forall A B:Type f xs,
  length (map f xs) = length xs.
Proof.
 intros A B f xs. induction xs.
  reflexivity.

  simpl. rewrite IHxs. reflexivity.
Qed.