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 UniverseEquiv PointedCat Yoneda.Require Import Pointed.Require Import Algebra.AbGroups.AbelianGroup.Require Import Homotopy.Suspension.Require Import Homotopy.ClassifyingSpace.Core.Import ClassifyingSpaceNotation.Require Import Homotopy.HSpace.Coherent.Require Import Homotopy.HomotopyGroup.Require Import Homotopy.Hopf.Require Import Modalities.Descent.Require Import Truncations.Core Truncations.Connectedness Truncations.SeparatedTrunc.(** * Eilenberg-Mac Lane spaces *)LocalOpen Scope pointed_scope.LocalOpen Scope nat_scope.LocalOpen Scope mc_mult_scope.(** ** Maps from connected types to pointed types *)(** Before specializing to Eilenberg-Mac Lane spaces, we show that when [X] is [n]-connected and [Y] is [n.+1]-truncated, [fmap (Pi n.+1)] is an equivalence. The case [n=1] is [isequiv_fmap_pi1_pmap], and the inductive step follows from [isequiv_fmap_loops_pmap]. *)(** Part of the inductive step is factored out here. *)
H: Univalence n: nat X, Y: pType el: IsEquiv (fmap loops) e: IsEquiv (fmap (Pi n.+1)) a:= groupiso_pi_loops n X: Pi n.+2 X $<~> Pi n.+1 (loops X)
IsEquiv (fmap (Pi n.+2))
H: Univalence n: nat X, Y: pType el: IsEquiv (fmap loops) e: IsEquiv (fmap (Pi n.+1)) a:= groupiso_pi_loops n X: Pi n.+2 X $<~> Pi n.+1 (loops X) b:= groupiso_pi_loops n Y: Pi n.+2 Y $<~> Pi n.+1 (loops Y)
IsEquiv (fmap (Pi n.+2))
H: Univalence n: nat X, Y: pType el: IsEquiv (fmap loops) e: IsEquiv (fmap (Pi n.+1)) a:= groupiso_pi_loops n X: Pi n.+2 X $<~> Pi n.+1 (loops X) b:= groupiso_pi_loops n Y: Pi n.+2 Y $<~> Pi n.+1 (loops Y) k:= equiv_precompose_cat_equiv a oE equiv_postcompose_cat_equiv b^-1$: (Pi n.+1 (loops X) $-> Pi n.+1 (loops Y)) <~> (Pi n.+2 X $-> Pi n.+2 Y)
IsEquiv (fmap (Pi n.+2))
H: Univalence n: nat X, Y: pType el: IsEquiv (fmap loops) e: IsEquiv (fmap (Pi n.+1)) a:= groupiso_pi_loops n X: Pi n.+2 X $<~> Pi n.+1 (loops X) b:= groupiso_pi_loops n Y: Pi n.+2 Y $<~> Pi n.+1 (loops Y) k:= equiv_precompose_cat_equiv a oE equiv_postcompose_cat_equiv b^-1$: (Pi n.+1 (loops X) $-> Pi n.+1 (loops Y)) <~> (Pi n.+2 X $-> Pi n.+2 Y)
(funx : X $-> Y => k (fmap (Pi1 o iterated_loops n) (fmap loops x))) ==
fmap (Pi n.+2)
H: Univalence n: nat X, Y: pType el: IsEquiv (fmap loops) e: IsEquiv (fmap (Pi n.+1)) a:= groupiso_pi_loops n X: Pi n.+2 X $<~> Pi n.+1 (loops X) b:= groupiso_pi_loops n Y: Pi n.+2 Y $<~> Pi n.+1 (loops Y) k:= equiv_precompose_cat_equiv a oE equiv_postcompose_cat_equiv b^-1$: (Pi n.+1 (loops X) $-> Pi n.+1 (loops Y)) <~> (Pi n.+2 X $-> Pi n.+2 Y) f: X $-> Y
k (fmap (Pi1 o iterated_loops n) (fmap loops f)) = fmap (Pi n.+2) f
H: Univalence n: nat X, Y: pType el: IsEquiv (fmap loops) e: IsEquiv (fmap (Pi n.+1)) a:= groupiso_pi_loops n X: Pi n.+2 X $<~> Pi n.+1 (loops X) b:= groupiso_pi_loops n Y: Pi n.+2 Y $<~> Pi n.+1 (loops Y) k:= equiv_precompose_cat_equiv a oE equiv_postcompose_cat_equiv b^-1$: (Pi n.+1 (loops X) $-> Pi n.+1 (loops Y)) <~> (Pi n.+2 X $-> Pi n.+2 Y) f: X $-> Y
k (fmap (Pi1 o iterated_loops n) (fmap loops f)) == fmap (Pi n.+2) f
H: Univalence n: nat X, Y: pType el: IsEquiv (fmap loops) e: IsEquiv (fmap (Pi n.+1)) a:= groupiso_pi_loops n X: Pi n.+2 X $<~> Pi n.+1 (loops X) b:= groupiso_pi_loops n Y: Pi n.+2 Y $<~> Pi n.+1 (loops Y) k:= equiv_precompose_cat_equiv a oE equiv_postcompose_cat_equiv b^-1$: (Pi n.+1 (loops X) $-> Pi n.+1 (loops Y)) <~> (Pi n.+2 X $-> Pi n.+2 Y) f: X $-> Y x: Pi n.+2 X
k (fmap (Pi1 o iterated_loops n) (fmap loops f)) x = fmap (Pi n.+2) f x
exact (moveR_equiv_V (f:=b) _ _ (fmap_pi_loops n.+1 f x)^).Defined.(** For [X] [n]-connected and [Y] [n.+1]-truncated, [fmap (Pi n.+1)] is an equivalence from the pointed maps [X ->* Y] to the group homomorphisms [Pi n.+1 X $-> Pi n.+1 Y]. Neither connectivity of [Y] nor truncatedness of [X] is needed. The induction is on [n]: the successor step is [isequiv_fmap_loops_pmap], which applies since [n.+2 <= n +2+ n], and the base case is [isequiv_fmap_pi1_pmap]. *)
H: Univalence n: nat X, Y: pType cX: IsConnected (Tr n) X tY: IsTrunc n.+1 Y
IsEquiv (fmap (Pi n.+1))
H: Univalence n: nat X, Y: pType cX: IsConnected (Tr n) X tY: IsTrunc n.+1 Y
IsEquiv (fmap (Pi n.+1))
H: Univalence X, Y: pType cX: IsConnected (Tr 0%nat) X tY: IsTrunc 0%nat.+1 Y
rapply IHn.Defined.Definitionequiv_fmap_pi_pmap `{Univalence} (n : nat) (X Y : pType)
`{IsConnected n X} `{IsTrunc n.+1 Y}
: (X ->* Y) <~> (Pi n.+1 X $-> Pi n.+1 Y)
:= Build_Equiv _ _ _ (isequiv_fmap_pi_pmap n X Y).(** Pointed maps from an [n]-connected type to an [n.+1]-truncated type which agree on [Pi n.+1] are equal. *)
H: Univalence n: nat X, Y: pType H0: IsConnected (Tr n) X IsTrunc0: IsTrunc n.+1 Y phi, psi: X ->* Y h: fmap (Pi n.+1) phi == fmap (Pi n.+1) psi
phi = psi
H: Univalence n: nat X, Y: pType H0: IsConnected (Tr n) X IsTrunc0: IsTrunc n.+1 Y phi, psi: X ->* Y h: fmap (Pi n.+1) phi == fmap (Pi n.+1) psi
phi = psi
H: Univalence n: nat X, Y: pType H0: IsConnected (Tr n) X IsTrunc0: IsTrunc n.+1 Y phi, psi: X ->* Y h: fmap (Pi n.+1) phi == fmap (Pi n.+1) psi
fmap (Pi n.+1) phi = fmap (Pi n.+1) psi
exact (equiv_path_grouphomomorphism h).Defined.(** Two [n]-connected [n.+1]-truncated pointed types with isomorphic [Pi n.+1] are pointed equivalent. *)Definitionpequiv_pi_connected_truncated `{Univalence} (n : nat) {X Y : pType}
`{IsConnected n X} `{IsTrunc n.+1 X} `{IsConnected n Y} `{IsTrunc n.+1 Y}
(phi : GroupIsomorphism (Pi n.+1 X) (Pi n.+1 Y))
: X <~>* Y
:= cate_reflect_fmap (Pi n.+1) (x:=X) (y:=Y) phi.(** The equivalence induces the given isomorphism on [Pi n.+1]. *)Definitionfmap_pi_pequiv_pi_connected_truncated `{Univalence} (n : nat) {X Y : pType}
`{IsConnected n X} `{IsTrunc n.+1 X} `{IsConnected n Y} `{IsTrunc n.+1 Y}
(phi : GroupIsomorphism (Pi n.+1 X) (Pi n.+1 Y))
: fmap (Pi n.+1) (pequiv_pi_connected_truncated n phi) == phi
:= fmap_cate_reflect_fmap (Pi n.+1) (x:=X) (y:=Y) phi.(** ** Definition and properties of Eilenberg-Mac Lane spaces *)(** 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} 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.(** [K(-, n)] as a functor from groups to pointed types. [fmap B] and the WildCat functoriality of [psusp] and [pTr] constrain the two groups to a single universe. *)DefinitionK' (n : nat) (G : Group) : pType := K(G, n).
H: Univalence n: nat
Is0Functor (K' n)
H: Univalence n: nat
Is0Functor (K' n)
H: Univalence n: nat
forallab : Group, (a $-> b) -> K' n a $-> K' n b
H: Univalence n: nat G, G': Group f: G $-> G'
K' n G $-> K' n G'
H: Univalence G, G': Group f: G $-> G'
K' 0 G $-> K' 0 G'
H: Univalence n: nat G, G': Group f: G $-> G' IHn: K' n G $-> K' n G'
K' n.+1 G $-> K' n.+1 G'
H: Univalence G, G': Group f: G $-> G'
K' 0 G $-> K' 0 G'
exact f.
H: Univalence n: nat G, G': Group f: G $-> G' IHn: K' n G $-> K' n G'
K' n.+1 G $-> K' n.+1 G'
H: Univalence G, G': Group f: G $-> G' IHn: K' 0 G $-> K' 0 G'
K' 1 G $-> K' 1 G'
H: Univalence m: nat G, G': Group f: G $-> G' IHn: K' m.+1 G $-> K' m.+1 G'
K' m.+2 G $-> K' m.+2 G'
H: Univalence G, G': Group f: G $-> G' IHn: K' 0 G $-> K' 0 G'
K' 1 G $-> K' 1 G'
exact (fmap B f).
H: Univalence m: nat G, G': Group f: G $-> G' IHn: K' m.+1 G $-> K' m.+1 G'
K' m.+2 G $-> K' m.+2 G'
exact (fmap (pTr m.+2) (fmap psusp IHn)).Defined.
H: Univalence n: nat
Is1Functor (K' n)
H: Univalence n: nat
Is1Functor (K' n)
H: Univalence n: nat
forall (ab : Group) (fg : a $-> b),
f $== g -> fmap (K' n) f $== fmap (K' n) g
H: Univalence n: nat
foralla : Group, fmap (K' n) (Id a) $== Id (K' n a)
H: Univalence n: nat
forall (abc : Group) (f : a $-> b) (g : b $-> c),
fmap (K' n) (g $o f) $== fmap (K' n) g $o fmap (K' n) f
H: Univalence n: nat
forall (ab : Group) (fg : a $-> b),
f $== g -> fmap (K' n) f $== fmap (K' n) g
H: Univalence n: nat G, G': Group f, g: G $-> G' p: f $== g
fmap (K' n) f $== fmap (K' n) g
exact (phomotopy_path (ap (fmap (K' n))
(equiv_path_grouphomomorphism p))).
H: Univalence n: nat
foralla : Group, fmap (K' n) (Id a) $== Id (K' n a)
H: Univalence n: nat G: Group
fmap (K' n) (Id G) $== Id (K' n G)
H: Univalence G: Group
fmap (K' 0) (Id G) $== Id (K' 0 G)
H: Univalence G: Group IH: fmap (K' 0) (Id G) $== Id (K' 0 G)
fmap (K' 1) (Id G) $== Id (K' 1 G)
H: Univalence m: nat G: Group IH: fmap (K' m.+1) (Id G) $== Id (K' m.+1 G)
fmap (K' m.+2) (Id G) $== Id (K' m.+2 G)
H: Univalence G: Group
fmap (K' 0) (Id G) $== Id (K' 0 G)
H: Univalence G: Group
fmap (K' 0) (Id G) == Id (K' 0 G)
reflexivity.
H: Univalence G: Group IH: fmap (K' 0) (Id G) $== Id (K' 0 G)
fmap (K' 1) (Id G) $== Id (K' 1 G)
exact (fmap_id B G).
H: Univalence m: nat G: Group IH: fmap (K' m.+1) (Id G) $== Id (K' m.+1 G)
fmap (K' m.+2) (Id G) $== Id (K' m.+2 G)
H: Univalence m: nat G: Group IH: fmap (K' m.+1) (Id G) $== Id (K' m.+1 G)
fmap (pTr m.+2) (fmap psusp (fmap (K' m.+1) (Id G))) ==* Id (K' m.+2 G)
H: Univalence m: nat G: Group IH: fmap (K' m.+1) (Id G) $== Id (K' m.+1 G)
fmap (pTr m.+2) (fmap psusp (fmap (K' m.+1) (Id G))) ==*
fmap (pTr m.+2) (Id (psusp (K' m.+1 G)))
H: Univalence m: nat G: Group IH: fmap (K' m.+1) (Id G) $== Id (K' m.+1 G)
fmap psusp (fmap (K' m.+1) (Id G)) $== Id (psusp (K' m.+1 G))
H: Univalence m: nat G: Group IH: fmap (K' m.+1) (Id G) $== Id (K' m.+1 G)
fmap psusp (fmap (K' m.+1) (Id G)) ==* fmap psusp (Id (K' m.+1 G))
H: Univalence m: nat G: Group IH: fmap (K' m.+1) (Id G) $== Id (K' m.+1 G)
fmap (K' m.+1) (Id G) $== Id (K' m.+1 G)
exact IH.
H: Univalence n: nat
forall (abc : Group) (f : a $-> b) (g : b $-> c),
fmap (K' n) (g $o f) $== fmap (K' n) g $o fmap (K' n) f
H: Univalence n: nat G, G', G'': Group f: G $-> G' g: G' $-> G''
fmap (K' n) (g $o f) $== fmap (K' n) g $o fmap (K' n) f
H: Univalence G, G', G'': Group f: G $-> G' g: G' $-> G''
fmap (K' 0) (g $o f) $== fmap (K' 0) g $o fmap (K' 0) f
H: Univalence G, G', G'': Group f: G $-> G' g: G' $-> G'' IH: fmap (K' 0) (g $o f) $== fmap (K' 0) g $o fmap (K' 0) f
fmap (K' 1) (g $o f) $== fmap (K' 1) g $o fmap (K' 1) f
H: Univalence m: nat G, G', G'': Group f: G $-> G' g: G' $-> G'' IH: fmap (K' m.+1) (g $o f) $== fmap (K' m.+1) g $o fmap (K' m.+1) f
fmap (K' m.+2) (g $o f) $== fmap (K' m.+2) g $o fmap (K' m.+2) f
H: Univalence G, G', G'': Group f: G $-> G' g: G' $-> G''
fmap (K' 0) (g $o f) $== fmap (K' 0) g $o fmap (K' 0) f
H: Univalence G, G', G'': Group f: G $-> G' g: G' $-> G''
fmap (K' 0) (g $o f) == fmap (K' 0) g $o fmap (K' 0) f
reflexivity.
H: Univalence G, G', G'': Group f: G $-> G' g: G' $-> G'' IH: fmap (K' 0) (g $o f) $== fmap (K' 0) g $o fmap (K' 0) f
fmap (K' 1) (g $o f) $== fmap (K' 1) g $o fmap (K' 1) f
exact (fmap_comp B f g).
H: Univalence m: nat G, G', G'': Group f: G $-> G' g: G' $-> G'' IH: fmap (K' m.+1) (g $o f) $== fmap (K' m.+1) g $o fmap (K' m.+1) f
fmap (K' m.+2) (g $o f) $== fmap (K' m.+2) g $o fmap (K' m.+2) f
H: Univalence m: nat G, G', G'': Group f: G $-> G' g: G' $-> G'' IH: fmap (K' m.+1) (g $o f) $== fmap (K' m.+1) g $o fmap (K' m.+1) f
H: Univalence m: nat G, G', G'': Group f: G $-> G' g: G' $-> G'' IH: fmap (K' m.+1) (g $o f) $== fmap (K' m.+1) g $o fmap (K' m.+1) f
fmap (K' m.+1) (g $o f) $== fmap (K' m.+1) g $o fmap (K' m.+1) f
exact IH.Defined.(** TODO: Many results in this file, such as [pi_em_fmap] and [em_fmap_loops_natural], have a large number of universe variables. These can be reduced by ending various definitions with Qed, but it would be better to fix the source of the explosion of universe variables. *)(** At positive levels, [pequiv_loops_em_em] is the canonical comparison map: the loop-suspension unit followed by [loops] of the truncation map. This presentation makes its naturality transparent, without reference to the Hopf-construction input used to show that it is an equivalence. *)
all: exact (pmap_prewhisker _ (ptr_loops_commutes _ _)).Defined.(** [fmap (K' n)] commutes with the loop-space identifications, so it is a map of spectra. *)
fmap loops
(ptr
o* fmap psusp
(match
n as n0
return ((K' n0 G $-> K' n0 G') -> K' n0.+1 G $-> K' n0.+1 G')
with
| 0%nat => fun_ : K' 0 G $-> K' 0 G' => fmap B f
| n0.+1%nat =>
funIHn : K' n0.+1 G $-> K' n0.+1 G' =>
fmap (pTr n0.+2) (fmap psusp IHn)
end
((fix F (n0 : nat) : K' n0 G $-> K' n0 G' :=
match n0 as n1 return (K' n1 G $-> K' n1 G') with
| 0%nat => f
| n1.+1%nat =>
match
n1 as n2
return
((K' n2 G $-> K' n2 G') -> K' n2.+1 G $-> K' n2.+1 G')
with
| 0%nat => fun_ : K' 0 G $-> K' 0 G' => fmap B f
| n2.+1%nat =>
funIHn : K' n2.+1 G $-> K' n2.+1 G' =>
fmap (pTr n2.+2) (fmap psusp IHn)
end (F n1)
end)
n)))
o* loop_susp_unit K( G, n.+1) ==*
fmap loops ptr o* loop_susp_unit K( G', n.+1) o* fmap (K' n.+1) f
fmap loops ptr $o
fmap loops
(fmap psusp
(match
n as n0 return ((K' n0 G $-> K' n0 G') -> K' n0.+1 G $-> K' n0.+1 G')
with
| 0%nat => fun_ : K' 0 G $-> K' 0 G' => fmap B f
| n0.+1%nat =>
funIHn : K' n0.+1 G $-> K' n0.+1 G' =>
fmap (pTr n0.+2) (fmap psusp IHn)
end
((fix F (n0 : nat) : K' n0 G $-> K' n0 G' :=
match n0 as n1 return (K' n1 G $-> K' n1 G') with
| 0%nat => f
| n1.+1%nat =>
match
n1 as n2
return
((K' n2 G $-> K' n2 G') -> K' n2.+1 G $-> K' n2.+1 G')
with
| 0%nat => fun_ : K' 0 G $-> K' 0 G' => fmap B f
| n2.+1%nat =>
funIHn : K' n2.+1 G $-> K' n2.+1 G' =>
fmap (pTr n2.+2) (fmap psusp IHn)
end (F n1)
end)
n)))
o* loop_susp_unit K( G, n.+1) ==*
fmap loops ptr o* loop_susp_unit K( G', n.+1) o* fmap (K' n.+1) f
fmap loops ptr
o* (fmap loops
(fmap psusp
(match
n as n0
return ((K' n0 G $-> K' n0 G') -> K' n0.+1 G $-> K' n0.+1 G')
with
| 0%nat => fun_ : K' 0 G $-> K' 0 G' => fmap B f
| n0.+1%nat =>
funIHn : K' n0.+1 G $-> K' n0.+1 G' =>
fmap (pTr n0.+2) (fmap psusp IHn)
end
((fix F (n0 : nat) : K' n0 G $-> K' n0 G' :=
match n0 as n1 return (K' n1 G $-> K' n1 G') with
| 0%nat => f
| n1.+1%nat =>
match
n1 as n2
return
((K' n2 G $-> K' n2 G') -> K' n2.+1 G $-> K' n2.+1 G')
with
| 0%nat => fun_ : K' 0 G $-> K' 0 G' => fmap B f
| n2.+1%nat =>
funIHn : K' n2.+1 G $-> K' n2.+1 G' =>
fmap (pTr n2.+2) (fmap psusp IHn)
end (F n1)
end)
n)))
o* loop_susp_unit K( G, n.+1)) ==*
fmap loops ptr o* loop_susp_unit K( G', n.+1) o* fmap (K' n.+1) f
fmap loops ptr
o* (loop_susp_unit
match n with
| 0%nat => pClassifyingSpace G'
| _.+1%nat =>
pTr n.+1
(psusp
((fix EilenbergMacLane (G0 : Group) (n1 : nat) {struct n1} :
pType :=
match n1 with
| 0%nat => G0
| 1%nat => pClassifyingSpace G0
| (_.+1as m).+1%nat =>
pTr m.+1 (psusp (EilenbergMacLane G0 m))
end)
G' n))
end
o* match
n as n0
return ((K' n0 G $-> K' n0 G') -> K' n0.+1 G $-> K' n0.+1 G')
with
| 0%nat => fun_ : K' 0 G $-> K' 0 G' => fmap B f
| n0.+1%nat =>
funIHn : K' n0.+1 G $-> K' n0.+1 G' =>
fmap (pTr n0.+2) (fmap psusp IHn)
end
((fix F (n0 : nat) : K' n0 G $-> K' n0 G' :=
match n0 as n1 return (K' n1 G $-> K' n1 G') with
| 0%nat => f
| n1.+1%nat =>
match
n1 as n2
return
((K' n2 G $-> K' n2 G') -> K' n2.+1 G $-> K' n2.+1 G')
with
| 0%nat => fun_ : K' 0 G $-> K' 0 G' => fmap B f
| n2.+1%nat =>
funIHn : K' n2.+1 G $-> K' n2.+1 G' =>
fmap (pTr n2.+2) (fmap psusp IHn)
end (F n1)
end)
n)) ==*
fmap loops ptr o* loop_susp_unit K( G', n.+1) o* fmap (K' n.+1) f
exact (pmap_compose_assoc _ _ _)^*.Defined.(** [equiv_g_pi_n_em] at level [n.+1] unfolds to the level-[n] map conjugated by [groupiso_pi_loops] and [pequiv_loops_em_em]. *)Local Definitionequiv_g_pi_n_em_succ (G : AbGroup) (n : nat) (x : G)
: equiv_g_pi_n_em G n.+1 x
= grp_iso_inverse (groupiso_pi_loops _ _)
(groupiso_pi_functor _ (pequiv_loops_em_em G n.+1)
(equiv_g_pi_n_em G n x))
:= idpath.(** The action of [fmap (K' n.+1) f] on [Pi n.+1] agrees with [f] under the identifications [equiv_g_pi_n_em]. *)
H: Univalence G, G': AbGroup f: GroupHomomorphism G G' n: nat IHn: (funx : G => fmap (Pi n.+1) (fmap (K' n.+1) f) (equiv_g_pi_n_em G n x)) ==
(funx : G => equiv_g_pi_n_em G' n (f x)) g: G
fmap (Pi n.+2) (fmap (K' n.+2) f)
(grp_iso_inverse (groupiso_pi_loops n K( G, n.+2))
(groupiso_pi_functor n (pequiv_loops_em_em G n.+1)
(equiv_g_pi_n_em G n g))) =
equiv_g_pi_n_em G' n.+1 (f g)
H: Univalence G, G': AbGroup f: GroupHomomorphism G G' n: nat IHn: (funx : G => fmap (Pi n.+1) (fmap (K' n.+1) f) (equiv_g_pi_n_em G n x)) ==
(funx : G => equiv_g_pi_n_em G' n (f x)) g: G
fmap (Pi n.+2) (fmap (K' n.+2) f)
(grp_iso_inverse (groupiso_pi_loops n K( G, n.+2))
(groupiso_pi_functor n (pequiv_loops_em_em G n.+1)
(equiv_g_pi_n_em G n g))) =
grp_iso_inverse (groupiso_pi_loops n K( G', n.+2))
(groupiso_pi_functor n (pequiv_loops_em_em G' n.+1)
(equiv_g_pi_n_em G' n (f g)))
H: Univalence G, G': AbGroup f: GroupHomomorphism G G' n: nat IHn: (funx : G => fmap (Pi n.+1) (fmap (K' n.+1) f) (equiv_g_pi_n_em G n x)) ==
(funx : G => equiv_g_pi_n_em G' n (f x)) g: G
groupiso_pi_loops n K( G', n.+2)
(fmap (Pi n.+2) (fmap (K' n.+2) f)
(grp_iso_inverse (groupiso_pi_loops n K( G, n.+2))
(groupiso_pi_functor n (pequiv_loops_em_em G n.+1)
(equiv_g_pi_n_em G n g)))) =
groupiso_pi_loops n K( G', n.+2)
(grp_iso_inverse (groupiso_pi_loops n K( G', n.+2))
(groupiso_pi_functor n (pequiv_loops_em_em G' n.+1)
(equiv_g_pi_n_em G' n (f g))))
H: Univalence G, G': AbGroup f: GroupHomomorphism G G' n: nat IHn: (funx : G => fmap (Pi n.+1) (fmap (K' n.+1) f) (equiv_g_pi_n_em G n x)) ==
(funx : G => equiv_g_pi_n_em G' n (f x)) g: G
groupiso_pi_loops n K( G', n.+2)
(fmap (Pi n.+2) (fmap (K' n.+2) f)
(grp_iso_inverse (groupiso_pi_loops n K( G, n.+2))
(groupiso_pi_functor n (pequiv_loops_em_em G n.+1)
(equiv_g_pi_n_em G n g)))) =
groupiso_pi_functor n (pequiv_loops_em_em G' n.+1)
(equiv_g_pi_n_em G' n (f g))
H: Univalence G, G': AbGroup f: GroupHomomorphism G G' n: nat IHn: (funx : G => fmap (Pi n.+1) (fmap (K' n.+1) f) (equiv_g_pi_n_em G n x)) ==
(funx : G => equiv_g_pi_n_em G' n (f x)) g: G
(fmap (pPi n.+1 o loops) (fmap (K' n.+2) f) o* pi_loops n.+1 (K' n.+2 G))
(grp_iso_inverse (groupiso_pi_loops n K( G, n.+2))
(groupiso_pi_functor n (pequiv_loops_em_em G n.+1)
(equiv_g_pi_n_em G n g))) =
groupiso_pi_functor n (pequiv_loops_em_em G' n.+1)
(equiv_g_pi_n_em G' n (f g))
H: Univalence G, G': AbGroup f: GroupHomomorphism G G' n: nat IHn: (funx : G => fmap (Pi n.+1) (fmap (K' n.+1) f) (equiv_g_pi_n_em G n x)) ==
(funx : G => equiv_g_pi_n_em G' n (f x)) g: G
fmap (pPi n.+1 o loops) (fmap (K' n.+2) f)
(groupiso_pi_functor n (pequiv_loops_em_em G n.+1) (equiv_g_pi_n_em G n g)) =
groupiso_pi_functor n (pequiv_loops_em_em G' n.+1)
(equiv_g_pi_n_em G' n (f g))
H: Univalence G, G': AbGroup f: GroupHomomorphism G G' n: nat IHn: (funx : G => fmap (Pi n.+1) (fmap (K' n.+1) f) (equiv_g_pi_n_em G n x)) ==
(funx : G => equiv_g_pi_n_em G' n (f x)) g: G
fmap (pPi n.+1) (fmap loops (fmap (K' n.+2) f) $o pequiv_loops_em_em G n.+1)
(equiv_g_pi_n_em G n g) =
groupiso_pi_functor n (pequiv_loops_em_em G' n.+1)
(equiv_g_pi_n_em G' n (f g))
H: Univalence G, G': AbGroup f: GroupHomomorphism G G' n: nat IHn: (funx : G => fmap (Pi n.+1) (fmap (K' n.+1) f) (equiv_g_pi_n_em G n x)) ==
(funx : G => equiv_g_pi_n_em G' n (f x)) g: G
fmap (pPi n.+1) (pequiv_loops_em_em G' n.+1 o* fmap (K' n.+1) f)
(equiv_g_pi_n_em G n g) =
groupiso_pi_functor n (pequiv_loops_em_em G' n.+1)
(equiv_g_pi_n_em G' n (f g))
H: Univalence G, G': AbGroup f: GroupHomomorphism G G' n: nat IHn: (funx : G => fmap (Pi n.+1) (fmap (K' n.+1) f) (equiv_g_pi_n_em G n x)) ==
(funx : G => equiv_g_pi_n_em G' n (f x)) g: G
(fmap (pPi n.+1) (pequiv_loops_em_em G' n.+1) $o
fmap (pPi n.+1) (fmap (K' n.+1) f)) (equiv_g_pi_n_em G n g) =
groupiso_pi_functor n (pequiv_loops_em_em G' n.+1)
(equiv_g_pi_n_em G' n (f g))
exact (ap _ (IHn g)).Defined.(** Equivalently, the composite is conjugation by the identifications [equiv_g_pi_n_em]. *)Definitionpi_em_fmap' {GG' : AbGroup}
(f : GroupHomomorphism G G') (n : nat)
: fmap (Pi n.+1) (fmap (K' n.+1) f)
== equiv_g_pi_n_em G' n o f o (equiv_g_pi_n_em G n)^-1
:= cate_moveL_eV (A:=Group) _ _ (equiv_g_pi_n_em G' n $o f) (pi_em_fmap f n).(** Eilenberg-Mac Lane spaces of a contractible group are contractible. *)
H: Univalence G: Group Contr0: Contr G n: nat
Contr K( G, n)
H: Univalence G: Group Contr0: Contr G n: nat
Contr K( G, n)
H: Univalence G: Group Contr0: Contr G
Contr K( G, 0)
H: Univalence G: Group Contr0: Contr G IHn: Contr K( G, 0)
Contr K( G, 1)
H: Univalence G: Group Contr0: Contr G n: nat IHn: Contr K( G, n.+1)
Contr K( G, n.+2)
H: Univalence G: Group Contr0: Contr G
Contr K( G, 0)
exact _.
H: Univalence G: Group Contr0: Contr G IHn: Contr K( G, 0)
Contr K( G, 1)
exact _.
H: Univalence G: Group Contr0: Contr G n: nat IHn: Contr K( G, n.+1)
Contr K( G, n.+2)
rapply contr_O_contr.Defined.(** [K(-,n)] is a pointed functor. *)
H: Univalence n: nat
IsPointedFunctor (K' n)
H: Univalence n: nat
IsPointedFunctor (K' n)
H: Univalence n: nat
K' n grp_trivial $<~> pUnit
H: Univalence n: nat
K' n grp_trivial ->* pUnit
H: Univalence n: nat
IsEquiv ?pointed_equiv_fun
H: Univalence n: nat
IsEquiv pconst
rapply isequiv_contr_contr.Defined.(** [fmap (K' n.+1) f] of a surjective homomorphism is an [n]-connected map. Both surjectivity of the map and of its [ap]s reduce to the previous level through the loop-space identifications. *)
H: Univalence G, G': AbGroup f: GroupHomomorphism G G' IsSurjection0: IsConnMap (Tr (-1)) f n: nat
IsConnMap (Tr n) (fmap (K' n.+1) f)
H: Univalence G, G': AbGroup f: GroupHomomorphism G G' IsSurjection0: IsConnMap (Tr (-1)) f n: nat
IsConnMap (Tr n) (fmap (K' n.+1) f)
H: Univalence G, G': AbGroup f: GroupHomomorphism G G' IsSurjection0: IsConnMap (Tr (-1)) f
exact (isconnected_equiv' n _
(equiv_functor_sigma_id (funp => equiv_ap e2 _ _))^-1%equiv
(c _)).Defined.(** [fmap (K' n.+1)] is an equivalence from group homomorphisms to pointed maps. Since [K(G, n.+1)] is [n]-connected and [K(G', n.+1)] is [n.+1]-truncated, [fmap (Pi n.+1)] is an equivalence from the pointed maps to the group homomorphisms [Pi n.+1 K(G, n.+1) $-> Pi n.+1 K(G', n.+1)], and by [pi_em_fmap'] the composite with [fmap (K' n.+1)] is conjugation by the identifications [equiv_g_pi_n_em], which is also an equivalence. In particular, pointed maps between Eilenberg-Mac Lane spaces of the same level are determined by their effect on homotopy groups. *)
apply pi_em_fmap'.Defined.(** The equivalence between group homomorphisms and pointed maps of Eilenberg-Mac Lane spaces. *)Definitionequiv_em_fmap (GG' : AbGroup) (n : nat)
: GroupHomomorphism G G' <~> (K(G, n.+1) ->* K(G', n.+1))
:= Build_Equiv _ _ _ (isequiv_em_fmap G G' n).(** The canonical identification of [Pi n.+1 K(Pi n.+1 X, n.+1)] with [Pi n.+1 X]. For [n = 0] this is [grp_iso_g_pi1_bg], and for positive [n] it is [equiv_g_pi_n_em] applied to the abelian group [Pi n.+1 X]. *)
equiv_O_functor_to_O_O_leq (Tr n.+2%nat.+1) (Tr n.+4)
(psusp
((fix EilenbergMacLane (G : Group) (n0 : nat) {struct n0} : pType :=
match n0 with
| 0 => G
| 1 => pClassifyingSpace G
| (_.+1as m).+1 => pTr m.+1 (psusp (EilenbergMacLane G m))
end)
B n.+2))
pt =
pt
reflexivity.Defined.(** The canonical equivalence between the [n.+4]- and [n.+3]-truncations. *)Local Definitionpequiv_ptr_psusp_em
: pTr n.+4 (psusp K(B, n.+2)) <~>* K(B, n.+3)
:= pequiv_ptr_ptr_psusp_em^-1* o*E pequiv_ptr.(** [pequiv_ptr_psusp_em] commutes with the truncation unit [ptr]. *)
apply ptr_natural.Qed.(** Pointed maps [K(B,n.+3) ->* K(A,n.+4)] are equivalent to pointed maps [K(B,n.+2) ->* K(A,n.+3)]. This is an instance of the stabilization theorem, Buchholtz-van Doorn-Rijke, Theorem 6.7; as there, it follows from the truncated suspension-loops adjunction, with the Freudenthal input carried by [pequiv_loops_em_em]. *)Definitionequiv_deloop_em_pmap
: (K(B, n.+3) ->* K(A, n.+4)) <~> (K(B, n.+2) ->* K(A, n.+3))
:= pequiv_pequiv_postcompose (pequiv_loops_em_em A n.+3)^-1*
oE loop_susp_adjoint K(B, n.+2) K(A, n.+4)
oE pequiv_ptr_rec
oE pequiv_pequiv_precompose pequiv_ptr_psusp_em.(** [equiv_deloop_em_pmap] as looping conjugated by the loop identifications. *)