Coq nat到bool不等式的一个简单(r)证明
在做的练习中,我需要一个推导,如下面的定理Coq nat到bool不等式的一个简单(r)证明,coq,Coq,在做的练习中,我需要一个推导,如下面的定理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 ->
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.
确实很简单。我知道你使用了std引理,比如
beq\u nat\u true
,然后你可以使用beq\u nat\u false\u iff
。否则,如果没有来自std库的引理,我会选择归纳法:
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.
定理不等于自然:对于所有n m:n
,n m->beq_nat n m=false
.
证明。
诱导n-as[|n-hi];简介[m]h;简单输入*;试试自反性。
-现在是艾琳·h。
-现在申请hi;heq简介;应用h;重写heq。
Qed。
通常我会在这里使用iff来合并两个引理(更好的是,你可以使用std库中的reflect)firstorder
有时擅长应用上下文中的假设,并做一些乏味的事情,比如intro
和auto
。在这种特殊情况下,你可以简单地用归纳法n,m;一阶。
如果这太神奇了,就做归纳n,m;单纯形;汽车;一致性。
@ejgallego,你能举一个如何使用反射的例子吗?@larsr,当然,请参见
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.