假设我必须证明以下引理:
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
中的true
被if
替换为简化为目标{ {1}},没有其他假设(在[2]点)。
我的问题是:有没有一种方法来分割目标,并添加相应的案例作为假设,而不是分割目标,替换和简化?
即,在第[2]点,而不是具有以下内容:
m = 0
我想要:
m : nat
______________________________________(1/1)
m = 0
并继续进行以下的证明。
(注意:这是一个非常虚拟的mwe,我知道还有其他方法可以在这里完成,我的观点是不是要完成这个特定的证明,而是要有一种方法来从破坏中得到一个假设)。
答案 0 :(得分:2)
您可以使用
而不是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
类似。阅读此entry后,您可以详细了解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
为第一个子目标。