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. Local Open Scope mc_scope. Local Open Scope mc_mult_scope. Generalizable Variables G 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. *) Class IsSubgroup {G : Group} (H : G -> Type) := { issubgroup_predicate :: forall x, IsHProp (H x) ; issubgroup_in_unit : H mon_unit ; issubgroup_in_op : forall x y, H x -> H y -> H (x * y) ; issubgroup_in_inv : forall x, H x -> H x^ ; }. Definition issig_issubgroup {G : Group} (H : G -> Type) : _ <~> IsSubgroup H := ltac:(issig). (** Basic properties of subgroups *) (** Smart constructor for subgroups. *)
G: Group
H: G -> Type
H0: forall x : G, IsHProp (H x)
unit: H 1
c: forall x y : G, H x -> H y -> H (x * y^)

IsSubgroup H
G: Group
H: G -> Type
H0: forall x : G, IsHProp (H x)
unit: H 1
c: forall x y : G, H x -> H y -> H (x * y^)

IsSubgroup H
G: Group
H: G -> Type
H0: forall x : G, IsHProp (H x)
unit: H 1
c: forall x y : G, H x -> H y -> H (x * y^)

forall x y : G, H x -> H y -> H (x * y)
G: Group
H: G -> Type
H0: forall x : G, IsHProp (H x)
unit: H 1
c: forall x y : G, H x -> H y -> H (x * y^)
forall x : G, H x -> H x^
G: Group
H: G -> Type
H0: forall x : G, IsHProp (H x)
unit: H 1
c: forall x y : G, H x -> H y -> H (x * y^)

forall x y : G, H x -> H y -> H (x * y)
G: Group
H: G -> Type
H0: forall x : G, IsHProp (H x)
unit: H 1
c: forall x y : G, H x -> H y -> H (x * y^)
x, y: G

H x -> H y -> H (x * y)
G: Group
H: G -> Type
H0: forall x : G, IsHProp (H x)
unit: H 1
c: forall x y : 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: forall x : G, IsHProp (H x)
unit: H 1
c: forall x y : 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: forall x : G, IsHProp (H x)
unit: H 1
c: forall x y : 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: forall x : 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: forall x : 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: forall x : 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: forall x : 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: forall x : 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: forall x : 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: forall x : G, IsHProp (H x)
unit: H 1
c: forall x y : G, H x -> H y -> H (x * y^)

forall x : G, H x -> H x^
G: Group
H: G -> Type
H0: forall x : G, IsHProp (H x)
unit: H 1
c: forall x y : G, H x -> H y -> H (x * y^)
g: G

H g -> H g^
G: Group
H: G -> Type
H0: forall x : 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: forall x : 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 *) Section IsSubgroupElements. 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^
by apply 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: by apply 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. End IsSubgroupElements. (** 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: forall g : G, H g <~> K g

IsSubgroup H -> IsSubgroup K
G: Group
H, K: G -> Type
p: forall g : G, H g <~> K g

IsSubgroup H -> IsSubgroup K
G: Group
H, K: G -> Type
p: forall g : G, H g <~> K g
H1: IsSubgroup H

IsSubgroup K
G: Group
H, K: G -> Type
p: forall g : G, H g <~> K g
H1: IsSubgroup H

forall x : G, IsHProp (K x)
G: Group
H, K: G -> Type
p: forall g : G, H g <~> K g
H1: IsSubgroup H
K 1
G: Group
H, K: G -> Type
p: forall g : G, H g <~> K g
H1: IsSubgroup H
forall x y : G, K x -> K y -> K (x * y)
G: Group
H, K: G -> Type
p: forall g : G, H g <~> K g
H1: IsSubgroup H
forall x : G, K x -> K x^
G: Group
H, K: G -> Type
p: forall g : G, H g <~> K g
H1: IsSubgroup H

forall x : G, IsHProp (K x)
G: Group
H, K: G -> Type
p: forall g : G, H g <~> K g
H1: IsSubgroup H
x: G

IsHProp (K x)
G: Group
H, K: G -> Type
p: forall g : G, H g <~> K g
H1: IsSubgroup H
x: G

H x <~> K x
apply p.
G: Group
H, K: G -> Type
p: forall g : G, H g <~> K g
H1: IsSubgroup H

K 1
apply p, issubgroup_in_unit.
G: Group
H, K: G -> Type
p: forall g : G, H g <~> K g
H1: IsSubgroup H

forall x y : G, K x -> K y -> K (x * y)
G: Group
H, K: G -> Type
p: forall g : 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: forall g : 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: forall g : G, H g <~> K g
H1: IsSubgroup H

forall x : G, K x -> K x^
G: Group
H, K: G -> Type
p: forall g : G, H g <~> K g
H1: IsSubgroup H
x: G
inx: K x

K x^
G: Group
H, K: G -> Type
p: forall g : 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. *) Record Subgroup (G : Group) := { subgroup_pred : G -> Type ; subgroup_issubgroup :: IsSubgroup subgroup_pred ; }. Coercion subgroup_pred : Subgroup >-> Funclass. Definition issig_subgroup {G : Group} : _ <~> Subgroup G := ltac:(issig). (** ** Basics properties of subgroups *)
G: Group
H: G -> Type
H0: forall x : G, IsHProp (H x)
unit: H 1
c: forall x y : G, H x -> H y -> H (x * y^)

