我有一个不等于零的自然数。我想证明,如果它等于零,那么它就为假。
Lemma notzero :
forall n,
n <> 0 ->
n =? 0 = false.
Proof.
intro n. inversion H.
答案 0 :(得分:2)
我发现,如果您使用布尔反射,则从长远来看,这些证明更易于维护,而不是在每个证明中都使用反转。库中有许多有用的引理供您使用,它们通常被称为“ reflect”,“ decide”,“ dec”或“ spec”,如规范中所述,因此您可以搜索与<
相关的引理与Search (_ < _) "spec".
同时设计反射引理是:1)在证明上下文中破坏布尔项,以及2)在上下文中添加相应的Prop
,以便于使用lia
,omega
等来完成证明。
根据您的情况,您可以使用Nat.eq_spec
(来自Require Import PeanoNat.
)。
destruct (Nat.eq_spec n 0).
它将创建两个分支,其中一个n ?= 0
被true
替换,并且n=0
被添加到上下文,而另一个n =? 0
被{{ 1}}和false
被添加到上下文中。现在,完成证明非常容易,因为第一个目标的上下文包含矛盾n<>0
和n=0
,第二个目标是n<>0
。您可以使用自动化战术false=false
,因此完整的证明是
now
如果您想使用整数now destruct (Nat.eq_spec n 0).
,则证明将变为Z
。因为now destruct (Z.eq_spec n 0).
模块具有许多具有匹配名称的对应词条。
答案 1 :(得分:0)
通常,您可以使用=?
反映自然数(Nat.eqb_spec
)相等的事实。
您是否故意使用两个平等概念?
请注意,n <> 0
是n = 0 -> False
的表示法。
Lemma notzero :
forall n,
n <> 0 ->
n =? 0 = false.
Proof.
intros n h. destruct (Nat.eqb_spec n 0).
- exfalso. apply h. assumption.
- reflexivity.
Qed.
也有可能仅对n
进行分析。
如果为0
,则可以使用假设进行结论;如果为S m
,则可以由reflexivity
证明目标。
Lemma notzero :
forall n,
n <> 0 ->
n =? 0 = false.
Proof.
intros n h. destruct n.
- contradiction.
- reflexivity.
Qed.