证明高斯'在Coq中定义nat的定理

时间:2015-11-21 00:08:29

标签: coq proof

我想证明高斯' .mobile-first($minWidth, $rulesSet) @media only screen and (min-width: $minWidth) $rulesSet(); 的定理。

用简单(非精确)语言表示:如果body font-family Helvetica, Arial, sans-serif font-size 100% line-height 1.5em color #2a2a2a -webkit-font-smoothing antialiased .min-width(1200px background-color pink nat而且a的因素都不在b*c,那么他们必须全部都在a

b

已经为整数c定义了定理,请参阅here in the Coq manual。但我需要Require Import NPeano. Theorem Gauss_nat: forall (a b c:nat), gcd a b = 1 -> (a | (b*c)) -> (a | c). 。到目前为止我得到的建议是使用Bezout的引理来说明

Z

但是,我无法直接将其用于nat,因为系数Lemma Bezout: forall (a b c:Z), Z.gcd a b = c -> exists u v, u*a+v*b=c. nat可能是负数,因此它不会保留u 1}}。

是否有其他证据在证明中不使用整数?

编辑:

正如Mark Dickinson在评论中指出的那样,定理和引理已经存在于Coq的库中。它们位于v中,名为natNPeano

1 个答案:

答案 0 :(得分:2)

如果您只想获取nat的结果,而不是真的避免使用Z,那么您可以在标准库中重复使用该证明。这里有一个关于如何继续的草图,依赖于两个辅助引理:

Require Import NPeano.
Require Import ZArith.
Require Import ZArith.Znumtheory.
Require Import Omega.

Close Scope Z_scope.

Lemma Zdiv_Ndiv a b : (a | b) <-> (Z.of_nat a | Z.of_nat b)%Z.
Proof. Admitted.

Lemma Zgcd_Ngcd a b : Z.of_nat (gcd a b) = Z.gcd (Z.of_nat a) (Z.of_nat b).
Proof. Admitted.

Theorem Gauss_nat a b c : gcd a b = 1 -> (a | (b*c)) -> (a | c).
Proof.
rewrite Zdiv_Ndiv, Zdiv_Ndiv, Nat2Z.inj_mul.
intros H1 H2.
assert (H3 : Z.of_nat (gcd a b) = 1%Z) by (rewrite H1; reflexivity).
rewrite Zgcd_Ngcd in H3.
apply (Gauss _ _ _ H2).
now rewrite <- Zgcd_1_rel_prime.
Qed.