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

时间:2017-11-30 16:18:57

标签: coq coq-tactic

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

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中的trueif替换为简化为目标{ {1}},没有其他假设(在[2]点)。

我的问题是:有没有一种方法来分割目标,并添加相应的案例作为假设,而不是分割目标,替换和简化?

即,在第[2]点,而不是具有以下内容:

m = 0

我想要:

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

并继续进行以下的证明。

(注意:这是一个非常虚拟的mwe,我知道还有其他方法可以在这里完成,我的观点是不是要完成这个特定的证明,而是要有一种方法来从破坏中得到一个假设)。

1 个答案:

答案 0 :(得分:2)

您可以使用

而不是destruct (beq_nat m 0)
destruct (beq_nat m 0) eqn:Equation_name.

case_eq (beq_nat m 0).

destruct ... eqn:Ecase_eq ...; intros E类似。阅读此entry后,您可以详细了解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

为第一个子目标。