Coq 用整数定理证明自然数定理

Coq 用整数定理证明自然数定理,coq,Coq,我不是数学家,但我对这个主题和Coq等证明助手的使用感兴趣。我仍然需要学习很多关于Coq是如何工作的。作为练习,我想证明: forall n : nat, n > 0 -> Nat.Odd n <-> Nat.Odd (5 * n + 6). 我想知道我是不是走对了路。我还寻求一些关于如何最终使用结果T1证明T2的提示(假设这实际上是使用Coq证明初始目标的合理方法) 感谢您的帮助。可能有一种方法可以证明Nat中的这一目标(通过使用可分性参数),但这种方法也是可行的。

我不是数学家,但我对这个主题和Coq等证明助手的使用感兴趣。我仍然需要学习很多关于Coq是如何工作的。作为练习,我想证明:

forall n : nat, n > 0 -> Nat.Odd n <-> Nat.Odd (5 * n + 6).
我想知道我是不是走对了路。我还寻求一些关于如何最终使用结果
T1
证明
T2
的提示(假设这实际上是使用Coq证明初始目标的合理方法)


感谢您的帮助。

可能有一种方法可以证明Nat中的这一目标(通过使用可分性参数),但这种方法也是可行的。 你陷入困境的引理
L1
实际上可以用与定理
T1
类似的方式来求解,利用
lia
找到正确的引理。然后,在证明
T2
的过程中应用
T1
的唯一方法是证明
Z.of_nat
尊重加法和乘法:你可以依赖另一次
lia
。您将获得以下证明:

From Coq Require Import ZArith Arith.PeanoNat Psatz.

Theorem T1 : forall n : Z, Z.Odd n <-> Z.Odd (5 * n + 6).
Admitted.

Lemma L1 (n : nat) : Z.Odd (Z.of_nat n) <-> Nat.Odd n.
Proof.
  split.
  - intros [x?]. exists (Z.to_nat x). lia.
  - intros [x?]. exists (Z.of_nat x). lia.
Qed.

Theorem T2 (n : nat) : Nat.Odd n <-> Nat.Odd (5 * n + 6).
Proof.
  do 2 rewrite <- L1.
  (* We need to massage slightly the goal to apply T1 *)
  assert (Z.of_nat (5*n + 6) = (5*(Z.of_nat n)+6)%Z) as -> by lia.
  apply T1.
Qed.
从Coq要求进口ZArith Arith.PeanoNat Psatz。
定理T1:forall n:Z,Z.奇数nz.奇数(5*n+6)。
承认。
引理L1(n:nat):Z.奇数(Z.of_nat n)n.奇数n。
证明。
分裂
-简介[x?]。存在(Z.to_nat x)。莉亚。
-简介[x?]。存在(Z.of_nat x)。莉亚。
Qed。
定理T2(n:nat):nat.奇n.奇(5*n+6)。
证明。
由lia重写。
应用T1。
Qed。
Lemma L1 : forall n : nat,
  Z.Odd (Z.of_nat n) <-> Nat.Odd n.
Proof.
  intros.
  Admitted.

Theorem T2 : forall n : nat,
  n > 0 -> Nat.Odd n <-> Nat.Odd (5 * n + 6).
Proof.
  intros.
  pose proof T1 as G.
  rewrite <- L1.
  rewrite <- L1.
  Admitted.
From Coq Require Import ZArith Arith.PeanoNat Psatz.

Theorem T1 : forall n : Z, Z.Odd n <-> Z.Odd (5 * n + 6).
Admitted.

Lemma L1 (n : nat) : Z.Odd (Z.of_nat n) <-> Nat.Odd n.
Proof.
  split.
  - intros [x?]. exists (Z.to_nat x). lia.
  - intros [x?]. exists (Z.of_nat x). lia.
Qed.

Theorem T2 (n : nat) : Nat.Odd n <-> Nat.Odd (5 * n + 6).
Proof.
  do 2 rewrite <- L1.
  (* We need to massage slightly the goal to apply T1 *)
  assert (Z.of_nat (5*n + 6) = (5*(Z.of_nat n)+6)%Z) as -> by lia.
  apply T1.
Qed.