Coqを勉強してます。

コンパイラを作るには型理論を理解しているとよくて、型理論を理解するには数学的な証明とかが出来ると良くて、数学的な証明をコンピュータ上で出来ると楽に正確に勉強出来ると思うので、Coqを勉強してます。

なんとなく、勉強してる訳ではなくて必要に迫られて勉強してるのですけど、数学アレルギーを治すのに良さそうな気がしています。


http://www.iij-ii.co.jp/lab/techdoc/coqt/

ここをみながら勉強中です。2の最後までやってみました。意味が良くわかってないんですけど。1は2回やってみました。あれだな、リッジレーサーを毎回、最初からやる事でどんなスピードでも対応出来る力を付けるみたいなそんな鍛え方をしてますよ。

覚えるまで何回もやれば最初は太極拳のように遅くても徐々にスピードは増して行くのだ。最初は繰り返し大切と。しかも、慣れれば自動証明ですっ飛ばせるらしいので、こんな所はもう分かってるぜ。autoだぜ。で、きっとよくなるんでしょう。

最初は調子良く進んでたのですが、コマンドが沢山出て来て覚えきれないです。普通のプログラミング言語じゃないので、いわゆる普通のプログラミング言語の常識が通用しない。覚える事が多すぎる。訳が分からなくなって来たので、表を書いてみました。書いてみたんですけど、読み進めたら書いてあったと言う。うーむ。表が欲しいと思ってから表があるとありがたいんだけど、いきなり表があるときっと辛いんだな。むー。ないと欲しくなるし、あればあったで苦しいって言う。

表はあくまで、自分が集めたアイテムリストとしてみるといいのかもしれない。俺専用のコマンドリストを持っておけば、やったところまでは、表をみればすぐ思い出せる。

とにかく、使い慣れることだな。10分で全問解けるくらいになれてしまえばこっちの物なはずだ。

コマンド

英語 読み 意味
Definition デフィニション 関数の定義 関数定義or証明編集モード用
Example エグザンプル 例の定義 関数定義or証明編集モード用
Theorem セオラム 定理 証明編集モード用
Lemma レマ 補題(他の命題を証明するための小定理) 証明編集モード用
Remark リマーク 注意 証明編集モード用
Fact ファクト 事実 証明編集モード用
Corollary コロラリ 系(ある定理から直ちに導かれる定理) 証明編集モード用
Proposition プロポジション 命題 証明編集モード用
Goal ゴール 名無しの命題 証明編集モード用
Inductive インダクティブ 型の定義
Check チェック 要素から型を探す。
Search サーチ 型から要素を探す。
Eval イーバル 簡約
Proof プルーフ 証明を開始する

英語 読み 意味
Type タイプ
Prop プロップ 命題
Set セット 集合
nat ナット 自然数

用語

英語 読み 意味
CoqIDE コックアイディーイー Coq用の統合開発環境
Proof General プルーフジェネラル emacs用の開発環境
coqtop コックトップ コマンドラインからのREPL
tactic タクティク proof-editing modeで使えるコマンド。証明を進める関数を探す為の関数かな?
Proof プルーフ 証明
Sort ソート 型の型 Type,Prop,Set
forall フォアオール 任意の,∀
-> ならば
proof-editing mode プルーフエディッティングモード 証明編集モード
subgoal サブゴール 証明における現在の結論

タクティク(tactic)

英語 読み 意味
intros イントロス 現在のサブゴールに対して、サブゴールが "forall A, B" なら仮定に A を入れてサブゴールを B に、サブゴールが "A -> B" なら仮定に "H : A" を入れてサブゴールを B に変える
apply アプライ apply HでサブゴールにHを適用する
Qed キューイーディー Quit Editing modeの略
intro イントロ サブゴールが "forall P : 〜" の形なら P を仮定に移し、サブゴールが "A -> B" のときは A を仮定に移する
unfold アンフォルド unfold の後に書いた名前の関数を展開する
right ライト サブゴール(型)が二つ型構成子を持っているとき、二つ目の型構成子を適用する
left レフト サブゴール(型)が二つ型構成子を持っているとき、一つ目の型構成子を適用する
case ケース 場合分け
destruct デストラク destruct H はまず case と同じはたらきをし、その後仮定にある H を消してから intro する
split スプリット サブゴール(型)が1つの型構成子をもっているとき型構成子を適用する
auto オート 自動的に証明する
tauto ティーオート autoより強力な自動証明
induction x - x について帰納法で証明を進める
simpl - サブゴールを簡約する
reflexivity - サブゴールが等式の形で、両辺の値が等しいとき
f_equal - apply (f_equal x) のようなもの、x は省略できる
rewrite x - x の型が "forall 〜, a = b" のとき、サブゴールの a を b で書き換える
rewrite <- x - x の型が "forall 〜, a = b" のとき、サブゴールの b を a で書き換える

