Built with Alectryon, running Coq+SerAPI v8.19.0+0.19.3. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑Ctrl+↓ to navigate, Ctrl+🖱️ to focus. On Mac, use ⌘ instead of Ctrl.
[Loading ML file number_string_notation_plugin.cmxs (using legacy method) ... done]
Require Import Truncations.Core Modalities.Modality.Require Export Modalities.Modality (conn_map_factor1_image).Require Import Algebra.Groups.Group Universes.TruncType Universes.HSet.LocalOpen Scope mc_scope.LocalOpen Scope mc_mult_scope.Generalizable VariablesG H A B C N f g.(** * Subgroups *)(** ** Definition of being a subgroup *)(** A subgroup H of a group G is a predicate (i.e. an hProp-valued type family) on G which is closed under the group operations. The group underlying H is given by the total space { g : G & H g }, defined in [subgroup_group] below. *)ClassIsSubgroup {G : Group} (H : G -> Type) := {
issubgroup_predicate :: forallx, IsHProp (H x) ;
issubgroup_in_unit : H mon_unit ;
issubgroup_in_op : forallxy, H x -> H y -> H (x * y) ;
issubgroup_in_inv : forallx, H x -> H x^ ;
}.Definitionissig_issubgroup {G : Group} (H : G -> Type) : _ <~> IsSubgroup H
:= ltac:(issig).(** Basic properties of subgroups *)(** Smart constructor for subgroups. *)
G: Group H: G -> Type H0: forallx : G, IsHProp (H x) unit: H 1 c: forallxy : G, H x -> H y -> H (x * y^)
IsSubgroup H
G: Group H: G -> Type H0: forallx : G, IsHProp (H x) unit: H 1 c: forallxy : G, H x -> H y -> H (x * y^)
IsSubgroup H
G: Group H: G -> Type H0: forallx : G, IsHProp (H x) unit: H 1 c: forallxy : G, H x -> H y -> H (x * y^)
forallxy : G, H x -> H y -> H (x * y)
G: Group H: G -> Type H0: forallx : G, IsHProp (H x) unit: H 1 c: forallxy : G, H x -> H y -> H (x * y^)
forallx : G, H x -> H x^
G: Group H: G -> Type H0: forallx : G, IsHProp (H x) unit: H 1 c: forallxy : G, H x -> H y -> H (x * y^)
forallxy : G, H x -> H y -> H (x * y)
G: Group H: G -> Type H0: forallx : G, IsHProp (H x) unit: H 1 c: forallxy : G, H x -> H y -> H (x * y^) x, y: G
H x -> H y -> H (x * y)
G: Group H: G -> Type H0: forallx : G, IsHProp (H x) unit: H 1 c: forallxy : G, H x -> H y -> H (x * y^) x, y: G hx: H x hy: H y
H (x * y)
G: Group H: G -> Type H0: forallx : G, IsHProp (H x) unit: H 1 c: forallxy : G, H x -> H y -> H (x * y^) x, y: G hx: H x hy: H y c':= c 1 y: H 1 -> H y -> H (1 * y^)
H (x * y)
G: Group H: G -> Type H0: forallx : G, IsHProp (H x) unit: H 1 c: forallxy : G, H x -> H y -> H (x * y^) x, y: G hx: H x hy: H y c': H y -> H (1 * y^)
H (x * y)
G: Group H: G -> Type H0: forallx : G, IsHProp (H x) unit: H 1 x, y: G c: H x -> H y^ -> H (x * (y^)^) hx: H x hy: H y c': H y -> H (1 * y^)
H (x * y)
G: Group H: G -> Type H0: forallx : G, IsHProp (H x) unit: H 1 x, y: G c: H x -> H y^ -> H (x * y) hx: H x hy: H y c': H y -> H (1 * y^)
H (x * y)
G: Group H: G -> Type H0: forallx : G, IsHProp (H x) unit: H 1 x, y: G c: H x -> H y^ -> H (x * y) hx: H x hy: H y c': H y -> H y^
H (x * y)
G: Group H: G -> Type H0: forallx : G, IsHProp (H x) unit: H 1 x, y: G c: H x -> H y^ -> H (x * y) hx: H x hy: H y c': H y -> H y^
H x
G: Group H: G -> Type H0: forallx : G, IsHProp (H x) unit: H 1 x, y: G c: H x -> H y^ -> H (x * y) hx: H x hy: H y c': H y -> H y^
H y^
G: Group H: G -> Type H0: forallx : G, IsHProp (H x) unit: H 1 x, y: G c: H x -> H y^ -> H (x * y) hx: H x hy: H y c': H y -> H y^
H y^
exact (c' hy).
G: Group H: G -> Type H0: forallx : G, IsHProp (H x) unit: H 1 c: forallxy : G, H x -> H y -> H (x * y^)
forallx : G, H x -> H x^
G: Group H: G -> Type H0: forallx : G, IsHProp (H x) unit: H 1 c: forallxy : G, H x -> H y -> H (x * y^) g: G
H g -> H g^
G: Group H: G -> Type H0: forallx : G, IsHProp (H x) unit: H 1 g: G c: H g -> H (1 * g^)
H g -> H g^
G: Group H: G -> Type H0: forallx : G, IsHProp (H x) unit: H 1 g: G c: H g -> H g^
H g -> H g^
assumption.Defined.(** Additional lemmas about being elements in a subgroup *)SectionIsSubgroupElements.Context {G : Group} {H : G -> Type} `{IsSubgroup G H}.
G: Group H: G -> Type H0: IsSubgroup H x, y: G
H x -> H y -> H (x * y^)
G: Group H: G -> Type H0: IsSubgroup H x, y: G
H x -> H y -> H (x * y^)
G: Group H: G -> Type H0: IsSubgroup H x, y: G p: H x q: H y
H (x * y^)
G: Group H: G -> Type H0: IsSubgroup H x, y: G p: H x q: H y
H x
G: Group H: G -> Type H0: IsSubgroup H x, y: G p: H x q: H y
H y^
G: Group H: G -> Type H0: IsSubgroup H x, y: G p: H x q: H y
H y^
byapply issubgroup_in_inv.Defined.
G: Group H: G -> Type H0: IsSubgroup H x: G
H x^ -> H x
G: Group H: G -> Type H0: IsSubgroup H x: G
H x^ -> H x
G: Group H: G -> Type H0: IsSubgroup H x: G
H x^ -> H (x^)^
apply issubgroup_in_inv.Defined.
G: Group H: G -> Type H0: IsSubgroup H x, y: G
H x -> H y -> H (x^ * y)
G: Group H: G -> Type H0: IsSubgroup H x, y: G
H x -> H y -> H (x^ * y)
G: Group H: G -> Type H0: IsSubgroup H x, y: G p: H x q: H y
H (x^ * y)
G: Group H: G -> Type H0: IsSubgroup H x, y: G p: H x q: H y
H (x^ * (y^)^)
G: Group H: G -> Type H0: IsSubgroup H x, y: G p: H x q: H y
H x^
G: Group H: G -> Type H0: IsSubgroup H x, y: G p: H x q: H y
H y^
1,2: byapply issubgroup_in_inv.Defined.
G: Group H: G -> Type H0: IsSubgroup H x, y: G
H (x * y) -> H y -> H x
G: Group H: G -> Type H0: IsSubgroup H x, y: G
H (x * y) -> H y -> H x
G: Group H: G -> Type H0: IsSubgroup H x, y: G p: H (x * y) q: H y
H x
G: Group H: G -> Type H0: IsSubgroup H x, y: G p: H (x * y) q: H y
H (x * 1)
G: Group H: G -> Type H0: IsSubgroup H x, y: G
H (x * y) -> H y -> H (x * 1)
G: Group H: G -> Type H0: IsSubgroup H x, y: G
H (x * y) -> H y -> H (x * (y * y^))
G: Group H: G -> Type H0: IsSubgroup H x, y: G
H (x * y) -> H y -> H (x * y * y^)
apply issubgroup_in_op_inv.Defined.
G: Group H: G -> Type H0: IsSubgroup H x, y: G
H (x * y) -> H x -> H y
G: Group H: G -> Type H0: IsSubgroup H x, y: G
H (x * y) -> H x -> H y
G: Group H: G -> Type H0: IsSubgroup H x, y: G p: H (x * y) q: H x
H y
G: Group H: G -> Type H0: IsSubgroup H x, y: G p: H (x * y) q: H x
H (1 * y)
G: Group H: G -> Type H0: IsSubgroup H x, y: G
H x -> H (x * y) -> H (1 * y)
G: Group H: G -> Type H0: IsSubgroup H x, y: G
H x -> H (x * y) -> H (x^ * x * y)
G: Group H: G -> Type H0: IsSubgroup H x, y: G
H x -> H (x * y) -> H (x^ * (x * y))
apply issubgroup_in_inv_op.Defined.EndIsSubgroupElements.(** Given a predicate H on a group G, being a subgroup is a property. *)
F: Funext G: Group H: G -> Type
IsHProp (IsSubgroup H)
F: Funext G: Group H: G -> Type
IsHProp (IsSubgroup H)
exact (istrunc_equiv_istrunc _ (issig_issubgroup H)).Defined.(** Transporting being a subgroup across a pointwise equivalence. *)
G: Group H, K: G -> Type p: forallg : G, H g <~> K g
IsSubgroup H -> IsSubgroup K
G: Group H, K: G -> Type p: forallg : G, H g <~> K g
IsSubgroup H -> IsSubgroup K
G: Group H, K: G -> Type p: forallg : G, H g <~> K g H1: IsSubgroup H
IsSubgroup K
G: Group H, K: G -> Type p: forallg : G, H g <~> K g H1: IsSubgroup H
forallx : G, IsHProp (K x)
G: Group H, K: G -> Type p: forallg : G, H g <~> K g H1: IsSubgroup H
K 1
G: Group H, K: G -> Type p: forallg : G, H g <~> K g H1: IsSubgroup H
forallxy : G, K x -> K y -> K (x * y)
G: Group H, K: G -> Type p: forallg : G, H g <~> K g H1: IsSubgroup H
forallx : G, K x -> K x^
G: Group H, K: G -> Type p: forallg : G, H g <~> K g H1: IsSubgroup H
forallx : G, IsHProp (K x)
G: Group H, K: G -> Type p: forallg : G, H g <~> K g H1: IsSubgroup H x: G
IsHProp (K x)
G: Group H, K: G -> Type p: forallg : G, H g <~> K g H1: IsSubgroup H x: G
H x <~> K x
apply p.
G: Group H, K: G -> Type p: forallg : G, H g <~> K g H1: IsSubgroup H
K 1
apply p, issubgroup_in_unit.
G: Group H, K: G -> Type p: forallg : G, H g <~> K g H1: IsSubgroup H
forallxy : G, K x -> K y -> K (x * y)
G: Group H, K: G -> Type p: forallg : G, H g <~> K g H1: IsSubgroup H x, y: G inx: K x iny: K y
K (x * y)
G: Group H, K: G -> Type p: forallg : G, H g <~> K g H1: IsSubgroup H x, y: G inx: H x iny: H y
K (x * y)
exact (p _ (issubgroup_in_op x y inx iny)).
G: Group H, K: G -> Type p: forallg : G, H g <~> K g H1: IsSubgroup H
forallx : G, K x -> K x^
G: Group H, K: G -> Type p: forallg : G, H g <~> K g H1: IsSubgroup H x: G inx: K x
K x^
G: Group H, K: G -> Type p: forallg : G, H g <~> K g H1: IsSubgroup H x: G inx: H x
K x^
exact (p _ (issubgroup_in_inv x inx)).Defined.(** ** Definition of subgroup *)(** The type (set) of subgroups of a group G. *)RecordSubgroup (G : Group) := {
subgroup_pred : G -> Type ;
subgroup_issubgroup :: IsSubgroup subgroup_pred ;
}.Coercionsubgroup_pred : Subgroup >-> Funclass.Definitionissig_subgroup {G : Group} : _ <~> Subgroup G
:= ltac:(issig).(** ** Basics properties of subgroups *)
G: Group H: G -> Type H0: forallx : G, IsHProp (H x) unit: H 1 c: forallxy : G, H x -> H y -> H (x * y^)
Subgroup G
G: Group H: G -> Type H0: forallx : G, IsHProp (H x) unit: H 1 c: forallxy : G, H x -> H y -> H (x * y^)
Subgroup G
G: Group H: G -> Type H0: forallx : G, IsHProp (H x) unit: H 1 c: forallxy : G, H x -> H y -> H (x * y^)
IsSubgroup H
rapply Build_IsSubgroup'; assumption.Defined.SectionSubgroupElements.Context {G : Group} (H : Subgroup G) (xy : G).Definitionsubgroup_in_unit : H 1 := issubgroup_in_unit.Definitionsubgroup_in_inv : H x -> H x^ := issubgroup_in_inv x.Definitionsubgroup_in_inv' : H x^ -> H x := issubgroup_in_inv' x.Definitionsubgroup_in_op : H x -> H y -> H (x * y) := issubgroup_in_op x y.Definitionsubgroup_in_op_inv : H x -> H y -> H (x * y^) := issubgroup_in_op_inv x y.Definitionsubgroup_in_inv_op : H x -> H y -> H (x^ * y) := issubgroup_in_inv_op x y.Definitionsubgroup_in_op_l : H (x * y) -> H y -> H x := issubgroup_in_op_l x y.Definitionsubgroup_in_op_r : H (x * y) -> H x -> H y := issubgroup_in_op_r x y.EndSubgroupElements.
G: Group H: Subgroup G x: G
IsEquiv (subgroup_in_inv H x)
G: Group H: Subgroup G x: G
IsEquiv (subgroup_in_inv H x)
G: Group H: Subgroup G x: G
H x^ -> H x
apply subgroup_in_inv'.Defined.Definitionequiv_subgroup_inv {G : Group} (H : Subgroup G) (x : G)
: H x <~> H x^ := Build_Equiv _ _ (subgroup_in_inv H x) _.
G: Group H: Subgroup G x, y: G
H (x * y^) <~> H (y * x^)
G: Group H: Subgroup G x, y: G
H (x * y^) <~> H (y * x^)
G: Group H: Subgroup G x, y: G
H (x * y^)^ <~> H (y * x^)
byrewrite grp_inv_op, grp_inv_inv.Defined.(** Paths between subgroups correspond to homotopies between the underlying predicates. *)
F: Funext G: Group H, K: Subgroup G
H == K <~> H = K
F: Funext G: Group H, K: Subgroup G
H == K <~> H = K
F: Funext G: Group H, K: Subgroup G
H == K <~>
(H; subgroup_issubgroup G H) =
(K; subgroup_issubgroup G K)
F: Funext G: Group H, K: Subgroup G
H == K <~> H = K
apply equiv_path_arrow.Defined.
U: Univalence G: Group H, K: Subgroup G
(forallg : G, H g <-> K g) <~> H = K
U: Univalence G: Group H, K: Subgroup G
(forallg : G, H g <-> K g) <~> H = K
U: Univalence G: Group H, K: Subgroup G
(forallg : G, H g <-> K g) <~> H == K
U: Univalence G: Group H, K: Subgroup G g: G
(H g <-> K g) <~> H g = K g
exact equiv_path_iff_ishprop.Defined.
H: Univalence G: Group
IsHSet (Subgroup G)
H: Univalence G: Group
IsHSet (Subgroup G)
H: Univalence G: Group
IsHSet {H : G -> Type & IsSubgroup H}
H: Univalence G: Group
foralla : G -> Type, ?Goal a <~> IsSubgroup a
H: Univalence G: Group
IsHSet {x : _ & ?Goal x}
H: Univalence G: Group
foralla : G -> Type, ?Goal a <~> IsSubgroup a
intro P; apply issig_issubgroup.
H: Univalence G: Group
IsHSet
{P : G -> Type &
{_ : forallx : G, IsHProp (P x) &
{_ : P 1 &
{_ : forallxy : G, P x -> P y -> P (x * y) &
forallx : G, P x -> P x^}}}}
H: Univalence G: Group
IsHSet
{ap : {a : G -> Type & forallx : G, IsHProp (a x)}
&
{_ : ap.11 &
{_
: forallxy : G, ap.1 x -> ap.1 y -> ap.1 (x * y) &
forallx : G, ap.1 x -> ap.1 x^}}}
H: Univalence G: Group
IsHSet {a : G -> Type & forallx : G, IsHProp (a x)}
H: Univalence G: Group
foralla : {a : G -> Type & forallx : G, IsHProp (a x)},
IsHSet
{_ : a.11 &
{_ : forallxy : G, a.1 x -> a.1 y -> a.1 (x * y) &
forallx : G, a.1 x -> a.1 x^}}
H: Univalence G: Group
IsHSet {a : G -> Type & forallx : G, IsHProp (a x)}
H: Univalence G: Group
IsHSet (G -> {x : Type & IsHProp x})
apply istrunc_forall.Defined.(** ** Underlying group of a subgroup *)(** The group given by a subgroup *)
G: Group H: Subgroup G
Group
G: Group H: Subgroup G
Group
G: Group H: Subgroup G
IsGroup {x : _ & H x}
G: Group H: Subgroup G
IsHSet {x : _ & H x}
G: Group H: Subgroup G
Associative sg_op
G: Group H: Subgroup G
LeftIdentity sg_op 1
G: Group H: Subgroup G
RightIdentity sg_op 1
G: Group H: Subgroup G
LeftInverse sg_op inv 1
G: Group H: Subgroup G
RightInverse sg_op inv 1
G: Group H: Subgroup G
Associative sg_op
G: Group H: Subgroup G
LeftIdentity sg_op 1
G: Group H: Subgroup G
RightIdentity sg_op 1
G: Group H: Subgroup G
LeftInverse sg_op inv 1
G: Group H: Subgroup G
RightInverse sg_op inv 1
1-5: grp_auto.Defined.Coercionsubgroup_group : Subgroup >-> Group.(** The underlying group of a subgroup of [G] has an inclusion map into [G]. *)
G: Group H: Subgroup G
H $-> G
G: Group H: Subgroup G
H $-> G
G: Group H: Subgroup G
H -> G
G: Group H: Subgroup G
IsSemiGroupPreserving ?grp_homo_map
G: Group H: Subgroup G
IsSemiGroupPreserving pr1
hnf; reflexivity.Defined.(** The inclusion map is an embedding. *)Instanceisembedding_subgroup_incl {G : Group} (H : Subgroup G)
: IsEmbedding (subgroup_incl H)
:= fun_ => istrunc_equiv_istrunc _ (hfiber_fibration _ _).(** Restriction of a group homomorphism to a subgroup. *)Definitiongrp_homo_restr {GH : Group} (f : G $-> H) (K : Subgroup G)
: subgroup_group K $-> H
:= f $o subgroup_incl _.(** Corestriction of a group homomorphism to a subgroup. *)
G, H: Group K: Subgroup H f: G $-> H g: forallx : G, K (f x)
G $-> K
G, H: Group K: Subgroup H f: G $-> H g: forallx : G, K (f x)
G $-> K
G, H: Group K: Subgroup H f: G $-> H g: forallx : G, K (f x)
G -> K
G, H: Group K: Subgroup H f: G $-> H g: forallx : G, K (f x)
IsSemiGroupPreserving ?grp_homo_map
G, H: Group K: Subgroup H f: G $-> H g: forallx : G, K (f x)
G -> K
exact (funx => (f x; g x)).
G, H: Group K: Subgroup H f: G $-> H g: forallx : G, K (f x)
IsSemiGroupPreserving (funx : G => (f x; g x))
G, H: Group K: Subgroup H f: G $-> H g: forallx : G, K (f x) x, y: G
(f (x * y); g (x * y)) = (f x; g x) * (f y; g y)
G, H: Group K: Subgroup H f: G $-> H g: forallx : G, K (f x) x, y: G
(f (x * y); g (x * y)).1 = ((f x; g x) * (f y; g y)).1
snapply grp_homo_op.Defined.(** Corestriction is an equivalence on group homomorphisms. *)
F: Funext G, H: Group K: Subgroup H
{f : G $-> H & forallx : G, K (f x)} <~> (G $-> K)
F: Funext G, H: Group K: Subgroup H
{f : G $-> H & forallx : G, K (f x)} <~> (G $-> K)
F: Funext G, H: Group K: Subgroup H
{f : G $-> H & forallx : G, K (f x)} -> G $-> K
F: Funext G, H: Group K: Subgroup H
(G $-> K) -> {f : G $-> H & forallx : G, K (f x)}
F: Funext G, H: Group K: Subgroup H
?f o ?g == idmap
F: Funext G, H: Group K: Subgroup H
?g o ?f == idmap
F: Funext G, H: Group K: Subgroup H
{f : G $-> H & forallx : G, K (f x)} -> G $-> K
exact (sig_rec subgroup_corec).
F: Funext G, H: Group K: Subgroup H
(G $-> K) -> {f : G $-> H & forallx : G, K (f x)}
F: Funext G, H: Group K: Subgroup H g: G $-> K
{f : G $-> H & forallx : G, K (f x)}
F: Funext G, H: Group K: Subgroup H g: G $-> K
forallx : G, K ((subgroup_incl K $o g) x)
F: Funext G, H: Group K: Subgroup H g: G $-> K x: G
K ((subgroup_incl K $o g) x)
exact (g x).2.
F: Funext G, H: Group K: Subgroup H
sig_rec subgroup_corec
o (fung : G $-> K =>
(subgroup_incl K $o g; funx : G => (g x).2)) ==
idmap
F: Funext G, H: Group K: Subgroup H g: G $-> K
sig_rec subgroup_corec
(subgroup_incl K $o g; funx : G => (g x).2) = g
by snapply equiv_path_grouphomomorphism.
F: Funext G, H: Group K: Subgroup H
(fung : G $-> K =>
(subgroup_incl K $o g; funx : G => (g x).2))
o sig_rec subgroup_corec == idmap
F: Funext G, H: Group K: Subgroup H f: G $-> H p: forallx : G, K (f x)
(subgroup_incl K $o sig_rec subgroup_corec (f; p);
funx : G => (sig_rec subgroup_corec (f; p) x).2) =
(f; p)
F: Funext G, H: Group K: Subgroup H f: G $-> H p: forallx : G, K (f x)
(subgroup_incl K $o sig_rec subgroup_corec (f; p);
funx : G => (sig_rec subgroup_corec (f; p) x).2).1 =
(f; p).1
by snapply equiv_path_grouphomomorphism.Defined.(** Functoriality on subgroups. *)Definitionfunctor_subgroup_group {GH : Group} {J : Subgroup G} {K : Subgroup H}
(f : G $-> H) (g : forallx, J x -> K (f x))
: subgroup_group J $-> subgroup_group K
:= subgroup_corec (grp_homo_restr f J) (sig_ind _ g).
G, H: Group J: Subgroup G K: Subgroup H e: G $<~> H f: forallx : G, J x <-> K (e x)
J $<~> K
G, H: Group J: Subgroup G K: Subgroup H e: G $<~> H f: forallx : G, J x <-> K (e x)
J $<~> K
G, H: Group J: Subgroup G K: Subgroup H e: G $<~> H f: forallx : G, J x <-> K (e x)
J $-> K
G, H: Group J: Subgroup G K: Subgroup H e: G $<~> H f: forallx : G, J x <-> K (e x)
K $-> J
G, H: Group J: Subgroup G K: Subgroup H e: G $<~> H f: forallx : G, J x <-> K (e x)
?f $o ?g $== Id K
G, H: Group J: Subgroup G K: Subgroup H e: G $<~> H f: forallx : G, J x <-> K (e x)
?g $o ?f $== Id J
G, H: Group J: Subgroup G K: Subgroup H e: G $<~> H f: forallx : G, J x <-> K (e x)
J $-> K
exact (functor_subgroup_group e (funx => fst (f x))).
G, H: Group J: Subgroup G K: Subgroup H e: G $<~> H f: forallx : G, J x <-> K (e x)
K $-> J
G, H: Group J: Subgroup G K: Subgroup H e: G $<~> H f: forallx : G, J x <-> K (e x)
forallx : H, K x -> J (e^-1$ x)
G, H: Group J: Subgroup G K: Subgroup H e: G $<~> H f: forallx : G, J x <-> K (e x) x: G
K (e x) -> J (e^-1$ (e x))
G, H: Group J: Subgroup G K: Subgroup H e: G $<~> H f: forallx : G, J x <-> K (e x) x: G k: K (e x)
J (e^-1$ (e x))
G, H: Group J: Subgroup G K: Subgroup H e: G $<~> H f: forallx : G, J x <-> K (e x) x: G k: K (e x)
J x
exact (snd (f x) k).
G, H: Group J: Subgroup G K: Subgroup H e: G $<~> H f: forallx : G, J x <-> K (e x)
functor_subgroup_group e (funx : G => fst (f x)) $o
functor_subgroup_group e^-1$
(equiv_ind e (funx : H => K x -> J (e^-1$ x))
(fun (x : G) (k : K (e x)) =>
transport J (eissect e x)^ (snd (f x) k))
:
forallx : H, K x -> J (e^-1$ x)) $== Id K
G, H: Group J: Subgroup G K: Subgroup H e: G $<~> H f: forallx : G, J x <-> K (e x) x: K
(functor_subgroup_group e (funx : G => fst (f x)) $o
functor_subgroup_group e^-1$
(equiv_ind e (funx : H => K x -> J (e^-1$ x))
(fun (x : G) (k : K (e x)) =>
transport J (eissect e x)^ (snd (f x) k)))) x =
Id K x
G, H: Group J: Subgroup G K: Subgroup H e: G $<~> H f: forallx : G, J x <-> K (e x) x: K
((functor_subgroup_group e (funx : G => fst (f x)) $o
functor_subgroup_group e^-1$
(equiv_ind e (funx : H => K x -> J (e^-1$ x))
(fun (x : G) (k : K (e x)) =>
transport J (eissect e x)^ (snd (f x) k)))) x).1 =
(Id K x).1
napply eisretr.
G, H: Group J: Subgroup G K: Subgroup H e: G $<~> H f: forallx : G, J x <-> K (e x)
functor_subgroup_group e^-1$
(equiv_ind e (funx : H => K x -> J (e^-1$ x))
(fun (x : G) (k : K (e x)) =>
transport J (eissect e x)^ (snd (f x) k))
:
forallx : H, K x -> J (e^-1$ x)) $o
functor_subgroup_group e (funx : G => fst (f x)) $==
Id J
G, H: Group J: Subgroup G K: Subgroup H e: G $<~> H f: forallx : G, J x <-> K (e x) x: J
(functor_subgroup_group e^-1$
(equiv_ind e (funx : H => K x -> J (e^-1$ x))
(fun (x : G) (k : K (e x)) =>
transport J (eissect e x)^ (snd (f x) k))) $o
functor_subgroup_group e (funx : G => fst (f x))) x =
Id J x
G, H: Group J: Subgroup G K: Subgroup H e: G $<~> H f: forallx : G, J x <-> K (e x) x: J
((functor_subgroup_group e^-1$
(equiv_ind e (funx : H => K x -> J (e^-1$ x))
(fun (x : G) (k : K (e x)) =>
transport J (eissect e x)^ (snd (f x) k))) $o
functor_subgroup_group e (funx : G => fst (f x))) x).1 =
(Id J x).1
napply eissect.Defined.(** ** Cosets of subgroups *)SectionCosets.(** Left and right cosets give equivalence relations. *)Context {G : Group} (H : Subgroup G).(** The relation of being in a left coset represented by an element. *)Definitionin_cosetL : Relation G := funxy => H (x^ * y).(** The relation of being in a right coset represented by an element. *)Definitionin_cosetR : Relation G := funxy => H (x * y^).Hint Extern4 => progressunfold in_cosetL : typeclass_instances.Hint Extern4 => progressunfold in_cosetR : typeclass_instances.GlobalArguments in_cosetL /.GlobalArguments in_cosetR /.(** These are props *)#[export] Instanceishprop_in_cosetL : is_mere_relation G in_cosetL := _.#[export] Instanceishprop_in_cosetR : is_mere_relation G in_cosetR := _.(** In fact, they are both equivalence relations. *)
G: Group H: Subgroup G
Reflexive in_cosetL
G: Group H: Subgroup G
Reflexive in_cosetL
G: Group H: Subgroup G x: G
H (x^ * x)
G: Group H: Subgroup G x: G
H 1
exact issubgroup_in_unit.Defined.
G: Group H: Subgroup G
Reflexive in_cosetR
G: Group H: Subgroup G
Reflexive in_cosetR
G: Group H: Subgroup G x: G
H (x * x^)
G: Group H: Subgroup G x: G
H 1
exact issubgroup_in_unit.Defined.
G: Group H: Subgroup G
Symmetric in_cosetL
G: Group H: Subgroup G
Symmetric in_cosetL
G: Group H: Subgroup G x, y: G h: H (x^ * y)
H (y^ * x)
G: Group H: Subgroup G x, y: G h: H (x^ * y)
H (y^ * (x^)^)
G: Group H: Subgroup G x, y: G h: H (x^ * y)
H (x^ * y)^
apply issubgroup_in_inv; assumption.Defined.
G: Group H: Subgroup G
Symmetric in_cosetR
G: Group H: Subgroup G
Symmetric in_cosetR
G: Group H: Subgroup G x, y: G h: H (x * y^)
H (y * x^)
G: Group H: Subgroup G x, y: G h: H (x * y^)
H ((y^)^ * x^)
G: Group H: Subgroup G x, y: G h: H (x * y^)
H (x * y^)^
apply issubgroup_in_inv; assumption.Defined.
G: Group H: Subgroup G
Transitive in_cosetL
G: Group H: Subgroup G
Transitive in_cosetL
G: Group H: Subgroup G x, y, z: G h: H (x^ * y) k: H (y^ * z)
H (x^ * z)
G: Group H: Subgroup G x, y, z: G h: H (x^ * y) k: H (y^ * z)
H (x^ * 1 * z)
G: Group H: Subgroup G x, y, z: G h: H (x^ * y) k: H (y^ * z)
H (x^ * (y * y^) * z)
G: Group H: Subgroup G x, y, z: G h: H (x^ * y) k: H (y^ * z)
H (x^ * y * y^ * z)
G: Group H: Subgroup G x, y, z: G h: H (x^ * y) k: H (y^ * z)
H (x^ * y * (y^ * z))
apply issubgroup_in_op; assumption.Defined.
G: Group H: Subgroup G
Transitive in_cosetR
G: Group H: Subgroup G
Transitive in_cosetR
G: Group H: Subgroup G x, y, z: G h: H (x * y^) k: H (y * z^)
H (x * z^)
G: Group H: Subgroup G x, y, z: G h: H (x * y^) k: H (y * z^)
H (x * 1 * z^)
G: Group H: Subgroup G x, y, z: G h: H (x * y^) k: H (y * z^)
H (x * (y^ * y) * z^)
G: Group H: Subgroup G x, y, z: G h: H (x * y^) k: H (y * z^)
H (x * y^ * y * z^)
G: Group H: Subgroup G x, y, z: G h: H (x * y^) k: H (y * z^)
H (x * y^ * (y * z^))
apply issubgroup_in_op; assumption.Defined.EndCosets.(** ** Properties of left and right cosets *)
G: Group N: Subgroup G
forallxy : G,
in_cosetL N (x^ * y) 1 <~> in_cosetL N x y
G: Group N: Subgroup G
forallxy : G,
in_cosetL N (x^ * y) 1 <~> in_cosetL N x y
forallxy : G,
in_cosetR N (x * y^) 1 <~> in_cosetR N x y
G: Group N: Subgroup G
forallxy : G,
in_cosetR N (x * y^) 1 <~> in_cosetR N x y
G: Group N: Subgroup G x, y: G
N (x * y^ * 1^) <~> N (x * y^)
G: Group N: Subgroup G x, y: G
N (x * y^ * 1) <~> N (x * y^)
G: Group N: Subgroup G x, y: G
N (x * y^) <~> N (x * y^)
reflexivity.Defined.(** Symmetry is an equivalence. *)
G: Group N: Subgroup G
forallxy : G, in_cosetL N x y <~> in_cosetL N y x
G: Group N: Subgroup G
forallxy : G, in_cosetL N x y <~> in_cosetL N y x
G: Group N: Subgroup G x, y: G
in_cosetL N x y <~> in_cosetL N y x
G: Group N: Subgroup G x, y: G
in_cosetL N x y -> in_cosetL N y x
G: Group N: Subgroup G x, y: G
in_cosetL N y x -> in_cosetL N x y
all: byintro.Defined.
G: Group N: Subgroup G
forallxy : G, in_cosetR N x y <~> in_cosetR N y x
G: Group N: Subgroup G
forallxy : G, in_cosetR N x y <~> in_cosetR N y x
G: Group N: Subgroup G x, y: G
in_cosetR N x y <~> in_cosetR N y x
G: Group N: Subgroup G x, y: G
in_cosetR N x y -> in_cosetR N y x
G: Group N: Subgroup G x, y: G
in_cosetR N y x -> in_cosetR N x y
all: byintro.Defined.(** The sigma type of a left coset is equivalent to the sigma type of the subgroup. *)
G: Group H: Subgroup G x: G
{x0 : _ & in_cosetL H x x0} <~> {x : _ & H x}
G: Group H: Subgroup G x: G
{x0 : _ & in_cosetL H x x0} <~> {x : _ & H x}
G: Group H: Subgroup G x: G
G <~> G
G: Group H: Subgroup G x: G
foralla : G, in_cosetL H x a <~> H (?f a)
G: Group H: Subgroup G x: G
G <~> G
rapply (Build_Equiv _ _ (x^ *.)).
G: Group H: Subgroup G x: G
foralla : G,
in_cosetL H x a <~>
H
({|
equiv_fun := sg_op x^;
equiv_isequiv := isequiv_group_left_op x^
|} a)
reflexivity.Defined.(** The sigma type of a right coset is equivalent to the sigma type of the subgroup. *)
G: Group H: Subgroup G x: G
{x0 : _ & in_cosetR H x x0} <~> {x : _ & H x}
G: Group H: Subgroup G x: G
{x0 : _ & in_cosetR H x x0} <~> {x : _ & H x}
G: Group H: Subgroup G x: G
G <~> G
G: Group H: Subgroup G x: G
foralla : G, in_cosetR H x a <~> H (?f a)
G: Group H: Subgroup G x: G
G <~> G
rapply (Build_Equiv _ _ (.* x ^)).
G: Group H: Subgroup G x: G
foralla : G,
in_cosetR H x a <~>
H
({|
equiv_fun := funy : G => y * x^;
equiv_isequiv := isequiv_group_right_op G x^
|} a)
G: Group H: Subgroup G x, y: G
H (x * y^) <~> H (y * x^)
apply equiv_subgroup_op_inv.Defined.(** ** Normal subgroups *)(** A normal subgroup is a subgroup closed under conjugation. *)ClassIsNormalSubgroup {G : Group} (N : Subgroup G)
:= isnormal : forall {xy}, N (x * y) -> N (y * x).RecordNormalSubgroup (G : Group) := {
normalsubgroup_subgroup : Subgroup G ;
normalsubgroup_isnormal :: IsNormalSubgroup normalsubgroup_subgroup ;
}.Arguments Build_NormalSubgroup G N _ : rename.Coercionnormalsubgroup_subgroup : NormalSubgroup >-> Subgroup.
G: Group N: Subgroup G IsNormalSubgroup0: IsNormalSubgroup N
forallxy : G, N (x * y) <~> N (y * x)
G: Group N: Subgroup G IsNormalSubgroup0: IsNormalSubgroup N
forallxy : G, N (x * y) <~> N (y * x)
G: Group N: Subgroup G IsNormalSubgroup0: IsNormalSubgroup N x, y: G
N (x * y) <~> N (y * x)
G: Group N: Subgroup G IsNormalSubgroup0: IsNormalSubgroup N x, y: G
N (x * y) -> N (y * x)
G: Group N: Subgroup G IsNormalSubgroup0: IsNormalSubgroup N x, y: G
N (y * x) -> N (x * y)
all: exact isnormal.Defined.(** Our definition of normal subgroup implies the usual definition of invariance under conjugation. *)
G: Group N: Subgroup G IsNormalSubgroup0: IsNormalSubgroup N x, y: G
N x <~> N (y * x * y^)
G: Group N: Subgroup G IsNormalSubgroup0: IsNormalSubgroup N x, y: G
N x <~> N (y * x * y^)
G: Group N: Subgroup G IsNormalSubgroup0: IsNormalSubgroup N x, y: G
N x <~> N (y^ * (y * x))
byrewrite grp_inv_V_gg.Defined.(** We can show a subgroup is normal if it is invariant under conjugation. *)
G: Group N: Subgroup G isnormal: forallxy : G, N x -> N (y * x * y^)
IsNormalSubgroup N
G: Group N: Subgroup G isnormal: forallxy : G, N x -> N (y * x * y^)
IsNormalSubgroup N
G: Group N: Subgroup G isnormal: forallxy : G, N x -> N (y * x * y^) x, y: G n: N (x * y)
N (y * x)
G: Group N: Subgroup G isnormal: forallxy : G, N x -> N (y * x * y^) x, y: G n: N (x * y)
N (y * x * 1)
G: Group N: Subgroup G isnormal: forallxy : G, N x -> N (y * x * y^) x, y: G n: N (x * y)
N (y * x * (y * y^))
G: Group N: Subgroup G isnormal: forallxy : G, N x -> N (y * x * y^) x, y: G n: N (x * y)
N (y * x * y * y^)
G: Group N: Subgroup G isnormal: forallxy : G, N x -> N (y * x * y^) x, y: G n: N (x * y)
N (y * (x * y) * y^)
byapply isnormal.Defined.(** Under funext, being a normal subgroup is a hprop. *)
H: Funext G: Group N: Subgroup G
IsHProp (IsNormalSubgroup N)
H: Funext G: Group N: Subgroup G
IsHProp (IsNormalSubgroup N)
unfold IsNormalSubgroup; exact _.Defined.(** Our definition of normal subgroup and the usual definition are therefore equivalent. *)
H: Funext G: Group N: Subgroup G
IsNormalSubgroup N <~>
(forallxy : G, N x -> N (y * x * y^))
H: Funext G: Group N: Subgroup G
IsNormalSubgroup N <~>
(forallxy : G, N x -> N (y * x * y^))
H: Funext G: Group N: Subgroup G
IsNormalSubgroup N ->
forallxy : G, N x -> N (y * x * y^)
H: Funext G: Group N: Subgroup G
(forallxy : G, N x -> N (y * x * y^)) ->
IsNormalSubgroup N
H: Funext G: Group N: Subgroup G
IsNormalSubgroup N ->
forallxy : G, N x -> N (y * x * y^)
H: Funext G: Group N: Subgroup G is_normal: IsNormalSubgroup N x, y: G
N x -> N (y * x * y^)
rapply isnormal_conj.
H: Funext G: Group N: Subgroup G
(forallxy : G, N x -> N (y * x * y^)) ->
IsNormalSubgroup N
H: Funext G: Group N: Subgroup G is_normal': forallxy : G, N x -> N (y * x * y^)
IsNormalSubgroup N
by snapply Build_IsNormalSubgroup'.Defined.(** Inner automorphisms of a group [G] restrict to automorphisms of normal subgroups. *)
G: Group N: Subgroup G IsNormalSubgroup0: IsNormalSubgroup N x: G
N $<~> N
G: Group N: Subgroup G IsNormalSubgroup0: IsNormalSubgroup N x: G
N $<~> N
G: Group N: Subgroup G IsNormalSubgroup0: IsNormalSubgroup N x: G
G $<~> G
G: Group N: Subgroup G IsNormalSubgroup0: IsNormalSubgroup N x: G
forallx0 : G, N x0 <-> N (?e x0)
G: Group N: Subgroup G IsNormalSubgroup0: IsNormalSubgroup N x: G
G $<~> G
exact (grp_iso_conj x).
G: Group N: Subgroup G IsNormalSubgroup0: IsNormalSubgroup N x: G
forallx0 : G, N x0 <-> N (grp_iso_conj x x0)
G: Group N: Subgroup G IsNormalSubgroup0: IsNormalSubgroup N x, y: G
N y <-> N (grp_iso_conj x y)
rapply isnormal_conj.Defined.(** Left and right cosets are equivalent in normal subgroups. *)Definitionequiv_in_cosetL_in_cosetR_normalsubgroup {G : Group}
(N : NormalSubgroup G) (xy : G)
: in_cosetL N x y <~> in_cosetR N x y
:= equiv_in_cosetR_symm _ _ oE equiv_symmetric_in_normalsubgroup _ _ _.(** Inverses are then respected *)
G: Group N: NormalSubgroup G x, y: G
in_cosetL N x^ y^ <~> in_cosetL N x y
G: Group N: NormalSubgroup G x, y: G
in_cosetL N x^ y^ <~> in_cosetL N x y
G: Group N: NormalSubgroup G x, y: G
N (x^ * (y^)^) <~> N (x^ * y)
byrewrite inverse_involutive.Defined.
G: Group N: NormalSubgroup G x, y: G
in_cosetR N x^ y^ <~> in_cosetR N x y
G: Group N: NormalSubgroup G x, y: G
in_cosetR N x^ y^ <~> in_cosetR N x y
G: Group N: NormalSubgroup G x, y: G
N (x * ((y^)^)^) <~> N (x * y^)
byrewrite grp_inv_inv.Defined.(** This lets us prove that left and right coset relations are congruences. *)
G: Group N: NormalSubgroup G x, x', y, y': G
in_cosetL N x y ->
in_cosetL N x' y' -> in_cosetL N (x * x') (y * y')
G: Group N: NormalSubgroup G x, x', y, y': G
in_cosetL N x y ->
in_cosetL N x' y' -> in_cosetL N (x * x') (y * y')
G: Group N: NormalSubgroup G x, x', y, y': G p: N (x^ * y) q: N (x'^ * y')
N ((x * x')^ * (y * y'))
(** rewrite goal before applying subgroup_op *)
G: Group N: NormalSubgroup G x, x', y, y': G p: N (x^ * y) q: N (x'^ * y')
N (x'^ * (x^ * (y * y')))
G: Group N: NormalSubgroup G x, x', y, y': G p: N (x^ * y) q: N (x'^ * y')
N (x^ * (y * y') * x'^)
G: Group N: NormalSubgroup G x, x', y, y': G p: N (x^ * y) q: N (x'^ * y')
N (x^ * y * (y' * x'^))
G: Group N: NormalSubgroup G x, x', y, y': G p: N (x^ * y) q: N (x'^ * y')
N (x^ * y)
G: Group N: NormalSubgroup G x, x', y, y': G p: N (x^ * y) q: N (x'^ * y')
N (y' * x'^)
G: Group N: NormalSubgroup G x, x', y, y': G p: N (x^ * y) q: N (x'^ * y')
N (y' * x'^)
G: Group N: NormalSubgroup G x, x', y, y': G p: N (x^ * y) q: N (x'^ * y')
N (x'^ * y')
exact q.Defined.
G: Group N: NormalSubgroup G x, x', y, y': G
in_cosetR N x y ->
in_cosetR N x' y' -> in_cosetR N (x * x') (y * y')
G: Group N: NormalSubgroup G x, x', y, y': G
in_cosetR N x y ->
in_cosetR N x' y' -> in_cosetR N (x * x') (y * y')
G: Group N: NormalSubgroup G x, x', y, y': G p: N (x * y^) q: N (x' * y'^)
N (x * x' * (y * y')^)
(** rewrite goal before applying subgroup_op *)
G: Group N: NormalSubgroup G x, x', y, y': G p: N (x * y^) q: N (x' * y'^)
N (x * x' * y'^ * y^)
G: Group N: NormalSubgroup G x, x', y, y': G p: N (x * y^) q: N (x' * y'^)
N (y^ * (x * x' * y'^))
G: Group N: NormalSubgroup G x, x', y, y': G p: N (x * y^) q: N (x' * y'^)
N (y^ * x * (x' * y'^))
G: Group N: NormalSubgroup G x, x', y, y': G p: N (x * y^) q: N (x' * y'^)
N (y^ * x)
G: Group N: NormalSubgroup G x, x', y, y': G p: N (x * y^) q: N (x' * y'^)
N (x' * y'^)
G: Group N: NormalSubgroup G x, x', y, y': G p: N (x * y^) q: N (x' * y'^)
N (y^ * x)
G: Group N: NormalSubgroup G x, x', y, y': G p: N (x * y^) q: N (x' * y'^)
N (x * y^)
exact p.Defined.(** ** Trivial subgroup *)(** The trivial subgroup of a group [G]. *)
G: Group
Subgroup G
G: Group
Subgroup G
G: Group
1 = 1
G: Group
forallxy : G, x = 1 -> y = 1 -> x * y^ = 1
G: Group
forallxy : G, x = 1 -> y = 1 -> x * y^ = 1
G: Group x, y: G p: x = 1 q: y = 1
x * y^ = 1
G: Group x, y: G p: x = 1 q: y = 1
1 * 1^ = 1
G: Group x, y: G p: x = 1 q: y = 1
1^ = 1
apply grp_inv_unit.Defined.(** The trivial subgroup is always included in any subgroup. *)
G: Group H: Subgroup G
forallx : G, trivial_subgroup G x -> H x
G: Group H: Subgroup G
forallx : G, trivial_subgroup G x -> H x
G: Group H: Subgroup G
H 1
exact issubgroup_in_unit.Defined.(** The trivial subgroup is a normal subgroup. *)
G: Group
IsNormalSubgroup (trivial_subgroup G)
G: Group
IsNormalSubgroup (trivial_subgroup G)
G: Group x, y: G p: x * y = 1
y * x = 1
G: Group x, y: G p: x = y^
y * x = 1
byapply grp_moveL_V1.Defined.(** The property of being the trivial subgroup. Note that any group can be automatically coerced to its maximal subgroup, so it makes sense for this predicate to be applied to groups in general. *)ClassIsTrivialGroup@{i} {G : Group@{i}} (H : Subgroup@{i i} G) :=
istrivialgroup : forallx, H x -> trivial_subgroup G x.Instanceishprop_istrivialgroup `{F : Funext} {G : Group} (H : Subgroup G)
: IsHProp (IsTrivialGroup H)
:= istrunc_forall.Instanceistrivial_trivial_subgroup {G : Group}
: IsTrivialGroup (trivial_subgroup G)
:= funx => idmap.(** Trivial groups are isomorphic to the trivial group. *)
G: Group H: Subgroup G
IsTrivialGroup H <-> H $<~> grp_trivial
G: Group H: Subgroup G
IsTrivialGroup H <-> H $<~> grp_trivial
G: Group H: Subgroup G
IsTrivialGroup H -> H $<~> grp_trivial
G: Group H: Subgroup G
H $<~> grp_trivial -> IsTrivialGroup H
G: Group H: Subgroup G
IsTrivialGroup H -> H $<~> grp_trivial
G: Group H: Subgroup G triv: IsTrivialGroup H
H $<~> grp_trivial
G: Group H: Subgroup G triv: IsTrivialGroup H
H $-> grp_trivial
G: Group H: Subgroup G triv: IsTrivialGroup H
grp_trivial $-> H
G: Group H: Subgroup G triv: IsTrivialGroup H
?f $o ?g $== Id grp_trivial
G: Group H: Subgroup G triv: IsTrivialGroup H
?g $o ?f $== Id H
G: Group H: Subgroup G triv: IsTrivialGroup H
grp_homo_const $o grp_homo_const $== Id grp_trivial
G: Group H: Subgroup G triv: IsTrivialGroup H
grp_homo_const $o grp_homo_const $== Id H
G: Group H: Subgroup G triv: IsTrivialGroup H
grp_homo_const $o grp_homo_const $== Id grp_trivial
byintros [].
G: Group H: Subgroup G triv: IsTrivialGroup H
grp_homo_const $o grp_homo_const $== Id H
G: Group H: Subgroup G triv: IsTrivialGroup H x: G Hx: H x
(1; issubgroup_in_unit) = (x; Hx)
G: Group H: Subgroup G triv: IsTrivialGroup H x: G Hx: H x
(1; issubgroup_in_unit).1 = (x; Hx).1
G: Group H: Subgroup G triv: IsTrivialGroup H x: G Hx: H x
(x; Hx).1 = (1; issubgroup_in_unit).1
byapply triv.
G: Group H: Subgroup G
H $<~> grp_trivial -> IsTrivialGroup H
G: Group H: Subgroup G e: H $<~> grp_trivial x: G Hx: H x
trivial_subgroup G x
G: Group H: Subgroup G e: H $<~> grp_trivial x: G Hx: H x
(x; Hx).1 = (1; 1%path).1
G: Group H: Subgroup G e: H $<~> grp_trivial x: G Hx: H x
H 1
G: Group H: Subgroup G e: H $<~> grp_trivial x: G Hx: H x
(x; Hx) = (1; ?proj2)
G: Group H: Subgroup G e: H $<~> grp_trivial x: G Hx: H x
(x; Hx) = (1; subgroup_in_unit H)
G: Group H: Subgroup G e: H $<~> grp_trivial x: G Hx: H x
(x; Hx) = e^-1$ 1
G: Group H: Subgroup G e: H $<~> grp_trivial x: G Hx: H x
e (x; Hx) = 1
apply path_contr.Defined.(** All trivial subgroups are isomorphic as groups. *)
G, H: Group J: Subgroup G K: Subgroup H e: J $<~> K
IsTrivialGroup J -> IsTrivialGroup K
G, H: Group J: Subgroup G K: Subgroup H e: J $<~> K
IsTrivialGroup J -> IsTrivialGroup K
G, H: Group J: Subgroup G K: Subgroup H e: J $<~> K triv: IsTrivialGroup J
IsTrivialGroup K
G, H: Group J: Subgroup G K: Subgroup H e: J $<~> K triv: J $<~> grp_trivial
IsTrivialGroup K
G, H: Group J: Subgroup G K: Subgroup H e: J $<~> K triv: J $<~> grp_trivial
K $<~> grp_trivial
exact (triv $oE e^-1$).Defined.(** ** Maximal Subgroups *)(** Every group is a (maximal) subgroup of itself. *)
G: Group
Subgroup G
G: Group
Subgroup G
G: Group
IsSubgroup (fun_ : G => Unit)
split; auto; exact _.Defined.(** We wish to coerce a group to its maximal subgroup. However, if we don't explicitly print [maximal_subgroup] things can get confusing, so we mark it as a coercion to be printed. *)Coercionmaximal_subgroup : Group >-> Subgroup.Add Printing Coercion maximal_subgroup.(** The group associated to the maximal subgroup is the original group. Note that this equivalence does not characterize the maximal subgroup, as a proper subgroup can be isomorphic to the whole group. For example, the even integers are isomorphic to the integers. *)
hnf; reflexivity.Defined.(** The maximal subgroup (the group itself) is a normal subgroup. *)
G: Group
IsNormalSubgroup (maximal_subgroup G)
G: Group
IsNormalSubgroup (maximal_subgroup G)
intros x y p; exact tt.Defined.(** The property of being a maximal subgroup of a group [G]. *)ClassIsMaximalSubgroup {G : Group} (H : Subgroup G) :=
ismaximalsubgroup : forall (x : G), H x.Instanceishprop_ismaximalsubgroup `{Funext}
{G : Group} (H : Subgroup G)
: IsHProp (IsMaximalSubgroup H)
:= istrunc_forall.Instanceismaximalsubgroup_maximalsubgroup {G : Group}
: IsMaximalSubgroup (maximal_subgroup G)
:= fung => tt.(** ** Subgroups in opposite group *)
G: Group H: G -> Type
IsSubgroup H -> IsSubgroup H
G: Group H: G -> Type
IsSubgroup H -> IsSubgroup H
G: Group H: G -> Type H1: IsSubgroup H
IsSubgroup H
G: Group H: G -> Type H1: IsSubgroup H
forallx : grp_op G, IsHProp (H x)
G: Group H: G -> Type H1: IsSubgroup H
H 1
G: Group H: G -> Type H1: IsSubgroup H
forallxy : grp_op G, H x -> H y -> H (x * y^)
G: Group H: G -> Type H1: IsSubgroup H
forallx : grp_op G, IsHProp (H x)
exact _.
G: Group H: G -> Type H1: IsSubgroup H
H 1
cbn; exact issubgroup_in_unit.
G: Group H: G -> Type H1: IsSubgroup H
forallxy : grp_op G, H x -> H y -> H (x * y^)
G: Group H: G -> Type H1: IsSubgroup H x, y: grp_op G Hx: H x Hy: H y
H (y^ * x)
byapply issubgroup_in_inv_op.Defined.(** Note that [grp_op] is definitionally involutive, so the next result also gives us a map [Subgroup (grp_op G) -> Subgroup G]. *)Definitionsubgroup_grp_op {G : Group} (H : Subgroup G)
: Subgroup (grp_op G)
:= Build_Subgroup (grp_op G) H _.
G: Group H: Subgroup G
IsNormalSubgroup H ->
IsNormalSubgroup (subgroup_grp_op H)
G: Group H: Subgroup G
IsNormalSubgroup H ->
IsNormalSubgroup (subgroup_grp_op H)
G: Group H: Subgroup G n: IsNormalSubgroup H x, y: grp_op G
H (y * x) -> H (x * y)
exact isnormal.Defined.Definitionnormalsubgroup_grp_op {G : Group}
: NormalSubgroup G -> NormalSubgroup (grp_op G)
:= funN => Build_NormalSubgroup (grp_op G) (subgroup_grp_op N) _.(** ** Preimage subgroup *)(** The preimage of a subgroup under a group homomorphism is a subgroup. *)
G, H: Group f: G $-> H S: H -> Type
IsSubgroup S -> IsSubgroup (S o f)
G, H: Group f: G $-> H S: H -> Type
IsSubgroup S -> IsSubgroup (S o f)
G, H: Group f: G $-> H S: H -> Type H1: IsSubgroup S
IsSubgroup (S o f)
G, H: Group f: G $-> H S: H -> Type H1: IsSubgroup S
forallx : G, IsHProp ((funx0 : G => S (f x0)) x)
G, H: Group f: G $-> H S: H -> Type H1: IsSubgroup S
(funx : G => S (f x)) 1
G, H: Group f: G $-> H S: H -> Type H1: IsSubgroup S
forallxy : G,
(funx0 : G => S (f x0)) x ->
(funx0 : G => S (f x0)) y ->
(funx0 : G => S (f x0)) (x * y^)
G, H: Group f: G $-> H S: H -> Type H1: IsSubgroup S
forallx : G, IsHProp ((funx0 : G => S (f x0)) x)
hnf; exact _.
G, H: Group f: G $-> H S: H -> Type H1: IsSubgroup S
(funx : G => S (f x)) 1
G, H: Group f: G $-> H S: H -> Type H1: IsSubgroup S
S 1
exact issubgroup_in_unit.
G, H: Group f: G $-> H S: H -> Type H1: IsSubgroup S
forallxy : G,
(funx0 : G => S (f x0)) x ->
(funx0 : G => S (f x0)) y ->
(funx0 : G => S (f x0)) (x * y^)
G, H: Group f: G $-> H S: H -> Type H1: IsSubgroup S x, y: G Sfx: S (f x) Sfy: S (f y)
S (f (x * y^))
G, H: Group f: G $-> H S: H -> Type H1: IsSubgroup S x, y: G Sfx: S (f x) Sfy: S (f y)
S (f x * f y^)
G, H: Group f: G $-> H S: H -> Type H1: IsSubgroup S x, y: G Sfx: S (f x) Sfy: S (f y)
S (f y^)
G, H: Group f: G $-> H S: H -> Type H1: IsSubgroup S x, y: G Sfx: S (f x) Sfy: S (f y)
S (f y)^
byapply issubgroup_in_inv.Defined.Definitionsubgroup_preimage {GH : Group} (f : G $-> H) (S : Subgroup H)
: Subgroup G
:= Build_Subgroup G (S o f) _.(** The preimage of a normal subgroup is again normal. *)
G, H: Group f: G $-> H N: Subgroup H IsNormalSubgroup0: IsNormalSubgroup N
IsNormalSubgroup (subgroup_preimage f N)
G, H: Group f: G $-> H N: Subgroup H IsNormalSubgroup0: IsNormalSubgroup N
IsNormalSubgroup (subgroup_preimage f N)
G, H: Group f: G $-> H N: Subgroup H IsNormalSubgroup0: IsNormalSubgroup N x, y: G Nfxy: subgroup_preimage f N (x * y)
N (f (y * x))
G, H: Group f: G $-> H N: Subgroup H IsNormalSubgroup0: IsNormalSubgroup N x, y: G Nfxy: subgroup_preimage f N (x * y)
N (f y * f x)
G, H: Group f: G $-> H N: Subgroup H IsNormalSubgroup0: IsNormalSubgroup N x, y: G Nfxy: subgroup_preimage f N (x * y)
N (f x * f y)
exact (transport N (grp_homo_op _ _ _) Nfxy).Defined.(** ** Subgroup intersection *)(** Intersection of two subgroups *)
G: Group H, K: Subgroup G
Subgroup G
G: Group H, K: Subgroup G
Subgroup G
G: Group H, K: Subgroup G
G -> Type
G: Group H, K: Subgroup G
forallx : G, IsHProp (?H x)
G: Group H, K: Subgroup G
?H1
G: Group H, K: Subgroup G
forallxy : G, ?H x -> ?H y -> ?H (x * y^)
G: Group H, K: Subgroup G
forallx : G,
IsHProp ((fung : G => (H g * K g)%type) x)
G: Group H, K: Subgroup G
(fung : G => (H g * K g)%type) 1
G: Group H, K: Subgroup G
forallxy : G,
(fung : G => (H g * K g)%type) x ->
(fung : G => (H g * K g)%type) y ->
(fung : G => (H g * K g)%type) (x * y^)
G: Group H, K: Subgroup G
(fung : G => (H g * K g)%type) 1
G: Group H, K: Subgroup G
forallxy : G,
(fung : G => (H g * K g)%type) x ->
(fung : G => (H g * K g)%type) y ->
(fung : G => (H g * K g)%type) (x * y^)
G: Group H, K: Subgroup G
forallxy : G,
(fung : G => (H g * K g)%type) x ->
(fung : G => (H g * K g)%type) y ->
(fung : G => (H g * K g)%type) (x * y^)
G: Group H, K: Subgroup G x, y: G fst: H x snd: K x fst0: H y snd0: K y
(H (sg_op x y^) * K (sg_op x y^))%type
split; byapply subgroup_in_op_inv.Defined.(** ** Simple groups *)ClassIsSimpleGroup (G : Group)
:= is_simple_group : forall (N : Subgroup G) `{IsNormalSubgroup G N},
IsTrivialGroup N + IsMaximalSubgroup N.(** ** The subgroup generated by a subset *)(** Underlying type family of a subgroup generated by subset *)Inductivesubgroup_generated_type {G : Group} (X : G -> Type) : G -> Type :=
(** The subgroup should contain all elements of the original family. *)
| sgt_in (g : G) : X g -> subgroup_generated_type X g
(** It should contain the unit. *)
| sgt_unit : subgroup_generated_type X mon_unit
(** Finally, it should be closed under inverses and operation. *)
| sgt_op (g h : G)
: subgroup_generated_type X g
-> subgroup_generated_type X h
-> subgroup_generated_type X (g * h^)
.Arguments sgt_in {G X g}.Arguments sgt_unit {G X}.Arguments sgt_op {G X g h}.(** Note that [subgroup_generated_type] will not automatically land in [HProp]. For example, if [X] already "contains" the unit of the group, then there are at least two different inhabitants of this family at the unit (given by [sgt_unit] and [sgt_in group_unit _]). Therefore, we propositionally truncate in [subgroup_generated] below. *)(** Subgroups are closed under inverses. *)
G: Group X: G -> Type g: G
subgroup_generated_type X g ->
subgroup_generated_type X g^
G: Group X: G -> Type g: G
subgroup_generated_type X g ->
subgroup_generated_type X g^
G: Group X: G -> Type g: G p: subgroup_generated_type X g
subgroup_generated_type X g^
G: Group X: G -> Type g: G p: subgroup_generated_type X g
subgroup_generated_type X (1 * g^)
exact (sgt_op sgt_unit p).Defined.
G: Group X: G -> Type g: G
subgroup_generated_type X g^ ->
subgroup_generated_type X g
G: Group X: G -> Type g: G
subgroup_generated_type X g^ ->
subgroup_generated_type X g
G: Group X: G -> Type g: G p: subgroup_generated_type X g^
subgroup_generated_type X g
G: Group X: G -> Type g: G p: subgroup_generated_type X g^
subgroup_generated_type X (g^)^
byapply sgt_inv.Defined.
G: Group X: G -> Type g, h: G
subgroup_generated_type X g ->
subgroup_generated_type X h ->
subgroup_generated_type X (g * h)
G: Group X: G -> Type g, h: G
subgroup_generated_type X g ->
subgroup_generated_type X h ->
subgroup_generated_type X (g * h)
G: Group X: G -> Type g, h: G p: subgroup_generated_type X g q: subgroup_generated_type X h
subgroup_generated_type X (g * h)
G: Group X: G -> Type g, h: G p: subgroup_generated_type X g q: subgroup_generated_type X h
subgroup_generated_type X (g * (h^)^)
exact (sgt_op p (sgt_inv q)).Defined.(** The subgroup generated by a subset *)
G: Group X: G -> Type
Subgroup G
G: Group X: G -> Type
Subgroup G
G: Group X: G -> Type
forallxy : G,
merely (subgroup_generated_type X x) ->
merely (subgroup_generated_type X y) ->
merely (subgroup_generated_type X (x * y^))
G: Group X: G -> Type x, y: G q: subgroup_generated_type X y p: subgroup_generated_type X x
merely (subgroup_generated_type X (x * y^))
exact (tr (sgt_op p q)).Defined.(** The inclusion of generators into the generated subgroup. *)Definitionsubgroup_generated_gen_incl {G : Group} {X : G -> Type} (g : G) (H : X g)
: subgroup_generated X
:= (g; tr (sgt_in H)).(** The generated subgroup is the smallest subgroup containing the generating set. *)
G: Group X: G -> Type S: Subgroup G i: forallg : G, X g -> S g
forallg : G, subgroup_generated X g -> S g
G: Group X: G -> Type S: Subgroup G i: forallg : G, X g -> S g
forallg : G, subgroup_generated X g -> S g
G: Group X: G -> Type S: Subgroup G i: forallg : G, X g -> S g g: G p: subgroup_generated_type X g
S g
G: Group X: G -> Type S: Subgroup G i: forallg : G, X g -> S g g: G Xg: X g
S g
G: Group X: G -> Type S: Subgroup G i: forallg : G, X g -> S g
S 1
G: Group X: G -> Type S: Subgroup G i: forallg : G, X g -> S g g, h: G p1: subgroup_generated_type X g p2: subgroup_generated_type X h IHp1: S g IHp2: S h
S (g * h^)
G: Group X: G -> Type S: Subgroup G i: forallg : G, X g -> S g g: G Xg: X g
S g
byapply i.
G: Group X: G -> Type S: Subgroup G i: forallg : G, X g -> S g
S 1
apply subgroup_in_unit.
G: Group X: G -> Type S: Subgroup G i: forallg : G, X g -> S g g, h: G p1: subgroup_generated_type X g p2: subgroup_generated_type X h IHp1: S g IHp2: S h
S (g * h^)
byapply subgroup_in_op_inv.Defined.(** If [f : G $-> H] is a group homomorphism and [X] and [Y] are subsets of [G] and [H] such that [f] maps [X] into [Y], then [f] sends the subgroup generated by [X] into the subgroup generated by [Y]. *)
G, H: Group X: G -> Type Y: H -> Type f: G $-> H preserves: forallg : G, X g -> Y (f g)
forallg : G,
subgroup_generated X g -> subgroup_generated Y (f g)
G, H: Group X: G -> Type Y: H -> Type f: G $-> H preserves: forallg : G, X g -> Y (f g)
forallg : G,
subgroup_generated X g -> subgroup_generated Y (f g)
G, H: Group X: G -> Type Y: H -> Type f: G $-> H preserves: forallg : G, X g -> Y (f g)
forallg : G,
subgroup_generated X g ->
subgroup_preimage f (subgroup_generated Y) g
G, H: Group X: G -> Type Y: H -> Type f: G $-> H preserves: forallg : G, X g -> Y (f g)
forallg : G,
X g -> subgroup_preimage f (subgroup_generated Y) g
G, H: Group X: G -> Type Y: H -> Type f: G $-> H preserves: forallg : G, X g -> Y (f g) g: G p: X g
subgroup_preimage f (subgroup_generated Y) g
G, H: Group X: G -> Type Y: H -> Type f: G $-> H preserves: forallg : G, X g -> Y (f g) g: G p: X g
Y (f g)
byapply preserves.Defined.
G, H: Group X: G -> Type Y: H -> Type f: G $<~> H preserves: forallg : G, X g <-> Y (f g)
forallg : G,
subgroup_generated X g <-> subgroup_generated Y (f g)
G, H: Group X: G -> Type Y: H -> Type f: G $<~> H preserves: forallg : G, X g <-> Y (f g)
forallg : G,
subgroup_generated X g <-> subgroup_generated Y (f g)
G, H: Group X: G -> Type Y: H -> Type f: G $<~> H preserves: forallg : G, X g <-> Y (f g)
forallx : G,
subgroup_generated X x -> subgroup_generated Y (f x)
G, H: Group X: G -> Type Y: H -> Type f: G $<~> H preserves: forallg : G, X g <-> Y (f g)
forallx : G,
subgroup_generated Y (f x) -> subgroup_generated X x
G, H: Group X: G -> Type Y: H -> Type f: G $<~> H preserves: forallg : G, X g <-> Y (f g)
forallx : G,
subgroup_generated X x -> subgroup_generated Y (f x)
G, H: Group X: G -> Type Y: H -> Type f: G $<~> H preserves: forallg : G, X g <-> Y (f g)
forallg : G, X g -> Y (f g)
apply preserves.
G, H: Group X: G -> Type Y: H -> Type f: G $<~> H preserves: forallg : G, X g <-> Y (f g)
forallx : G,
subgroup_generated Y (f x) -> subgroup_generated X x
G, H: Group X: G -> Type Y: H -> Type f: G $<~> H preserves: forallg : G, X g <-> Y (f g) x: H
subgroup_generated Y (f (f^-1$ x)) ->
subgroup_generated X (f^-1$ x)
G, H: Group X: G -> Type Y: H -> Type f: G $<~> H preserves: forallg : G, X g <-> Y (f g) x: H
subgroup_generated Y x ->
subgroup_generated X (f^-1$ x)
G, H: Group X: G -> Type Y: H -> Type f: G $<~> H preserves: forallg : G, X g <-> Y (f g)
forallg : H, Y g -> X (f^-1$ g)
G, H: Group X: G -> Type Y: H -> Type f: G $<~> H preserves: forallg : G, X g <-> Y (f g) x: G y: Y (f x)
X (f^-1$ (f x))
G, H: Group X: G -> Type Y: H -> Type f: G $<~> H preserves: forallg : G, X g <-> Y (f g) x: G y: Y (f x)
X x
byapply preserves.Defined.(** A similar result is true if we replace one group by its opposite, i.e. if [f] is an anti-homomorphism. For simplicity, we state this only for the case in which [f] is the identity isomorphism. It's also useful in the special case where [X] and [Y] are the same. *)
G: Group X, Y: G -> Type preserves: forallg : G, X g <-> Y g
forallg : G,
subgroup_generated X g <-> subgroup_generated Y g
G: Group X, Y: G -> Type preserves: forallg : G, X g <-> Y g
forallg : G,
subgroup_generated X g <-> subgroup_generated Y g
G: Group X, Y: G -> Type preserves: forallg : G, X g <-> Y g g: G
subgroup_generated X g -> subgroup_generated Y g
G: Group X, Y: G -> Type preserves: forallg : G, X g <-> Y g g: G
subgroup_generated Y g -> subgroup_generated X g
G: Group X, Y: G -> Type preserves: forallg : G, X g <-> Y g g: G
subgroup_generated X g ->
subgroup_grp_op (subgroup_generated Y) g
G: Group X, Y: G -> Type preserves: forallg : G, X g <-> Y g g: G
subgroup_generated Y g -> subgroup_generated X g
G: Group X, Y: G -> Type preserves: forallg : G, X g <-> Y g g: G
subgroup_generated X g ->
subgroup_grp_op (subgroup_generated Y) g
G: Group X, Y: G -> Type preserves: forallg : G, X g <-> Y g g: G
subgroup_generated Y g ->
subgroup_grp_op (subgroup_generated X) g
G: Group X, Y: G -> Type preserves: forallg : G, X g <-> Y g g: G
forallg : G,
X g -> subgroup_grp_op (subgroup_generated Y) g
G: Group X, Y: G -> Type preserves: forallg : G, X g <-> Y g g: G
forallg : grp_op G,
Y g -> subgroup_grp_op (subgroup_generated X) g
G: Group X, Y: G -> Type preserves: forallg : G, X g <-> Y g g, x: G Xx: X x
subgroup_grp_op (subgroup_generated Y) x
G: Group X, Y: G -> Type preserves: forallg : G, X g <-> Y g g: G x: grp_op G Xx: Y x
subgroup_grp_op (subgroup_generated X) x
G: Group X, Y: G -> Type preserves: forallg : G, X g <-> Y g g, x: G Xx: X x
Y x
G: Group X, Y: G -> Type preserves: forallg : G, X g <-> Y g g: G x: grp_op G Xx: Y x
X x
all: byapply (preserves x).Defined.(** ** Product of subgroups *)(** The product of two subgroups. *)Definitionsubgroup_product {G : Group} (HK : Subgroup G) : Subgroup G
:= subgroup_generated (funx => (H x + K x)%type).(** The induction principle for the product. *)
G: Group H, K: Subgroup G P: forallx : G, subgroup_product H K x -> Type P_H_in: forall (x : G) (y : H x),
P x (tr (sgt_in (inl y))) P_K_in: forall (x : G) (y : K x),
P x (tr (sgt_in (inr y))) P_unit: P 1 (tr sgt_unit) P_op: forall (xy : G)
(h : subgroup_generated_type
(funx0 : G => (H x0 + K x0)%type) x)
(k : subgroup_generated_type
(funx0 : G => (H x0 + K x0)%type) y),
P x (tr h) ->
P y (tr k) -> P (x * - y) (tr (sgt_op h k)) H0: forall (x : G) (y : subgroup_product H K x),
IsHProp (P x y)
forall (x : G) (p : subgroup_product H K x), P x p
G: Group H, K: Subgroup G P: forallx : G, subgroup_product H K x -> Type P_H_in: forall (x : G) (y : H x),
P x (tr (sgt_in (inl y))) P_K_in: forall (x : G) (y : K x),
P x (tr (sgt_in (inr y))) P_unit: P 1 (tr sgt_unit) P_op: forall (xy : G)
(h : subgroup_generated_type
(funx0 : G => (H x0 + K x0)%type) x)
(k : subgroup_generated_type
(funx0 : G => (H x0 + K x0)%type) y),
P x (tr h) ->
P y (tr k) -> P (x * - y) (tr (sgt_op h k)) H0: forall (x : G) (y : subgroup_product H K x),
IsHProp (P x y)
forall (x : G) (p : subgroup_product H K x), P x p
G: Group H, K: Subgroup G P: forallx : G, subgroup_product H K x -> Type P_H_in: forall (x : G) (y : H x),
P x (tr (sgt_in (inl y))) P_K_in: forall (x : G) (y : K x),
P x (tr (sgt_in (inr y))) P_unit: P 1 (tr sgt_unit) P_op: forall (xy : G)
(h : subgroup_generated_type
(funx0 : G => (H x0 + K x0)%type) x)
(k : subgroup_generated_type
(funx0 : G => (H x0 + K x0)%type) y),
P x (tr h) ->
P y (tr k) -> P (x * - y) (tr (sgt_op h k)) H0: forall (x : G) (y : subgroup_product H K x),
IsHProp (P x y) x: G p: subgroup_product H K x
P x p
G: Group H, K: Subgroup G P: forallx : G, subgroup_product H K x -> Type P_H_in: forall (x : G) (y : H x),
P x (tr (sgt_in (inl y))) P_K_in: forall (x : G) (y : K x),
P x (tr (sgt_in (inr y))) P_unit: P 1 (tr sgt_unit) P_op: forall (xy : G)
(h : subgroup_generated_type
(funx0 : G => (H x0 + K x0)%type) x)
(k : subgroup_generated_type
(funx0 : G => (H x0 + K x0)%type) y),
P x (tr h) ->
P y (tr k) -> P (x * - y) (tr (sgt_op h k)) H0: forall (x : G) (y : subgroup_product H K x),
IsHProp (P x y) x: G p: subgroup_generated_type
(funx : G => (H x + K x)%type) x
P x (tr p)
G: Group H, K: Subgroup G P: forallx : G, subgroup_product H K x -> Type P_H_in: forall (x : G) (y : H x),
P x (tr (sgt_in (inl y))) P_K_in: forall (x : G) (y : K x),
P x (tr (sgt_in (inr y))) P_unit: P 1 (tr sgt_unit) P_op: forall (xy : G)
(h : subgroup_generated_type
(funx0 : G => (H x0 + K x0)%type) x)
(k : subgroup_generated_type
(funx0 : G => (H x0 + K x0)%type) y),
P x (tr h) ->
P y (tr k) -> P (x * - y) (tr (sgt_op h k)) H0: forall (x : G) (y : subgroup_product H K x),
IsHProp (P x y) x: G s: (H x + K x)%type
P x (tr (sgt_in s))
G: Group H, K: Subgroup G P: forallx : G, subgroup_product H K x -> Type P_H_in: forall (x : G) (y : H x),
P x (tr (sgt_in (inl y))) P_K_in: forall (x : G) (y : K x),
P x (tr (sgt_in (inr y))) P_unit: P 1 (tr sgt_unit) P_op: forall (xy : G)
(h : subgroup_generated_type
(funx0 : G => (H x0 + K x0)%type) x)
(k : subgroup_generated_type
(funx0 : G => (H x0 + K x0)%type) y),
P x (tr h) ->
P y (tr k) -> P (x * - y) (tr (sgt_op h k)) H0: forall (x : G) (y : subgroup_product H K x),
IsHProp (P x y)
P 1 (tr sgt_unit)
G: Group H, K: Subgroup G P: forallx : G, subgroup_product H K x -> Type P_H_in: forall (x : G) (y : H x),
P x (tr (sgt_in (inl y))) P_K_in: forall (x : G) (y : K x),
P x (tr (sgt_in (inr y))) P_unit: P 1 (tr sgt_unit) P_op: forall (xy : G)
(h : subgroup_generated_type
(funx0 : G => (H x0 + K x0)%type) x)
(k : subgroup_generated_type
(funx0 : G => (H x0 + K x0)%type) y),
P x (tr h) ->
P y (tr k) -> P (x * - y) (tr (sgt_op h k)) H0: forall (x : G) (y : subgroup_product H K x),
IsHProp (P x y) x, y: G h: subgroup_generated_type
(funx : G => (H x + K x)%type) x k: subgroup_generated_type
(funx : G => (H x + K x)%type) y IHh: P x (tr h) IHk: P y (tr k)
P (x * y^) (tr (sgt_op h k))
G: Group H, K: Subgroup G P: forallx : G, subgroup_product H K x -> Type P_H_in: forall (x : G) (y : H x),
P x (tr (sgt_in (inl y))) P_K_in: forall (x : G) (y : K x),
P x (tr (sgt_in (inr y))) P_unit: P 1 (tr sgt_unit) P_op: forall (xy : G)
(h : subgroup_generated_type
(funx0 : G => (H x0 + K x0)%type) x)
(k : subgroup_generated_type
(funx0 : G => (H x0 + K x0)%type) y),
P x (tr h) ->
P y (tr k) -> P (x * - y) (tr (sgt_op h k)) H0: forall (x : G) (y : subgroup_product H K x),
IsHProp (P x y) x: G s: (H x + K x)%type
P x (tr (sgt_in s))
G: Group H, K: Subgroup G P: forallx : G, subgroup_product H K x -> Type P_H_in: forall (x : G) (y : H x),
P x (tr (sgt_in (inl y))) P_K_in: forall (x : G) (y : K x),
P x (tr (sgt_in (inr y))) P_unit: P 1 (tr sgt_unit) P_op: forall (xy : G)
(h : subgroup_generated_type
(funx0 : G => (H x0 + K x0)%type) x)
(k : subgroup_generated_type
(funx0 : G => (H x0 + K x0)%type) y),
P x (tr h) ->
P y (tr k) -> P (x * - y) (tr (sgt_op h k)) H0: forall (x : G) (y : subgroup_product H K x),
IsHProp (P x y) x: G s: H x
P x (tr (sgt_in (inl s)))
G: Group H, K: Subgroup G P: forallx : G, subgroup_product H K x -> Type P_H_in: forall (x : G) (y : H x),
P x (tr (sgt_in (inl y))) P_K_in: forall (x : G) (y : K x),
P x (tr (sgt_in (inr y))) P_unit: P 1 (tr sgt_unit) P_op: forall (xy : G)
(h : subgroup_generated_type
(funx0 : G => (H x0 + K x0)%type) x)
(k : subgroup_generated_type
(funx0 : G => (H x0 + K x0)%type) y),
P x (tr h) ->
P y (tr k) -> P (x * - y) (tr (sgt_op h k)) H0: forall (x : G) (y : subgroup_product H K x),
IsHProp (P x y) x: G s: K x
P x (tr (sgt_in (inr s)))
G: Group H, K: Subgroup G P: forallx : G, subgroup_product H K x -> Type P_H_in: forall (x : G) (y : H x),
P x (tr (sgt_in (inl y))) P_K_in: forall (x : G) (y : K x),
P x (tr (sgt_in (inr y))) P_unit: P 1 (tr sgt_unit) P_op: forall (xy : G)
(h : subgroup_generated_type
(funx0 : G => (H x0 + K x0)%type) x)
(k : subgroup_generated_type
(funx0 : G => (H x0 + K x0)%type) y),
P x (tr h) ->
P y (tr k) -> P (x * - y) (tr (sgt_op h k)) H0: forall (x : G) (y : subgroup_product H K x),
IsHProp (P x y) x: G s: H x
P x (tr (sgt_in (inl s)))
apply P_H_in.
G: Group H, K: Subgroup G P: forallx : G, subgroup_product H K x -> Type P_H_in: forall (x : G) (y : H x),
P x (tr (sgt_in (inl y))) P_K_in: forall (x : G) (y : K x),
P x (tr (sgt_in (inr y))) P_unit: P 1 (tr sgt_unit) P_op: forall (xy : G)
(h : subgroup_generated_type
(funx0 : G => (H x0 + K x0)%type) x)
(k : subgroup_generated_type
(funx0 : G => (H x0 + K x0)%type) y),
P x (tr h) ->
P y (tr k) -> P (x * - y) (tr (sgt_op h k)) H0: forall (x : G) (y : subgroup_product H K x),
IsHProp (P x y) x: G s: K x
P x (tr (sgt_in (inr s)))
apply P_K_in.
G: Group H, K: Subgroup G P: forallx : G, subgroup_product H K x -> Type P_H_in: forall (x : G) (y : H x),
P x (tr (sgt_in (inl y))) P_K_in: forall (x : G) (y : K x),
P x (tr (sgt_in (inr y))) P_unit: P 1 (tr sgt_unit) P_op: forall (xy : G)
(h : subgroup_generated_type
(funx0 : G => (H x0 + K x0)%type) x)
(k : subgroup_generated_type
(funx0 : G => (H x0 + K x0)%type) y),
P x (tr h) ->
P y (tr k) -> P (x * - y) (tr (sgt_op h k)) H0: forall (x : G) (y : subgroup_product H K x),
IsHProp (P x y)
P 1 (tr sgt_unit)
exact P_unit.
G: Group H, K: Subgroup G P: forallx : G, subgroup_product H K x -> Type P_H_in: forall (x : G) (y : H x),
P x (tr (sgt_in (inl y))) P_K_in: forall (x : G) (y : K x),
P x (tr (sgt_in (inr y))) P_unit: P 1 (tr sgt_unit) P_op: forall (xy : G)
(h : subgroup_generated_type
(funx0 : G => (H x0 + K x0)%type) x)
(k : subgroup_generated_type
(funx0 : G => (H x0 + K x0)%type) y),
P x (tr h) ->
P y (tr k) -> P (x * - y) (tr (sgt_op h k)) H0: forall (x : G) (y : subgroup_product H K x),
IsHProp (P x y) x, y: G h: subgroup_generated_type
(funx : G => (H x + K x)%type) x k: subgroup_generated_type
(funx : G => (H x + K x)%type) y IHh: P x (tr h) IHk: P y (tr k)
P (x * y^) (tr (sgt_op h k))
byapply P_op.Defined.Definitionsubgroup_product_incl_l {G : Group} (HK : Subgroup G)
: forallx, H x -> subgroup_product H K x
:= funx => tr o sgt_in o inl.Definitionsubgroup_product_incl_r {G : Group} (HK : Subgroup G)
: forallx, K x -> subgroup_product H K x
:= funx => tr o sgt_in o inr.(** A product of normal subgroups is normal. *)
G: Group H, K: Subgroup G IsNormalSubgroup0: IsNormalSubgroup H IsNormalSubgroup1: IsNormalSubgroup K
IsNormalSubgroup (subgroup_product H K)
G: Group H, K: Subgroup G IsNormalSubgroup0: IsNormalSubgroup H IsNormalSubgroup1: IsNormalSubgroup K
IsNormalSubgroup (subgroup_product H K)
G: Group H, K: Subgroup G IsNormalSubgroup0: IsNormalSubgroup H IsNormalSubgroup1: IsNormalSubgroup K
forallxy : G,
subgroup_product H K x ->
subgroup_product H K (y * x * y^)
G: Group H, K: Subgroup G IsNormalSubgroup0: IsNormalSubgroup H IsNormalSubgroup1: IsNormalSubgroup K y: G
forallx : G,
subgroup_product H K x ->
subgroup_product H K (y * x * y^)
G: Group H, K: Subgroup G IsNormalSubgroup0: IsNormalSubgroup H IsNormalSubgroup1: IsNormalSubgroup K y: G
forallg : G,
H g + K g -> H (grp_conj y g) + K (grp_conj y g)
G: Group H, K: Subgroup G IsNormalSubgroup0: IsNormalSubgroup H IsNormalSubgroup1: IsNormalSubgroup K y, x: G
H x + K x -> H (grp_conj y x) + K (grp_conj y x)
apply functor_sum; rapply isnormal_conj.Defined.Definitionnormalsubgroup_product {G : Group} (HK : NormalSubgroup G)
: NormalSubgroup G
:= Build_NormalSubgroup G (subgroup_product H K) _.
G, H: Group J, K: Subgroup G L, M: Subgroup H f: G $-> H l: forallx : G, J x -> L (f x) r: forallx : G, K x -> M (f x)
forallx : G,
subgroup_product J K x -> subgroup_product L M (f x)
G, H: Group J, K: Subgroup G L, M: Subgroup H f: G $-> H l: forallx : G, J x -> L (f x) r: forallx : G, K x -> M (f x)
forallx : G,
subgroup_product J K x -> subgroup_product L M (f x)
G, H: Group J, K: Subgroup G L, M: Subgroup H f: G $-> H l: forallx : G, J x -> L (f x) r: forallx : G, K x -> M (f x)
forallg : G,
(funx : G => (J x + K x)%type) g ->
(funx : H => (L x + M x)%type) (f g)
exact (funx => functor_sum (l x) (r x)).Defined.
G, H: Group J, K: Subgroup G L, M: Subgroup H f: G $<~> H l: forallx : G, J x <-> L (f x) r: forallx : G, K x <-> M (f x)
forallx : G,
subgroup_product J K x <-> subgroup_product L M (f x)
G, H: Group J, K: Subgroup G L, M: Subgroup H f: G $<~> H l: forallx : G, J x <-> L (f x) r: forallx : G, K x <-> M (f x)
forallx : G,
subgroup_product J K x <-> subgroup_product L M (f x)
G, H: Group J, K: Subgroup G L, M: Subgroup H f: G $<~> H l: forallx : G, J x <-> L (f x) r: forallx : G, K x <-> M (f x)
forallg : G,
(funx : G => (J x + K x)%type) g <->
(funx : H => (L x + M x)%type) (f g)
forallx : grp_op G,
subgroup_grp_op (subgroup_product H K) x <->
subgroup_product (subgroup_grp_op H)
(subgroup_grp_op K) x
G: Group H, K: Subgroup G
forallx : grp_op G,
subgroup_grp_op (subgroup_product H K) x <->
subgroup_product (subgroup_grp_op H)
(subgroup_grp_op K) x
G: Group H, K: Subgroup G x: grp_op G
subgroup_grp_op (subgroup_product H K) x <->
subgroup_product (subgroup_grp_op H)
(subgroup_grp_op K) x
G: Group H, K: Subgroup G x: grp_op G
forallg : G,
H g + K g <->
subgroup_grp_op H g + subgroup_grp_op K g
reflexivity.Defined.(** *** Paths between generated subgroups *)(** This gets used twice in [path_subgroup_generated], so we factor it out here. *)
G: Group X, Y: G -> Type K: forallg : G, merely (X g) -> merely (Y g)
forallg : G,
Trunc (-1) (subgroup_generated_type X g) ->
Trunc (-1) (subgroup_generated_type Y g)
G: Group X, Y: G -> Type K: forallg : G, merely (X g) -> merely (Y g)
forallg : G,
Trunc (-1) (subgroup_generated_type X g) ->
Trunc (-1) (subgroup_generated_type Y g)
G: Group X, Y: G -> Type K: forallg : G, merely (X g) -> merely (Y g) g: G ing: subgroup_generated_type X g
Trunc (-1) (subgroup_generated_type Y g)
G: Group X, Y: G -> Type K: forallg : G, merely (X g) -> merely (Y g) g: G x: X g
Trunc (-1) (subgroup_generated_type Y g)
G: Group X, Y: G -> Type K: forallg : G, merely (X g) -> merely (Y g)
Trunc (-1) (subgroup_generated_type Y 1)
G: Group X, Y: G -> Type K: forallg : G, merely (X g) -> merely (Y g) g, h: G Xg: subgroup_generated_type X g Xh: subgroup_generated_type X h IHYg: Trunc (-1) (subgroup_generated_type Y g) IHYh: Trunc (-1) (subgroup_generated_type Y h)
Trunc (-1) (subgroup_generated_type Y (g * h^))
G: Group X, Y: G -> Type K: forallg : G, merely (X g) -> merely (Y g) g: G x: X g
Trunc (-1) (subgroup_generated_type Y g)
exact (Trunc_functor (-1) sgt_in (K g (tr x))).
G: Group X, Y: G -> Type K: forallg : G, merely (X g) -> merely (Y g)
Trunc (-1) (subgroup_generated_type Y 1)
exact (tr sgt_unit).
G: Group X, Y: G -> Type K: forallg : G, merely (X g) -> merely (Y g) g, h: G Xg: subgroup_generated_type X g Xh: subgroup_generated_type X h IHYg: Trunc (-1) (subgroup_generated_type Y g) IHYh: Trunc (-1) (subgroup_generated_type Y h)
Trunc (-1) (subgroup_generated_type Y (g * h^))
G: Group X, Y: G -> Type K: forallg : G, merely (X g) -> merely (Y g) g, h: G Xg: subgroup_generated_type X g Xh: subgroup_generated_type X h IHYh: subgroup_generated_type Y h IHYg: subgroup_generated_type Y g
Trunc (-1) (subgroup_generated_type Y (g * h^))
byapply tr, sgt_op.Defined.(** If the predicates selecting the generators are merely equivalent, then the generated subgroups are equal. (One could probably prove that the generated subgroup are isomorphic without using univalence.) *)
H: Univalence G: Group X, Y: G -> Type K: forallg : G,
Trunc (-1) (X g) <-> Trunc (-1) (Y g)
subgroup_generated X = subgroup_generated Y
H: Univalence G: Group X, Y: G -> Type K: forallg : G,
Trunc (-1) (X g) <-> Trunc (-1) (Y g)
subgroup_generated X = subgroup_generated Y
H: Univalence G: Group X, Y: G -> Type K: forallg : G,
Trunc (-1) (X g) <-> Trunc (-1) (Y g)
forallg : G,
subgroup_generated X g <-> subgroup_generated Y g
H: Univalence G: Group X, Y: G -> Type K: forallg : G,
Trunc (-1) (X g) <-> Trunc (-1) (Y g) g: G
subgroup_generated X g -> subgroup_generated Y g
H: Univalence G: Group X, Y: G -> Type K: forallg : G,
Trunc (-1) (X g) <-> Trunc (-1) (Y g) g: G
subgroup_generated Y g -> subgroup_generated X g
H: Univalence G: Group X, Y: G -> Type K: forallg : G,
Trunc (-1) (X g) <-> Trunc (-1) (Y g) g: G
H: Univalence G: Group X, Y: G -> Type K: forallg : G,
Trunc (-1) (X g) <-> Trunc (-1) (Y g) g: G
subgroup_generated Y g -> subgroup_generated X g
apply path_subgroup_generated_helper, (funx => snd (K x)).Defined.(** Equal subgroups have isomorphic underlying groups. *)Definitionequiv_subgroup_group {G : Group} (H1H2 : Subgroup G)
: H1 = H2 -> GroupIsomorphism H1 H2
:= ltac:(intros []; exact grp_iso_id).(** ** Image of a group homomorphism *)(** The image of a group homomorphism between groups is a subgroup. *)
G, H: Group f: G $-> H
Subgroup H
G, H: Group f: G $-> H
Subgroup H
G, H: Group f: G $-> H
hexists (funx : G => f x = 1)
G, H: Group f: G $-> H
forallxy : H,
hexists (funx0 : G => f x0 = x) ->
hexists (funx0 : G => f x0 = y) ->
hexists (funx0 : G => f x0 = x * y^)
G, H: Group f: G $-> H
hexists (funx : G => f x = 1)
G, H: Group f: G $-> H
{x : G & f x = 1}
G, H: Group f: G $-> H
f 1 = 1
apply grp_homo_unit.
G, H: Group f: G $-> H
forallxy : H,
hexists (funx0 : G => f x0 = x) ->
hexists (funx0 : G => f x0 = y) ->
hexists (funx0 : G => f x0 = x * y^)
G, H: Group f: G $-> H x, y: H q: {x : G & f x = y} p: {x0 : G & f x0 = x}
{x0 : G & f x0 = x * y^}
G, H: Group f: G $-> H x, y: H b: G q: f b = y a: G p: f a = x
{x0 : G & f x0 = x * y^}
G, H: Group f: G $-> H x, y: H b: G q: f b = y a: G p: f a = x
f (a * b^) = x * y^
G, H: Group f: G $-> H x, y: H b: G q: f b = y a: G p: f a = x
f b^ = y^
lhs napply grp_homo_inv; f_ap.Defined.Definitiongrp_image_in {GH : Group} (f : G $-> H)
: forallx, grp_image f (f x)
:= funx => tr (x; idpath).Definitiongrp_homo_image_in {GH : Group} (f : G $-> H)
: G $-> grp_image f
:= subgroup_corec f (grp_image_in f).(** ** Image of a group embedding *)(** When the homomorphism is an embedding, we don't need to truncate. *)
G, H: Group f: G $-> H IsEmbedding0: IsEmbedding f
Subgroup H
G, H: Group f: G $-> H IsEmbedding0: IsEmbedding f
Subgroup H
G, H: Group f: G $-> H IsEmbedding0: IsEmbedding f
IsSubgroup (hfiber f)
G, H: Group f: G $-> H IsEmbedding0: IsEmbedding f
forallx : H, IsHProp (hfiber f x)
G, H: Group f: G $-> H IsEmbedding0: IsEmbedding f
hfiber f 1
G, H: Group f: G $-> H IsEmbedding0: IsEmbedding f
forallxy : H,
hfiber f x -> hfiber f y -> hfiber f (x * y)
G, H: Group f: G $-> H IsEmbedding0: IsEmbedding f
forallx : H, hfiber f x -> hfiber f x^
G, H: Group f: G $-> H IsEmbedding0: IsEmbedding f
forallx : H, IsHProp (hfiber f x)
exact _.
G, H: Group f: G $-> H IsEmbedding0: IsEmbedding f
hfiber f 1
exact (mon_unit; grp_homo_unit f).
G, H: Group f: G $-> H IsEmbedding0: IsEmbedding f
forallxy : H,
hfiber f x -> hfiber f y -> hfiber f (x * y)
G, H: Group f: G $-> H IsEmbedding0: IsEmbedding f x, y: H a, b: G
hfiber f (f a * f b)
G, H: Group f: G $-> H IsEmbedding0: IsEmbedding f x, y: H a, b: G
f (a * b) = f a * f b
apply grp_homo_op.
G, H: Group f: G $-> H IsEmbedding0: IsEmbedding f
forallx : H, hfiber f x -> hfiber f x^
G, H: Group f: G $-> H IsEmbedding0: IsEmbedding f b: H a: G
hfiber f (f a)^
G, H: Group f: G $-> H IsEmbedding0: IsEmbedding f b: H a: G
f a^ = (f a)^
apply grp_homo_inv.Defined.
G, H: Group f: G $-> H IsEmbedding0: IsEmbedding f
GroupIsomorphism G (grp_image_embedding f)
G, H: Group f: G $-> H IsEmbedding0: IsEmbedding f
GroupIsomorphism G (grp_image_embedding f)
G, H: Group f: G $-> H IsEmbedding0: IsEmbedding f
GroupHomomorphism G (grp_image_embedding f)
G, H: Group f: G $-> H IsEmbedding0: IsEmbedding f
IsEquiv ?grp_iso_homo
G, H: Group f: G $-> H IsEmbedding0: IsEmbedding f
GroupHomomorphism G (grp_image_embedding f)
G, H: Group f: G $-> H IsEmbedding0: IsEmbedding f
forallx : G, grp_image_embedding f (f x)
exact (funx => (x; idpath)).
G, H: Group f: G $-> H IsEmbedding0: IsEmbedding f
IsEquiv (subgroup_corec f (funx : G => (x; 1%path)))
G, H: Group f: G $-> H IsEmbedding0: IsEmbedding f
IsConnMap (Tr (-1))
(subgroup_corec f (funx : G => (x; 1%path)))
G, H: Group f: G $-> H IsEmbedding0: IsEmbedding f
IsEmbedding
(subgroup_corec f (funx : G => (x; 1%path)))
G, H: Group f: G $-> H IsEmbedding0: IsEmbedding f
IsConnMap (Tr (-1))
(subgroup_corec f (funx : G => (x; 1%path)))
G, H: Group f: G $-> H IsEmbedding0: IsEmbedding f b: H a: G p: f a = b
G, H: Group f: G $-> H IsEmbedding0: IsEmbedding f b: H a: G p: f a = b
(f a; a; 1%path) = (b; a; p)
G, H: Group f: G $-> H IsEmbedding0: IsEmbedding f b: H a: G p: f a = b
f a = b
G, H: Group f: G $-> H IsEmbedding0: IsEmbedding f b: H a: G p: f a = b
transport (hfiber f) ?p (a; 1%path) = (a; p)
G, H: Group f: G $-> H IsEmbedding0: IsEmbedding f b: H a: G p: f a = b
transport (hfiber f) p (a; 1%path) = (a; p)
G, H: Group f: G $-> H IsEmbedding0: IsEmbedding f b: H a: G p: f a = b
((a; 1%path).1;
transport (funx : H => f (a; 1%path).1 = x) p
(a; 1%path).2) = (a; p)
byapply path_sigma_hprop.Defined.(** The image of a surjective group homomorphism is the maximal subgroup. *)
G, H: Group f: G $-> H IsSurjection0: IsConnMap (Tr (-1)) f
IsMaximalSubgroup (grp_image f)
G, H: Group f: G $-> H IsSurjection0: IsConnMap (Tr (-1)) f
IsMaximalSubgroup (grp_image f)
G, H: Group f: G $-> H IsSurjection0: IsConnMap (Tr (-1)) f
foralla : G, grp_image f (f a)
apply grp_image_in.Defined.(** ** Image of a subgroup under a group homomorphism *)(** The image of a subgroup under group homomorphism. *)Definitionsubgroup_image {GH : Group} (f : G $-> H)
: Subgroup G -> Subgroup H
:= funK => grp_image (grp_homo_restr f K).(** By definition, values of [f x] where [x] is in a subgroup [J] are in the image of [J] under [f]. *)Definitionsubgroup_image_in {GH : Group} (f : G $-> H) (J : Subgroup G)
: forallx, J x -> subgroup_image f J (f x)
:= funxJx => tr ((x; Jx); idpath).(** Converting the subgroups to groups, we get the expected surjective (epi) restriction homomorphism. *)Definitiongrp_homo_subgroup_image_in {GH : Group}
(f : G $-> H) (J : Subgroup G)
: subgroup_group J $-> subgroup_group (subgroup_image f J)
:= functor_subgroup_group f (subgroup_image_in _ _).(** The restriction map from the subgroup to the image is surjective as expected, by [conn_map_factor1_image]. *)Definitionissurj_grp_homo_subgroup_image_in {GH : Group}
(f : G $-> H) (J : Subgroup G)
: IsSurjection (grp_homo_subgroup_image_in f J)
:= _.(** An image of a subgroup [J] is included in a subgroup [K] if (and only if) [J] is included in the preimage of the subgroup [K]. *)
G, H: Group f: G $-> H J: Subgroup G K: Subgroup H g: forallx : G, J x -> K (f x)
forallx : H, subgroup_image f J x -> K x
G, H: Group f: G $-> H J: Subgroup G K: Subgroup H g: forallx : G, J x -> K (f x)
forallx : H, subgroup_image f J x -> K x
G, H: Group f: G $-> H J: Subgroup G K: Subgroup H g: forallx : G, J x -> K (f x) x: H j: G Jj: J j p: grp_homo_restr f J (j; Jj) = x
K x
G, H: Group f: G $-> H J: Subgroup G K: Subgroup H g: forallx : G, J x -> K (f x) j: G Jj: J j
K (grp_homo_restr f J (j; Jj))
exact (g j Jj).Defined.(** The image functor is adjoint to the preimage functor. *)
G, H: Group f: G $-> H J: Subgroup G K: Subgroup H
(forallx : H, subgroup_image f J x -> K x) <->
(forallx : G, J x -> subgroup_preimage f K x)
G, H: Group f: G $-> H J: Subgroup G K: Subgroup H
(forallx : H, subgroup_image f J x -> K x) <->
(forallx : G, J x -> subgroup_preimage f K x)
G, H: Group f: G $-> H J: Subgroup G K: Subgroup H
(forallx : H, subgroup_image f J x -> K x) ->
forallx : G, J x -> subgroup_preimage f K x
G, H: Group f: G $-> H J: Subgroup G K: Subgroup H
(forallx : G, J x -> subgroup_preimage f K x) ->
forallx : H, subgroup_image f J x -> K x
G, H: Group f: G $-> H J: Subgroup G K: Subgroup H
(forallx : H, subgroup_image f J x -> K x) ->
forallx : G, J x -> subgroup_preimage f K x
G, H: Group f: G $-> H J: Subgroup G K: Subgroup H rec: forallx : H, subgroup_image f J x -> K x x: G Jx: J x
subgroup_preimage f K x
G, H: Group f: G $-> H J: Subgroup G K: Subgroup H rec: forallx : H, subgroup_image f J x -> K x x: G Jx: J x
{x0 : J & grp_homo_restr f J x0 = f x}
byexists (x; Jx).
G, H: Group f: G $-> H J: Subgroup G K: Subgroup H
(forallx : G, J x -> subgroup_preimage f K x) ->
forallx : H, subgroup_image f J x -> K x
snapply subgroup_image_rec.Defined.(** [subgroup_image] preserves normal subgroups when the group homomorphism is surjective. *)
G, H: Group f: G $-> H J: Subgroup G IsNormalSubgroup0: IsNormalSubgroup J IsSurjection0: IsConnMap (Tr (-1)) f
IsNormalSubgroup (subgroup_image f J)
G, H: Group f: G $-> H J: Subgroup G IsNormalSubgroup0: IsNormalSubgroup J IsSurjection0: IsConnMap (Tr (-1)) f
IsNormalSubgroup (subgroup_image f J)
G, H: Group f: G $-> H J: Subgroup G IsNormalSubgroup0: IsNormalSubgroup J IsSurjection0: IsConnMap (Tr (-1)) f
forallxy : H,
subgroup_image f J x ->
subgroup_image f J (y * x * y^)
G, H: Group f: G $-> H J: Subgroup G IsNormalSubgroup0: IsNormalSubgroup J IsSurjection0: IsConnMap (Tr (-1)) f y: H
forallx : H,
subgroup_image f J x ->
subgroup_image f J (y * x * y^)
G, H: Group f: G $-> H J: Subgroup G IsNormalSubgroup0: IsNormalSubgroup J IsSurjection0: IsConnMap (Tr (-1)) f y: H
forallx : H,
subgroup_image f J x ->
subgroup_preimage (grp_conj y) (subgroup_image f J) x
G, H: Group f: G $-> H J: Subgroup G IsNormalSubgroup0: IsNormalSubgroup J IsSurjection0: IsConnMap (Tr (-1)) f y: H
forallx : G,
J x ->
subgroup_preimage
(grp_conj y) (subgroup_image f J)
(f x)
G, H: Group f: G $-> H J: Subgroup G IsNormalSubgroup0: IsNormalSubgroup J IsSurjection0: IsConnMap (Tr (-1)) f y: H x: G Jx: J x
subgroup_preimage
(grp_conj y) (subgroup_image f J)
(f x)
G, H: Group f: G $-> H J: Subgroup G IsNormalSubgroup0: IsNormalSubgroup J IsSurjection0: IsConnMap (Tr (-1)) f y: H x: G Jx: J x
subgroup_image f J ((grp_conj y $o f) x)
G, H: Group f: G $-> H J: Subgroup G IsNormalSubgroup0: IsNormalSubgroup J IsSurjection0: IsConnMap (Tr (-1)) f x: G Jx: J x y: G
subgroup_image f J ((grp_conj (f y) $o f) x)
G, H: Group f: G $-> H J: Subgroup G IsNormalSubgroup0: IsNormalSubgroup J IsSurjection0: IsConnMap (Tr (-1)) f x: G Jx: J x y: G
subgroup_image f J ((f $o grp_conj y) x)
G, H: Group f: G $-> H J: Subgroup G IsNormalSubgroup0: IsNormalSubgroup J IsSurjection0: IsConnMap (Tr (-1)) f x: G Jx: J x y: G
J (grp_conj y x)
by rapply isnormal_conj.Defined.(** ** Kernels of group homomorphisms *)Definitiongrp_kernel {GH : Group} (f : G $-> H)
: NormalSubgroup G
:= Build_NormalSubgroup G (subgroup_preimage f (trivial_subgroup _)) _.(** Corecursion principle for group kernels *)
A, B, G: Group f: A $-> B g: G $-> A h: f $o g == grp_homo_const
G $-> grp_kernel f
A, B, G: Group f: A $-> B g: G $-> A h: f $o g == grp_homo_const
G $-> grp_kernel f
snapply (subgroup_corec g); exact h.Defined.Definitionequiv_grp_kernel_corec `{Funext} {A B G : Group} {f : A $-> B}
: {g : G $-> A & f $o g == grp_homo_const} <~> (G $-> grp_kernel f)
:= equiv_subgroup_corec G (grp_kernel f).(** The underlying map of a group homomorphism with a trivial kernel is an embedding. *)
G, H: Group f: G $-> H triv: IsTrivialGroup (grp_kernel f)
IsEmbedding f
G, H: Group f: G $-> H triv: IsTrivialGroup (grp_kernel f)
IsEmbedding f
G, H: Group f: G $-> H triv: IsTrivialGroup (grp_kernel f) h: H
IsHProp (hfiber f h)
G, H: Group f: G $-> H triv: IsTrivialGroup (grp_kernel f) h: H
forallxy : hfiber f h, x = y
G, H: Group f: G $-> H triv: IsTrivialGroup (grp_kernel f) h: H x: G p: f x = h y: G q: f y = h
(x; p) = (y; q)
G, H: Group f: G $-> H triv: IsTrivialGroup (grp_kernel f) h: H x: G p: f x = h y: G q: f y = h
x = y
G, H: Group f: G $-> H triv: IsTrivialGroup (grp_kernel f) h: H x: G p: f x = h y: G q: f y = h
x * y^ = 1
G, H: Group f: G $-> H triv: IsTrivialGroup (grp_kernel f) h: H x: G p: f x = h y: G q: f y = h
f (x * y^) = 1
G, H: Group f: G $-> H triv: IsTrivialGroup (grp_kernel f) h: H x: G p: f x = h y: G q: f y = h
f (x * y^) = h * h^
G, H: Group f: G $-> H triv: IsTrivialGroup (grp_kernel f) h: H x: G p: f x = h y: G q: f y = h
f x * f y^ = h * h^
G, H: Group f: G $-> H triv: IsTrivialGroup (grp_kernel f) h: H x: G p: f x = h y: G q: f y = h
f y^ = h^
G, H: Group f: G $-> H triv: IsTrivialGroup (grp_kernel f) h: H x: G p: f x = h y: G q: f y = h
(f y)^ = h^
exact (ap (^) q).Defined.(** If the underlying map of a group homomorphism is an embedding then the kernel is trivial. *)
G, H: Group f: G $-> H emb: IsEmbedding f
IsTrivialGroup (grp_kernel f)
G, H: Group f: G $-> H emb: IsEmbedding f
IsTrivialGroup (grp_kernel f)
G, H: Group f: G $-> H emb: IsEmbedding f g: G p: grp_kernel f g
trivial_subgroup G g
G, H: Group f: G $-> H emb: IsEmbedding f g: G p: grp_kernel f g
f g = f 1
exact (p @ (grp_homo_unit f)^).Defined.GlobalHint Immediate istrivial_kernel_isembedding : typeclass_instances.(** Characterisation of group embeddings *)