Timings for Kernel.v
Require Import Basics Types.
Require Import Algebra.Groups.Group.
Require Import Algebra.Groups.Subgroup.
Require Import WildCat.Core.
(** * Kernels of group homomorphisms *)
Local Open Scope mc_scope.
Local Open Scope mc_mult_scope.
Definition grp_kernel {A B : Group} (f : GroupHomomorphism A B) : NormalSubgroup A.
snrapply Build_NormalSubgroup.
srapply (Build_Subgroup' (fun x => f x = group_unit)).
intros x y p q; cbn in p, q; cbn.
refine (grp_homo_op _ _ _ @ ap011 _ p _ @ _).
rewrite q; apply right_inverse.
refine (_^-1 oE grp_moveL_M1).
refine (_ oE equiv_path_inverse _ _).
(** ** Corecursion principle for group kernels *)
Proposition grp_kernel_corec {A B G : Group} {f : A $-> B} (g : G $-> A)
(h : f $o g == grp_homo_const) : G $-> grp_kernel f.
snrapply Build_GroupHomomorphism.
exact (fun x:G => (g x; h x)).
apply path_sigma_hprop; cbn.
Theorem equiv_grp_kernel_corec `{Funext} {A B G : Group} {f : A $-> B}
: (G $-> grp_kernel f) <~> (exists g : G $-> A, f $o g == grp_homo_const).
srapply equiv_adjointify.
exact (grp_kernel_corec _ p).
apply path_sigma_hprop; unfold pr1.
apply equiv_path_grouphomomorphism; intro; reflexivity.
apply equiv_path_grouphomomorphism; intro x.
apply path_sigma_hprop; reflexivity.
(** ** Characterisation of group embeddings *)
Proposition equiv_kernel_isembedding `{Univalence} {A B : Group} (f : A $-> B)
: (grp_kernel f = trivial_subgroup :> Subgroup A) <~> IsEmbedding f.
refine (_ oE (equiv_path_subgroup' _ _)^-1%equiv).
apply equiv_iff_hprop_uncurried.
refine (iff_compose _ (isembedding_grouphomomorphism f)); split.
exact (ap _ p @ grp_homo_unit f).