破坏固定点时,添加假设而不简化
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
。阅读这篇 .
后,您可以了解更多关于 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
第一个子目标。
假设我必须证明以下引理:
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
。阅读这篇
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
第一个子目标。