以下、今日やってみたソースです。

Definition plus (n : nat)(m : nat) : nat := n + m.
Definition plus1 (n m : nat) : nat := n + m.
Definition plus2 n m := n + m.


Definition add a b := a + b.
Definition plus' : nat -> nat -> nat := fun n m => n + m.
Definition id (A:Type)(a:A) := a.
Definition id' : forall(A:Type), A -> A := fun A x => x.
Definition prop0: forall(A: Prop), A -> A := fun A x => x.

Definition p0 : forall(A: Prop), A -> A := fun A x => x.

(* 命題1. 任意の命題 A B C に対して、
「B ならば C」ならば「A ならば B」ならば 「A ならば C」。*)

Definition p2: forall(A B C: Prop), (B->C)->(A->B)->A->C :=
  fun A B C b a x => (b (a x)).
 
(*Definition prop3: forall(A : Type)(l1 l2 l3: list A), app l1 l3 = app l2 l3 -> l1 = l2.
*)

(* 問0. 任意の命題 A B に対して、
A ならば 「A ならば B」ならば Bが成り立つ。*)

Definition prop4: forall(A B:Prop), A->(A->B)->B := 
fun A B a f => f a.

(*問1. 任意の命題 A B C に対して、
「A ならば B ならば C」ならば「B ならば A ならば C」が成り立つ。 *)

Definition prop5: forall(A B C:Prop), (A->B->C)->B->A->C :=
fun A B C f b a => f a b.

(*
Definition prop6: forall (P Q : Prop),
  (forall P : Prop, ((P -> Q) -> Q)) -> ((P -> Q) -> P) ->  P :=
*)

Goal forall (A : Prop), A -> A.
Proof.
intros.
apply H.
Qed.

Theorem prop7 : forall (A : Prop), A -> A.
Proof.
intros.
apply H.
Qed.

Lemma prop8 : forall (A : Prop), A -> A.
Proof.
intros.
apply H.
Qed.

Example prop9 : forall (A : Prop), A -> A.
Proof.
intros.
apply H.
Qed.

Example prop10 : forall (A : Prop), A -> A := fun A x => x.

Goal forall (A : Prop), A -> A.
Proof.
intros.
apply H.
Qed.

Goal forall (P Q : Prop), (forall P : Prop, (P -> Q) -> Q) -> ((P -> Q) -> P) -> P.
Proof.
intros.
apply H0.
intro.
apply (H (P->Q)).
apply (H P).
Qed.

Goal forall (P Q R : Prop), (P -> Q) -> (Q -> R) -> P -> R.
Proof.
intros.
apply H0.
apply H.
apply H1.
Qed.

Inductive list (A : Type) : Type :=
  | nil : list A
  | cons : A -> list A -> list A.
(*
Inductive False : Prop :=.

Definition not (A : Prop) := A -> False.
*)
Goal forall P : Prop, P -> ~~P.
Proof.
intros.
intro.
apply H0.
apply H.
Qed.

Goal forall P : Prop, P-> ~~P.
unfold not.
intros.
apply H0.
apply H.
Qed.

Goal forall (P Q : Prop), P \/ Q -> Q \/ P.
Proof.
intros.
case H.
apply or_intror.
apply or_introl.
Qed.

Goal forall (P Q : Prop), P \/ Q -> Q \/ P.
intros.
destruct H.
right.
apply H.
left.
apply H.
Qed.

Goal forall (P Q : Prop), P /\ Q -> Q /\ P.
Proof.
intros.
destruct H.
apply conj.
apply H0.
apply H.
Qed.

Goal forall (P Q : Prop), P /\ Q -> Q /\ P.
Proof.
intros.
destruct H.
split.
apply H0.
apply H.
Qed.


Goal forall (P : Prop), P -> ~~P.
info_auto.
Qed.

Goal  forall (P : Prop), ~(P /\ ~P).
Proof.
intros.
intro.
apply H.
destruct H.
apply H.
Qed.

Goal forall (P Q : Prop), ~P \/ ~Q -> ~(P /\ Q).
Proof.
intros.
intro.
destruct H.
apply H.
apply H0.
apply H.
apply H0.
Qed.

Goal forall (P : Prop), (forall (P : Prop), ~~P -> P) -> P \/ ~P.
Proof.
intro.
intro.
apply H.
intro.
apply H0.
left.
apply H.
intro.
apply H0.
right.
apply H1.
Qed.
(*
Fixpoint app (A : Type)(l l' : list A) : list A :=
  match l with
  | nil => l'
  | cons x xs => cons A x (app A xs l')
  end.
*)
Open Scope list_scope.

Fixpoint app2 (A : Type)(l l' : list A) : list A :=
  match l with
  | nil => l'
  | cons x xs => cons A x (app2 A xs l')
  end.

Close Scope list_scope.