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.