Subgroup G
G: Group
H: G -> Type
H0: forall x : G, IsHProp (H x)
unit: H 1
c: forall x y : G, H x -> H y -> H (x * y^)

Subgroup G
G: Group
H: G -> Type
H0: forall x : G, IsHProp (H x)
unit: H 1
c: forall x y : G, H x -> H y -> H (x * y^)

IsSubgroup H
rapply Build_IsSubgroup'; assumption. Defined. Section SubgroupElements. Context {G : Group} (H : Subgroup G) (x y : G). Definition subgroup_in_unit : H 1 := issubgroup_in_unit. Definition subgroup_in_inv : H x -> H x^ := issubgroup_in_inv x. Definition subgroup_in_inv' : H x^ -> H x := issubgroup_in_inv' x. Definition subgroup_in_op : H x -> H y -> H (x * y) := issubgroup_in_op x y. Definition subgroup_in_op_inv : H x -> H y -> H (x * y^) := issubgroup_in_op_inv x y. Definition subgroup_in_inv_op : H x -> H y -> H (x^ * y) := issubgroup_in_inv_op x y. Definition subgroup_in_op_l : H (x * y) -> H y -> H x := issubgroup_in_op_l x y. Definition subgroup_in_op_r : H (x * y) -> H x -> H y := issubgroup_in_op_r x y. End SubgroupElements.
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. Definition equiv_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^)
by rewrite 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

(forall g : G, H g <-> K g) <~> H = K
U: Univalence
G: Group
H, K: Subgroup G

(forall g : G, H g <-> K g) <~> H = K
U: Univalence
G: Group
H, K: Subgroup G

(forall g : 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

forall a : G -> Type, ?Goal a <~> IsSubgroup a
H: Univalence
G: Group
IsHSet {x : _ & ?Goal x}
H: Univalence
G: Group

forall a : G -> Type, ?Goal a <~> IsSubgroup a
intro P; apply issig_issubgroup.
H: Univalence
G: Group

IsHSet {P : G -> Type & {_ : forall x : G, IsHProp (P x) & {_ : P 1 & {_ : forall x y : G, P x -> P y -> P (x * y) & forall x : G, P x -> P x^}}}}
H: Univalence
G: Group

IsHSet {ap : {a : G -> Type & forall x : G, IsHProp (a x)} & {_ : ap.1 1 & {_ : forall x y : G, ap.1 x -> ap.1 y -> ap.1 (x * y) & forall x : G, ap.1 x -> ap.1 x^}}}
H: Univalence
G: Group

IsHSet {a : G -> Type & forall x : G, IsHProp (a x)}
H: Univalence
G: Group
forall a : {a : G -> Type & forall x : G, IsHProp (a x)}, IsHSet {_ : a.1 1 & {_ : forall x y : G, a.1 x -> a.1 y -> a.1 (x * y) & forall x : G, a.1 x -> a.1 x^}}
H: Univalence
G: Group

IsHSet {a : G -> Type & forall x : 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. Coercion subgroup_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. *) Instance isembedding_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. *) Definition grp_homo_restr {G H : 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: forall x : G, K (f x)

G $-> K
G, H: Group
K: Subgroup H
f: G $-> H
g: forall x : G, K (f x)

G $-> K
G, H: Group
K: Subgroup H
f: G $-> H
g: forall x : G, K (f x)

G -> K
G, H: Group
K: Subgroup H
f: G $-> H
g: forall x : G, K (f x)
IsSemiGroupPreserving ?grp_homo_map
G, H: Group
K: Subgroup H
f: G $-> H
g: forall x : G, K (f x)

G -> K
exact (fun x => (f x; g x)).
G, H: Group
K: Subgroup H
f: G $-> H
g: forall x : G, K (f x)

IsSemiGroupPreserving (fun x : G => (f x; g x))
G, H: Group
K: Subgroup H
f: G $-> H
g: forall x : 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: forall x : 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 & forall x : G, K (f x)} <~> (G $-> K)
F: Funext
G, H: Group
K: Subgroup H

{f : G $-> H & forall x : G, K (f x)} <~> (G $-> K)
F: Funext
G, H: Group
K: Subgroup H

{f : G $-> H & forall x : G, K (f x)} -> G $-> K
F: Funext
G, H: Group
K: Subgroup H
(G $-> K) -> {f : G $-> H & forall x : 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 & forall x : G, K (f x)} -> G $-> K
exact (sig_rec subgroup_corec).
F: Funext
G, H: Group
K: Subgroup H

(G $-> K) -> {f : G $-> H & forall x : G, K (f x)}
F: Funext
G, H: Group
K: Subgroup H
g: G $-> K

{f : G $-> H & forall x : G, K (f x)}
F: Funext
G, H: Group
K: Subgroup H
g: G $-> K

