Definition Mixin := BaseMixin mulA mul1 mk_invgK mk_invMg.Local Notation T := (arg_sort bT).Notation rT := (FinGroup.sort T).Local Notation class := (finClass bT).Canonical eqType := Equality.Pack class.Canonical choiceType := Choice.Pack class.Canonical countType := Countable.Pack class.Canonical finType := Finite.Pack class.Notation baseFinGroupType := base_type.Notation finGroupType := type.Notation BaseFinGroupType T m := (@pack_base T m _ _ id).Notation FinGroupType := Pack.Notation "[ 'finGroupType' 'of' T ]" := (@clone T _ _ id _ id)
  (at level 0, format "[ 'finGroupType'  'of'  T ]") : form_scope.Definition oneg : rT := FinGroup.one T.Definition mulg : T -> T -> rT := FinGroup.mul T.Definition invg : T -> rT := FinGroup.inv T.Definition expgn_rec (x : T) n : rT := iterop n mulg x oneg.Definition expgn := nosimpl expgn_rec.Notation "[ ~ x1 , x2 , .. , xn ]" := (commg .. (commg x1 x2) .. xn)
  : group_scope.(* Arguments of conjg are restricted to true groups to avoid an *)
(* improper interpretation of A ^ B with A and B sets, namely:  *)
(*       {x^-1 * (y * z) | y \in A, x, z \in B}                 *)
Definition conjg (T : finGroupType) (x y : T) := y^-1 * (x * y).Definition commg (T : finGroupType) (x y : T) := x^-1 * x ^ y.Implicit Types x y z : T.Local Notation mulgT := (@mulg T).

(* Specifications: *)
Lemma mulgA : associative mulgT.
Lemma mul1g : left_id 1 mulgT.
Lemma invgK : @involutive T invg.
Lemma invMg x y : (x * y)^-1 = y^-1 * x^-1.
Lemma invg_inj : @injective T T invg.
Lemma invg1 : 1^-1 = 1 :> T.
Lemma mulg1 : right_id 1 mulgT.