我想证明高斯' .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
中,名为nat
和NPeano
。
答案 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.