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.Equivalences Basics.Iff.Require Import Basics.Overture Basics.Tactics Basics.Equivalences Basics.Iff.
Require Import Types.Universe.
Require Import Groups.Group AbGroups.Abelianization AbGroups.AbelianGroup
  Groups.Commutator Groups.QuotientGroup.
Require Import WildCat.Core WildCat.Equiv.

Local Open Scope mc_scope.
Local Open Scope mc_mult_scope.
Local Open Scope group_scope.

(** * Perfect Groups *)

(** ** Definition *)

(** A group is perfect if its abelianization is trivial. *)
Class IsPerfect (G : Group) := contr_abel_isperfect :: IsTrivialGroup (abel G).

(** A group is perfect if its commutator subgroup is the maximal subgroup. *)
G: Group

IsMaximalSubgroup [maximal_subgroup G, maximal_subgroup G] -> IsPerfect G
G: Group

IsMaximalSubgroup [maximal_subgroup G, maximal_subgroup G] -> IsPerfect G
G: Group
max: IsMaximalSubgroup [maximal_subgroup G, maximal_subgroup G]

IsPerfect G
G: Group
max: IsMaximalSubgroup [maximal_subgroup G, maximal_subgroup G]

maximal_subgroup (abel G) $<~> grp_trivial
G: Group
max: IsMaximalSubgroup [maximal_subgroup G, maximal_subgroup G]

abel G $<~> grp_trivial
G: Group
max: IsMaximalSubgroup [maximal_subgroup G, maximal_subgroup G]

abgroup_derived_quotient G $<~> grp_trivial
exact (fst (istrivial_iff_grp_iso_trivial (abgroup_derived_quotient G)) _ $oE (grp_iso_subgroup_group_maximal _)^-1$). Defined. (** Conversely, the commutator subgroup of any perfect group is the maximal subgroup. *)
H: Univalence
G: Group

IsPerfect G -> IsMaximalSubgroup [maximal_subgroup G, maximal_subgroup G]
H: Univalence
G: Group

IsPerfect G -> IsMaximalSubgroup [maximal_subgroup G, maximal_subgroup G]
H: Univalence
G: Group
p: IsPerfect G

IsMaximalSubgroup [maximal_subgroup G, maximal_subgroup G]
H: Univalence
G: Group
p: IsPerfect G

IsTrivialGroup (maximal_subgroup (G / normalsubgroup_derived G))
H: Univalence
G: Group
p: IsPerfect G

maximal_subgroup (abel G) $<~> maximal_subgroup (G / normalsubgroup_derived G)
H: Univalence
G: Group
p: IsPerfect G

maximal_subgroup (G / normalsubgroup_derived G) $<~> ?Goal0
H: Univalence
G: Group
p: IsPerfect G
?Goal $<~> ?Goal0
H: Univalence
G: Group
p: IsPerfect G
maximal_subgroup (abel G) $<~> ?Goal
H: Univalence
G: Group
p: IsPerfect G

abel G $<~> G / normalsubgroup_derived G
exact (emap abgroup_group (@groupiso_isabelianization G _ _ _ _ _ (isabelianization_derived_quotient _))). Defined. (** ** Basic properties *) (** All simple non-abelian groups are perfect. *)
H: Univalence
G: Group
s: IsSimpleGroup G
na: ~ Commutative sg_op

IsPerfect G
H: Univalence
G: Group
s: IsSimpleGroup G
na: ~ Commutative sg_op

IsPerfect G
(* Since [G] is simple, we can assume the commutator [ [G, G] ] is either trivial or maximal. *)
H: Univalence
G: Group
s: IsSimpleGroup G
na: ~ Commutative sg_op
triv: IsTrivialGroup [maximal_subgroup G, maximal_subgroup G]

IsPerfect G
H: Univalence
G: Group
s: IsSimpleGroup G
na: ~ Commutative sg_op
max: IsMaximalSubgroup [maximal_subgroup G, maximal_subgroup G]
IsPerfect G
H: Univalence
G: Group
s: IsSimpleGroup G
na: ~ Commutative sg_op
triv: IsTrivialGroup [maximal_subgroup G, maximal_subgroup G]

IsPerfect G
H: Univalence
G: Group
s: IsSimpleGroup G
na: ~ Commutative sg_op
triv: IsTrivialGroup [maximal_subgroup G, maximal_subgroup G]

Commutative sg_op
H: Univalence
G: Group
s: IsSimpleGroup G
na: ~ Commutative sg_op
triv: IsTrivialGroup [maximal_subgroup G, maximal_subgroup G]
x, y: G

