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 Pointed.Require Import Cubical.DPath.Require Import Algebra.AbGroups.Require Import Homotopy.Suspension.Require Import Homotopy.ClassifyingSpace.Require Import Homotopy.HSpace.Coherent.Require Import Homotopy.HomotopyGroup.Require Import Homotopy.Hopf.Require Import Truncations.Core Truncations.Connectedness.Require Import WildCat.(** * Eilenberg-Mac Lane spaces *)LocalOpen Scope pointed_scope.LocalOpen Scope nat_scope.LocalOpen Scope mc_mult_scope.(** The definition of the Eilenberg-Mac Lane spaces. Note that while we allow [G] to be non-abelian for [n > 1], later results will need to assume that [G] is abelian. *)FixpointEilenbergMacLane@{u v | u <= v} (G : Group@{u}) (n : nat) : pType@{v}
:= match n with
| 0 => G
| 1 => pClassifyingSpace@{u v} G
| m.+1 => pTr m.+1 (psusp (EilenbergMacLane G m))
end.Notation"'K(' G , n )" := (EilenbergMacLane G n).SectionEilenbergMacLane.Context `{Univalence}.
H: Univalence G: Group n: nat
IsTrunc n K( G, n)
H: Univalence G: Group n: nat
IsTrunc n K( G, n)
destruct n as [|[]]; exact _.Defined.(** This is subsumed by the next result, but Coq doesn't always find the next result when it should. *)
H: Univalence G: Group n: nat
IsConnected (Tr n) K( G, n.+1)
H: Univalence G: Group n: nat
IsConnected (Tr n) K( G, n.+1)
induction n; exact _.Defined.
H: Univalence G: Group n: nat
IsConnected (Tr n.-1) K( G, n)
H: Univalence G: Group n: nat
IsConnected (Tr n.-1) K( G, n)
H: Univalence G: Group
IsConnected (Tr 0%nat.-1) K( G, 0)
H: Univalence G: Group n: nat
IsConnected (Tr n.+1%nat.-1) K( G, n.+1)
H: Univalence G: Group n: nat
IsConnected (Tr n.+1%nat.-1) K( G, n.+1)
apply isconnected_em.Defined.
H: Univalence G: Group n: nat
IsConnected (Tr 0%nat) K( G, n.+1)
H: Univalence G: Group n: nat
IsConnected (Tr 0%nat) K( G, n.+1)
rapply (is0connected_isconnected n.-2).Defined.LocalOpen Scope trunc_scope.(** This is a variant of [pequiv_ptr_loop_psusp] from pSusp.v. All we are really using is that [n.+2 <= n +2+ n], but because of the use of [isconnmap_pred_add], the proof is a bit more specific to this case. *)
exact iscohhspace_loops.Defined.(** If [G] and [G'] are isomorphic, then [K(G,n)] and [K(G',n)] are equivalent. TODO: We should show that [K(-,n)] is a functor, which implies this. *)
H: Univalence G, G': Group n: nat e: G $<~> G'
K( G, n) <~>* K( G', n)
H: Univalence G, G': Group n: nat e: G $<~> G'
K( G, n) <~>* K( G', n)
bydestruct (equiv_path_group e).Defined.(** Every pointed (n-1)-connected n-type is an Eilenberg-Mac Lane space. *)
H: Univalence X: pType n: nat H0: IsConnected (Tr n) X IsTrunc0: IsTrunc n.+1 X
K( Pi n.+1 X, n.+1) <~>* X
H: Univalence X: pType n: nat H0: IsConnected (Tr n) X IsTrunc0: IsTrunc n.+1 X
K( Pi n.+1 X, n.+1) <~>* X
H: Univalence X: pType isC: IsConnected (Tr 0%nat) X isT: IsTrunc 0%nat.+1 X
K( Pi 1 X, 1) <~>* X
H: Univalence n: nat IHn: forallX : pType,
IsConnected (Tr n) X -> IsTrunc n.+1 X -> K( Pi n.+1 X, n.+1) <~>* X X: pType isC: IsConnected (Tr n.+1%nat) X isT: IsTrunc n.+1%nat.+1 X
K( Pi n.+2 X, n.+2) <~>* X
H: Univalence n: nat IHn: forallX : pType,
IsConnected (Tr n) X -> IsTrunc n.+1 X -> K( Pi n.+1 X, n.+1) <~>* X X: pType isC: IsConnected (Tr n.+1%nat) X isT: IsTrunc n.+1%nat.+1 X
K( Pi n.+2 X, n.+2) <~>* X
(* The equivalence will be the composite<< K( (Pi n.+2 X) n.+2) <~>* K( (Pi n.+1 (loops X)), n.+2) = pTr n.+2 (psusp K( (Pi n.+1 (loops X)), n.+1)) [by definition] <~>* pTr n.+2 (psusp (loops X)) <~>* pTr n.+2 X <~>* X>> and we'll work from right to left.*)
H: Univalence n: nat IHn: forallX : pType,
IsConnected (Tr n) X -> IsTrunc n.+1 X -> K( Pi n.+1 X, n.+1) <~>* X X: pType isC: IsConnected (Tr n.+1%nat) X isT: IsTrunc n.+1%nat.+1 X
K( Pi n.+2 X, n.+2) <~>* pTr n.+2 X
H: Univalence n: nat IHn: forallX : pType,
IsConnected (Tr n) X -> IsTrunc n.+1 X -> K( Pi n.+1 X, n.+1) <~>* X X: pType isC: IsConnected (Tr n.+1%nat) X isT: IsTrunc n.+1%nat.+1 X