如何使用不等式来简化Coq中的if-then-else?

时间:2015-12-07 14:17:40

标签: coq coq-tactic

我正处于证明的中间,我通过

生成了两个案例
destruct (eq_id_dec Y X)

eq_id_dec在性质上与eq_nat_dec)相似。

这给出了两个案例,其中相等的假设e: Y = X和不等等的n: Y <> X

在第一种情况下,我可以轻松使用rewrite erewrite <- e

但是,如何在第二种情况下有效地利用不平等?考虑,例如,一个目标,如

(if eq_id_dec X Y then AAA else BBB) = BBB

我尝试了unfold eq_id_dec和一些rewrite S但是卡住了。

1 个答案:

答案 0 :(得分:1)

理想情况下,您想说出像

这样的内容
forall (P : Prop)
       (b : {P} + {~ P})
       (H : ~ P), b = right H.

不幸的是,如果没有假设功能性扩展性,就不可能显示这个结果,因为没有任何有用的原则可以让你证明两个否定证明是相等的。

你可以为你的案例证明这个引理的一般结果,如下:

Require Import Coq.Arith.Peano_dec.

Lemma sumboolF T P (b : {P} + {~ P}) x y : ~ P -> (if b then x else y) = y :> T.
Proof.
intros; destruct b; tauto.
Qed.

Lemma test n m : n <> m -> (if eq_nat_dec n m then 1 else 0) = 0.
Proof.
intros H; rewrite sumboolF; auto.
Qed.

这有助于解决您的问题,但可能需要针对sumbool类型的其他用途显示类似的结果。

这是让我们考虑从软件基础书中删除sumbool,而只是使用普通布尔值的问题之一。