Built with Alectryon. 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.
Require Import Basics.Overture Basics.Tactics Basics.PathGroupoids Basics.TruncRequire Import Basics.Overture Basics.Tactics Basics.PathGroupoids Basics.Trunc
Basics.Iff Basics.Equivalences Basics.Predicate.Require Import Types.Sigma Types.Paths.Require Import Groups.Group AbGroups.Abelianization AbGroups.AbelianGroup
Groups.QuotientGroup.Require Import WildCat.Core WildCat.Equiv WildCat.EquivGpd.Require Import Truncations.Core.LocalOpen Scope predicate_scope.LocalOpen Scope mc_scope.LocalOpen Scope mc_mult_scope.Set Universe Minimization ToSet.(** Commutators in groups *)(** ** Commutators of group elements *)(** Note that this convention is chosen due to the convention we chose for group conjugation elsewhere. *)Definitiongrp_commutator {G : Group} (xy : G) : G := x * y * x^ * y^.Notation"[ x , y ]" := (grp_commutator x y) : mc_mult_scope.Arguments grp_commutator {G} x y : simpl never.(** ** Easy properties of commutators *)(** Commuting elements of a group have trivial commutator. *)
G: Group x, y: G p: x * y = y * x
[x, y] = 1
G: Group x, y: G p: x * y = y * x
[x, y] = 1
G: Group x, y: G p: x * y = y * x
x * y * x^ * y^ = 1
G: Group x, y: G p: x * y = y * x
y * y^ = 1
apply grp_inv_r.Defined.(** A commutator of an element with itself is the unit. *)
G: Group x, y: G
[x, x] = 1
G: Group x, y: G
[x, x] = 1
byapply grp_commutator_commutes.Defined.(** A commutator of a group element with unit on the left is the unit. *)
G: Group x: G
[1, x] = 1
G: Group x: G
[1, x] = 1
byapply grp_commutator_commutes, grp_1g_g1.Defined.(** A commutator of a group element with unit on the right is the unit. *)
G: Group x: G
[x, 1] = 1
G: Group x: G
[x, 1] = 1
byapply grp_commutator_commutes, grp_g1_1g.Defined.(** Commutators in abelian groups are trivial. *)
A: AbGroup x, y: A
[x, y] = 1
A: AbGroup x, y: A
[x, y] = 1
apply grp_commutator_commutes, commutativity.Defined.(** The commutator can be thought of as the "error" in the commutativity of two elements of a group. *)
G: Group x, y: G
x * y = [x, y] * y * x
G: Group x, y: G
x * y = [x, y] * y * x
G: Group x, y: G
x * y = x * y * x^ * y^ * y * x
byrewrite !grp_inv_gV_g.Defined.(** Inverting a commutator reverses the order. *)
G: Group x, y: G
[x, y]^ = [y, x]
G: Group x, y: G
[x, y]^ = [y, x]
G: Group x, y: G
(x * y * x^ * y^)^ = y * x * y^ * x^
byrewrite3 grp_inv_op, 2 grp_inv_inv, 2 grp_assoc.Defined.(** Group homomorphisms commute with commutators. *)
G, H: Group f: G $-> H x, y: G
f [x, y] = [f x, f y]
G, H: Group f: G $-> H x, y: G
f [x, y] = [f x, f y]
G, H: Group f: G $-> H x, y: G
f (x * y * x^ * y^) = f x * f y * (f x)^ * (f y)^
byrewrite !grp_homo_op, !grp_homo_inv.Defined.(** A commutator with a product on the left side can be expanded as the product of a conjugated commutator and another commutator. *)
G: Group x, y, z: G
[x * y, z] = grp_conj x [y, z] * [x, z]
G: Group x, y, z: G
[x * y, z] = grp_conj x [y, z] * [x, z]
G: Group x, y, z: G
x * y * z * (x * y)^ * z^ = x * (y * z * y^ * z^) * x^ * (x * z * x^ * z^)
byrewrite grp_inv_op, !grp_assoc, !grp_inv_gV_g.Defined.(** A commutator with a product on the right side can be expanded as the product of a conjugated commutator and another commutator. *)
G: Group x, y, z: G
[x, y * z] = [x, y] * grp_conj y [x, z]
G: Group x, y, z: G
[x, y * z] = [x, y] * grp_conj y [x, z]
G: Group x, y, z: G
x * (y * z) * x^ * (y * z)^ = x * y * x^ * y^ * (y * (x * z * x^ * z^) * y^)
byrewrite grp_inv_op, !grp_assoc, !grp_inv_gV_g.Defined.(** A commutator with the element on the right being multiplied on the right gives a conjugation. *)
G: Group x, y: G
[x, y] * y = grp_conj x y
G: Group x, y: G
[x, y] * y = grp_conj x y
G: Group x, y: G
x * y * x^ * y^ * y = x * y * x^
byrewrite grp_inv_gV_g.Defined.(** A commutator with the inverse element on the left being multiplied on the left gives a conjugation. *)
G: Group x, y: G
x^ * [x, y] = grp_conj y x^
G: Group x, y: G
x^ * [x, y] = grp_conj y x^
G: Group x, y: G
x^ * (x * y * x^ * y^) = y * x^ * y^
byrewrite <- !grp_assoc, grp_inv_V_gg.Defined.(** Commutators with inverted left sides are conjugated commutators. *)
G: Group x, y: G
[x^, y] = grp_conj x^ [y, x]
G: Group x, y: G
[x^, y] = grp_conj x^ [y, x]
G: Group x, y: G
x^ * y * (x^)^ * y^ = x^ * (y * x * y^ * x^) * (x^)^
byrewrite !grp_assoc, grp_inv_inv, grp_inv_gV_g.Defined.(** Commutators with inverted right sides are conjugated commutators. *)
G: Group x, y: G
[x, y^] = grp_conj y^ [y, x]
G: Group x, y: G
[x, y^] = grp_conj y^ [y, x]
G: Group x, y: G
x * y^ * x^ * (y^)^ = y^ * (y * x * y^ * x^) * (y^)^
byrewrite grp_inv_inv, !grp_assoc, grp_inv_gg_V.Defined.(** ** Hall-Witt identity *)(** The Hall-Witt identity is a Jacobi-like identity for groups. It states that the different commutators of 3 elements (with one conjugated) assemble into an identity. The proof is purely mechanical and simply cancels all the terms. This is a rare instance where a mechanized proof is much shorter than an on-paper proof. *)
G: Group x, y, z: G
[[x, y], grp_conj y z] * [[y, z], grp_conj z x] * [[z, x], grp_conj x y] = 1
G: Group x, y, z: G
[[x, y], grp_conj y z] * [[y, z], grp_conj z x] * [[z, x], grp_conj x y] = 1
G: Group x, y, z: G
x * y * x^ * y^ * (y * z * y^) * (x * y * x^ * y^)^ * (y * z * y^)^ *
(y * z * y^ * z^ * (z * x * z^) * (y * z * y^ * z^)^ * (z * x * z^)^) *
(z * x * z^ * x^ * (x * y * x^) * (z * x * z^ * x^)^ * (x * y * x^)^) = 1
G: Group x, y, z: G
x * y * x^ * y^ * y * z * y^ * y * x * y^ * x^ * y * z^ * y^ * y * z * y^ *
z^ * z * x * z^ * z * y * z^ * y^ * z * x^ * z^ * z * x * z^ * x^ * x * y *
x^ * x * z * x^ * z^ * x * y^ * x^ = 1
G: Group x, y, z: G
x * x^ = 1
apply grp_inv_r.Defined.(** This variant of the Hall-Witt identity is useful later for proving the three subgroups lemma. *)
G: Group x, y, z: G
grp_conj x [[x^, y], z] * grp_conj z [[z^, x], y] * grp_conj y [[y^, z], x] =
1
G: Group x, y, z: G
grp_conj x [[x^, y], z] * grp_conj z [[z^, x], y] * grp_conj y [[y^, z], x] =
1
G: Group x, y, z: G
[grp_conj x [x^, y], grp_conj x z] * [grp_conj z [z^, x], grp_conj z y] *
[grp_conj y [y^, z], grp_conj y x] = 1
G: Group x, y, z: G
[[y, x], grp_conj x z] * [[x, z], grp_conj z y] * [[z, y], grp_conj y x] = 1
apply grp_hall_witt.Defined.(** ** Precomposing normal subgroups with commutators *)
G: Group H: Subgroup G IsNormalSubgroup0: IsNormalSubgroup H y: G
IsSubgroup (funx : G => H [x, y])
G: Group H: Subgroup G IsNormalSubgroup0: IsNormalSubgroup H y: G
IsSubgroup (funx : G => H [x, y])
G: Group H: Subgroup G IsNormalSubgroup0: IsNormalSubgroup H y: G
forallx : G, IsHProp (H [x, y])
G: Group H: Subgroup G IsNormalSubgroup0: IsNormalSubgroup H y: G
H [1, y]
G: Group H: Subgroup G IsNormalSubgroup0: IsNormalSubgroup H y: G
forallxy0 : G, H [x, y] -> H [y0, y] -> H [x * y0, y]
G: Group H: Subgroup G IsNormalSubgroup0: IsNormalSubgroup H y: G
forallx : G, H [x, y] -> H [x^, y]
G: Group H: Subgroup G IsNormalSubgroup0: IsNormalSubgroup H y: G
forallx : G, IsHProp (H [x, y])
exact _.
G: Group H: Subgroup G IsNormalSubgroup0: IsNormalSubgroup H y: G
H [1, y]
G: Group H: Subgroup G IsNormalSubgroup0: IsNormalSubgroup H y: G
H 1
apply subgroup_in_unit.
G: Group H: Subgroup G IsNormalSubgroup0: IsNormalSubgroup H y: G
forallxy0 : G, H [x, y] -> H [y0, y] -> H [x * y0, y]
G: Group H: Subgroup G IsNormalSubgroup0: IsNormalSubgroup H y, x, z: G Hxy: H [x, y] Hzy: H [z, y]
H [x * z, y]
G: Group H: Subgroup G IsNormalSubgroup0: IsNormalSubgroup H y, x, z: G Hxy: H [x, y] Hzy: H [z, y]
H (grp_conj x [z, y] * [x, y])
G: Group H: Subgroup G IsNormalSubgroup0: IsNormalSubgroup H y, x, z: G Hxy: H [x, y] Hzy: H [z, y]
H (grp_conj x [z, y])
G: Group H: Subgroup G IsNormalSubgroup0: IsNormalSubgroup H y, x, z: G Hxy: H [x, y] Hzy: H [z, y]
H [x, y]
G: Group H: Subgroup G IsNormalSubgroup0: IsNormalSubgroup H y, x, z: G Hxy: H [x, y] Hzy: H [z, y]
H (grp_conj x [z, y])
by rapply isnormal_conj.
G: Group H: Subgroup G IsNormalSubgroup0: IsNormalSubgroup H y, x, z: G Hxy: H [x, y] Hzy: H [z, y]
H [x, y]
assumption.
G: Group H: Subgroup G IsNormalSubgroup0: IsNormalSubgroup H y: G
forallx : G, H [x, y] -> H [x^, y]
G: Group H: Subgroup G IsNormalSubgroup0: IsNormalSubgroup H y, x: G Hxy: H [x, y]
H [x^, y]
G: Group H: Subgroup G IsNormalSubgroup0: IsNormalSubgroup H y, x: G Hxy: H [x, y]
H (grp_conj x^ [y, x])
G: Group H: Subgroup G IsNormalSubgroup0: IsNormalSubgroup H y, x: G Hxy: H [x, y]
H [y, x]
G: Group H: Subgroup G IsNormalSubgroup0: IsNormalSubgroup H y, x: G Hxy: H [x, y]
H [x, y]^
byapply subgroup_in_inv.Defined.(** The condition [H [x, y]] is equivalent to the condition [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]
G: Group H: Subgroup G x, y: G
H [x, y]^ <~> H [y, x]
byrewrite grp_commutator_inv.Defined.(** So we get this symmetrical version as well. *)Instanceissubgroup_precomp_commutator_r {G : Group} (H : Subgroup G)
`{!IsNormalSubgroup H} (x : G)
: IsSubgroup (funy => H [x, y])
:= issubgroup_equiv (funy => issubgroup_precomp_commutator_agree H y x) _.Definitionsubgroup_precomp_commutator_l {G : Group} (H : Subgroup G) (y : G)
`{!IsNormalSubgroup H}
: Subgroup G
:= Build_Subgroup _ (funx => H [x, y]) _.Definitionsubgroup_precomp_commutator_r {G : Group} (H : Subgroup G) (x : G)
`{!IsNormalSubgroup H}
: Subgroup G
:= Build_Subgroup _ (funy => H [x, y]) _.(** ** Commutator subgroups *)Definitionsubgroup_commutator {G : Group@{i}} (HK : Subgroup@{i i} G)
: Subgroup@{i i} G
:= subgroup_generated (fung => exists (x : H) (y : K), [x.1, y.1] = g).Notation"[ H , K ]" := (subgroup_commutator H K) : group_scope.LocalOpen Scope group_scope.(** [subgroup_commutator H K] is the smallest subgroup containing the commutators of elements of [H] with elements of [K]. *)
G: Group H, K, J: Subgroup G i: forallxy : G, H x -> K y -> J (grp_commutator x y)
[H, K] ⊆ J
G: Group H, K, J: Subgroup G i: forallxy : G, H x -> K y -> J (grp_commutator x y)
[H, K] ⊆ J
G: Group H, K, J: Subgroup G i: forallxy0 : G, H x -> K y0 -> J (grp_commutator x y0) y: G Hy: H y z: G Kz: K z
J (grp_commutator y z)
byapply i.Defined.(** Doubly iterated [subgroup_commutator]s of [H], [J] and [K] are the smallest of the normal subgroups containing the doubly iterated commutators of elements of [H], [J] and [K]. *)
G: Group H, J, K, N: Subgroup G IsNormalSubgroup0: IsNormalSubgroup N i: forallxyz : G,
H x -> J y -> K z -> N (grp_commutator (grp_commutator x y) z)
[[H, J], K] ⊆ N
G: Group H, J, K, N: Subgroup G IsNormalSubgroup0: IsNormalSubgroup N i: forallxyz : G,
H x -> J y -> K z -> N (grp_commutator (grp_commutator x y) z)
[[H, J], K] ⊆ N
G: Group H, J, K, N: Subgroup G IsNormalSubgroup0: IsNormalSubgroup N i: forallxyz : G,
H x -> J y -> K z -> N (grp_commutator (grp_commutator x y) z)
forallxy : G, [H, J] x -> K y -> N (grp_commutator x y)
G: Group H, J, K, N: Subgroup G IsNormalSubgroup0: IsNormalSubgroup N i: forallxyz0 : G,
H x -> J y -> K z0 -> N (grp_commutator (grp_commutator x y) z0) z: G Kz: K z
forallx : G, [H, J] x -> N (grp_commutator x z)
G: Group H, J, K, N: Subgroup G IsNormalSubgroup0: IsNormalSubgroup N i: forallxyz0 : G,
H x -> J y -> K z0 -> N (grp_commutator (grp_commutator x y) z0) z: G Kz: K z
forallx : G, [H, J] x -> subgroup_precomp_commutator_l N z x
G: Group H, J, K, N: Subgroup G IsNormalSubgroup0: IsNormalSubgroup N i: forallxyz0 : G,
H x -> J y -> K z0 -> N (grp_commutator (grp_commutator x y) z0) z: G Kz: K z
forallxy : G,
H x -> J y -> subgroup_precomp_commutator_l N z (grp_commutator x y)
byintros; apply i.Defined.(** A commutator of elements from each respective subgroup is in the commutator subgroup. *)
G: Group H, J: Subgroup G x, y: G Hx: H x Jy: J y
[H, J] (grp_commutator x y)
G: Group H, J: Subgroup G x, y: G Hx: H x Jy: J y
[H, J] (grp_commutator x y)
G: Group H, J: Subgroup G x, y: G Hx: H x Jy: J y
{x0 : H & {y0 : J & grp_commutator x0.1 y0.1 = grp_commutator x y}}
byexists (x; Hx), (y; Jy).Defined.(** Commutator subgroups are functorial. *)
G: Group H, J, K, L: Subgroup G f: H ⊆ K g: J ⊆ L
[H, J] ⊆ [K, L]
G: Group H, J, K, L: Subgroup G f: H ⊆ K g: J ⊆ L
[H, J] ⊆ [K, L]
G: Group H, J, K, L: Subgroup G f: H ⊆ K g: J ⊆ L
forallxy : G, H x -> J y -> [K, L] (grp_commutator x y)
G: Group H, J, K, L: Subgroup G f: H ⊆ K g: J ⊆ L x, y: G Hx: H x Jx: J y
forallxy : G, H x -> J y -> [J, H] (grp_commutator x y)
G: Group H, J: Subgroup G x, y: G Hx: H x Jy: J y
[J, H] (grp_commutator x y)
G: Group H, J: Subgroup G x, y: G Hx: H x Jy: J y
[J, H] (grp_commutator x y)^
G: Group H, J: Subgroup G x, y: G Hx: H x Jy: J y
[J, H] (grp_commutator y x)
byapply subgroup_commutator_in.Defined.(** Commutator subgroups are symmetric in their arguments. *)
G: Group H, J: Subgroup G
[H, J] ↔ [J, H]
G: Group H, J: Subgroup G
[H, J] ↔ [J, H]
snapply pred_subset_antisymm; apply subgroup_incl_commutator_symm.Defined.(** The opposite subgroup of a commutator subgroup is the commutator subgroup of the opposite subgroups. *)
exact (grp_homo_commutator (grp_op_iso_inv _) a0.1 a.1).Defined.(** A commutator subgroup of an abelian group is always trivial. *)
A: AbGroup H, K: Subgroup A
IsTrivialGroup [H, K]
A: AbGroup H, K: Subgroup A
IsTrivialGroup [H, K]
A: AbGroup H, K: Subgroup A x, y: A X: H x X0: K y
trivial_subgroup A (grp_commutator x y)
rapply ab_commutator.Defined.(** A commutator of normal subgroups is normal. *)
G: Group H, J: Subgroup G IsNormalSubgroup0: IsNormalSubgroup H IsNormalSubgroup1: IsNormalSubgroup J
IsNormalSubgroup [H, J]
G: Group H, J: Subgroup G IsNormalSubgroup0: IsNormalSubgroup H IsNormalSubgroup1: IsNormalSubgroup J
IsNormalSubgroup [H, J]
G: Group H, J: Subgroup G IsNormalSubgroup0: IsNormalSubgroup H IsNormalSubgroup1: IsNormalSubgroup J
forallxy : G, [H, J] x -> [H, J] (y * x * y^)
G: Group H, J: Subgroup G IsNormalSubgroup0: IsNormalSubgroup H IsNormalSubgroup1: IsNormalSubgroup J y: G
forallx : G, [H, J] x -> [H, J] (y * x * y^)
G: Group H, J: Subgroup G IsNormalSubgroup0: IsNormalSubgroup H IsNormalSubgroup1: IsNormalSubgroup J y: G
(fung : G => {x : H & {y0 : J & grp_commutator x.1 y0.1 = g}})
⊆ (funx : G => {x0 : H & {y0 : J & grp_commutator x0.1 y0.1 = grp_conj y x}})
G: Group H, J: Subgroup G IsNormalSubgroup0: IsNormalSubgroup H IsNormalSubgroup1: IsNormalSubgroup J y, x: G
{x0 : H & {y0 : J & grp_commutator x0.1 y0.1 = x}} ->
{x0 : H & {y0 : J & grp_commutator x0.1 y0.1 = grp_conj y x}}
G: Group H, J: Subgroup G IsNormalSubgroup0: IsNormalSubgroup H IsNormalSubgroup1: IsNormalSubgroup J y, x: G a: H a0: J
grp_commutator a.1 a0.1 = x ->
grp_commutator (grp_iso_normal_conj H y a).1 (grp_iso_normal_conj J y a0).1 =
grp_conj y x
G: Group H, J: Subgroup G IsNormalSubgroup0: IsNormalSubgroup H IsNormalSubgroup1: IsNormalSubgroup J y, x: G a: H a0: J p: grp_commutator a.1 a0.1 = x
grp_commutator (grp_iso_normal_conj H y a).1 (grp_iso_normal_conj J y a0).1 =
grp_conj y x
G: Group H, J: Subgroup G IsNormalSubgroup0: IsNormalSubgroup H IsNormalSubgroup1: IsNormalSubgroup J y, x: G a: H a0: J p: grp_commutator a.1 a0.1 = x
grp_conj y (grp_commutator (subgroup_incl H a) (subgroup_incl J a0)) =
grp_conj y x
exact (ap (grp_conj y) p).Defined.(** Commutator subgroups distribute over products of normal subgroups on the left. *)
G: Group H, K, L: NormalSubgroup G
[subgroup_product H K, L] ↔ subgroup_product [H, L] [K, L]
G: Group H, K, L: NormalSubgroup G
[subgroup_product H K, L] ↔ subgroup_product [H, L] [K, L]
G: Group H, K, L: NormalSubgroup G x: G
[subgroup_product H K, L] x -> subgroup_product [H, L] [K, L] x
G: Group H, K, L: NormalSubgroup G x: G
subgroup_product [H, L] [K, L] x -> [subgroup_product H K, L] x
G: Group H, K, L: NormalSubgroup G x: G
[subgroup_product H K, L] x -> subgroup_product [H, L] [K, L] x
G: Group H, K, L: NormalSubgroup G
forallxy : G,
subgroup_product H K x ->
L y -> subgroup_product [H, L] [K, L] (grp_commutator x y)
G: Group H, K, L: NormalSubgroup G y: G Ly: L y
forallx : G,
subgroup_product H K x -> subgroup_product [H, L] [K, L] (grp_commutator x y)
G: Group H, K, L: NormalSubgroup G y: G Ly: L y
forallx : G,
subgroup_product H K x ->
subgroup_precomp_commutator_l (subgroup_product [H, L] [K, L]) y x
G: Group H, K, L: NormalSubgroup G y: G Ly: L y
pred_or H K
⊆ subgroup_precomp_commutator_l (subgroup_product [H, L] [K, L]) y
G: Group H, K, L: NormalSubgroup G y: G Ly: L y x: G Hx: H x
subgroup_precomp_commutator_l (subgroup_product [H, L] [K, L]) y x
G: Group H, K, L: NormalSubgroup G y: G Ly: L y x: G Kx: K x
subgroup_precomp_commutator_l (subgroup_product [H, L] [K, L]) y x
G: Group H, K, L: NormalSubgroup G y: G Ly: L y x: G Hx: H x
subgroup_precomp_commutator_l (subgroup_product [H, L] [K, L]) y x
G: Group H, K, L: NormalSubgroup G y: G Ly: L y x: G Hx: H x
[H, L] (grp_commutator x y)
byapply subgroup_commutator_in.
G: Group H, K, L: NormalSubgroup G y: G Ly: L y x: G Kx: K x
subgroup_precomp_commutator_l (subgroup_product [H, L] [K, L]) y x
G: Group H, K, L: NormalSubgroup G y: G Ly: L y x: G Kx: K x
[K, L] (grp_commutator x y)
byapply subgroup_commutator_in.
G: Group H, K, L: NormalSubgroup G x: G
subgroup_product [H, L] [K, L] x -> [subgroup_product H K, L] x
G: Group H, K, L: NormalSubgroup G
pred_or [H, L] [K, L] ⊆ [subgroup_product H K, L]
G: Group H, K, L: NormalSubgroup G x: G HLx: [H, L] x
[subgroup_product H K, L] x
G: Group H, K, L: NormalSubgroup G x: G KLx: [K, L] x
[subgroup_product H K, L] x
G: Group H, K, L: NormalSubgroup G x: G HLx: [H, L] x
[subgroup_product H K, L] x
G: Group H, K, L: NormalSubgroup G
forallx : G, [H, L] x -> [subgroup_product H K, L] x
G: Group H, K, L: NormalSubgroup G
H ⊆ subgroup_product H K
G: Group H, K, L: NormalSubgroup G
L ⊆ L
G: Group H, K, L: NormalSubgroup G
H ⊆ subgroup_product H K
apply subgroup_product_incl_l.
G: Group H, K, L: NormalSubgroup G x: G KLx: [K, L] x
[subgroup_product H K, L] x
G: Group H, K, L: NormalSubgroup G
forallx : G, [K, L] x -> [subgroup_product H K, L] x
G: Group H, K, L: NormalSubgroup G
K ⊆ subgroup_product H K
G: Group H, K, L: NormalSubgroup G
L ⊆ L
G: Group H, K, L: NormalSubgroup G
K ⊆ subgroup_product H K
apply subgroup_product_incl_r.Defined.(** Commutator subgroups distribute over products of normal subgroups on the right. *)
G: Group H, K, L: NormalSubgroup G
[H, subgroup_product K L] ↔ subgroup_product [H, K] [H, L]
G: Group H, K, L: NormalSubgroup G
[H, subgroup_product K L] ↔ subgroup_product [H, K] [H, L]
G: Group H, K, L: NormalSubgroup G x: G
[H, subgroup_product K L] x <-> subgroup_product [H, K] [H, L] x
G: Group H, K, L: NormalSubgroup G x: G
[H, subgroup_product K L] x <-> ?Goal
G: Group H, K, L: NormalSubgroup G x: G
?Goal <-> subgroup_product [H, K] [H, L] x
G: Group H, K, L: NormalSubgroup G x: G
[subgroup_product K L, H] x <-> subgroup_product [H, K] [H, L] x
G: Group H, K, L: NormalSubgroup G x: G
[subgroup_product K L, H] x <-> ?Goal
G: Group H, K, L: NormalSubgroup G x: G
?Goal <-> subgroup_product [H, K] [H, L] x
G: Group H, K, L: NormalSubgroup G x: G
[subgroup_product K L, H] x <-> subgroup_product [K, H] [L, H] x
exact (subgroup_commutator_normal_prod_l K L H x).Defined.(** The subgroup image of a commutator is included in the commutator of the subgroup images. The converse only generally holds for a normal [J] and [K] and a surjective [f]. *)
G, H: Group f: G $-> H J, K: Subgroup G
subgroup_image f [J, K] ⊆ [subgroup_image f J, subgroup_image f K]
G, H: Group f: G $-> H J, K: Subgroup G
subgroup_image f [J, K] ⊆ [subgroup_image f J, subgroup_image f K]
G, H: Group f: G $-> H J, K: Subgroup G
[J, K] ⊆ subgroup_preimage f [subgroup_image f J, subgroup_image f K]
G, H: Group f: G $-> H J, K: Subgroup G
forallxy : G,
J x ->
K y ->
subgroup_preimage f [subgroup_image f J, subgroup_image f K]
(grp_commutator x y)
G, H: Group f: G $-> H J, K: Subgroup G x, y: G Jx: J x Ky: K y
subgroup_preimage f [subgroup_image f J, subgroup_image f K]
(grp_commutator x y)
G, H: Group f: G $-> H J, K: Subgroup G x, y: G Jx: J x Ky: K y
[subgroup_image f J, subgroup_image f K] (f (grp_commutator x y))
G, H: Group f: G $-> H J, K: Subgroup G x, y: G Jx: J x Ky: K y
[subgroup_image f J, subgroup_image f K] (grp_commutator (f x) (f y))
apply subgroup_commutator_in;
byapply subgroup_image_in.Defined.(** ** Derived subgroup *)(** The commutator subgroup of the maximal subgroup with itself is called the derived subgroup. It is the subgroup generated by all commutators. *)Definitionnormalsubgroup_derivedG : NormalSubgroup G
:= Build_NormalSubgroup G [G, G] _.(** We can quotient a group by its derived subgroup. *)Definitiongrp_derived_quotient (G : Group) : Group
:= QuotientGroup G (normalsubgroup_derived G).(** We can show that the multiplication then becomes commutative. *)
G: Group
Commutative sg_op
G: Group
Commutative sg_op
G: Group x: grp_derived_quotient G
forally : grp_derived_quotient G, x * y = y * x
G: Group y: G
forallx : grp_derived_quotient G,
(funx0 : G / normalsubgroup_derived G => x * x0 = x0 * x)
(grp_quotient_map y)
G: Group y, x: G
grp_quotient_map x * grp_quotient_map y =
grp_quotient_map y * grp_quotient_map x
byrewrite !grp_inv_op, !grp_inv_inv, !grp_assoc.Defined.(** Hence we have a way of producing abelian groups from groups. *)Definitionabgroup_derived_quotient (G : Group) : AbGroup
:= Build_AbGroup (grp_derived_quotient G) _.(** We get a recursion principle into abelian groups. *)
G: Group A: AbGroup f: G $-> A
abgroup_derived_quotient G $-> A
G: Group A: AbGroup f: G $-> A
abgroup_derived_quotient G $-> A
G: Group A: AbGroup f: G $-> A
foralln : G, normalsubgroup_derived G n -> f n = 1
G: Group A: AbGroup f: G $-> A
foralln : G,
normalsubgroup_derived G n -> subgroup_preimage f (trivial_subgroup A) n
G: Group A: AbGroup f: G $-> A
forallxy : G,
maximal_subgroup G x ->
maximal_subgroup G y ->
subgroup_preimage f (trivial_subgroup A) (grp_commutator x y)
G: Group A: AbGroup f: G $-> A x, y: G
subgroup_preimage f (trivial_subgroup A) (grp_commutator x y)
G: Group A: AbGroup f: G $-> A x, y: G
grp_commutator (f x) (f y) = 1
apply ab_commutator.Defined.(** Furthermore, this construction is an abelianization. *)
forallxy : abgroup_derived_quotient G $-> A,
group_precomp A grp_quotient_map x $== group_precomp A grp_quotient_map y ->
x $== y
G: Group A: AbGroup
SplEssSurj (group_precomp A grp_quotient_map)
G: Group A: AbGroup f: G $-> A
{a : abgroup_derived_quotient G $-> A &
group_precomp A grp_quotient_map a $== f}
G: Group A: AbGroup f: G $-> A
group_precomp A grp_quotient_map (abgroup_derived_quotient_rec f) $== f
hnf; reflexivity.
G: Group A: AbGroup
forallxy : abgroup_derived_quotient G $-> A,
group_precomp A grp_quotient_map x $== group_precomp A grp_quotient_map y ->
x $== y
G: Group A: AbGroup f, g: abgroup_derived_quotient G $-> A p: group_precomp A grp_quotient_map f $== group_precomp A grp_quotient_map g
f $== g
G: Group A: AbGroup f, g: abgroup_derived_quotient G $-> A p: group_precomp A grp_quotient_map f $== group_precomp A grp_quotient_map g x: G
f (grp_quotient_map x) = g (grp_quotient_map x)
exact (p x).Defined.(** *** Three subgroups lemma *)
G: Group H, J, K, N: Subgroup G IsNormalSubgroup0: IsNormalSubgroup N T1: [[H, J], K] ⊆ N T2: [[J, K], H] ⊆ N
[[K, H], J] ⊆ N
G: Group H, J, K, N: Subgroup G IsNormalSubgroup0: IsNormalSubgroup N T1: [[H, J], K] ⊆ N T2: [[J, K], H] ⊆ N
[[K, H], J] ⊆ N
G: Group H, J, K, N: Subgroup G IsNormalSubgroup0: IsNormalSubgroup N T1: [[H, J], K] ⊆ N T2: [[J, K], H] ⊆ N
forallxyz : G,
K x -> H y -> J z -> N (grp_commutator (grp_commutator x y) z)
G: Group H, J, K, N: Subgroup G IsNormalSubgroup0: IsNormalSubgroup N T1: subgroup_commutator (subgroup_commutator H J) K ⊆ N T2: subgroup_commutator (subgroup_commutator J K) H ⊆ N
forallxyz : G, K x -> H y -> J z -> N [[x, y], z]
G: Group H, J, K, N: Subgroup G IsNormalSubgroup0: IsNormalSubgroup N T1: subgroup_commutator (subgroup_commutator H J) K ⊆ N T2: subgroup_commutator (subgroup_commutator J K) H ⊆ N z, x, y: G Kz: K z Hx: H x Jy: J y
N [[z, x], y]
G: Group H, J, K, N: Subgroup G IsNormalSubgroup0: IsNormalSubgroup N T1: subgroup_commutator (subgroup_commutator H J) K ⊆ N T2: subgroup_commutator (subgroup_commutator J K) H ⊆ N z, x, y: G Kz: K z Hx: H x Jy: J y p: grp_conj x [[x^, y], z^] * grp_conj z^ [[(z^)^, x], y] *
grp_conj y [[y^, z^], x] = 1
N [[z, x], y]
G: Group H, J, K, N: Subgroup G IsNormalSubgroup0: IsNormalSubgroup N T1: subgroup_commutator (subgroup_commutator H J) K ⊆ N T2: subgroup_commutator (subgroup_commutator J K) H ⊆ N z, x, y: G Kz: K z Hx: H x Jy: J y p: grp_conj x [[x^, y], z^] * grp_conj z^ [[z, x], y] * grp_conj y [[y^, z^], x] =
1
N [[z, x], y]
G: Group H, J, K, N: Subgroup G IsNormalSubgroup0: IsNormalSubgroup N T1: subgroup_commutator (subgroup_commutator H J) K ⊆ N T2: subgroup_commutator (subgroup_commutator J K) H ⊆ N z, x, y: G Kz: K z Hx: H x Jy: J y p: grp_conj x [[x^, y], z^] * grp_conj z^ [[z, x], y] =
(grp_conj y [[y^, z^], x])^
N [[z, x], y]
G: Group H, J, K, N: Subgroup G IsNormalSubgroup0: IsNormalSubgroup N T1: subgroup_commutator (subgroup_commutator H J) K ⊆ N T2: subgroup_commutator (subgroup_commutator J K) H ⊆ N z, x, y: G Kz: K z Hx: H x Jy: J y p: grp_conj z^ [[z, x], y] =
(grp_conj x [[x^, y], z^])^ * (grp_conj y [[y^, z^], x])^
N [[z, x], y]
G: Group H, J, K, N: Subgroup G IsNormalSubgroup0: IsNormalSubgroup N T1: subgroup_commutator (subgroup_commutator H J) K ⊆ N T2: subgroup_commutator (subgroup_commutator J K) H ⊆ N z, x, y: G Kz: K z Hx: H x Jy: J y p: grp_conj z^ [[z, x], y] =
(grp_conj x [[x^, y], z^])^ * (grp_conj y [[y^, z^], x])^
N (z^ * [[z, x], y] * (z^)^)
G: Group H, J, K, N: Subgroup G IsNormalSubgroup0: IsNormalSubgroup N T1: subgroup_commutator (subgroup_commutator H J) K ⊆ N T2: subgroup_commutator (subgroup_commutator J K) H ⊆ N z, x, y: G Kz: K z Hx: H x Jy: J y p: grp_conj z^ [[z, x], y] =
(grp_conj x [[x^, y], z^])^ * (grp_conj y [[y^, z^], x])^
N (grp_conj z^ [[z, x], y])
G: Group H, J, K, N: Subgroup G IsNormalSubgroup0: IsNormalSubgroup N T1: subgroup_commutator (subgroup_commutator H J) K ⊆ N T2: subgroup_commutator (subgroup_commutator J K) H ⊆ N z, x, y: G Kz: K z Hx: H x Jy: J y p: grp_conj z^ [[z, x], y] =
(grp_conj x [[x^, y], z^])^ * (grp_conj y [[y^, z^], x])^
N ((grp_conj x [[x^, y], z^])^ * (grp_conj y [[y^, z^], x])^)
G: Group H, J, K, N: Subgroup G IsNormalSubgroup0: IsNormalSubgroup N T1: subgroup_commutator (subgroup_commutator H J) K ⊆ N T2: subgroup_commutator (subgroup_commutator J K) H ⊆ N z, x, y: G Kz: K z Hx: H x Jy: J y p: grp_conj z^ [[z, x], y] =
(grp_conj x [[x^, y], z^])^ * (grp_conj y [[y^, z^], x])^
N (grp_conj x [[x^, y], z^])^
G: Group H, J, K, N: Subgroup G IsNormalSubgroup0: IsNormalSubgroup N T1: subgroup_commutator (subgroup_commutator H J) K ⊆ N T2: subgroup_commutator (subgroup_commutator J K) H ⊆ N z, x, y: G Kz: K z Hx: H x Jy: J y p: grp_conj z^ [[z, x], y] =
(grp_conj x [[x^, y], z^])^ * (grp_conj y [[y^, z^], x])^
N (grp_conj y [[y^, z^], x])^
G: Group H, J, K, N: Subgroup G IsNormalSubgroup0: IsNormalSubgroup N T1: subgroup_commutator (subgroup_commutator H J) K ⊆ N T2: subgroup_commutator (subgroup_commutator J K) H ⊆ N z, x, y: G Kz: K z Hx: H x Jy: J y p: grp_conj z^ [[z, x], y] =
(grp_conj x [[x^, y], z^])^ * (grp_conj y [[y^, z^], x])^
N (grp_conj x [[x^, y], z^])^
G: Group H, J, K, N: Subgroup G IsNormalSubgroup0: IsNormalSubgroup N T1: subgroup_commutator (subgroup_commutator H J) K ⊆ N T2: subgroup_commutator (subgroup_commutator J K) H ⊆ N z, x, y: G Kz: K z Hx: H x Jy: J y p: grp_conj z^ [[z, x], y] =
(grp_conj x [[x^, y], z^])^ * (grp_conj y [[y^, z^], x])^
N (grp_conj x [[x^, y], z^])
G: Group H, J, K, N: Subgroup G IsNormalSubgroup0: IsNormalSubgroup N T1: subgroup_commutator (subgroup_commutator H J) K ⊆ N T2: subgroup_commutator (subgroup_commutator J K) H ⊆ N z, x, y: G Kz: K z Hx: H x Jy: J y p: grp_conj z^ [[z, x], y] =
(grp_conj x [[x^, y], z^])^ * (grp_conj y [[y^, z^], x])^
N [[x^, y], z^]
G: Group H, J, K, N: Subgroup G IsNormalSubgroup0: IsNormalSubgroup N T1: subgroup_commutator (subgroup_commutator H J) K ⊆ N T2: subgroup_commutator (subgroup_commutator J K) H ⊆ N z, x, y: G Kz: K z Hx: H x Jy: J y p: grp_conj z^ [[z, x], y] =
(grp_conj x [[x^, y], z^])^ * (grp_conj y [[y^, z^], x])^
subgroup_commutator (subgroup_commutator H J) K [[x^, y], z^]
G: Group H, J, K, N: Subgroup G IsNormalSubgroup0: IsNormalSubgroup N T1: subgroup_commutator (subgroup_commutator H J) K ⊆ N T2: subgroup_commutator (subgroup_commutator J K) H ⊆ N z, x, y: G Kz: K z Hx: H x Jy: J y p: grp_conj z^ [[z, x], y] =
(grp_conj x [[x^, y], z^])^ * (grp_conj y [[y^, z^], x])^
{x0 : subgroup_commutator H J & {y0 : K & [x0.1, y0.1] = [[x^, y], z^]}}
G: Group H, J, K, N: Subgroup G IsNormalSubgroup0: IsNormalSubgroup N T1: subgroup_commutator (subgroup_commutator H J) K ⊆ N T2: subgroup_commutator (subgroup_commutator J K) H ⊆ N z, x, y: G Kz: K z Hx: H x Jy: J y p: grp_conj z^ [[z, x], y] =
(grp_conj x [[x^, y], z^])^ * (grp_conj y [[y^, z^], x])^
subgroup_commutator H J
G: Group H, J, K, N: Subgroup G IsNormalSubgroup0: IsNormalSubgroup N T1: subgroup_commutator (subgroup_commutator H J) K ⊆ N T2: subgroup_commutator (subgroup_commutator J K) H ⊆ N z, x, y: G Kz: K z Hx: H x Jy: J y p: grp_conj z^ [[z, x], y] =
(grp_conj x [[x^, y], z^])^ * (grp_conj y [[y^, z^], x])^
{y0 : K & [?x.1, y0.1] = [[x^, y], z^]}
G: Group H, J, K, N: Subgroup G IsNormalSubgroup0: IsNormalSubgroup N T1: subgroup_commutator (subgroup_commutator H J) K ⊆ N T2: subgroup_commutator (subgroup_commutator J K) H ⊆ N z, x, y: G Kz: K z Hx: H x Jy: J y p: grp_conj z^ [[z, x], y] =
(grp_conj x [[x^, y], z^])^ * (grp_conj y [[y^, z^], x])^
subgroup_commutator H J
G: Group H, J, K, N: Subgroup G IsNormalSubgroup0: IsNormalSubgroup N T1: subgroup_commutator (subgroup_commutator H J) K ⊆ N T2: subgroup_commutator (subgroup_commutator J K) H ⊆ N z, x, y: G Kz: K z Hx: H x Jy: J y p: grp_conj z^ [[z, x], y] =
(grp_conj x [[x^, y], z^])^ * (grp_conj y [[y^, z^], x])^
subgroup_commutator H J [x^, y]
G: Group H, J, K, N: Subgroup G IsNormalSubgroup0: IsNormalSubgroup N T1: subgroup_commutator (subgroup_commutator H J) K ⊆ N T2: subgroup_commutator (subgroup_commutator J K) H ⊆ N z, x, y: G Kz: K z Hx: H x Jy: J y p: grp_conj z^ [[z, x], y] =
(grp_conj x [[x^, y], z^])^ * (grp_conj y [[y^, z^], x])^
H x^
byapply subgroup_in_inv.
G: Group H, J, K, N: Subgroup G IsNormalSubgroup0: IsNormalSubgroup N T1: subgroup_commutator (subgroup_commutator H J) K ⊆ N T2: subgroup_commutator (subgroup_commutator J K) H ⊆ N z, x, y: G Kz: K z Hx: H x Jy: J y p: grp_conj z^ [[z, x], y] =
(grp_conj x [[x^, y], z^])^ * (grp_conj y [[y^, z^], x])^
{y0 : K &
[([x^, y]; subgroup_commutator_in (subgroup_in_inv H x Hx) Jy).1, y0.1] =
[[x^, y], z^]}
byexists (z^; subgroup_in_inv _ _ Kz).
G: Group H, J, K, N: Subgroup G IsNormalSubgroup0: IsNormalSubgroup N T1: subgroup_commutator (subgroup_commutator H J) K ⊆ N T2: subgroup_commutator (subgroup_commutator J K) H ⊆ N z, x, y: G Kz: K z Hx: H x Jy: J y p: grp_conj z^ [[z, x], y] =
(grp_conj x [[x^, y], z^])^ * (grp_conj y [[y^, z^], x])^
N (grp_conj y [[y^, z^], x])^
G: Group H, J, K, N: Subgroup G IsNormalSubgroup0: IsNormalSubgroup N T1: subgroup_commutator (subgroup_commutator H J) K ⊆ N T2: subgroup_commutator (subgroup_commutator J K) H ⊆ N z, x, y: G Kz: K z Hx: H x Jy: J y p: grp_conj z^ [[z, x], y] =
(grp_conj x [[x^, y], z^])^ * (grp_conj y [[y^, z^], x])^
N (grp_conj y [[y^, z^], x])
G: Group H, J, K, N: Subgroup G IsNormalSubgroup0: IsNormalSubgroup N T1: subgroup_commutator (subgroup_commutator H J) K ⊆ N T2: subgroup_commutator (subgroup_commutator J K) H ⊆ N z, x, y: G Kz: K z Hx: H x Jy: J y p: grp_conj z^ [[z, x], y] =
(grp_conj x [[x^, y], z^])^ * (grp_conj y [[y^, z^], x])^
N [[y^, z^], x]
G: Group H, J, K, N: Subgroup G IsNormalSubgroup0: IsNormalSubgroup N T1: subgroup_commutator (subgroup_commutator H J) K ⊆ N T2: subgroup_commutator (subgroup_commutator J K) H ⊆ N z, x, y: G Kz: K z Hx: H x Jy: J y p: grp_conj z^ [[z, x], y] =
(grp_conj x [[x^, y], z^])^ * (grp_conj y [[y^, z^], x])^
subgroup_commutator (subgroup_commutator J K) H [[y^, z^], x]
G: Group H, J, K, N: Subgroup G IsNormalSubgroup0: IsNormalSubgroup N T1: subgroup_commutator (subgroup_commutator H J) K ⊆ N T2: subgroup_commutator (subgroup_commutator J K) H ⊆ N z, x, y: G Kz: K z Hx: H x Jy: J y p: grp_conj z^ [[z, x], y] =
(grp_conj x [[x^, y], z^])^ * (grp_conj y [[y^, z^], x])^
{x0 : subgroup_commutator J K & {y0 : H & [x0.1, y0.1] = [[y^, z^], x]}}
G: Group H, J, K, N: Subgroup G IsNormalSubgroup0: IsNormalSubgroup N T1: subgroup_commutator (subgroup_commutator H J) K ⊆ N T2: subgroup_commutator (subgroup_commutator J K) H ⊆ N z, x, y: G Kz: K z Hx: H x Jy: J y p: grp_conj z^ [[z, x], y] =
(grp_conj x [[x^, y], z^])^ * (grp_conj y [[y^, z^], x])^
subgroup_commutator J K
G: Group H, J, K, N: Subgroup G IsNormalSubgroup0: IsNormalSubgroup N T1: subgroup_commutator (subgroup_commutator H J) K ⊆ N T2: subgroup_commutator (subgroup_commutator J K) H ⊆ N z, x, y: G Kz: K z Hx: H x Jy: J y p: grp_conj z^ [[z, x], y] =
(grp_conj x [[x^, y], z^])^ * (grp_conj y [[y^, z^], x])^
{y0 : H & [?x.1, y0.1] = [[y^, z^], x]}
G: Group H, J, K, N: Subgroup G IsNormalSubgroup0: IsNormalSubgroup N T1: subgroup_commutator (subgroup_commutator H J) K ⊆ N T2: subgroup_commutator (subgroup_commutator J K) H ⊆ N z, x, y: G Kz: K z Hx: H x Jy: J y p: grp_conj z^ [[z, x], y] =
(grp_conj x [[x^, y], z^])^ * (grp_conj y [[y^, z^], x])^
subgroup_commutator J K
G: Group H, J, K, N: Subgroup G IsNormalSubgroup0: IsNormalSubgroup N T1: subgroup_commutator (subgroup_commutator H J) K ⊆ N T2: subgroup_commutator (subgroup_commutator J K) H ⊆ N z, x, y: G Kz: K z Hx: H x Jy: J y p: grp_conj z^ [[z, x], y] =
(grp_conj x [[x^, y], z^])^ * (grp_conj y [[y^, z^], x])^
G: Group H, J, K, N: Subgroup G IsNormalSubgroup0: IsNormalSubgroup N T1: subgroup_commutator (subgroup_commutator H J) K ⊆ N T2: subgroup_commutator (subgroup_commutator J K) H ⊆ N z, x, y: G Kz: K z Hx: H x Jy: J y p: grp_conj z^ [[z, x], y] =
(grp_conj x [[x^, y], z^])^ * (grp_conj y [[y^, z^], x])^
{y0 : H &
[([y^, z^];
subgroup_commutator_in (subgroup_in_inv J y Jy) (subgroup_in_inv K z Kz)).1,
y0.1] = [[y^, z^], x]}