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