intros a b r1 r2 H'; generalize r2; elim H'; clear H' a b r1 r2.
exact gcd_inv_Or.
exact gcd_inv_Ol.
intros a b c H' H'0 H'1 r2 H'2; inversion H'2; auto.
apply H'1; auto.
rewrite <- H0; simpl in |- *; rewrite H1; auto.
apply H'1; auto.
rewrite <- H; simpl in |- *; rewrite <- minus_n_O; rewrite H1; auto.
absurd (a < b); auto with arith.
intros a b c H' H'0 H'1 r2 H'2; inversion H'2; auto.
apply H'1; auto.
rewrite <- H0; simpl in |- *; rewrite H1; rewrite <- minus_n_O; auto.
apply H'1; auto.
rewrite <- H; simpl in |- *; rewrite H1; auto.
absurd (a < b); auto with arith.
Qed.

(* Specifications: *)
Lemma gcd_correct2 : forall a b r : nat, gcd_spec a b r -> gcd a b = r.
Lemma gcd_def0l : forall x : nat, gcd 0 x = x.
Lemma gcd_def0r : forall x : nat, gcd x 0 = x.
Lemma gcd_def1 : forall x : nat, gcd x x = x.
Lemma gcd_def2 : forall a b : nat, gcd a b = gcd a (b + a).
Lemma gcd_def3 : forall a b : nat, gcd a b = gcd (a + b) b.
Lemma gcd_is_gcd : forall a b : nat, is_gcd a b (gcd a b).
Lemma preEuclid :
forall a b c m : nat,
divides c (m * a) -> divides c (m * b) -> divides c (m * gcd a b).
Theorem L_Euclides :
forall x a b : nat, is_gcd x a 1 -> divides x (a * b) -> divides x b.
Lemma L_Euclides1 :
forall p a b : nat,
prime p -> divides p (a * b) -> ~ divides p a -> divides p b.