x * y = y * x
H: Univalence
G: Group
s: IsSimpleGroup G
na: ~ Commutative sg_op
triv: IsTrivialGroup [maximal_subgroup G, maximal_subgroup G]
x, y: G

grp_commutator x y * y * x = y * x
H: Univalence
G: Group
s: IsSimpleGroup G
na: ~ Commutative sg_op
triv: IsTrivialGroup [maximal_subgroup G, maximal_subgroup G]
x, y: G

grp_commutator x y * (y * x) = y * x
H: Univalence
G: Group
s: IsSimpleGroup G
na: ~ Commutative sg_op
triv: IsTrivialGroup [maximal_subgroup G, maximal_subgroup G]
x, y: G

grp_commutator x y * (y * x) = 1 * (y * x)
H: Univalence
G: Group
s: IsSimpleGroup G
na: ~ Commutative sg_op
triv: IsTrivialGroup [maximal_subgroup G, maximal_subgroup G]
x, y: G

grp_commutator x y = 1
H: Univalence
G: Group
s: IsSimpleGroup G
na: ~ Commutative sg_op
triv: IsTrivialGroup [maximal_subgroup G, maximal_subgroup G]
x, y: G

[maximal_subgroup G, maximal_subgroup G] (grp_commutator x y)
by apply subgroup_commutator_in. Defined. (** A quotient of a perfect group is perfect. *)
H: Univalence
G: Group
N: NormalSubgroup G

IsPerfect G -> IsPerfect (G / N)
H: Univalence
G: Group
N: NormalSubgroup G

IsPerfect G -> IsPerfect (G / N)
H: Univalence
G: Group
N: NormalSubgroup G
perf: IsPerfect G

IsPerfect (G / N)
H: Univalence
G: Group
N: NormalSubgroup G
perf: IsPerfect G

IsMaximalSubgroup [maximal_subgroup (G / N), maximal_subgroup (G / N)]
H: Univalence
G: Group
N: NormalSubgroup G
perf: IsPerfect G

forall x : G, [maximal_subgroup (G / N), maximal_subgroup (G / N)] (grp_quotient_map x)
H: Univalence
G: Group
N: NormalSubgroup G
perf: IsPerfect G
x: G

[maximal_subgroup (G / N), maximal_subgroup (G / N)] (grp_quotient_map x)
H: Univalence
G: Group
N: NormalSubgroup G
perf: IsMaximalSubgroup [maximal_subgroup G, maximal_subgroup G]
x: G

[maximal_subgroup (G / N), maximal_subgroup (G / N)] (grp_quotient_map x)
H: Univalence
G: Group
N: NormalSubgroup G
perf: IsMaximalSubgroup [maximal_subgroup G, maximal_subgroup G]

forall x : G, [maximal_subgroup G, maximal_subgroup G] x -> [maximal_subgroup (G / N), maximal_subgroup (G / N)] (grp_quotient_map x)
H: Univalence
G: Group
N: NormalSubgroup G
perf: IsMaximalSubgroup [maximal_subgroup G, maximal_subgroup G]

forall x : G, [maximal_subgroup G, maximal_subgroup G] x -> subgroup_preimage grp_quotient_map [maximal_subgroup (G / N), maximal_subgroup (G / N)] x
H: Univalence
G: Group
N: NormalSubgroup G
perf: IsMaximalSubgroup [maximal_subgroup G, maximal_subgroup G]

forall x y : G, maximal_subgroup G x -> maximal_subgroup G y -> subgroup_preimage grp_quotient_map [maximal_subgroup (G / N), maximal_subgroup (G / N)] (grp_commutator x y)
H: Univalence
G: Group
N: NormalSubgroup G
perf: IsMaximalSubgroup [maximal_subgroup G, maximal_subgroup G]
x, y: G

subgroup_preimage grp_quotient_map [maximal_subgroup (G / N), maximal_subgroup (G / N)] (grp_commutator x y)
H: Univalence
G: Group
N: NormalSubgroup G
perf: IsMaximalSubgroup [maximal_subgroup G, maximal_subgroup G]
x, y: G

[maximal_subgroup (G / N), maximal_subgroup (G / N)] (grp_quotient_map (grp_commutator x y))
H: Univalence
G: Group
N: NormalSubgroup G
perf: IsMaximalSubgroup [maximal_subgroup G, maximal_subgroup G]
x, y: G

[maximal_subgroup (G / N), maximal_subgroup (G / N)] (grp_commutator (grp_quotient_map x) (grp_quotient_map y))
by apply subgroup_commutator_in. Defined.