forall x : 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 (fun g : G $-> K => (subgroup_incl K $o g; fun x : 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; fun x : G => (g x).2) = g
by snapply equiv_path_grouphomomorphism.
F: Funext
G, H: Group
K: Subgroup H

(fun g : G $-> K => (subgroup_incl K $o g; fun x : G => (g x).2)) o sig_rec subgroup_corec == idmap
F: Funext
G, H: Group
K: Subgroup H
f: G $-> H
p: forall x : G, K (f x)

(subgroup_incl K $o sig_rec subgroup_corec (f; p); fun x : G => (sig_rec subgroup_corec (f; p) x).2) = (f; p)
F: Funext
G, H: Group
K: Subgroup H
f: G $-> H
p: forall x : G, K (f x)

(subgroup_incl K $o sig_rec subgroup_corec (f; p); fun x : G => (sig_rec subgroup_corec (f; p) x).2).1 = (f; p).1
by snapply equiv_path_grouphomomorphism. Defined. (** Functoriality on subgroups. *) Definition functor_subgroup_group {G H : Group} {J : Subgroup G} {K : Subgroup H} (f : G $-> H) (g : forall x, 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: forall x : G, J x <-> K (e x)

J $<~> K
G, H: Group
J: Subgroup G
K: Subgroup H
e: G $<~> H
f: forall x : G, J x <-> K (e x)

J $<~> K
G, H: Group
J: Subgroup G
K: Subgroup H
e: G $<~> H
f: forall x : G, J x <-> K (e x)

J $-> K
G, H: Group
J: Subgroup G
K: Subgroup H
e: G $<~> H
f: forall x : G, J x <-> K (e x)
K $-> J
G, H: Group
J: Subgroup G
K: Subgroup H
e: G $<~> H
f: forall x : G, J x <-> K (e x)
?f $o ?g $== Id K
G, H: Group
J: Subgroup G
K: Subgroup H
e: G $<~> H
f: forall x : G, J x <-> K (e x)
?g $o ?f $== Id J
G, H: Group
J: Subgroup G
K: Subgroup H
e: G $<~> H
f: forall x : G, J x <-> K (e x)

J $-> K
exact (functor_subgroup_group e (fun x => fst (f x))).
G, H: Group
J: Subgroup G
K: Subgroup H
e: G $<~> H
f: forall x : G, J x <-> K (e x)

K $-> J
G, H: Group
J: Subgroup G
K: Subgroup H
e: G $<~> H
f: forall x : G, J x <-> K (e x)

forall x : H, K x -> J (e^-1$ x)
G, H: Group
J: Subgroup G
K: Subgroup H
e: G $<~> H
f: forall x : 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: forall x : 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: forall x : 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: forall x : G, J x <-> K (e x)

functor_subgroup_group e (fun x : G => fst (f x)) $o functor_subgroup_group e^-1$ (equiv_ind e (fun x : H => K x -> J (e^-1$ x)) (fun (x : G) (k : K (e x)) => transport J (eissect e x)^ (snd (f x) k)) : forall x : H, K x -> J (e^-1$ x)) $== Id K
G, H: Group
J: Subgroup G
K: Subgroup H
e: G $<~> H
f: forall x : G, J x <-> K (e x)
x: K

(functor_subgroup_group e (fun x : G => fst (f x)) $o functor_subgroup_group e^-1$ (equiv_ind e (fun x : 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: forall x : G, J x <-> K (e x)
x: K

((functor_subgroup_group e (fun x : G => fst (f x)) $o functor_subgroup_group e^-1$ (equiv_ind e (fun x : 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: forall x : G, J x <-> K (e x)

functor_subgroup_group e^-1$ (equiv_ind e (fun x : H => K x -> J (e^-1$ x)) (fun (x : G) (k : K (e x)) => transport J (eissect e x)^ (snd (f x) k)) : forall x : H, K x -> J (e^-1$ x)) $o functor_subgroup_group e (fun x : G => fst (f x)) $== Id J
G, H: Group
J: Subgroup G
K: Subgroup H
e: G $<~> H
f: forall x : G, J x <-> K (e x)
x: J

(functor_subgroup_group e^-1$ (equiv_ind e (fun x : 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 (fun x : G => fst (f x))) x = Id J x
G, H: Group
J: Subgroup G
K: Subgroup H
e: G $<~> H
f: forall x : G, J x <-> K (e x)
x: J

((functor_subgroup_group e^-1$ (equiv_ind e (fun x : 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 (fun x : G => fst (f x))) x).1 = (Id J x).1
napply eissect. Defined. (** ** Cosets of subgroups *) Section Cosets. (** 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. *) Definition in_cosetL : Relation G := fun x y => H (x^ * y). (** The relation of being in a right coset represented by an element. *) Definition in_cosetR : Relation G := fun x y => H (x * y^). Hint Extern 4 => progress unfold in_cosetL : typeclass_instances. Hint Extern 4 => progress unfold in_cosetR : typeclass_instances. Global Arguments in_cosetL /. Global Arguments in_cosetR /. (** These are props *) #[export] Instance ishprop_in_cosetL : is_mere_relation G in_cosetL := _. #[export] Instance ishprop_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. End Cosets. (** ** Properties of left and right cosets *)
G: Group
N: Subgroup G

forall x y : G, in_cosetL N (x^ * y) 1 <~> in_cosetL N x y
G: Group
N: Subgroup G

forall x y : G, in_cosetL N (x^ * y) 1 <~> in_cosetL 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)
G: Group
N: Subgroup G
x, y: G

N (y^ * (x^)^) <~> N (x^ * y)
G: Group
N: Subgroup G
x, y: G

N (y^ * x) <~> N (x^ * y)
apply equiv_iff_hprop; apply symmetric_in_cosetL. Defined.
G: Group
N: Subgroup G

forall x y : G, in_cosetR N (x * y^) 1 <~> in_cosetR N x y
G: Group
N: Subgroup G

forall x y : 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

forall x y : G, in_cosetL N x y <~> in_cosetL N y x
G: Group
N: Subgroup G

forall 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 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: by intro. Defined.
G: Group
N: Subgroup G

forall x y : G, in_cosetR N x y <~> in_cosetR N y x
G: Group
N: Subgroup G

forall 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 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: by intro. 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
forall a : 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

forall a : 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
forall a : 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

forall a : G, in_cosetR H x a <~> H ({| equiv_fun := fun y : 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. *) Class IsNormalSubgroup {G : Group} (N : Subgroup G) := isnormal : forall {x y}, N (x * y) -> N (y * x). Record NormalSubgroup (G : Group) := { normalsubgroup_subgroup : Subgroup G ; normalsubgroup_isnormal :: IsNormalSubgroup normalsubgroup_subgroup ; }. Arguments Build_NormalSubgroup G N _ : rename. Coercion normalsubgroup_subgroup : NormalSubgroup >-> Subgroup.
G: Group
N: Subgroup G
IsNormalSubgroup0: IsNormalSubgroup N

forall x y : G, N (x * y) <~> N (y * x)
G: Group
N: Subgroup G
IsNormalSubgroup0: IsNormalSubgroup N

forall 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 (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))
by rewrite grp_inv_V_gg. Defined. (** We can show a subgroup is normal if it is invariant under conjugation. *)
G: Group
N: Subgroup G
isnormal: forall x y : G, N x -> N (y * x * y^)

IsNormalSubgroup N
G: Group
N: Subgroup G
isnormal: forall x y : G, N x -> N (y * x * y^)

IsNormalSubgroup N
G: Group
N: Subgroup G
isnormal: forall x y : G, N x -> N (y * x * y^)
x, y: G
n: N (x * y)

N (y * x)
G: Group
N: Subgroup G
isnormal: forall x y : G, N x -> N (y * x * y^)
x, y: G
n: N (x * y)

N (y * x * 1)
G: Group
N: Subgroup G
isnormal: forall x y : 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: forall x y : 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: forall x y : G, N x -> N (y * x * y^)
x, y: G
n: N (x * y)

N (y * (x * y) * y^)
by apply 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 <~> (forall x y : G, N x -> N (y * x * y^))
H: Funext
G: Group
N: Subgroup G

IsNormalSubgroup N <~> (forall x y : G, N x -> N (y * x * y^))
H: Funext
G: Group
N: Subgroup G

IsNormalSubgroup N -> forall x y : G, N x -> N (y * x * y^)
H: Funext
G: Group
N: Subgroup G
(forall x y : G, N x -> N (y * x * y^)) -> IsNormalSubgroup N
H: Funext
G: Group
N: Subgroup G

IsNormalSubgroup N -> forall x y : 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

(forall x y : G, N x -> N (y * x * y^)) -> IsNormalSubgroup N
H: Funext
G: Group
N: Subgroup G
is_normal': forall x y : 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
forall x0 : 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

forall x0 : 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. *) Definition equiv_in_cosetL_in_cosetR_normalsubgroup {G : Group} (N : NormalSubgroup G) (x y : 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)
by rewrite 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^)
by rewrite 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
forall x y : G, x = 1 -> y = 1 -> x * y^ = 1
G: Group

forall x y : 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

forall x : G, trivial_subgroup G x -> H x
G: Group
H: Subgroup G

forall x : 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
by apply 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. *) Class IsTrivialGroup@{i} {G : Group@{i}} (H : Subgroup@{i i} G) := istrivialgroup : forall x, H x -> trivial_subgroup G x. Instance ishprop_istrivialgroup `{F : Funext} {G : Group} (H : Subgroup G) : IsHProp (IsTrivialGroup H) := istrunc_forall. Instance istrivial_trivial_subgroup {G : Group} : IsTrivialGroup (trivial_subgroup G) := fun x => 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
by intros [].
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
by apply 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

trivial_subgroup G $<~> trivial_subgroup H
G, H: Group

trivial_subgroup G $<~> trivial_subgroup H
G, H: Group

Group
G, H: Group
trivial_subgroup H $<~> ?b
G, H: Group
trivial_subgroup G $<~> ?b
G, H: Group

trivial_subgroup H $<~> grp_trivial
G, H: Group
trivial_subgroup G $<~> grp_trivial
1,2: apply istrivial_iff_grp_iso_trivial; exact _. Defined.
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. *) Coercion maximal_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. *)
G: Group

maximal_subgroup G $<~> G
G: Group

maximal_subgroup G $<~> G
G: Group

maximal_subgroup G <~> G
G: Group
IsSemiGroupPreserving ?f
G: Group

maximal_subgroup G <~> G
rapply equiv_sigma_contr.
G: Group

IsSemiGroupPreserving (equiv_sigma_contr (maximal_subgroup G))
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]. *) Class IsMaximalSubgroup {G : Group} (H : Subgroup G) := ismaximalsubgroup : forall (x : G), H x. Instance ishprop_ismaximalsubgroup `{Funext} {G : Group} (H : Subgroup G) : IsHProp (IsMaximalSubgroup H) := istrunc_forall. Instance ismaximalsubgroup_maximalsubgroup {G : Group} : IsMaximalSubgroup (maximal_subgroup G) := fun g => 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

forall x : grp_op G, IsHProp (H x)
G: Group
H: G -> Type
H1: IsSubgroup H
H 1
G: Group
H: G -> Type
H1: IsSubgroup H
forall x y : grp_op G, H x -> H y -> H (x * y^)
G: Group
H: G -> Type
H1: IsSubgroup H

forall x : 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

forall x y : 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)
by apply 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]. *) Definition subgroup_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. Definition normalsubgroup_grp_op {G : Group} : NormalSubgroup G -> NormalSubgroup (grp_op G) := fun N => 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

forall x : G, IsHProp ((fun x0 : G => S (f x0)) x)
G, H: Group
f: G $-> H
S: H -> Type
H1: IsSubgroup S
(fun x : G => S (f x)) 1
G, H: Group
f: G $-> H
S: H -> Type
H1: IsSubgroup S
forall x y : G, (fun x0 : G => S (f x0)) x -> (fun x0 : G => S (f x0)) y -> (fun x0 : G => S (f x0)) (x * y^)
G, H: Group
f: G $-> H
S: H -> Type
H1: IsSubgroup S

forall x : G, IsHProp ((fun x0 : G => S (f x0)) x)
hnf; exact _.
G, H: Group
f: G $-> H
S: H -> Type
H1: IsSubgroup S

(fun x : 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

forall x y : G, (fun x0 : G => S (f x0)) x -> (fun x0 : G => S (f x0)) y -> (fun x0 : 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)^
by apply issubgroup_in_inv. Defined. Definition subgroup_preimage {G H : 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
forall x : G, IsHProp (?H x)
G: Group
H, K: Subgroup G
?H 1
G: Group
H, K: Subgroup G
forall x y : G, ?H x -> ?H y -> ?H (x * y^)
G: Group
H, K: Subgroup G

forall x : G, IsHProp ((fun g : G => (H g * K g)%type) x)
G: Group
H, K: Subgroup G
(fun g : G => (H g * K g)%type) 1
G: Group
H, K: Subgroup G
forall x y : G, (fun g : G => (H g * K g)%type) x -> (fun g : G => (H g * K g)%type) y -> (fun g : G => (H g * K g)%type) (x * y^)
G: Group
H, K: Subgroup G

(fun g : G => (H g * K g)%type) 1
G: Group
H, K: Subgroup G
forall x y : G, (fun g : G => (H g * K g)%type) x -> (fun g : G => (H g * K g)%type) y -> (fun g : G => (H g * K g)%type) (x * y^)
G: Group
H, K: Subgroup G

forall x y : G, (fun g : G => (H g * K g)%type) x -> (fun g : G => (H g * K g)%type) y -> (fun g : 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; by apply subgroup_in_op_inv. Defined. (** ** Simple groups *) Class IsSimpleGroup (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 *) Inductive subgroup_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^)^
by apply 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

forall x y : 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. *) Definition subgroup_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: forall g : G, X g -> S g

forall g : G, subgroup_generated X g -> S g
G: Group
X: G -> Type
S: Subgroup G
i: forall g : G, X g -> S g

forall g : G, subgroup_generated X g -> S g
G: Group
X: G -> Type
S: Subgroup G
i: forall g : G, X g -> S g
g: G
p: subgroup_generated_type X g

S g
G: Group
X: G -> Type
S: Subgroup G
i: forall g : G, X g -> S g
g: G
Xg: X g

S g
G: Group
X: G -> Type
S: Subgroup G
i: forall g : G, X g -> S g
S 1
G: Group
X: G -> Type
S: Subgroup G
i: forall g : 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: forall g : G, X g -> S g
g: G
Xg: X g

S g
by apply i.
G: Group
X: G -> Type
S: Subgroup G
i: forall g : G, X g -> S g

S 1
apply subgroup_in_unit.
G: Group
X: G -> Type
S: Subgroup G
i: forall g : 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^)
by apply 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: forall g : G, X g -> Y (f g)

forall g : G, subgroup_generated X g -> subgroup_generated Y (f g)
G, H: Group
X: G -> Type
Y: H -> Type
f: G $-> H
preserves: forall g : G, X g -> Y (f g)

forall g : G, subgroup_generated X g -> subgroup_generated Y (f g)
G, H: Group
X: G -> Type
Y: H -> Type
f: G $-> H
preserves: forall g : G, X g -> Y (f g)

forall g : 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: forall g : G, X g -> Y (f g)

forall g : G, X g -> subgroup_preimage f (subgroup_generated Y) g
G, H: Group
X: G -> Type
Y: H -> Type
f: G $-> H
preserves: forall g : 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: forall g : G, X g -> Y (f g)
g: G
p: X g

Y (f g)
by apply preserves. Defined.
G, H: Group
X: G -> Type
Y: H -> Type
f: G $<~> H
preserves: forall g : G, X g <-> Y (f g)

forall g : G, subgroup_generated X g <-> subgroup_generated Y (f g)
G, H: Group
X: G -> Type
Y: H -> Type
f: G $<~> H
preserves: forall g : G, X g <-> Y (f g)

forall g : G, subgroup_generated X g <-> subgroup_generated Y (f g)
G, H: Group
X: G -> Type
Y: H -> Type
f: G $<~> H
preserves: forall g : G, X g <-> Y (f g)

forall x : G, subgroup_generated X x -> subgroup_generated Y (f x)
G, H: Group
X: G -> Type
Y: H -> Type
f: G $<~> H
preserves: forall g : G, X g <-> Y (f g)
forall x : G, subgroup_generated Y (f x) -> subgroup_generated X x
G, H: Group
X: G -> Type
Y: H -> Type
f: G $<~> H
preserves: forall g : G, X g <-> Y (f g)

forall x : G, subgroup_generated X x -> subgroup_generated Y (f x)
G, H: Group
X: G -> Type
Y: H -> Type
f: G $<~> H
preserves: forall g : G, X g <-> Y (f g)

forall g : G, X g -> Y (f g)
apply preserves.
G, H: Group
X: G -> Type
Y: H -> Type
f: G $<~> H
preserves: forall g : G, X g <-> Y (f g)

forall x : G, subgroup_generated Y (f x) -> subgroup_generated X x
G, H: Group
X: G -> Type
Y: H -> Type
f: G $<~> H
preserves: forall g : 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: forall g : 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: forall g : G, X g <-> Y (f g)

forall g : H, Y g -> X (f^-1$ g)
G, H: Group
X: G -> Type
Y: H -> Type
f: G $<~> H
preserves: forall g : 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: forall g : G, X g <-> Y (f g)
x: G
y: Y (f x)

X x
by apply 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: forall g : G, X g <-> Y g

forall g : G, subgroup_generated X g <-> subgroup_generated Y g
G: Group
X, Y: G -> Type
preserves: forall g : G, X g <-> Y g

forall g : G, subgroup_generated X g <-> subgroup_generated Y g
G: Group
X, Y: G -> Type
preserves: forall g : G, X g <-> Y g
g: G

subgroup_generated X g -> subgroup_generated Y g
G: Group
X, Y: G -> Type
preserves: forall g : G, X g <-> Y g
g: G
subgroup_generated Y g -> subgroup_generated X g
G: Group
X, Y: G -> Type
preserves: forall g : 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: forall g : G, X g <-> Y g
g: G
subgroup_generated Y g -> subgroup_generated X g
G: Group
X, Y: G -> Type
preserves: forall g : 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: forall g : 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: forall g : G, X g <-> Y g
g: G

forall g : G, X g -> subgroup_grp_op (subgroup_generated Y) g
G: Group
X, Y: G -> Type
preserves: forall g : G, X g <-> Y g
g: G
forall g : grp_op G, Y g -> subgroup_grp_op (subgroup_generated X) g
G: Group
X, Y: G -> Type
preserves: forall g : 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: forall g : 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: forall g : G, X g <-> Y g
g, x: G
Xx: X x

Y x
G: Group
X, Y: G -> Type
preserves: forall g : G, X g <-> Y g
g: G
x: grp_op G
Xx: Y x
X x
all: by apply (preserves x). Defined. (** ** Product of subgroups *) (** The product of two subgroups. *) Definition subgroup_product {G : Group} (H K : Subgroup G) : Subgroup G := subgroup_generated (fun x => (H x + K x)%type). (** The induction principle for the product. *)
G: Group
H, K: Subgroup G
P: forall x : 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 (x y : G) (h : subgroup_generated_type (fun x0 : G => (H x0 + K x0)%type) x) (k : subgroup_generated_type (fun x0 : 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: forall x : 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 (x y : G) (h : subgroup_generated_type (fun x0 : G => (H x0 + K x0)%type) x) (k : subgroup_generated_type (fun x0 : 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: forall x : 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 (x y : G) (h : subgroup_generated_type (fun x0 : G => (H x0 + K x0)%type) x) (k : subgroup_generated_type (fun x0 : 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: forall x : 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 (x y : G) (h : subgroup_generated_type (fun x0 : G => (H x0 + K x0)%type) x) (k : subgroup_generated_type (fun x0 : 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 (fun x : G => (H x + K x)%type) x

P x (tr p)
G: Group
H, K: Subgroup G
P: forall x : 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 (x y : G) (h : subgroup_generated_type (fun x0 : G => (H x0 + K x0)%type) x) (k : subgroup_generated_type (fun x0 : 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: forall x : 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 (x y : G) (h : subgroup_generated_type (fun x0 : G => (H x0 + K x0)%type) x) (k : subgroup_generated_type (fun x0 : 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: forall x : 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 (x y : G) (h : subgroup_generated_type (fun x0 : G => (H x0 + K x0)%type) x) (k : subgroup_generated_type (fun x0 : 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 (fun x : G => (H x + K x)%type) x
k: subgroup_generated_type (fun x : 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: forall x : 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 (x y : G) (h : subgroup_generated_type (fun x0 : G => (H x0 + K x0)%type) x) (k : subgroup_generated_type (fun x0 : 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: forall x : 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 (x y : G) (h : subgroup_generated_type (fun x0 : G => (H x0 + K x0)%type) x) (k : subgroup_generated_type (fun x0 : 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: forall x : 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 (x y : G) (h : subgroup_generated_type (fun x0 : G => (H x0 + K x0)%type) x) (k : subgroup_generated_type (fun x0 : 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: forall x : 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 (x y : G) (h : subgroup_generated_type (fun x0 : G => (H x0 + K x0)%type) x) (k : subgroup_generated_type (fun x0 : 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: forall x : 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 (x y : G) (h : subgroup_generated_type (fun x0 : G => (H x0 + K x0)%type) x) (k : subgroup_generated_type (fun x0 : 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: forall x : 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 (x y : G) (h : subgroup_generated_type (fun x0 : G => (H x0 + K x0)%type) x) (k : subgroup_generated_type (fun x0 : 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: forall x : 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 (x y : G) (h : subgroup_generated_type (fun x0 : G => (H x0 + K x0)%type) x) (k : subgroup_generated_type (fun x0 : 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 (fun x : G => (H x + K x)%type) x
k: subgroup_generated_type (fun x : 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))
by apply P_op. Defined. Definition subgroup_product_incl_l {G : Group} (H K : Subgroup G) : forall x, H x -> subgroup_product H K x := fun x => tr o sgt_in o inl. Definition subgroup_product_incl_r {G : Group} (H K : Subgroup G) : forall x, K x -> subgroup_product H K x := fun x => 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

forall x y : 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

forall x : 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

forall g : 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. Definition normalsubgroup_product {G : Group} (H K : 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: forall x : G, J x -> L (f x)
r: forall x : G, K x -> M (f x)

forall x : 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: forall x : G, J x -> L (f x)
r: forall x : G, K x -> M (f x)

forall x : 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: forall x : G, J x -> L (f x)
r: forall x : G, K x -> M (f x)

forall g : G, (fun x : G => (J x + K x)%type) g -> (fun x : H => (L x + M x)%type) (f g)
exact (fun x => functor_sum (l x) (r x)). Defined.
G, H: Group
J, K: Subgroup G
L, M: Subgroup H
f: G $<~> H
l: forall x : G, J x <-> L (f x)
r: forall x : G, K x <-> M (f x)

forall x : 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: forall x : G, J x <-> L (f x)
r: forall x : G, K x <-> M (f x)

forall x : 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: forall x : G, J x <-> L (f x)
r: forall x : G, K x <-> M (f x)

forall g : G, (fun x : G => (J x + K x)%type) g <-> (fun x : H => (L x + M x)%type) (f g)
exact (fun x => iff_functor_sum (l x) (r x)). Defined.
G: Group
H, K: Subgroup G

forall 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

forall 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

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

forall g : 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: forall g : G, merely (X g) -> merely (Y g)

forall g : G, Trunc (-1) (subgroup_generated_type X g) -> Trunc (-1) (subgroup_generated_type Y g)
G: Group
X, Y: G -> Type
K: forall g : G, merely (X g) -> merely (Y g)

forall g : G, Trunc (-1) (subgroup_generated_type X g) -> Trunc (-1) (subgroup_generated_type Y g)
G: Group
X, Y: G -> Type
K: forall g : 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: forall g : 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: forall g : G, merely (X g) -> merely (Y g)
Trunc (-1) (subgroup_generated_type Y 1)
G: Group
X, Y: G -> Type
K: forall g : 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: forall g : 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: forall g : 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: forall g : 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: forall g : 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^))
by apply 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: forall g : G, Trunc (-1) (X g) <-> Trunc (-1) (Y g)

subgroup_generated X = subgroup_generated Y
H: Univalence
G: Group
X, Y: G -> Type
K: forall g : G, Trunc (-1) (X g) <-> Trunc (-1) (Y g)

subgroup_generated X = subgroup_generated Y
H: Univalence
G: Group
X, Y: G -> Type
K: forall g : G, Trunc (-1) (X g) <-> Trunc (-1) (Y g)

forall g : G, subgroup_generated X g <-> subgroup_generated Y g
H: Univalence
G: Group
X, Y: G -> Type
K: forall g : 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: forall g : 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: forall g : G, Trunc (-1) (X g) <-> Trunc (-1) (Y g)
g: G

subgroup_generated X g -> subgroup_generated Y g
apply path_subgroup_generated_helper, (fun x => fst (K x)).
H: Univalence
G: Group
X, Y: G -> Type
K: forall g : G, Trunc (-1) (X g) <-> Trunc (-1) (Y g)
g: G

subgroup_generated Y g -> subgroup_generated X g
apply path_subgroup_generated_helper, (fun x => snd (K x)). Defined. (** Equal subgroups have isomorphic underlying groups. *) Definition equiv_subgroup_group {G : Group} (H1 H2 : 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 (fun x : G => f x = 1)
G, H: Group
f: G $-> H
forall x y : H, hexists (fun x0 : G => f x0 = x) -> hexists (fun x0 : G => f x0 = y) -> hexists (fun x0 : G => f x0 = x * y^)
G, H: Group
f: G $-> H

hexists (fun x : 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

forall x y : H, hexists (fun x0 : G => f x0 = x) -> hexists (fun x0 : G => f x0 = y) -> hexists (fun x0 : 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. Definition grp_image_in {G H : Group} (f : G $-> H) : forall x, grp_image f (f x) := fun x => tr (x; idpath). Definition grp_homo_image_in {G H : 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

forall x : 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
forall x y : H, hfiber f x -> hfiber f y -> hfiber f (x * y)
G, H: Group
f: G $-> H
IsEmbedding0: IsEmbedding f
forall x : H, hfiber f x -> hfiber f x^
G, H: Group
f: G $-> H
IsEmbedding0: IsEmbedding f

forall x : 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

forall x y : 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

forall x : 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

forall x : G, grp_image_embedding f (f x)
exact (fun x => (x; idpath)).
G, H: Group
f: G $-> H
IsEmbedding0: IsEmbedding f

IsEquiv (subgroup_corec f (fun x : G => (x; 1%path)))
G, H: Group
f: G $-> H
IsEmbedding0: IsEmbedding f

IsConnMap (Tr (-1)) (subgroup_corec f (fun x : G => (x; 1%path)))
G, H: Group
f: G $-> H
IsEmbedding0: IsEmbedding f
IsEmbedding (subgroup_corec f (fun x : G => (x; 1%path)))
G, H: Group
f: G $-> H
IsEmbedding0: IsEmbedding f

IsConnMap (Tr (-1)) (subgroup_corec f (fun x : G => (x; 1%path)))
G, H: Group
f: G $-> H
IsEmbedding0: IsEmbedding f
b: H
a: G
p: f a = b

IsConnected (Tr (-1)) (hfiber (fun x : G => (f x; x; 1%path)) (b; a; p))
G, H: Group
f: G $-> H
IsEmbedding0: IsEmbedding f
b: H
a: G
p: f a = b

Tr (-1) (hfiber (fun x : G => (f x; x; 1%path)) (b; a; p))
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 (fun x : H => f (a; 1%path).1 = x) p (a; 1%path).2) = (a; p)
by apply 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

forall a : 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. *) Definition subgroup_image {G H : Group} (f : G $-> H) : Subgroup G -> Subgroup H := fun K => 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]. *) Definition subgroup_image_in {G H : Group} (f : G $-> H) (J : Subgroup G) : forall x, J x -> subgroup_image f J (f x) := fun x Jx => tr ((x; Jx); idpath). (** Converting the subgroups to groups, we get the expected surjective (epi) restriction homomorphism. *) Definition grp_homo_subgroup_image_in {G H : 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]. *) Definition issurj_grp_homo_subgroup_image_in {G H : 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: forall x : G, J x -> K (f x)

forall x : H, subgroup_image f J x -> K x
G, H: Group
f: G $-> H
J: Subgroup G
K: Subgroup H
g: forall x : G, J x -> K (f x)

forall x : H, subgroup_image f J x -> K x
G, H: Group
f: G $-> H
J: Subgroup G
K: Subgroup H
g: forall x : 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: forall x : 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

(forall x : H, subgroup_image f J x -> K x) <-> (forall x : G, J x -> subgroup_preimage f K x)
G, H: Group
f: G $-> H
J: Subgroup G
K: Subgroup H

(forall x : H, subgroup_image f J x -> K x) <-> (forall x : G, J x -> subgroup_preimage f K x)
G, H: Group
f: G $-> H
J: Subgroup G
K: Subgroup H

(forall x : H, subgroup_image f J x -> K x) -> forall x : G, J x -> subgroup_preimage f K x
G, H: Group
f: G $-> H
J: Subgroup G
K: Subgroup H
(forall x : G, J x -> subgroup_preimage f K x) -> forall x : H, subgroup_image f J x -> K x
G, H: Group
f: G $-> H
J: Subgroup G
K: Subgroup H

(forall x : H, subgroup_image f J x -> K x) -> forall x : G, J x -> subgroup_preimage f K x
G, H: Group
f: G $-> H
J: Subgroup G
K: Subgroup H
rec: forall x : 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: forall x : H, subgroup_image f J x -> K x
x: G
Jx: J x

{x0 : J & grp_homo_restr f J x0 = f x}
by exists (x; Jx).
G, H: Group
f: G $-> H
J: Subgroup G
K: Subgroup H

(forall x : G, J x -> subgroup_preimage f K x) -> forall x : 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

forall x y : 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

forall x : 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

forall x : 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

forall x : 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 *) Definition grp_kernel {G H : 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. Definition equiv_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

forall x y : 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. Global Hint Immediate istrivial_kernel_isembedding : typeclass_instances. (** Characterisation of group embeddings *)
F: Funext
G, H: Group
f: G $-> H

IsTrivialGroup (grp_kernel f) <~> IsEmbedding f
F: Funext
G, H: Group
f: G $-> H

IsTrivialGroup (grp_kernel f) <~> IsEmbedding f
F: Funext
G, H: Group
f: G $-> H

IsTrivialGroup (grp_kernel f) <-> IsEmbedding f
split; exact _. Defined.