证明Gauss';Coq中的nat定理

证明Gauss';Coq中的nat定理,coq,proof,Coq,Proof,我想证明nat的高斯定理 用简单的(非精确的)语言,它说:如果a除以b*c,并且a的因子都不在b中,那么它们都必须在c中 Require Import NPeano. Theorem Gauss_nat: forall (a b c:nat), gcd a b = 1 -> (a | (b*c)) -> (a | c). 该定理已为整数Z定义,请参阅。但是我需要它来进行nat。到目前为止,我得到的建议是使用Bezout引理,它指出 Lemma Bezout: forall (a

我想证明nat的高斯定理

用简单的(非精确的)语言,它说:如果
a
除以
b*c
,并且
a
的因子都不在
b
中,那么它们都必须在
c

Require Import NPeano. 
Theorem Gauss_nat: forall (a b c:nat), gcd a b = 1 -> (a | (b*c)) -> (a | c).
该定理已为整数
Z
定义,请参阅。但是我需要它来进行
nat
。到目前为止,我得到的建议是使用Bezout引理,它指出

Lemma Bezout: forall (a b c:Z), Z.gcd a b = c -> exists u v, u*a+v*b=c.
但是,我不能将它直接用于
nat
s,因为系数
u
v
可能是负数,因此它不适用于
nat

有没有另一个证明不使用整数

编辑:


正如马克·迪金森在一篇评论中指出的,这个定理和引理已经在柯克的图书馆里了。它们位于
NPeano
,名为
Nat.gcd_bezout
Nat.gauss

如果您只是想获得
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.
需要导入NPeano。
需要进口ZArith。
需要输入ZArith.znum理论。
需要进口欧米茄。
闭合范围Z_范围。
引理Zdiv|ndivab:(a | b)(Z.of|nat a | Z.of|nat b)%Z。
证明。承认。
引理Zgcd_Ngcd ab:Z.of_nat(gcd a b)=Z.gcd(Z.of_nat a)(Z.of_nat b)。
证明。承认。
定理Gauss_natabc:gcdab=1->(a |(b*c))->(a | c)。
证明。
重写Zdiv_Ndiv,Zdiv_Ndiv,Nat2Z.inj_mul。
简介H1H2。
通过(重写H1;自反性)断言(H3:Z.of_nat(gcd a b)=1%Z)。
在H3中重写Zgcd_Ngcd。
应用(高斯H2)。

现在重写你可以证明并使用一个基于nat的Bezout版本:
forall(ab:nat),exists u v,u*a=gcd a b+v*b
。那太完美了!你能用一个基于nat的Bezout的Coq教授给出一个“答案”以及Gauss_nat是如何从中得出的吗?(或者至少,
Bezout_nat
,我能够用它来证明Gauss_nat…)看起来这些结果已经在:寻找
gcd_Bezout_pos
gcd_Bezout
,和
Gauss
。证据在这里:谢谢,这很有用——我想人们偶尔会想在Z和nat之间来回借用定理。(必须明确地处理所有Z.to_nat和Z.from_nat和Nat2Z.inj_mul似乎很难看,但它可能比“魔法”转换更好……)