Built with Alectryon, running Coq+SerAPI v8.18.0+0.18.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.
(* -*- mode: coq; mode: visual-line -*- *)
[Loading ML file number_string_notation_plugin.cmxs (using legacy method) ... done]
Require Import Pointed.Require Import Truncations.Core Truncations.Connectedness.Require Import Homotopy.ClassifyingSpace.Require Import Algebra.Groups.Require Import WildCat.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
}.Global Existing Instanceisconn_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:= [{x : X & merely (x = pt)}, (pt; tr 1)]: pType x: X p: x = pt
pt = (x; tr p)
X: pType BG:= [{x : X & merely (x = 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; rapply (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