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.

Local Open Scope predicate_scope.
Local Open Scope mc_scope.
Local Open 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. *)
Definition grp_commutator {G : Group} (x y : 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
by apply 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
by apply 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
by apply 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
by rewrite !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^
by rewrite 3 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)^
by rewrite !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^)
by rewrite 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^)
by rewrite 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^
by rewrite 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^
by rewrite <- !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^)^
by rewrite !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^)^
by rewrite <- !grp_assoc, grp_inv_inv, grp_inv_V_gg. Defined.
G: Group
x, y: G

grp_conj x [x^, y] = [y, x]
G: Group
x, y: G

grp_conj x [x^, y] = [y, x]
G: Group
x, y: G

x * (x^ * y * (x^)^ * y^) * x^ = y * x * y^ * x^
by rewrite !grp_inv_inv, <- !grp_assoc, grp_inv_g_Vg. Defined.
G: Group
x, y: G

grp_conj y [x, y^] = [y, x]
G: Group
x, y: G

grp_conj y [x, y^] = [y, x]
G: Group
x, y: G

y * (x * y^ * x^ * (y^)^) * y^ = y * x * y^ * x^
by rewrite 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 (fun x : G => H [x, y])
G: Group
H: Subgroup G
IsNormalSubgroup0: IsNormalSubgroup H
y: G

IsSubgroup (fun x : G => H [x, y])
G: Group
H: Subgroup G
IsNormalSubgroup0: IsNormalSubgroup H
y: G

forall x : 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
forall x y0 : G, H [x, y] -> H [y0, y] -> H [x * y0, y]
G: Group
H: Subgroup G
IsNormalSubgroup0: IsNormalSubgroup H
y: G
forall x : G, H [x, y] -> H [x^, y]
G: Group
H: Subgroup G
IsNormalSubgroup0: IsNormalSubgroup H
y: G

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

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

