破坏固定点时,添加假设而不简化

When destructing fixpoint, add hypothesis without simplifying

假设我必须证明以下引理:

Require Import Coq.Arith.EqNat.

Lemma myLemma: forall m,
  if beq_nat m 0
  then m = 0
  else m <> 0.

然后我这样做:

Proof.
  intro.
  destruct (beq_nat m 0).  (* [1] *)
  - (* [2] *)
  - (* ???? Can't do anything *)
Qed.

然后在[1]点,destruct进行案例分析,先将beq_nat m 0替换为if中的true,简化为目标 m = 0,没有额外的假设(在点 [2])。

我的问题是:不是拆分目标,替换和简化,有没有办法拆分目标,并添加相应的案例作为假设?

也就是说,在 [2] 点,而不是具有以下内容:

m : nat
______________________________________(1/1)
m = 0

我想要:

m : nat
true = PeanoNat.Nat.eqb m 0
______________________________________(1/1)
if PeanoNat.Nat.eqb m 0 then m = 0 else m <> 0

并继续进行以下证明。

(N.B.: 这是一个非常虚的mwe,我知道还有其他方法可以在这里完成,我的意思不是完成这个特定的证明,而是有一个方法来得到一个假设来自破坏)。

您可以使用

代替destruct (beq_nat m 0)
destruct (beq_nat m 0) eqn:Equation_name.

case_eq (beq_nat m 0).

destruct ... eqn:E 就像 case_eq ...; intros E。阅读这篇 .

后,您可以了解更多关于 destructcase 之间的区别

前两个选项简化了事情,但我们可以这样做来避免简化:

remember (beq_nat m 0) as b eqn:E; rewrite E; destruct b.

第三个选项会给你这样的证明状态

m : nat
E : true = PeanoNat.Nat.eqb m 0
============================
if PeanoNat.Nat.eqb m 0 then m = 0 else m <> 0

第一个子目标。