在进行Software Foundations的练习时,我需要推导,如下面的定理SET GENERATOR
所表达的那样。在用各种战术和标准定理挣扎了一段时间之后,我放弃并决定使用下面的定理。
not_eq_nat__beq_nat_false
要简单得多。
eq_nat__beq_nat_true
我的猜测是使用Require Export Arith.
Require Export Arith.EqNat.
Theorem ex_falso_quodlibet : forall (P:Prop), False -> P.
Proof.
intros P contra.
inversion contra.
Qed.
Theorem not_eq_nat__beq_nat_false: forall n m : nat
, n <> m -> (n =? m) = false
.
Proof.
intros.
unfold not in H.
destruct (n =? m) eqn:beqval; try reflexivity.
apply ex_falso_quodlibet. apply H.
apply beq_nat_true; assumption.
Qed.
Theorem eq_nat__beq_nat_true: forall n m : nat
, n = m -> (n =? m) = true
.
Proof.
intros.
rewrite H. symmetry. apply beq_nat_refl.
Qed.
是解决方案。如何轻易证明这种琐事?
在Vinz的回答中,我正在寻找以下内容。
sumbool
确实很简单。
答案 0 :(得分:3)
我发现您使用的是std lemmas,例如beq_nat_true
,然后您可以使用beq_nat_false_iff
。否则,没有任何来自std lib的引理,我会去感应:
Theorem not_eq_nat__beq_nat_false: forall n m : nat
, n <> m -> beq_nat n m = false
.
Proof.
induction n as [ | n hi]; intros [ | m] h; simpl in *; try reflexivity.
- now elim h.
- now apply hi; intro heq; apply h; rewrite heq.
Qed.