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 HSpace Suspension ExactSequence HomotopyGroup.Require Import WildCat.Core WildCat.UniverseWildCat.Equiv Modalities.ReflectiveSubuniverse Modalities.Descent.Require Import HSet Spaces.Nat.Core.Require Import Homotopy.Join Colimits.Pushout.LocalOpen Scope pointed_scope.LocalOpen Scope trunc_scope.LocalOpen Scope mc_mult_scope.(** * The Hopf construction *)(** We define the Hopf construction associated to a left-invertible H-space, and use it to prove that H-spaces satisfy a strengthened version of Freudenthal's theorem (see [freudenthal_hspace] below). *)(** The Hopf construction associated to a left-invertible H-space (Definition 8.5.6 in the HoTT book). *)
H: Univalence X: pType H0: IsHSpace X H1: foralla : X, IsEquiv (sg_op a)
pFam (psusp X)
H: Univalence X: pType H0: IsHSpace X H1: foralla : X, IsEquiv (sg_op a)
pFam (psusp X)
H: Univalence X: pType H0: IsHSpace X H1: foralla : X, IsEquiv (sg_op a)
psusp X -> Type
H: Univalence X: pType H0: IsHSpace X H1: foralla : X, IsEquiv (sg_op a)
?pfam_pr1 pt
H: Univalence X: pType H0: IsHSpace X H1: foralla : X, IsEquiv (sg_op a)
psusp X -> Type
H: Univalence X: pType H0: IsHSpace X H1: foralla : X, IsEquiv (sg_op a)
X -> X = X
exact (funx => path_universe (x *.)).
H: Univalence X: pType H0: IsHSpace X H1: foralla : X, IsEquiv (sg_op a)
Susp_rec X X (funx : X => path_universe (sg_op x)) pt
H: Univalence X: pType H0: IsHSpace X H1: foralla : X, IsEquiv (sg_op a)
X
exact pt.Defined.(** *** Total space of the Hopf construction *)(** The total space of the Hopf construction on [Susp X] is the join of [X] with itself. Note that we need both left and right multiplication to be equivalences. This is true when [X] is a 0-connected H-space for example. (This is lemma 8.5.7 in the HoTT book). *)
H: Univalence X: pType H0: IsHSpace X H1: foralla : X, IsEquiv (sg_op a) H2: foralla : X, IsEquiv (funy : X => y * a)
psigma (hopf_construction X) <~>* pjoin X X
H: Univalence X: pType H0: IsHSpace X H1: foralla : X, IsEquiv (sg_op a) H2: foralla : X, IsEquiv (funy : X => y * a)
psigma (hopf_construction X) <~>* pjoin X X
H: Univalence X: pType H0: IsHSpace X H1: foralla : X, IsEquiv (sg_op a) H2: foralla : X, IsEquiv (funy : X => y * a)
psigma (hopf_construction X) <~> pjoin X X
H: Univalence X: pType H0: IsHSpace X H1: foralla : X, IsEquiv (sg_op a) H2: foralla : X, IsEquiv (funy : X => y * a)
?f pt = pt
H: Univalence X: pType H0: IsHSpace X H1: foralla : X, IsEquiv (sg_op a) H2: foralla : X, IsEquiv (funy : X => y * a)
psigma (hopf_construction X) <~> pjoin X X
H: Univalence X: pType H0: IsHSpace X H1: foralla : X, IsEquiv (sg_op a) H2: foralla : X, IsEquiv (funy : X => y * a)
Pushout
(functor_sigma (const_tt X) (funa : X => idmap))
(functor_sigma (const_tt X)
(funa : X =>
pod_e
{|
pod_faml := Unit_ind X;
pod_famr := Unit_ind X;
pod_e :=
funx : X =>
{|
equiv_fun := sg_op x;
equiv_isequiv := H1 x
|}
|} a)) <~> pjoin X X
H: Univalence X: pType H0: IsHSpace X H1: foralla : X, IsEquiv (sg_op a) H2: foralla : X, IsEquiv (funy : X => y * a)
{H : X &
pod_faml
{|
pod_faml := Unit_ind X;
pod_famr := Unit_ind X;
pod_e :=
funx : X =>
{|
equiv_fun := sg_op x; equiv_isequiv := H1 x
|}
|} (const_tt X H)} <~> X * X
H: Univalence X: pType H0: IsHSpace X H1: foralla : X, IsEquiv (sg_op a) H2: foralla : X, IsEquiv (funy : X => y * a)
H: Univalence X: pType H0: IsHSpace X H1: foralla : X, IsEquiv (sg_op a) H2: foralla : X, IsEquiv (funy : X => y * a)
?eB o functor_sigma (const_tt X) (funa : X => idmap) ==
fst
o (equiv_sigma_prod0 X X
oE equiv_functor_sigma_id
(funx : X =>
{|
equiv_fun := funy : X => y * x;
equiv_isequiv := H2 x
|}) oE equiv_sigma_symm0 X X
:
{H : X &
pod_faml
{|
pod_faml := Unit_ind X;
pod_famr := Unit_ind X;
pod_e :=
funx : X =>
{|
equiv_fun := sg_op x; equiv_isequiv := H1 x
|}
|} (const_tt X H)} <~> X * X)
H: Univalence X: pType H0: IsHSpace X H1: foralla : X, IsEquiv (sg_op a) H2: foralla : X, IsEquiv (funy : X => y * a)
?eC
o functor_sigma (const_tt X)
(funa : X =>
pod_e
{|
pod_faml := Unit_ind X;
pod_famr := Unit_ind X;
pod_e :=
funx : X =>
{|
equiv_fun := sg_op x;
equiv_isequiv := H1 x
|}
|} a) ==
snd
o (equiv_sigma_prod0 X X
oE equiv_functor_sigma_id
(funx : X =>
{|
equiv_fun := funy : X => y * x;
equiv_isequiv := H2 x
|}) oE equiv_sigma_symm0 X X
:
{H : X &
pod_faml
{|
pod_faml := Unit_ind X;
pod_famr := Unit_ind X;
pod_e :=
funx : X =>
{|
equiv_fun := sg_op x; equiv_isequiv := H1 x
|}
|} (const_tt X H)} <~> X * X)
H: Univalence X: pType H0: IsHSpace X H1: foralla : X, IsEquiv (sg_op a) H2: foralla : X, IsEquiv (funy : X => y * a)
equiv_contr_sigma (Unit_ind X)
o functor_sigma (const_tt X) (funa : X => idmap) ==
fst
o (equiv_sigma_prod0 X X
oE equiv_functor_sigma_id
(funx : X =>
{|
equiv_fun := funy : X => y * x;
equiv_isequiv := H2 x
|}) oE equiv_sigma_symm0 X X
:
{H : X &
pod_faml
{|
pod_faml := Unit_ind X;
pod_famr := Unit_ind X;
pod_e :=
funx : X =>
{|
equiv_fun := sg_op x; equiv_isequiv := H1 x
|}
|} (const_tt X H)} <~> X * X)
H: Univalence X: pType H0: IsHSpace X H1: foralla : X, IsEquiv (sg_op a) H2: foralla : X, IsEquiv (funy : X => y * a)
equiv_contr_sigma (Unit_ind X)
o functor_sigma (const_tt X)
(funa : X =>
pod_e
{|
pod_faml := Unit_ind X;
pod_famr := Unit_ind X;
pod_e :=
funx : X =>
{|
equiv_fun := sg_op x;
equiv_isequiv := H1 x
|}
|} a) ==
snd
o (equiv_sigma_prod0 X X
oE equiv_functor_sigma_id
(funx : X =>
{|
equiv_fun := funy : X => y * x;
equiv_isequiv := H2 x
|}) oE equiv_sigma_symm0 X X
:
{H : X &
pod_faml
{|
pod_faml := Unit_ind X;
pod_famr := Unit_ind X;
pod_e :=
funx : X =>
{|
equiv_fun := sg_op x; equiv_isequiv := H1 x
|}
|} (const_tt X H)} <~> X * X)
1,2: reflexivity.
H: Univalence X: pType H0: IsHSpace X H1: foralla : X, IsEquiv (sg_op a) H2: foralla : X, IsEquiv (funy : X => y * a)
(equiv_pushout
(equiv_sigma_prod0 X X
oE equiv_functor_sigma_id
(funx : X =>
{|
equiv_fun := funy : X => y * x;
equiv_isequiv := H2 x
|}) oE equiv_sigma_symm0 X X
:
{H : X &
pod_faml
{|
pod_faml := Unit_ind X;
pod_famr := Unit_ind X;
pod_e :=
funx : X =>
{|
equiv_fun := sg_op x;
equiv_isequiv := H1 x
|}
|} (const_tt X H)} <~> X * X)
(equiv_contr_sigma (Unit_ind X))
(equiv_contr_sigma (Unit_ind X))
(funx0 : {_ : X & X} => 1%path)
(funx0 : {_ : X & X} => 1%path)
oE equiv_pod_flatten
{|
pod_faml := Unit_ind X;
pod_famr := Unit_ind X;
pod_e :=
funx : X =>
{|
equiv_fun := sg_op x;
equiv_isequiv := H1 x
|}
|}) pt = pt
reflexivity.Defined.(** ** Miscellaneous lemmas and corollaries about the Hopf construction *)
H: Univalence X: pType H0: IsHSpace X H1: foralla : X, IsEquiv (sg_op a)
forallxy : X,
transport (hopf_construction X) (merid x) y = x * y
H: Univalence X: pType H0: IsHSpace X H1: foralla : X, IsEquiv (sg_op a)
forallxy : X,
transport (hopf_construction X) (merid x) y = x * y
H: Univalence X: pType H0: IsHSpace X H1: foralla : X, IsEquiv (sg_op a) x, y: X
transport (hopf_construction X) (merid x) y = x * y
H: Univalence X: pType H0: IsHSpace X H1: foralla : X, IsEquiv (sg_op a) x, y: X
transport idmap (ap (hopf_construction X) (merid x)) y =
x * y
H: Univalence X: pType H0: IsHSpace X H1: foralla : X, IsEquiv (sg_op a) x, y: X
ap (hopf_construction X) (merid x) = ?Goal
H: Univalence X: pType H0: IsHSpace X H1: foralla : X, IsEquiv (sg_op a) x, y: X
transport idmap ?Goal y = x * y
H: Univalence X: pType H0: IsHSpace X H1: foralla : X, IsEquiv (sg_op a) x, y: X
transport idmap (path_universe (sg_op x)) y = x * y
apply transport_path_universe.Defined.(** The connecting map associated to the Hopf construction of [X] is a retraction of [loop_susp_unit X] (Proposition 2.19 in https://arxiv.org/abs/2301.02636v1). *)
H: Univalence X: pType H0: IsHSpace X H1: foralla : X, IsEquiv (sg_op a)
connecting_map_family (hopf_construction X)
o* loop_susp_unit X ==* pmap_idmap
H: Univalence X: pType H0: IsHSpace X H1: foralla : X, IsEquiv (sg_op a)
connecting_map_family (hopf_construction X)
o* loop_susp_unit X ==* pmap_idmap
H: Univalence X: pType H0: IsHSpace X H1: foralla : X, IsEquiv (sg_op a)
IsHSpace
[hopf_construction X pt,
dpoint (hopf_construction X)]
H: Univalence X: pType H0: IsHSpace X H1: foralla : X, IsEquiv (sg_op a)
connecting_map_family (hopf_construction X)
o* loop_susp_unit X == pmap_idmap
H: Univalence X: pType H0: IsHSpace X H1: foralla : X, IsEquiv (sg_op a)
connecting_map_family (hopf_construction X)
o* loop_susp_unit X == pmap_idmap
H: Univalence X: pType H0: IsHSpace X H1: foralla : X, IsEquiv (sg_op a) x: X
transport
(Susp_rec X X (funx : X => path_universe (sg_op x)))
(merid x @ (merid pt)^) pt = x
H: Univalence X: pType H0: IsHSpace X H1: foralla : X, IsEquiv (sg_op a) x: X
transport
(Susp_rec X X (funx : X => path_universe (sg_op x)))
(merid pt)^
(transport
(Susp_rec X X
(funx : X => path_universe (sg_op x)))
(merid x) pt) = x
H: Univalence X: pType H0: IsHSpace X H1: foralla : X, IsEquiv (sg_op a) x: X
transport
(Susp_rec X X (funx : X => path_universe (sg_op x)))
(merid x) pt =
transport
(Susp_rec X X (funx : X => path_universe (sg_op x)))
(merid pt) x
H: Univalence X: pType H0: IsHSpace X H1: foralla : X, IsEquiv (sg_op a) x: X
x * pt = pt * x
exact (right_identity _ @ (left_identity _)^).Defined.(** It follows from [hopf_retraction] and Freudenthal's theorem that [loop_susp_unit] induces an equivalence on [Pi (2n+1)] for [n]-connected H-spaces (with n >= 0). Note that [X] is automatically left-invertible. *)
H: Univalence n: nat X: pType H0: IsConnected (Tr n) X H1: IsHSpace X
H: Univalence n: nat X: pType H0: IsConnected (Tr n) X H1: IsHSpace X i:= is0connected_isconnected n.-2 X: IsConnected (Tr 0) X
?Goal o* loop_susp_unit X ==* pmap_idmap
apply hopf_retraction.Defined.(** By Freudenthal, [loop_susp_unit] induces an equivalence on lower homotopy groups as well, so it is a (2n+1)-equivalence. We formalize it below with [m = n-1], and allow [n] to start at [-1]. We prove it using a more general result about reflective subuniverses, [OO_inverts_conn_map_factor_conn_map], but one could also use homotopy groups and the truncated Whitehead theorem. *)
H: Univalence m: trunc_index X: pType H0: IsConnected (Tr m.+1) X H1: IsHSpace X H2: foralla : X, IsEquiv (sg_op a)
O_inverts (Tr (m +2+ m).+1) (loop_susp_unit X)
H: Univalence m: trunc_index X: pType H0: IsConnected (Tr m.+1) X H1: IsHSpace X H2: foralla : X, IsEquiv (sg_op a)
O_inverts (Tr (m +2+ m).+1) (loop_susp_unit X)
H: Univalence m: trunc_index X: pType H0: IsConnected (Tr m.+1) X H1: IsHSpace X H2: foralla : X, IsEquiv (sg_op a) r:= connecting_map_family (hopf_construction X): loops (psusp X) ->*
[hopf_construction X pt,
dpoint (hopf_construction X)]
O_inverts (Tr (m +2+ m).+1) (loop_susp_unit X)
H: Univalence m: trunc_index X: pType H0: IsConnected (Tr m.+1) X H1: IsHSpace X H2: foralla : X, IsEquiv (sg_op a) r:= connecting_map_family (hopf_construction X): loops (psusp X) ->*
[hopf_construction X pt,
dpoint (hopf_construction X)]
Tr (m +2+ m) <<< Tr (m +2+ m).+1
H: Univalence m: trunc_index X: pType H0: IsConnected (Tr m.+1) X H1: IsHSpace X H2: foralla : X, IsEquiv (sg_op a) r:= connecting_map_family (hopf_construction X): loops (psusp X) ->*
[hopf_construction X pt,
dpoint (hopf_construction X)]
O_leq (Tr (m +2+ m).+1) (Sep (Tr (m +2+ m)))
H: Univalence m: trunc_index X: pType H0: IsConnected (Tr m.+1) X H1: IsHSpace X H2: foralla : X, IsEquiv (sg_op a) r:= connecting_map_family (hopf_construction X): loops (psusp X) ->*
[hopf_construction X pt,
dpoint (hopf_construction X)]
IsConnMap (Tr (m +2+ m).+1)
(funx : X => r (loop_susp_unit X x))
H: Univalence m: trunc_index X: pType H0: IsConnected (Tr m.+1) X H1: IsHSpace X H2: foralla : X, IsEquiv (sg_op a) r:= connecting_map_family (hopf_construction X): loops (psusp X) ->*
[hopf_construction X pt,
dpoint (hopf_construction X)]
IsConnMap (Tr (m +2+ m)) (loop_susp_unit X)
H: Univalence m: trunc_index X: pType H0: IsConnected (Tr m.+1) X H1: IsHSpace X H2: foralla : X, IsEquiv (sg_op a) r:= connecting_map_family (hopf_construction X): loops (psusp X) ->*
[hopf_construction X pt,
dpoint (hopf_construction X)]
Tr (m +2+ m) <<< Tr (m +2+ m).+1
H: Univalence m: trunc_index X: pType H0: IsConnected (Tr m.+1) X H1: IsHSpace X H2: foralla : X, IsEquiv (sg_op a) r:= connecting_map_family (hopf_construction X): loops (psusp X) ->*
[hopf_construction X pt,
dpoint (hopf_construction X)]
IsConnMap (Tr (m +2+ m).+1)
(funx : X => r (loop_susp_unit X x))
H: Univalence m: trunc_index X: pType H0: IsConnected (Tr m.+1) X H1: IsHSpace X H2: foralla : X, IsEquiv (sg_op a) r:= connecting_map_family (hopf_construction X): loops (psusp X) ->*
[hopf_construction X pt,
dpoint (hopf_construction X)]
IsConnMap (Tr (m +2+ m).+1)
(funx : X => r (loop_susp_unit X x))
H: Univalence m: trunc_index X: pType H0: IsConnected (Tr m.+1) X H1: IsHSpace X H2: foralla : X, IsEquiv (sg_op a) r:= connecting_map_family (hopf_construction X): loops (psusp X) ->*
[hopf_construction X pt,
dpoint (hopf_construction X)]
1%equiv == (funx : X => r (loop_susp_unit X x))
H: Univalence m: trunc_index X: pType H0: IsConnected (Tr m.+1) X H1: IsHSpace X H2: foralla : X, IsEquiv (sg_op a) r:= connecting_map_family (hopf_construction X): loops (psusp X) ->*
[hopf_construction X pt,
dpoint (hopf_construction X)]
(funx : X => r (loop_susp_unit X x)) == 1%equiv
napply hopf_retraction.Defined.(** Note that we don't really need the assumption that [X] is left-invertible in the previous result; for [m >= -1], it follows from connectivity. And for [m = -2], the conclusion is trivial. Here we state the version for [m >= -1] without left-invertibility. *)
H: Univalence m: trunc_index X: pType H0: IsConnected (Tr m.+2) X H1: IsHSpace X
exact (freudenthal_hspace' (m:=m.+1) X).Defined.(** Here we give a generalization of a result from Eilenberg-Mac Lane Spaces in Homotopy Type Theory, Dan Licata and Eric Finster. Their version corresponds to [m = -2] in our version. Their encode-decode proof was formalized in this library in EMSpace.v until this shorter and more general approach was found. *)
H: Univalence m: trunc_index X: pType H0: IsConnected (Tr m.+2) X k:= (m.+1 +2+ m.+1).+1: trunc_index H1: IsHSpace X IsTrunc0: IsTrunc k X
X <~>* pTr k (loops (psusp X))
H: Univalence m: trunc_index X: pType H0: IsConnected (Tr m.+2) X k:= (m.+1 +2+ m.+1).+1: trunc_index H1: IsHSpace X IsTrunc0: IsTrunc k X
X <~>* pTr k (loops (psusp X))
H: Univalence m: trunc_index X: pType H0: IsConnected (Tr m.+2) X k:= (m.+1 +2+ m.+1).+1: trunc_index H1: IsHSpace X IsTrunc0: IsTrunc k X
pTr k X <~>* pTr k (loops (psusp X))
H: Univalence m: trunc_index X: pType H0: IsConnected (Tr m.+2) X k:= (m.+1 +2+ m.+1).+1: trunc_index H1: IsHSpace X IsTrunc0: IsTrunc k X
O_inverts (Tr k) (loop_susp_unit X)
rapply freudenthal_hspace.Defined.(** Since [loops X] is an H-space, the Hopf construction provides a map [Join (loops X) (loops X) -> Susp (loops X)]. We show that this map is equivalent to the fiber of [loop_susp_counit X : Susp (loops X) -> X] over the base point, up to the automorphism of [Susp (loops X)] induced by inverting loops. *)
napply isconnected_join; exact _.Defined.(** In particular, we get the following result. 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. *)