GitHub coq/coq/pull/17235: Remove ASSUM-DEF rule from the module document.
すぐにコメントがついて、ASSUM-DEF は必要なことがわかった。うぅむ。
Coq は直感主義なので一般には命題の 2重否定の除去はできないのだが、 is_true b という形の bool から作られる命題の 2重否定は除去できたっけ? と思って試す
From mathcomp Require Import all_ssreflect. Lemma test2 (b : bool) : ~ ~ b <-> b. Proof. case: b; split => //. move=> _. by apply. Qed.
うむ、できるよな (b は bool であって命題ではないが、SSReflect では bool から Prop への coercion として is_true が指定されていて、~ ~ b <-> b は実は ~ ~ (is_true b) <-> (is_true b) となっている)
not をもっと並べてみる
Lemma test4 (b : bool) : ~ ~ ~ ~ b <-> b.
Proof.
case: b; split => //.
move=> _.
rewrite /not.
by do 2 apply.
move=> H.
exfalso.
apply H.
by apply.
Qed.
Lemma test6 (b : bool) : ~ ~ ~ ~ ~ ~ b <-> b.
Proof.
case: b; split => //.
move=> _.
rewrite /not.
by do 3 apply.
move=> H.
exfalso.
apply H.
by do 2 apply.
Qed.
Lemma test8 (b : bool) : ~ ~ ~ ~ ~ ~ ~ ~ b <-> b.
Proof.
case: b; split => //.
move=> _.
rewrite /not.
by do 4 apply.
move=> H.
exfalso.
apply H.
by do 3 apply.
Qed.
まぁ、偶数個なら問題なくいけるようだ
一般的に証明してみよう
Fixpoint even_nots (n : nat) (P : Prop) : Prop :=
match n with
| 0 => P
| m.+1 => ~ ~ (even_nots m P)
end.
Lemma test_even (n : nat) (b : bool) : even_nots n b <-> b.
Proof.
case: b; split => //.
move=> _.
elim: n => //= n IH.
by apply.
elim: n => //= n IH H.
exfalso.
by apply H => /IH.
Qed.
特に問題なく証明できるようだ
奇数個ならどうか
Lemma test3 (b : bool) : ~ ~ ~ b <-> ~ b.
Proof.
case: b; split => //.
move=> H.
exfalso.
apply H.
by apply.
move=> _.
by apply.
Qed.
Lemma test5 (b : bool) : ~ ~ ~ ~ ~ b <-> ~ b.
Proof.
case: b; split => //.
move=> H.
exfalso.
apply H.
by do 2 apply.
move=> _.
by do 2 apply.
Qed.
Lemma test7 (b : bool) : ~ ~ ~ ~ ~ ~ ~ b <-> ~ b.
Proof.
case: b; split => //.
move=> H.
exfalso.
apply H.
by do 3 apply.
move=> _.
by do 3 apply.
Qed.
まぁ、できるようだな
一般的に証明してみよう
Fixpoint odd_nots (n : nat) (P : Prop) : Prop :=
match n with
| 0 => ~ P
| m.+1 => ~ ~ (odd_nots m P)
end.
Lemma test_odd (n : nat) (b : bool) : odd_nots n b <-> ~ b.
Proof.
case: b; split => //.
elim: n => //= n IH H.
exfalso.
apply: H => H.
by apply IH.
move=> _.
elim: n => //= n IH.
by apply.
Qed.
ちゃんとできるな
[latest]