(**********************************************************************)
 
Inductive is_gcd (a b c : nat) : Prop :=
    is_gcd_intro :
      divides c a ->
      divides c b ->
      (forall d : nat, divides d a -> divides d b -> divides d c) ->
      is_gcd a b c.(**********************************************************************)
 
Inductive is_gcd (a b c : nat) : Prop :=
    is_gcd_intro :
      divides c a ->
      divides c b ->
      (forall d : nat, divides d a -> divides d b -> divides d c) ->
      is_gcd a b c.

(* Specifications: *)
Lemma is_gcd_unic : forall a b c d : nat, is_gcd a b c -> is_gcd a b d -> c = d.
Lemma is_gcd_ref : forall x : nat, is_gcd x x x.
Lemma is_gcd_sym : forall a b c : nat, is_gcd a b c -> is_gcd b a c.
Lemma is_gcd_O' : forall a r : nat, is_gcd a 0 r -> a = r.
Lemma is_gcd_Ol : forall a : nat, is_gcd a 0 a.
Lemma is_gcd_Or : forall a : nat, is_gcd 0 a a.
Lemma prime_gcd : forall p n : nat, prime p -> ~ divides p n -> is_gcd n p 1.
Lemma gcd_rec : forall P : nat -> nat -> Set, (forall x : nat, P 0 x) -> (forall x : nat, P x 0) -> (forall a b : nat, P a b -> P a (b + a)) -> (forall a b : nat, P a b -> P (a + b) b) -> forall a b : nat, P a b.
Lemma gcd_ind : forall P : nat -> nat -> Prop, (forall x : nat, P 0 x) -> (forall x : nat, P x 0) -> (forall a b : nat, P a b -> P a (b + a)) -> (forall a b : nat, P a b -> P (a + b) b) -> forall a b : nat, P a b.