Record Ctype : Type :=  {real :> R; imag : R}.Record Ctype : Type :=  {real :> R; imag : R}.Record Ctype : Type :=  {real :> R; imag : R}.Definition Cadd (z z' : Ctype) : Ctype :=
  Build_Ctype (sgroup_law R (real z) (real z'))
    (sgroup_law R (imag z) (imag z')).Definition Cmult (z z' : Ctype) : Ctype :=
  Build_Ctype
    (sgroup_law R (ring_mult (real z) (real z'))
       (group_inverse R (ring_mult (imag z) (imag z'))))
    (sgroup_law R (ring_mult (real z) (imag z'))
       (ring_mult (imag z) (real z'))).Definition Copp (z : Ctype) : Ctype :=
  Build_Ctype (group_inverse R (real z)) (group_inverse R (imag z)).Definition Cone : Ctype := Build_Ctype (ring_unit R) (monoid_unit R).Definition Czero : Ctype := Build_Ctype (monoid_unit R) (monoid_unit R).Definition Ceq (z z' : Ctype) :=
  Equal (real z) (real z') /\ Equal (imag z) (imag z').Definition Cset : Setoid.

(* Specifications: *)
Lemma Build_Ctype_comp : forall x x' y y' : R, Equal x x' -> Equal y y' -> Equal (s:=Cset) (Build_Ctype x y) (Build_Ctype x' y').
Lemma real_comp : forall x x' : Cset, Equal x x' -> Equal (real x) (real x').
Lemma imag_comp : forall x x' : Cset, Equal x x' -> Equal (imag x) (imag x').
Lemma Build_Ctype_comp2 : forall x x' y y' : R, Equal x x' -> Equal y y' -> Ceq (Build_Ctype x y) (Build_Ctype x' y').