Coq 自然数矛盾&x27;零度检验

Coq 自然数矛盾&x27;零度检验,coq,Coq,我有一个不等于零的自然数。我想证明,如果它等于零,那么它就等于false Lemma notzero : forall n, n <> 0 -> n =? 0 = false. Proof. intro n. inversion H. 引理非零: 福兰, n 0-> n=?0=错误。 证明。 简介。反转H。 通常,您可以使用=?反映自然数相等的事实(Nat.eqb_spec)。 你是故意使用这两个平等的概念吗? 请注意,n0是n=0->False的

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

Lemma notzero : 
  forall n, 
    n <> 0 ->
    n =? 0 = false.
Proof.
  intro n. inversion H.
引理非零:
福兰,
n 0->
n=?0=错误。
证明。
简介。反转H。

通常,您可以使用
=?
反映自然数相等的事实(
Nat.eqb_spec
)。 你是故意使用这两个平等的概念吗? 请注意,
n0
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.

我发现,如果使用布尔反射,从长远来看,证明更易于维护,而不是在每个证明中使用反转。这些库有许多有用的引理,你可以使用,它们通常被称为“reflect”、“decise”、“dec”或“spec”,就像在规范中一样,因此你可以搜索与
相关的引理。注意:这只是@Théo答案的一个详细说明。我不建议现在在学习如何做证明时使用它们。我永远不会真正使用它,因为它可能很慢,而且并不总是清楚它是如何找到证据的,但这更像是个人的品味。我已经像这样解决了引理,引理da:forall n:nat,n0->n=0->False。证明。介绍n eq1 eq2。应用eq1。应用eq2。这没问题。所以你把引理改为使用
=
,而不是
=?
。你知道两者的区别吗?还有,你的问题是由@larsr解决的还是我的答案?如果是这样,您应该接受相应的一个。对于自然数等式,使用=和使用=?当平等给予布尔。这并不能解决问题。根据你的回复,我导入Nat.eqb_规范介绍n H.析构函数n+应用H.+自反性。但是,当我导入Nat.eqb_规范时,会出现错误消息(即Nat.eqb_规范不是一个模块)。正如larsr先生所建议的那样,我以这种方式开始证明需要导入PeanoNat。需要进口Nat.eq_规格证明。介绍n H.自毁(Nat.eq_规范n 0)。然后错误消息是“找不到绑定到匹配后缀Nat的逻辑路径的物理路径”。
Nat.eqb_spec
实际上不是一个模块,因此您不需要
要求
导入
。只需使用析构函数(Nat.eqb_spec n 0)
Lemma notzero : 
  forall n, 
    n <> 0 ->
    n =? 0 = false.
Proof.
  intros n h. destruct n.
  - contradiction.
  - reflexivity.
Qed.
destruct (Nat.eq_spec n 0).
now destruct (Nat.eq_spec n 0).