(******************)
Inductive is_gcdZ : Z -> Z -> Z -> Prop :=
  | gcd_OZ : forall b : Z, is_gcdZ OZ b (absZ b)
  | gcd_mod :
      forall b a d q r : Z,
      b <> OZ -> is_diveuclZ a b q r -> is_gcdZ r b d -> is_gcdZ b a d.(******************)
Inductive is_gcdZ : Z -> Z -> Z -> Prop :=
  | gcd_OZ : forall b : Z, is_gcdZ OZ b (absZ b)
  | gcd_mod :
      forall b a d q r : Z,
      b <> OZ -> is_diveuclZ a b q r -> is_gcdZ r b d -> is_gcdZ b a d.(******************)
Inductive is_gcdZ : Z -> Z -> Z -> Prop :=
  | gcd_OZ : forall b : Z, is_gcdZ OZ b (absZ b)
  | gcd_mod :
      forall b a d q r : Z,
      b <> OZ -> is_diveuclZ a b q r -> is_gcdZ r b d -> is_gcdZ b a d.(******************)
Definition have_gcdZ (a b : Z) := {d : Z | is_gcdZ a b d}.Definition gcdZ_i (a b : Z) := exist (is_gcdZ a b).(* Inductive have_gcdZ [a, b: Z]: Set
  := gcdZ_i: (d: Z) (is_gcdZ a b d) -> (have_gcdZ a b). *)

(*******************)
Definition P (a : Z) := forall b : Z, have_gcdZ a b.

(* Specifications: *)
Lemma acc_P : forall n : Z, (forall m : Z, lt_absZ m n -> P m) -> P n.
Lemma gcdZ_exists : forall a b : Z, have_gcdZ a b.
Lemma gcdZ_is_gcd : forall a b d : Z, is_gcdZ a b d -> is_gcd Z IdZ multZ OZ a b d.