Timings for FreeAbelianGroup.v
Require Import Basics.Overture Basics.Tactics Basics.Equivalences.
 
Require Import Types.Sigma Types.Forall Types.Paths.
 
Require Import WildCat.Core WildCat.EquivGpd WildCat.Universe.
 
Require Import Algebra.AbGroups.AbelianGroup Algebra.AbGroups.Abelianization.
 
Require Import Algebra.Groups.FreeGroup.
 
Require Import Spaces.List.Core.
 
(** * Free Abelian Groups *)
 
Definition FactorsThroughFreeAbGroup (S : Type) (F_S : AbGroup)
  (i : S -> F_S) (A : AbGroup) (g : S -> A) : Type
  := {f : F_S $-> A & f o i == g}.
 
(** Universal property of a free abelian group on a set (type). *)
 
Class IsFreeAbGroupOn (S : Type) (F_S : AbGroup) (i : S -> F_S)
  := contr_isfreeabgroupon :: forall (A : AbGroup) (g : S -> A),
      Contr (FactorsThroughFreeAbGroup S F_S i A g).
 
(** A abelian group is free if there exists a generating type on which it is a free group (a basis). *)
 
Class IsFreeAbGroup (F_S : AbGroup)
  := isfreegroup : {S : _ & {i : _ & IsFreeAbGroupOn S F_S i}}.
 
Instance isfreeabgroup_isfreeabgroupon (S : Type) (F_S : AbGroup) (i : S -> F_S)
  {H : IsFreeAbGroupOn S F_S i}
  : IsFreeAbGroup F_S
  := (S; i; H).
 
(** The abelianization of the free group on a set is the free abelian group. *)
 
Definition FreeAbGroup (S : Type) : AbGroup
  := abel (FreeGroup S).
 
Arguments FreeAbGroup S : simpl never.
 
Definition freeabgroup_in {S : Type} : S -> FreeAbGroup S
  := abel_unit o freegroup_in.
 
Definition FreeAbGroup_rec {S : Type} {A : AbGroup} (f : S -> A)
  : FreeAbGroup S $-> A
  := grp_homo_abel_rec (FreeGroup_rec f).
 
Definition FreeAbGroup_rec_beta_in {S : Type} {A : AbGroup} (f : S -> A)
  : FreeAbGroup_rec f o freeabgroup_in == f
  := fun _ => idpath.
 
Definition FreeAbGroup_ind_homotopy {X : Type} {A : AbGroup}
  {f f' : FreeAbGroup X $-> A}
  (p : forall x, f (freeabgroup_in x) = f' (freeabgroup_in x))
  : f $== f'.
 
  snapply abel_ind_homotopy.
 
  snapply FreeGroup_ind_homotopy.
 
(** The abelianization of a free group on a set is a free abelian group on that set. *)
 
Instance isfreeabgroupon_isabelianization_isfreegroup `{Funext}
  {S : Type} {G : Group} {A : AbGroup} (f : S -> G) (g : G $-> A)
  {H1 : IsAbelianization A g} {H2 : IsFreeGroupOn S G f}
  : IsFreeAbGroupOn S A (g o f).
 
  unfold FactorsThroughFreeGroup, FactorsThroughFreeAbGroup.
 
  exact (equiv_functor_sigma_pb (equiv_group_precomp_isabelianization g B)).
 
(** As a special case, the free abelian group is a free abelian group. *)
 
Instance isfreeabgroup_freeabgroup `{Funext} (S : Type)
  : IsFreeAbGroup (FreeAbGroup S).
 
  exists S, freeabgroup_in.
 
  srapply isfreeabgroupon_isabelianization_isfreegroup.
 
(** Functoriality follows from the functoriality of [abel] and [FreeGroup]. *)
 
Instance is0functor_freeabgroup : Is0Functor FreeAbGroup := _.
 
Instance is1functor_freeabgroup : Is1Functor FreeAbGroup := _.