Local Notation mixin_of T b := (Finite.mixin_of (EqType T b)).Local Notation fin_ c := (@Finite.Class _ c c).Local Notation do_pack pack T := (pack T _ _ id _ _ id).Definition groupMixin V := FinGroup.Mixin (@addrA V) (@add0r V) (@addNr V).Local Notation base_group T vT fT :=
  (@FinGroup.PackBase T (groupMixin vT) (Finite.class fT)).Local Notation fin_group B V := (@FinGroup.Pack B (@addNr V)).Record class_of M :=
  Class { base : GRing.Zmodule.class_of M; mixin : mixin_of M base }.Record class_of M :=
  Class { base : GRing.Zmodule.class_of M; mixin : mixin_of M base }.Record class_of M :=
  Class { base : GRing.Zmodule.class_of M; mixin : mixin_of M base }.Record class_of M :=
  Class { base : GRing.Zmodule.class_of M; mixin : mixin_of M base }.Structure type := Pack {sort; _ : class_of sort}.Structure type := Pack {sort; _ : class_of sort}.Structure type := Pack {sort; _ : class_of sort}.Definition pack := gen_pack Pack Class GRing.Zmodule.class.Notation xclass := (class : class_of xT).Definition eqType := @Equality.Pack cT xclass.Definition choiceType := @Choice.Pack cT xclass.Definition countType := @Countable.Pack cT (fin_ xclass).Definition finType := @Finite.Pack cT (fin_ xclass).Definition zmodType := @GRing.Zmodule.Pack cT xclass.Definition join_finType := @Finite.Pack zmodType (fin_ xclass).Definition baseFinGroupType := base_group cT zmodType finType.Definition finGroupType := fin_group baseFinGroupType zmodType.Definition join_baseFinGroupType := base_group zmodType zmodType finType.Definition join_finGroupType := fin_group join_baseFinGroupType zmodType.Notation finZmodType := type.Notation "[ 'finRingType' 'of' T ]" := (do_pack pack T)
  (at level 0, format "[ 'finRingType'  'of'  T ]") : form_scope.Implicit Types x y : U.

(* Specifications: *)
Lemma zmod1gE : 1%g = 0 :> U.
Lemma zmodVgE x : x^-1%g = - x.
Lemma zmodMgE x y : (x * y)%g = x + y.
Lemma zmod_mulgC x y : commute x y.
Lemma zmod_abelian (A : {set U}) : abelian A.