結論
Coqは最強の表現力を持つ仕様記述言語を使う
Coqを使うためにはPhDが必要?
証明を人間が与えるのが大変?
Coqは(型の表現力が)最強の関数型言語
注意: ここでの関数型言語とは
(ラムダ計算を基礎とした)(静的型付き)関数型(プログラミング)言語
Coqではいろんなモノが式
「ある論理式PをCoqで証明する」 ≡ 「(a : P)となる式aを見つける」
☆ a をPの証明と呼ぶ
例えば、
「任意の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
実際はタクティックを試しながら、対話的にゴールを変形していく。
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.