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

How to use an unequality to simplify a if-then-else in Coq?

我正在证明中,我通过

生成了两个案例
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 和一些 rewriteS 但卡住了。

理想情况下,您想说

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 并仅使用普通布尔值的问题之一。