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.From HoTT Require Import Basics Types.From HoTT.WildCat Require Import Core Induced.Require Import Colimits.Quotient.Require Import Pointed.Require Import Truncations.Core Truncations.Connectedness.Require Import Homotopy.ClassifyingSpace.Require Import Algebra.Groups.Group.LocalOpen Scope trunc_scope.LocalOpen Scope path_scope.LocalOpen Scope pointed_scope.(** Keyed unification makes [rewrite !loops_functor_group] take a really long time. See https://coq.inria.fr/bugs/show_bug.cgi?id=4544 for more discussion. *)Local Unset Keyed Unification.(** * oo-Groups *)(** We want a workable definition of "oo-group" (what a classical homotopy theorist would call a "grouplike Aoo-space"). The classical definitions using operads or Segal spaces involve infinitely much data, which we don't know how to handle in HoTT. But instead, we can invoke the theorem (which is a theorem in classical homotopy theory, and also in any oo-topos) that every oo-group is the loop space of some pointed connected object, and use it instead as a definition: we define an oo-group to be a pointed connected type (its classifying space or delooping). Then we make subsidiary definitions to allow us to treat such an object in the way we would expect, e.g. an oo-group homomorphism is a pointed map between classifying spaces. *)(** ** Definition *)RecordooGroup :=
{ classifying_space : pType ;
isconn_classifying_space :: IsConnected 0 classifying_space
}.Local NotationB := classifying_space.Definitiongroup_type (G : ooGroup) : Type
:= point (B G) = point (B G).(** The following is fundamental: we declare a coercion from oo-groups to types which takes a pointed connected type not to its underlying type, but to its loop space. Thus, if [G : ooGroup], then [g : G] means that [g] is an element of the oo-group that [G] is intended to denote, which is the loop space of the pointed connected type that is technically the data of which [G : ooGroup] consists. This makes it easier to really think of [G] as "really being" an oo-group rather than its classifying space.This is also convenient because elements of oo-groups are, definitionally, loops in some type. Thus, the oo-group operations like multiplication, inverse, associativity, higher associativity, etc. are simply special cases of the corresponding operations for paths. *)Coerciongroup_type : ooGroup >-> Sortclass.(** Every pointed type has a loop space that is an oo-group. *)
(** Using [cut] prevents Coq from looking for these facts with typeclass search, which is slow and (for some reason) introduces scads of extra universes. *)
X: pType BG:= [{x0 : X & merely (x0 = pt)}, (pt; tr 1)]: pType x: X p: x = pt
pt = (x; tr p)
X: pType BG:= [{x0 : X & merely (x0 = pt)}, (pt; tr 1)]: pType x: X p: x = pt
pt = x
exact (p^).Defined.(** Unfortunately, the underlying type of that oo-group is not *definitionally* the same as the ordinary loop space, but it is equivalent to it. *)
X: pType
loops X <~> group_loops X
X: pType
loops X <~> group_loops X
X: pType
[pt = pt, 1] <~> pt = pt
X: pType
pt = pt <~> pt = pt
exact (equiv_path_sigma_hprop (point X ; tr 1) (point X ; tr 1)).Defined.(** ** Homomorphisms *)(** *** Definition *)DefinitionooGroupHom (GH : ooGroup)
:= B G ->* B H.Definitiongrouphom_fun {GH} (phi : ooGroupHom G H) : G -> H
:= fmap loops phi.Coerciongrouphom_fun : ooGroupHom >-> Funclass.(** The loop group functor takes values in oo-group homomorphisms. *)
X, Y: pType f: X ->* Y
ooGroupHom (group_loops X) (group_loops Y)
X, Y: pType f: X ->* Y
ooGroupHom (group_loops X) (group_loops Y)
X, Y: pType f: X ->* Y
{x : X & Tr (-1) (x = pt)} -> {x : Y & Tr (-1) (x = pt)}
X, Y: pType f: X ->* Y
?Goal pt = pt
X, Y: pType f: X ->* Y
{x : X & Tr (-1) (x = pt)} -> {x : Y & Tr (-1) (x = pt)}
symmetry; tapply (fmap_comp loops).Qed.Definitiongrouphom_idmap (G : ooGroup) : ooGroupHom G G
:= pmap_idmap.
X: pType
grouphom_idmap (group_loops X) == group_loops_functor (Id X)
X: pType
grouphom_idmap (group_loops X) == group_loops_functor (Id X)
X: pType g: group_loops X
grouphom_idmap (group_loops X) g = group_loops_functor (Id X) g
X: pType g: group_loops X
Id (loops (B (group_loops X))) g = group_loops_functor (Id X) g
X: pType g: group_loops X
Id (loops (B (group_loops X))) (loops_group X ((loops_group X)^-1 g)) =
group_loops_functor (Id X) (loops_group X ((loops_group X)^-1 g))
X: pType g: group_loops X
Id (loops (B (group_loops X))) (loops_group X ((loops_group X)^-1 g)) =
fmap loops (group_loops_functor (Id X))
(loops_group X ((loops_group X)^-1 g))
X: pType g: group_loops X
Id (loops (B (group_loops X))) (loops_group X ((loops_group X)^-1 g)) =
loops_group X (fmap loops (Id X) ((loops_group X)^-1 g))
exact (ap (loops_group X) (fmap_id loops _ _)^).Qed.(** *** Homomorphic properties *)(** The following tactic often allows us to "pretend" that phi preserves basepoints strictly. This is basically a simple extension of [pointed_reduce_rewrite] (see Pointed.v). *)Ltacgrouphom_reduce :=
unfold grouphom_fun; cbn;
repeatmatch goal with
| [ G : ooGroup |- _ ] => destruct G as [G ?]
| [ phi : ooGroupHom ?G?H |- _ ] => destruct phi as [phi ?]
end;
pointed_reduce_rewrite.
G, H, K: ooGroup psi: ooGroupHom H K phi: ooGroupHom G H
grouphom_compose psi phi == psi o phi
G, H, K: ooGroup psi: ooGroupHom H K phi: ooGroupHom G H
grouphom_compose psi phi == psi o phi
G: Type point1: IsPointed G isconn_classifying_space2: IsConnected (Tr 0) G H: Type isconn_classifying_space1: IsConnected (Tr 0) H K: Type isconn_classifying_space0: IsConnected (Tr 0) K psi: H -> K phi: G -> H g: {|
classifying_space := [G, point1];
isconn_classifying_space := isconn_classifying_space2
|}
ap (funx : G => psi (phi x)) g = ap psi (ap phi g)
exact (ap_compose phi psi g).Qed.
G: ooGroup
grouphom_idmap G == idmap
G: ooGroup
grouphom_idmap G == idmap
G: Type point: IsPointed G isconn_classifying_space0: IsConnected (Tr 0) G g: {|
classifying_space := [G, point];
isconn_classifying_space := isconn_classifying_space0
|}
ap idmap g = g
exact (ap_idmap g).Qed.
G, H: ooGroup phi: ooGroupHom G H g1, g2: G
phi (g1 @ g2) = phi g1 @ phi g2
G, H: ooGroup phi: ooGroupHom G H g1, g2: G
phi (g1 @ g2) = phi g1 @ phi g2
G: Type point0: IsPointed G isconn_classifying_space1: IsConnected (Tr 0) G H: Type isconn_classifying_space0: IsConnected (Tr 0) H phi: G -> H g1, g2: {|
classifying_space := [G, point0];
isconn_classifying_space := isconn_classifying_space1
|}
ap phi (g1 @ g2) = ap phi g1 @ ap phi g2
exact (ap_pp phi g1 g2).Qed.
G, H: ooGroup phi: ooGroupHom G H g: G
phi g^ = (phi g)^
G, H: ooGroup phi: ooGroupHom G H g: G
phi g^ = (phi g)^
G: Type point0: IsPointed G isconn_classifying_space1: IsConnected (Tr 0) G H: Type isconn_classifying_space0: IsConnected (Tr 0) H phi: G -> H g: {|
classifying_space := [G, point0];
isconn_classifying_space := isconn_classifying_space1
|}
ap phi g^ = (ap phi g)^
exact (ap_V phi g).Qed.
G, H: ooGroup phi: ooGroupHom G H
phi 1 = 1
G, H: ooGroup phi: ooGroupHom G H
phi 1 = 1
G: Type point0: IsPointed G isconn_classifying_space1: IsConnected (Tr 0) G H: Type isconn_classifying_space0: IsConnected (Tr 0) H phi: G -> H
G: Type point0: IsPointed G isconn_classifying_space1: IsConnected (Tr 0) G H: Type isconn_classifying_space0: IsConnected (Tr 0) H phi: G -> H g1, g2, g3: {|
classifying_space := [G, point0];
isconn_classifying_space := isconn_classifying_space1
|}
Abort.(** ** Subgroups *)SectionSubgroups.Context {GH : ooGroup} (incl : ooGroupHom H G) `{IsEmbedding incl}.(** A subgroup induces an equivalence relation on the ambient group, whose equivalence classes are called "cosets". *)Definitionin_coset : G -> G -> Type
:= fung1g2 => hfiber incl (g1 @ g2^).
G, H: ooGroup incl: ooGroupHom H G IsEmbedding0: IsEmbedding incl
is_mere_relation G in_coset
G, H: ooGroup incl: ooGroupHom H G IsEmbedding0: IsEmbedding incl
is_mere_relation G in_coset
exact _.Defined.
G, H: ooGroup incl: ooGroupHom H G IsEmbedding0: IsEmbedding incl
Reflexive in_coset
G, H: ooGroup incl: ooGroupHom H G IsEmbedding0: IsEmbedding incl
Reflexive in_coset
G, H: ooGroup incl: ooGroupHom H G IsEmbedding0: IsEmbedding incl g: G