从nat到bool的不等式的简单(r)证明

时间:2016-03-11 09:15:43

标签: coq

在进行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

确实很简单。

1 个答案:

答案 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.