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 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 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
... * 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)
forallx : G, [H, K] x -> J x
G: Group H, K, J: Subgroup G i: forallxy : G,
H x -> K y -> J (grp_commutator x y)
forallx : G, [H, K] x -> J x
G: Group H, K, J: Subgroup G i: forallxy : G,
H x -> K y -> J (grp_commutator x y) 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)
forallx : G, [[H, J], K] x -> N x
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)
forallx : G, [[H, J], K] x -> N x
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: forallxyz : G,
H x ->
J y ->
K z -> N (grp_commutator (grp_commutator x y) z) 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: forallxyz : G,
H x ->
J y ->
K z -> N (grp_commutator (grp_commutator x y) z) 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: forallxyz : G,
H x ->
J y ->
K z -> N (grp_commutator (grp_commutator x y) z) 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: forallx : G, H x -> K x g: forallx : G, J x -> L x
forallx : G, [H, J] x -> [K, L] x
G: Group H, J, K, L: Subgroup G f: forallx : G, H x -> K x g: forallx : G, J x -> L x
forallx : G, [H, J] x -> [K, L] x
G: Group H, J, K, L: Subgroup G f: forallx : G, H x -> K x g: forallx : G, J x -> L x
forallxy : G,
H x -> J y -> [K, L] (grp_commutator x y)
G: Group H, J, K, L: Subgroup G f: forallx : G, H x -> K x g: forallx : G, J x -> L x x, y: G Hx: H x Jx: J y
[K, L] (grp_commutator x y)
G: Group H, J, K, L: Subgroup G f: forallx : G, H x -> K x g: forallx : G, J x -> L x x, y: G Hx: H x Jx: J y
K x
G: Group H, J, K, L: Subgroup G f: forallx : G, H x -> K x g: forallx : G, J x -> L x x, y: G Hx: H x Jx: J y
L y
G: Group H, J, K, L: Subgroup G f: forallx : G, H x -> K x g: forallx : G, J x -> L x x, y: G Hx: H x Jx: J y
K x
byapply f.
G: Group H, J, K, L: Subgroup G f: forallx : G, H x -> K x g: forallx : G, J x -> L x x, y: G Hx: H x Jx: J y
L y
byapply g.Defined.
G: Group H, J, K, L: Subgroup G f: forallx : G, H x <-> K x g: forallx : G, J x <-> L x
forallx : G, [H, J] x <-> [K, L] x
G: Group H, J, K, L: Subgroup G f: forallx : G, H x <-> K x g: forallx : G, J x <-> L x
forallx : G, [H, J] x <-> [K, L] x
G: Group H, J, K, L: Subgroup G f: forallx : G, H x <-> K x g: forallx : G, J x <-> L x
forallx : G, H x -> K x
G: Group H, J, K, L: Subgroup G f: forallx : G, H x <-> K x g: forallx : G, J x <-> L x
forallx : G, J x -> L x
G: Group H, J, K, L: Subgroup G f: forallx : G, H x <-> K x g: forallx : G, J x <-> L x
forallx : G, K x -> H x
G: Group H, J, K, L: Subgroup G f: forallx : G, H x <-> K x g: forallx : G, J x <-> L x
forallx : G, L x -> J x
G: Group H, J, K, L: Subgroup G f: forallx : G, H x <-> K x g: forallx : G, J x <-> L x
forallx : G, J x -> L x
G: Group H, J, K, L: Subgroup G f: forallx : G, H x <-> K x g: forallx : G, J x <-> L x
forallx : G, L x -> J x
1,2: apply g.Defined.
G: Group H, J: Subgroup G
forallx : G, [H, J] x -> [J, H] x
G: Group H, J: Subgroup G
forallx : G, [H, J] x -> [J, H] x
G: Group H, J: Subgroup G
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
forallx : G, [H, J] x <-> [J, H] x
G: Group H, J: Subgroup G
forallx : G, [H, J] x <-> [J, H] x
intros x; split; snapply 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
forallx : grp_op G,
[H, J] x <-> [subgroup_grp_op J, subgroup_grp_op H] x
G: Group H, J: Subgroup G
forallx : grp_op G,
[H, J] x <-> [subgroup_grp_op J, subgroup_grp_op H] x
G: Group H, J: Subgroup G IsNormalSubgroup0: IsNormalSubgroup H IsNormalSubgroup1: IsNormalSubgroup J y, x: G
{x0 : H & {y : J & grp_commutator x0.1 y.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
forallx : G,
[subgroup_product H K, L] x <->
subgroup_product [H, L] [K, L] x
G: Group H, K, L: NormalSubgroup G
forallx : 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 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
forallg : G,
(funx : G => (H x + K x)%type) g ->
subgroup_precomp_commutator_l
(subgroup_product [H, L] [K, L]) y g
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
forallg : G,
(funx : G => ([H, L] x + [K, L] x)%type) g ->
[subgroup_product H K, L] g
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
forallx : G, H x -> subgroup_product H K x
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
forallx : G, K x -> subgroup_product H K x
apply subgroup_product_incl_r.Defined.(** Commutator subgroups distribute over products of normal subgroups on the right. *)
G: Group H, K, L: NormalSubgroup G
forallx : G,
[H, subgroup_product K L] x <->
subgroup_product [H, K] [H, L] x
G: Group H, K, L: NormalSubgroup G
forallx : 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 <->
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
forallx : H,
subgroup_image f [J, K] x ->
[subgroup_image f J, subgroup_image f K] x
G, H: Group f: G $-> H J, K: Subgroup G
forallx : H,
subgroup_image f [J, K] x ->
[subgroup_image f J, subgroup_image f K] x
G, H: Group f: G $-> H J, K: Subgroup G
forallx : G,
[J, K] x ->
[subgroup_image f J, subgroup_image f K] (f x)
G, H: Group f: G $-> H J, K: Subgroup G
forallx : G,
[J, K] x ->
subgroup_preimage f
[subgroup_image f J, subgroup_image f K] x
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: forallx : G, [[H, J], K] x -> N x T2: forallx : G, [[J, K], H] x -> N x
forallx : G, [[K, H], J] x -> N x
G: Group H, J, K, N: Subgroup G IsNormalSubgroup0: IsNormalSubgroup N T1: forallx : G, [[H, J], K] x -> N x T2: forallx : G, [[J, K], H] x -> N x
forallx : G, [[K, H], J] x -> N x
G: Group H, J, K, N: Subgroup G IsNormalSubgroup0: IsNormalSubgroup N T1: forallx : G, [[H, J], K] x -> N x T2: forallx : G, [[J, K], H] x -> N x
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: forallx : G,
subgroup_commutator (subgroup_commutator H J) K x ->
N x T2: forallx : G,
subgroup_commutator (subgroup_commutator J K) H x ->
N x
forallxyz : G, K x -> H y -> J z -> N [[x, y], z]
G: Group H, J, K, N: Subgroup G IsNormalSubgroup0: IsNormalSubgroup N T1: forallx : G,
subgroup_commutator (subgroup_commutator H J) K x ->
N x T2: forallx : G,
subgroup_commutator (subgroup_commutator J K) H x ->
N x 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: forallx : G,
subgroup_commutator (subgroup_commutator H J) K x ->
N x T2: forallx : G,
subgroup_commutator (subgroup_commutator J K) H x ->
N x 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: forallx : G,
subgroup_commutator (subgroup_commutator H J) K x ->
N x T2: forallx : G,
subgroup_commutator (subgroup_commutator J K) H x ->
N x 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: forallx : G,
subgroup_commutator (subgroup_commutator H J) K x ->
N x T2: forallx : G,
subgroup_commutator (subgroup_commutator J K) H x ->
N x 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: forallx : G,
subgroup_commutator (subgroup_commutator H J) K x ->
N x T2: forallx : G,
subgroup_commutator (subgroup_commutator J K) H x ->
N x 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: forallx : G,
subgroup_commutator (subgroup_commutator H J) K x ->
N x T2: forallx : G,
subgroup_commutator (subgroup_commutator J K) H x ->
N x 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: forallx : G,
subgroup_commutator (subgroup_commutator H J) K x ->
N x T2: forallx : G,
subgroup_commutator (subgroup_commutator J K) H x ->
N x 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: forallx : G,
subgroup_commutator (subgroup_commutator H J) K x ->
N x T2: forallx : G,
subgroup_commutator (subgroup_commutator J K) H x ->
N x 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: forallx : G,
subgroup_commutator (subgroup_commutator H J) K x ->
N x T2: forallx : G,
subgroup_commutator (subgroup_commutator J K) H x ->
N x 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: forallx : G,
subgroup_commutator (subgroup_commutator H J) K x ->
N x T2: forallx : G,
subgroup_commutator (subgroup_commutator J K) H x ->
N x 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: forallx : G,
subgroup_commutator (subgroup_commutator H J) K x ->
N x T2: forallx : G,
subgroup_commutator (subgroup_commutator J K) H x ->
N x 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: forallx : G,
subgroup_commutator (subgroup_commutator H J) K x ->
N x T2: forallx : G,
subgroup_commutator (subgroup_commutator J K) H x ->
N x 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: forallx : G,
subgroup_commutator (subgroup_commutator H J) K x ->
N x T2: forallx : G,
subgroup_commutator (subgroup_commutator J K) H x ->
N x 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: forallx : G,
subgroup_commutator (subgroup_commutator H J) K x ->
N x T2: forallx : G,
subgroup_commutator (subgroup_commutator J K) H x ->
N x 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: forallx : G,
subgroup_commutator (subgroup_commutator H J) K x ->
N x T2: forallx : G,
subgroup_commutator (subgroup_commutator J K) H x ->
N x 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: forallx : G,
subgroup_commutator (subgroup_commutator H J) K x ->
N x T2: forallx : G,
subgroup_commutator (subgroup_commutator J K) H x ->
N x 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: forallx : G,
subgroup_commutator (subgroup_commutator H J) K x ->
N x T2: forallx : G,
subgroup_commutator (subgroup_commutator J K) H x ->
N x 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: forallx : G,
subgroup_commutator (subgroup_commutator H J) K x ->
N x T2: forallx : G,
subgroup_commutator (subgroup_commutator J K) H x ->
N x 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: forallx : G,
subgroup_commutator (subgroup_commutator H J) K x ->
N x T2: forallx : G,
subgroup_commutator (subgroup_commutator J K) H x ->
N x 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: forallx : G,
subgroup_commutator (subgroup_commutator H J) K x ->
N x T2: forallx : G,
subgroup_commutator (subgroup_commutator J K) H x ->
N x 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: forallx : G,
subgroup_commutator (subgroup_commutator H J) K x ->
N x T2: forallx : G,
subgroup_commutator (subgroup_commutator J K) H x ->
N x 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: forallx : G,
subgroup_commutator (subgroup_commutator H J) K x ->
N x T2: forallx : G,
subgroup_commutator (subgroup_commutator J K) H x ->
N x 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: forallx : G,
subgroup_commutator (subgroup_commutator H J) K x ->
N x T2: forallx : G,
subgroup_commutator (subgroup_commutator J K) H x ->
N x 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: forallx : G,
subgroup_commutator (subgroup_commutator H J) K x ->
N x T2: forallx : G,
subgroup_commutator (subgroup_commutator J K) H x ->
N x 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: forallx : G,
subgroup_commutator (subgroup_commutator H J) K x ->
N x T2: forallx : G,
subgroup_commutator (subgroup_commutator J K) H x ->
N x 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: forallx : G,
subgroup_commutator (subgroup_commutator H J) K x ->
N x T2: forallx : G,
subgroup_commutator (subgroup_commutator J K) H x ->
N x 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: forallx : G,
subgroup_commutator (subgroup_commutator H J) K x ->
N x T2: forallx : G,
subgroup_commutator (subgroup_commutator J K) H x ->
N x 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: forallx : G,
subgroup_commutator (subgroup_commutator H J) K x ->
N x T2: forallx : G,
subgroup_commutator (subgroup_commutator J K) H x ->
N x 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: forallx : G,
subgroup_commutator (subgroup_commutator H J) K x ->
N x T2: forallx : G,
subgroup_commutator (subgroup_commutator J K) H x ->
N x 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: forallx : G,
subgroup_commutator (subgroup_commutator H J) K x ->
N x T2: forallx : G,
subgroup_commutator (subgroup_commutator J K) H x ->
N x 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: forallx : G,
subgroup_commutator (subgroup_commutator H J) K x ->
N x T2: forallx : G,
subgroup_commutator (subgroup_commutator J K) H x ->
N x 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]}