自然数零检验的矛盾

时间:2019-10-05 05:51:35

标签: coq

我有一个不等于零的自然数。我想证明,如果它等于零,那么它就为假。

Lemma notzero : 
  forall n, 
    n <> 0 ->
    n =? 0 = false.
Proof.
  intro n. inversion H.

2 个答案:

答案 0 :(得分:2)

我发现,如果您使用布尔反射,则从长远来看,这些证明更易于维护,而不是在每个证明中都使用反转。库中有许多有用的引理供您使用,它们通常被称为“ reflect”,“ decide”,“ dec”或“ spec”,如规范中所述,因此您可以搜索与<相关的引理与Search (_ < _) "spec".

同时设计反射引理是:1)在证明上下文中破坏布尔项,以及2)在上下文中添加相应的Prop,以便于使用liaomega等来完成证明。

根据您的情况,您可以使用Nat.eq_spec(来自Require Import PeanoNat.)。

destruct (Nat.eq_spec n 0).

它将创建两个分支,其中一个n ?= 0true替换,并且n=0被添加到上下文,而另一个n =? 0被{{ 1}}和false被添加到上下文中。现在,完成证明非常容易,因为第一个目标的上下文包含矛盾n<>0n=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 <> 0n = 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.