Coq 破坏不动点时,添加假设而不简化

Coq 破坏不动点时,添加假设而不简化,coq,coq-tactic,Coq,Coq Tactic,假设我必须证明以下引理: Require Import Coq.Arith.EqNat. Lemma myLemma: forall m, if beq_nat m 0 then m = 0 else m <> 0. 然后,在点[1]处,destruct通过案例分析进行,首先beq_nat m 0在if中被true替换,其简化为目标m=0,无需额外假设(在点[2]) 我的问题是:有没有一种方法来拆分目标,并添加相应的案例作为假设,而不是拆分目标、替换和简化目标 也就是

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

Require Import Coq.Arith.EqNat.

Lemma myLemma: forall m,
  if beq_nat m 0
  then m = 0
  else m <> 0.
然后,在点[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
m:nat
true=PeanoNat.Nat.eqb m 0
______________________________________(1/1)
如果PeanoNat.Nat.eqb m 0,则m=0,否则m 0
并着手进行以下证明

(注:这是一个非常愚蠢的mwe,我知道还有其他方法可以完成这里,我的重点不是完成这个特殊的证明,而是有一种方法从析构函数中得到一个假设)。

而不是
析构函数(beq_nat m 0)
你可以使用

destruct (beq_nat m 0) eqn:Equation_name.

destruct。。。eqn:E
类似于
case_eq。。。;简介E
。阅读本文后,您可以进一步了解
destruct
case
之间的区别

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

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
m:nat
E:true=peanat.Nat.eqb m 0
============================
如果PeanoNat.Nat.eqb m 0,则m=0,否则m 0

对于第一个子目标。

您是否特别希望在目标中单独保留
beq_nat m 0
?(安东的回答给了你一些保持平等的方法,但你正在破坏的东西仍然是简化的。)@TejChajed谢谢,起初我错过了“如何避免简化”部分。这正是我想要的,谢谢你的详细回答。
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