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.
From HoTT Require Import Basics Types Truncations.Core.From HoTT Require Import Basics Types Truncations.Core.Require Import HFiber AbelianGroup.(* Given a group [G], we define the centralizer of an element [g : G] as a subgroup and use this to show that the cyclic subgroup generated by [g] is abelian. *)LocalOpen Scope mc_scope.LocalOpen Scope mc_mult_scope.(* First we show that the collection of elements that commute with a fixed element [g] is a subgroup. *)Definitioncentralizer {G : Group} (g : G)
:= funh => g * h = h * g.Definitioncentralizer_unit {G : Group} (g : G) : centralizer g mon_unit
:= grp_g1_1g _ _ idpath.
G: Group g, h, k: G p: centralizer g h q: centralizer g k
centralizer g (h * k)
G: Group g, h, k: G p: centralizer g h q: centralizer g k
centralizer g (h * k)
G: Group g, h, k: G p: centralizer g h q: centralizer g k
g * h * k = h * k * g
G: Group g, h, k: G p: centralizer g h q: centralizer g k
h * g * k = h * k * g
G: Group g, h, k: G p: centralizer g h q: centralizer g k
h * (g * k) = h * k * g
G: Group g, h, k: G p: centralizer g h q: centralizer g k
h * (k * g) = h * k * g
apply grp_assoc.Defined.
G: Group g, h: G p: centralizer g h
centralizer g h^
G: Group g, h: G p: centralizer g h
centralizer g h^
G: Group g, h: G p: g * h = h * g
g * h^ = h^ * g
G: Group g, h: G p: g * h = h * g
h^ * g = g * h^
G: Group g, h: G p: g * h = h * g
h^ * g * 1 = 1 * (g * h^)
G: Group g, h: G p: g * h = h * g
h^ * g * (h * h^) = h^ * h * (g * h^)
G: Group g, h: G p: g * h = h * g
h^ * g * h * h^ = h^ * h * g * h^
G: Group g, h: G p: g * h = h * g
h^ * g * h = h^ * h * g
G: Group g, h: G p: g * h = h * g
h^ * (g * h) = h^ * (h * g)
exact (ap (h^ *.) p).Defined.
G: Group g: G
IsSubgroup (centralizer g)
G: Group g: G
IsSubgroup (centralizer g)
G: Group g: G
centralizer g 1
G: Group g: G
forallxy : G, centralizer g x -> centralizer g y -> centralizer g (x * y)
G: Group g: G
forallx : G, centralizer g x -> centralizer g x^
G: Group g: G
centralizer g 1
apply centralizer_unit.
G: Group g: G
forallxy : G, centralizer g x -> centralizer g y -> centralizer g (x * y)
G, H: Group f: GroupHomomorphism G H g, g': G p: g * g' = g' * g
f g * f g' = f g' * f g
G, H: Group f: GroupHomomorphism G H g, g': G p: g * g' = g' * g
f (g * g') = f (g' * g)
exact (ap f p).Defined.(** Isomorphisms reflect centralizers. *)
G, H: Group f: GroupIsomorphism G H g, g': G
centralizer (f g) (f g') -> centralizer g g'
G, H: Group f: GroupIsomorphism G H g, g': G
centralizer (f g) (f g') -> centralizer g g'
G, H: Group f: GroupIsomorphism G H g, g': G p: centralizer (f g) (f g')
centralizer g g'
G, H: Group f: GroupIsomorphism G H g, g': G p: centralizer (f g) (f g')
centralizer (f^-1 (f g)) (f^-1 (f g'))
exact (centralizer_hom (grp_iso_inverse f) _ _ p).Defined.(* Now we define cyclic subgroups. We allow any map [Unit -> G] in this definition, because in applications (such as [Z_commutative]) we have no control over the map. *)Definitioncyclic_subgroup_from_unit {G : Group} (gen : Unit -> G) := subgroup_generated (hfiber gen).(* When we have a particular element [g] of [G], we could choose the predicate to be [fun h => h = g], but to fit into the above definition, we use [unit_name g], which gives the predicate [fun h => hfiber (unit_name g) h]. *)Definitioncyclic_subgroup {G : Group} (g : G) := cyclic_subgroup_from_unit (unit_name g).(* Any cyclic subgroup is commutative. *)
G: Group gen: Unit -> G
Commutative group_sgop
G: Group gen: Unit -> G
Commutative group_sgop
G: Group gen: Unit -> G h, k: cyclic_subgroup_from_unit gen
group_sgop h k = group_sgop k h
G: Group gen: Unit -> G h: G H: Trunc (-1) (subgroup_generated_type (hfiber gen) h) k: cyclic_subgroup_from_unit gen
group_sgop (h; H) k = group_sgop k (h; H)
G: Group gen: Unit -> G h: G H: Trunc (-1) (subgroup_generated_type (hfiber gen) h) k: G K: Trunc (-1) (subgroup_generated_type (hfiber gen) k)
G: Group gen: Unit -> G h, k: G K: subgroup_generated_type (hfiber gen) k H: subgroup_generated_type (hfiber gen) h
h * k = k * h
G: Group gen: Unit -> G k: G K: subgroup_generated_type (hfiber gen) k h: G p: gen tt = h
h * k = k * h
G: Group gen: Unit -> G k: G K: subgroup_generated_type (hfiber gen) k
1 * k = k * 1
G: Group gen: Unit -> G k: G K: subgroup_generated_type (hfiber gen) k h1, h2: G H1: subgroup_generated_type (hfiber gen) h1 IHH1: subgroup_generated_type (hfiber gen) h2 H2: h1 * k = k * h1 IHH2: h2 * k = k * h2
h1 * h2^ * k = k * (h1 * h2^)
G: Group gen: Unit -> G k: G K: subgroup_generated_type (hfiber gen) k h: G p: gen tt = h
h * k = k * h
G: Group gen: Unit -> G k: G K: subgroup_generated_type (hfiber gen) k
gen tt * k = k * gen tt
G: Group gen: Unit -> G k: G q: gen tt = k
gen tt * k = k * gen tt
G: Group gen: Unit -> G
gen tt * 1 = 1 * gen tt
G: Group gen: Unit -> G k1, k2: G K1: subgroup_generated_type (hfiber gen) k1 IHK1: subgroup_generated_type (hfiber gen) k2 K2: gen tt * k1 = k1 * gen tt IHK2: gen tt * k2 = k2 * gen tt
gen tt * (k1 * k2^) = k1 * k2^ * gen tt
G: Group gen: Unit -> G k: G q: gen tt = k
gen tt * k = k * gen tt
G: Group gen: Unit -> G
gen tt * gen tt = gen tt * gen tt
reflexivity.
G: Group gen: Unit -> G
gen tt * 1 = 1 * gen tt
apply centralizer_unit.
G: Group gen: Unit -> G k1, k2: G K1: subgroup_generated_type (hfiber gen) k1 IHK1: subgroup_generated_type (hfiber gen) k2 K2: gen tt * k1 = k1 * gen tt IHK2: gen tt * k2 = k2 * gen tt
G: Group gen: Unit -> G k: G K: subgroup_generated_type (hfiber gen) k
1 * k = k * 1
symmetry; apply centralizer_unit.
G: Group gen: Unit -> G k: G K: subgroup_generated_type (hfiber gen) k h1, h2: G H1: subgroup_generated_type (hfiber gen) h1 IHH1: subgroup_generated_type (hfiber gen) h2 H2: h1 * k = k * h1 IHH2: h2 * k = k * h2
h1 * h2^ * k = k * (h1 * h2^)
G: Group gen: Unit -> G k: G K: subgroup_generated_type (hfiber gen) k h1, h2: G H1: subgroup_generated_type (hfiber gen) h1 IHH1: subgroup_generated_type (hfiber gen) h2 H2: h1 * k = k * h1 IHH2: h2 * k = k * h2
k * (h1 * h2^) = h1 * h2^ * k
srapply (issubgroup_in_op_inv (H:=centralizer k)); unfold centralizer; symmetry; assumption.Defined.Definitionabgroup_cyclic_subgroup {G : Group} (g : G) : AbGroup
:= Build_AbGroup (cyclic_subgroup g) _.(** ** Centralizers of general subsets *)(** The centralizer of the elements of [G] for which [H] holds. *)Definitionsubtype_centralizer {G : Group} (H : G -> Type)
: G -> Type(* Note the order of operations here. We do this to match the original proofs for the centraliser of an element. *)
:= fung => merely (forallh : G, H h -> centralizer h g).(** The centralizer of any subset of [G] is a subgroup of [G]. *)
G: Group H: G -> Type
IsSubgroup (subtype_centralizer H)
G: Group H: G -> Type
IsSubgroup (subtype_centralizer H)
G: Group H: G -> Type
subtype_centralizer H 1
G: Group H: G -> Type
forallxy : G,
subtype_centralizer H x ->
subtype_centralizer H y -> subtype_centralizer H (x * y)
G: Group H: G -> Type
forallx : G, subtype_centralizer H x -> subtype_centralizer H x^
G: Group H: G -> Type
subtype_centralizer H 1
G: Group H: G -> Type
forallh : G, H h -> centralizer h 1
G: Group H: G -> Type h: G Hh: H h
centralizer h 1
exact (centralizer_unit h).
G: Group H: G -> Type
forallxy : G,
subtype_centralizer H x ->
subtype_centralizer H y -> subtype_centralizer H (x * y)
G: Group H: G -> Type x, y: G cx: subtype_centralizer H x cy: subtype_centralizer H y
subtype_centralizer H (x * y)
G: Group H: G -> Type x, y: G cy: forallh : G, H h -> centralizer h y cx: forallh : G, H h -> centralizer h x
forallh : G, H h -> centralizer h (x * y)
G: Group H: G -> Type x, y: G cy: forallh0 : G, H h0 -> centralizer h0 y cx: forallh0 : G, H h0 -> centralizer h0 x h: G Hh: H h
centralizer h (x * y)
exact (centralizer_sgop _ _ _ (cx h Hh) (cy h Hh)).
G: Group H: G -> Type
forallx : G, subtype_centralizer H x -> subtype_centralizer H x^
G: Group H: G -> Type x: G Hx: subtype_centralizer H x
subtype_centralizer H x^
G: Group H: G -> Type x: G Hx: forallh : G, H h -> centralizer h x
forallh : G, H h -> centralizer h x^
G: Group H: G -> Type x: G Hx: forallh0 : G, H h0 -> centralizer h0 x h: G Hh: H h
centralizer h x^
exact (centralizer_inverse h x (Hx h Hh)).Defined.Definitionsubtype_centralizer_subgroup
{G : Group} (H : G -> Type)
:= Build_Subgroup G (subtype_centralizer H) _.