forall x : 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]^
by apply 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]
by rewrite grp_commutator_inv. Defined. (** So we get this symmetrical version as well. *) Instance issubgroup_precomp_commutator_r {G : Group} (H : Subgroup G) `{!IsNormalSubgroup H} (x : G) : IsSubgroup (fun y => H [x, y]) := issubgroup_equiv (fun y => issubgroup_precomp_commutator_agree H y x) _. Definition subgroup_precomp_commutator_l {G : Group} (H : Subgroup G) (y : G) `{!IsNormalSubgroup H} : Subgroup G := Build_Subgroup _ (fun x => H [x, y]) _. Definition subgroup_precomp_commutator_r {G : Group} (H : Subgroup G) (x : G) `{!IsNormalSubgroup H} : Subgroup G := Build_Subgroup _ (fun y => H [x, y]) _. (** ** Commutator subgroups *) Definition subgroup_commutator {G : Group@{i}} (H K : Subgroup@{i i} G) : Subgroup@{i i} G := subgroup_generated (fun g => exists (x : H) (y : K), [x.1, y.1] = g). Notation "[ H , K ]" := (subgroup_commutator H K) : group_scope. Local Open 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: forall x y : G, H x -> K y -> J (grp_commutator x y)

[H, K] ⊆ J
G: Group
H, K, J: Subgroup G
i: forall x y : G, H x -> K y -> J (grp_commutator x y)

[H, K] ⊆ J
G: Group
H, K, J: Subgroup G
i: forall x y0 : 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)
by apply 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: forall x y z : 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: forall x y z : 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: forall x y z : G, H x -> J y -> K z -> N (grp_commutator (grp_commutator x y) z)

forall x y : G, [H, J] x -> K y -> N (grp_commutator x y)
G: Group
H, J, K, N: Subgroup G
IsNormalSubgroup0: IsNormalSubgroup N
i: forall x y z0 : G, H x -> J y -> K z0 -> N (grp_commutator (grp_commutator x y) z0)
z: G
Kz: K z

forall x : G, [H, J] x -> N (grp_commutator x z)
G: Group
H, J, K, N: Subgroup G
IsNormalSubgroup0: IsNormalSubgroup N
i: forall x y z0 : G, H x -> J y -> K z0 -> N (grp_commutator (grp_commutator x y) z0)
z: G
Kz: K z

forall x : G, [H, J] x -> subgroup_precomp_commutator_l N z x
G: Group
H, J, K, N: Subgroup G
IsNormalSubgroup0: IsNormalSubgroup N
i: forall x y z0 : G, H x -> J y -> K z0 -> N (grp_commutator (grp_commutator x y) z0)
z: G
Kz: K z

forall x y : G, H x -> J y -> subgroup_precomp_commutator_l N z (grp_commutator x y)
by intros; 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}}
by exists (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

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

[K, L] (grp_commutator x y)
exact (subgroup_commutator_in (f _ Hx) (g _ Jx)). Defined.
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

H ⊆ K
G: Group
H, J, K, L: Subgroup G
f: H ↔ K
g: J ↔ L
J ⊆ L
G: Group
H, J, K, L: Subgroup G
f: H ↔ K
g: J ↔ L
K ⊆ H
G: Group
H, J, K, L: Subgroup G
f: H ↔ K
g: J ↔ L
L ⊆ J
G: Group
H, J, K, L: Subgroup G
f: H ↔ K
g: J ↔ L

H ⊆ K
G: Group
H, J, K, L: Subgroup G
f: H ↔ K
g: J ↔ L
J ⊆ L
G: Group
H, J, K, L: Subgroup G
f: H ↔ K
g: J ↔ L
H ↔ K
G: Group
H, J, K, L: Subgroup G
f: H ↔ K
g: J ↔ L
J ↔ L
G: Group
H, J, K, L: Subgroup G
f: H ↔ K
g: J ↔ L

J ⊆ L
G: Group
H, J, K, L: Subgroup G
f: H ↔ K
g: J ↔ L
J ↔ L
1,2: exact g. Defined.
G: Group
H, J: Subgroup G

[H, J] ⊆ [J, H]
G: Group
H, J: Subgroup G

[H, J] ⊆ [J, H]
G: Group
H, J: Subgroup G

forall x y : 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)
by apply 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. *)
G: Group
H, J: Subgroup G

subgroup_grp_op [H, J] ↔ [subgroup_grp_op J, subgroup_grp_op H]
G: Group
H, J: Subgroup G

subgroup_grp_op [H, J] ↔ [subgroup_grp_op J, subgroup_grp_op H]
G: Group
H, J: Subgroup G

(fun g : G => {x : H & {y : J & grp_commutator x.1 y.1 = g}}) ↔ (fun g : grp_op G => {x : subgroup_grp_op J & {y : subgroup_grp_op H & grp_commutator x.1 y.1 = g}})
G: Group
H, J: Subgroup G
x: G

{x0 : H & {y : J & grp_commutator x0.1 y.1 = x}} <-> {x0 : subgroup_grp_op J & {y : subgroup_grp_op H & grp_commutator x0.1 y.1 = x}}
G: Group
H, J: Subgroup G
x: G

{x0 : H & {y : J & grp_commutator x0.1 y.1 = x}} <-> {a : subgroup_grp_op H & {b : subgroup_grp_op J & grp_commutator b.1 a.1 = x}}
G: Group
H, J: Subgroup G
x: G
a: H
a0: J

(fun y : J => grp_commutator a.1 y.1 = x) a0 <~> (fun b : subgroup_grp_op J => grp_commutator b.1 (grp_iso_subgroup_group (grp_op_iso_inv G) (fun x0 : G => equiv_subgroup_inv (subgroup_grp_op H) x0) a).1 = x) (grp_iso_subgroup_group (grp_op_iso_inv G) (fun x0 : G => equiv_subgroup_inv (subgroup_grp_op J) x0) a0)
G: Group
H, J: Subgroup G
x: G
a: H
a0: J

grp_commutator a.1 a0.1 = x <~> grp_commutator (a0.1)^ (a.1)^ = x
G: Group
H, J: Subgroup G
x: G
a: H
a0: J

grp_commutator a.1 a0.1 = grp_commutator (a0.1)^ (a.1)^
G: Group
H, J: Subgroup G
x: G
a: H
a0: J

(grp_commutator a0.1 a.1)^ = grp_commutator (a0.1)^ (a.1)^
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

forall x y : G, [H, J] x -> [H, J] (y * x * y^)
G: Group
H, J: Subgroup G
IsNormalSubgroup0: IsNormalSubgroup H
IsNormalSubgroup1: IsNormalSubgroup J
y: G

forall x : G, [H, J] x -> [H, J] (y * x * y^)
G: Group
H, J: Subgroup G
IsNormalSubgroup0: IsNormalSubgroup H
IsNormalSubgroup1: IsNormalSubgroup J
y: G

(fun g : G => {x : H & {y0 : J & grp_commutator x.1 y0.1 = g}}) ⊆ (fun x : 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

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

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

forall x : 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)
by apply 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)
by apply 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

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

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

forall x y : 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; by apply 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. *) Definition normalsubgroup_derived G : NormalSubgroup G := Build_NormalSubgroup G [G, G] _. (** We can quotient a group by its derived subgroup. *) Definition grp_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

forall y : grp_derived_quotient G, x * y = y * x
G: Group
y: G

forall x : grp_derived_quotient G, (fun x0 : 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
G: Group
y, x: G

grp_commutator (y^; tt).1 (x^; tt).1 = (x * y)^ * (y * x)
G: Group
y, x: G

y^ * x^ * (y^)^ * (x^)^ = (x * y)^ * (y * x)
by rewrite !grp_inv_op, !grp_inv_inv, !grp_assoc. Defined. (** Hence we have a way of producing abelian groups from groups. *) Definition abgroup_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

forall n : G, normalsubgroup_derived G n -> f n = 1
G: Group
A: AbGroup
f: G $-> A

forall n : G, normalsubgroup_derived G n -> subgroup_preimage f (trivial_subgroup A) n
G: Group
A: AbGroup
f: G $-> A

forall x y : 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. *)
G: Group

IsAbelianization (abgroup_derived_quotient G) grp_quotient_map
G: Group

IsAbelianization (abgroup_derived_quotient G) grp_quotient_map
G: Group
A: AbGroup

IsSurjInj (group_precomp A grp_quotient_map)
G: Group
A: AbGroup

SplEssSurj (group_precomp A grp_quotient_map)
G: Group
A: AbGroup
forall x y : 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

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

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

forall x y z : 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^
by apply 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^]}
by exists (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])^

subgroup_commutator J K [y^, z^]
apply subgroup_commutator_in; by apply 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 : H & [([y^, z^]; subgroup_commutator_in (subgroup_in_inv J y Jy) (subgroup_in_inv K z Kz)).1, y0.1] = [[y^, z^], x]}
by exists (x; Hx). Local Open Scope group_scope. Defined.
G: Group
H, J, K: Subgroup G

IsTrivialGroup [[H, J], K] -> IsTrivialGroup [[J, K], H] -> IsTrivialGroup [[K, H], J]
G: Group
H, J, K: Subgroup G

IsTrivialGroup [[H, J], K] -> IsTrivialGroup [[J, K], H] -> IsTrivialGroup [[K, H], J]
rapply three_subgroups_lemma. Defined.