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]
LocalOpen Scope pointed_scope.LocalOpen Scope mc_mult_scope.LocalOpen Scope path_scope.(** * The moduli type of coherent H-space structures *)(** When [A] is a left-invertible coherent H-space, we construct an equivalence between the ("moduli") type of coherent H-space structures on [A] and the type [A ->* (A ->** A)]. By the smash-hom adjunction for pointed types, due to Floris van Doorn in HoTT, the latter is also equivalent to the type [Smash A A ->* A].This equivalence generalizes a formula of Arkowitz--Curjel and Copeland for spaces, and appears as Theorem 2.27 in https://arxiv.org/abs/2301.02636v1 *)(** ** Paths between H-space structures *)(** Paths between H-space structures correspond to homotopies between the underlying binary operations which respect the identities. This is the type of the latter. *)
X: pType mu, nu: IsHSpace X
Type
X: pType mu, nu: IsHSpace X
Type
X: pType mu: SgOp X mu_lid: LeftIdentity mu pt mu_rid: RightIdentity mu pt nu: SgOp X nu_lid: LeftIdentity nu pt nu_rid: RightIdentity nu pt
Type
X: pType mu: SgOp X mu_lid: LeftIdentity mu pt mu_rid: RightIdentity mu pt nu: SgOp X nu_lid: LeftIdentity nu pt nu_rid: RightIdentity nu pt h: forallx0x1 : X, mu x0 x1 = nu x0 x1 x: X
Type
X: pType mu: SgOp X mu_lid: LeftIdentity mu pt mu_rid: RightIdentity mu pt nu: SgOp X nu_lid: LeftIdentity nu pt nu_rid: RightIdentity nu pt h: forallx0x1 : X, mu x0 x1 = nu x0 x1 x: X
Type
X: pType mu: SgOp X mu_lid: LeftIdentity mu pt mu_rid: RightIdentity mu pt nu: SgOp X nu_lid: LeftIdentity nu pt nu_rid: RightIdentity nu pt h: forallx0x1 : X, mu x0 x1 = nu x0 x1 x: X
Type
exact (mu_lid x = h pt x @ nu_lid x).
X: pType mu: SgOp X mu_lid: LeftIdentity mu pt mu_rid: RightIdentity mu pt nu: SgOp X nu_lid: LeftIdentity nu pt nu_rid: RightIdentity nu pt h: forallx0x1 : X, mu x0 x1 = nu x0 x1 x: X
Type
exact (mu_rid x = h x pt @ nu_rid x).Defined.(** Transport of left and right identities of binary operations along paths between the underlying functions. *)
H: Funext X: Type x: X mu, nu: X -> X -> X mu_lid: forally : X, mu x y = y mu_rid: forally : X, mu y x = y p: mu = nu
transport
(funm : X -> X -> X =>
(forally : X, m x y = y) *
(forally : X, m y x = y)) p (mu_lid, mu_rid) =
(funy : X => (ap100 p x y)^ @ mu_lid y,
funy : X => (ap100 p y x)^ @ mu_rid y)
H: Funext X: Type x: X mu, nu: X -> X -> X mu_lid: forally : X, mu x y = y mu_rid: forally : X, mu y x = y p: mu = nu
transport
(funm : X -> X -> X =>
(forally : X, m x y = y) *
(forally : X, m y x = y)) p
(mu_lid, mu_rid) =
(funy : X => (ap100 p x y)^ @ mu_lid y,
funy : X => (ap100 p y x)^ @ mu_rid y)
H: Funext X: Type x: X mu: X -> X -> X mu_lid: forally : X, mu x y = y mu_rid: forally : X, mu y x = y
(mu_lid, mu_rid) =
(funy : X => 1 @ mu_lid y, funy : X => 1 @ mu_rid y)
H: Funext X: Type x: X mu: X -> X -> X mu_lid: forally : X, mu x y = y mu_rid: forally : X, mu y x = y y: X
mu_lid y = 1 @ mu_lid y
H: Funext X: Type x: X mu: X -> X -> X mu_lid: forally : X, mu x y = y mu_rid: forally : X, mu y x = y y: X
mu_rid y = 1 @ mu_rid y
all: exact (concat_1p _)^.Defined.(** Characterization of paths between H-space structures. *)
H: Funext X: pType mu, nu: IsHSpace X
path_ishspace_type mu nu <~> mu = nu
H: Funext X: pType mu, nu: IsHSpace X
path_ishspace_type mu nu <~> mu = nu
H: Funext X: pType mu: SgOp X mu_lid: LeftIdentity mu pt mu_rid: RightIdentity mu pt nu: SgOp X nu_lid: LeftIdentity nu pt nu_rid: RightIdentity nu pt
{h : forallx0x1 : X, mu x0 x1 = nu x0 x1 &
((forallx : X, mu_lid x = h pt x @ nu_lid x) *
(forallx : X, mu_rid x = h x pt @ nu_rid x))%type} <~>
{|
hspace_op := mu;
hspace_left_identity := mu_lid;
hspace_right_identity := mu_rid
|} =
{|
hspace_op := nu;
hspace_left_identity := nu_lid;
hspace_right_identity := nu_rid
|}
H: Funext X: pType mu: SgOp X mu_lid: LeftIdentity mu pt mu_rid: RightIdentity mu pt nu: SgOp X nu_lid: LeftIdentity nu pt nu_rid: RightIdentity nu pt
{h : forallx0x1 : X, mu x0 x1 = nu x0 x1 &
((forallx : X, mu_lid x = h pt x @ nu_lid x) *
(forallx : X, mu_rid x = h x pt @ nu_rid x))%type} <~>
issig_ishspace^-1
{|
hspace_op := mu;
hspace_left_identity := mu_lid;
hspace_right_identity := mu_rid
|} =
issig_ishspace^-1
{|
hspace_op := nu;
hspace_left_identity := nu_lid;
hspace_right_identity := nu_rid
|}
H: Funext X: pType mu: SgOp X mu_lid: LeftIdentity mu pt mu_rid: RightIdentity mu pt nu: SgOp X nu_lid: LeftIdentity nu pt nu_rid: RightIdentity nu pt
{h : forallx0x1 : X, mu x0 x1 = nu x0 x1 &
((forallx : X, mu_lid x = h pt x @ nu_lid x) *
(forallx : X, mu_rid x = h x pt @ nu_rid x))%type} <~>
{p : mu = nu &
transport
(funmu : X -> X -> X =>
((forallx : X, mu pt x = x) *
(forallx : X, mu x pt = x))%type) p
(mu_lid, mu_rid) = (nu_lid, nu_rid)}
H: Funext X: pType mu: SgOp X mu_lid: LeftIdentity mu pt mu_rid: RightIdentity mu pt nu: SgOp X nu_lid: LeftIdentity nu pt nu_rid: RightIdentity nu pt h: forallxy : X, mu x y = nu x y
(forallx : X, mu_lid x = h pt x @ nu_lid x) *
(forallx : X, mu_rid x = h x pt @ nu_rid x) <~>
transport
(funmu : X -> X -> X =>
((forallx : X, mu pt x = x) *
(forallx : X, mu x pt = x))%type)
(path_forall mu nu
(functor_forall idmap
(funa : X => path_forall (mu a) (nu a)) h))
(mu_lid, mu_rid) = (nu_lid, nu_rid)
H: Funext X: pType mu: SgOp X mu_lid: LeftIdentity mu pt mu_rid: RightIdentity mu pt nu: SgOp X nu_lid: LeftIdentity nu pt nu_rid: RightIdentity nu pt h: forallxy : X, mu x y = nu x y
transport
(funmu : X -> X -> X =>
((forallx : X, mu pt x = x) *
(forallx : X, mu x pt = x))%type)
(path_forall mu nu
(functor_forall idmap
(funa : X => path_forall (mu a) (nu a)) h))
(mu_lid, mu_rid) = ?Goal
H: Funext X: pType mu: SgOp X mu_lid: LeftIdentity mu pt mu_rid: RightIdentity mu pt nu: SgOp X nu_lid: LeftIdentity nu pt nu_rid: RightIdentity nu pt h: forallxy : X, mu x y = nu x y
(forallx : X, mu_lid x = h pt x @ nu_lid x) *
(forallx : X, mu_rid x = h x pt @ nu_rid x) <~>
?Goal = (nu_lid, nu_rid)
H: Funext X: pType mu: SgOp X mu_lid: LeftIdentity mu pt mu_rid: RightIdentity mu pt nu: SgOp X nu_lid: LeftIdentity nu pt nu_rid: RightIdentity nu pt h: forallxy : X, mu x y = nu x y
(forallx : X, mu_lid x = h pt x @ nu_lid x) *
(forallx : X, mu_rid x = h x pt @ nu_rid x) <~>
(funy : X =>
(ap100
(path_forall mu nu
(functor_forall idmap
(funa : X => path_forall (mu a) (nu a)) h))
pt y)^ @ mu_lid y,
funy : X =>
(ap100
(path_forall mu nu
(functor_forall idmap
(funa : X => path_forall (mu a) (nu a)) h))
y pt)^ @ mu_rid y) =
(nu_lid, nu_rid)
H: Funext X: pType mu: SgOp X mu_lid: LeftIdentity mu pt mu_rid: RightIdentity mu pt nu: SgOp X nu_lid: LeftIdentity nu pt nu_rid: RightIdentity nu pt h: forallxy : X, mu x y = nu x y
(forallx : X, mu_lid x = h pt x @ nu_lid x) *
(forallx : X, mu_rid x = h x pt @ nu_rid x) <~>
((funy : X =>
(ap100
(path_forall mu nu
(functor_forall idmap
(funa : X => path_forall (mu a) (nu a)) h))
pt y)^ @ mu_lid y) = nu_lid) *
((funy : X =>
(ap100
(path_forall mu nu
(functor_forall idmap
(funa : X => path_forall (mu a) (nu a)) h))
y pt)^ @ mu_rid y) = nu_rid)
H: Funext X: pType mu: SgOp X mu_lid: LeftIdentity mu pt mu_rid: RightIdentity mu pt nu: SgOp X nu_lid: LeftIdentity nu pt nu_rid: RightIdentity nu pt h: forallxy : X, mu x y = nu x y x: X
mu_lid x = h pt x @ nu_lid x <~>
(ap100
(path_forall mu nu
(functor_forall idmap
(funa : X => path_forall (mu a) (nu a)) h))
pt x)^ @ mu_lid x = nu_lid x
H: Funext X: pType mu: SgOp X mu_lid: LeftIdentity mu pt mu_rid: RightIdentity mu pt nu: SgOp X nu_lid: LeftIdentity nu pt nu_rid: RightIdentity nu pt h: forallxy : X, mu x y = nu x y x: X
mu_rid x = h x pt @ nu_rid x <~>
(ap100
(path_forall mu nu
(functor_forall idmap
(funa : X => path_forall (mu a) (nu a)) h))
x pt)^ @ mu_rid x = nu_rid x
all: nrefine (equiv_moveR_Vp _ _ _ oE _);
apply equiv_concat_r;
apply whiskerR; symmetry;
apply ap100_path_arrow2.Defined.(** ** Sections of evaluation fibrations *)(** We first show that coherent H-space structures on a pointed type correspond to pointed sections of the evaluation fibration [ev A]. *)
H: Funext A: pType
IsCohHSpace A <~> pSect (ev A)
H: Funext A: pType
IsCohHSpace A <~> pSect (ev A)
H: Funext A: pType
{s : A -> selfmaps A &
{p : s pt = pt &
{H : (funx : A => ev A (s x)) == idmap &
H pt = ap (ev A) p @ point_eq (ev A)}}} <~>
{hspace_op : SgOp A &
{hspace_left_identity : LeftIdentity hspace_op pt &
{hspace_right_identity : RightIdentity hspace_op pt &
hspace_left_identity pt = hspace_right_identity pt}}}
H: Funext A: pType
{s : A -> selfmaps A &
{p : s pt = pt &
{H : (funx : A => ev A (s x)) == idmap &
H pt = ap (ev A) p @ point_eq (ev A)}}} <~>
{hspace_op : A -> A -> A &
{hspace_left_identity
: forally : A, hspace_op pt y = y &
{hspace_right_identity
: forallx : A, hspace_op x pt = x &
hspace_left_identity pt = hspace_right_identity pt}}}
H: Funext A: pType mu: A -> selfmaps A
{p : mu pt = pt &
{H : (funx : A => ev A (mu x)) == idmap &
H pt = ap (ev A) p @ point_eq (ev A)}} <~>
{hspace_left_identity : forally : A, mu pt y = y &
{hspace_right_identity : forallx : A, mu x pt = x &
hspace_left_identity pt = hspace_right_identity pt}}
H: Funext A: pType mu: A -> selfmaps A H1: mu pt = pt
{H : (funx : A => mu x pt) == idmap &
H pt = ap (funf : A -> A => f pt) H1 @ 1} <~>
{hspace_right_identity : forallx : A, mu x pt = x &
apD10 H1 pt = hspace_right_identity pt}
H: Funext A: pType mu: A -> selfmaps A H1: mu pt = pt H2: (funx : A => mu x pt) == idmap
H2 pt = ap (funf : A -> A => f pt) H1 @ 1 <~>
apD10 H1 pt = H2 pt
H: Funext A: pType mu: A -> selfmaps A H1: mu pt = pt H2: (funx : A => mu x pt) == idmap
H2 pt = ap (funf : A -> A => f pt) H1 @ 1 <~>
H2 pt = apD10 H1 pt
H: Funext A: pType mu: A -> selfmaps A H1: mu pt = pt H2: (funx : A => mu x pt) == idmap
ap (funf : A -> A => f pt) H1 @ 1 = apD10 H1 pt
apply concat_p1.Defined.(** Our next goal is to see that when [A] is a left-invertible H-space, then the fibration [ev A] is trivial. *)(** This lemma says that the family [fun a => A ->* [A,a]] is trivial. *)
H: Funext A: pType a: A H0: IsHSpace A IsEquiv0: IsEquiv (hspace_op a)
(A ->* A) <~> (A ->* [A, a])
H: Funext A: pType a: A H0: IsHSpace A IsEquiv0: IsEquiv (hspace_op a)
(A ->* A) <~> (A ->* [A, a])
H: Funext A: pType a: A H0: IsHSpace A IsEquiv0: IsEquiv (hspace_op a)
A <~>* [A, a]
rapply pequiv_hspace_left_op.Defined.(** The lemma gives us an equivalence on the total spaces (domains) of [ev A] and [psnd] (the projection out of the displayed product). *)
H: Funext A: pType H0: IsHSpace A H1: foralla : A, IsEquiv (sg_op a)
(A ->* A) * A <~> (A -> A)
H: Funext A: pType H0: IsHSpace A H1: foralla : A, IsEquiv (sg_op a)
(A ->* A) * A <~> (A -> A)
H: Funext A: pType H0: IsHSpace A H1: foralla : A, IsEquiv (sg_op a)
(A ->* A) * A <~> {a : A & {f : A -> A & f pt = a}}
H: Funext A: pType H0: IsHSpace A H1: foralla : A, IsEquiv (sg_op a)
{a : A & {f : A -> A & f pt = a}} <~> (A -> A)
H: Funext A: pType H0: IsHSpace A H1: foralla : A, IsEquiv (sg_op a)
(A ->* A) * A <~> {a : A & {f : A -> A & f pt = a}}
H: Funext A: pType H0: IsHSpace A H1: foralla : A, IsEquiv (sg_op a)
{_ : A & A ->* A} <~>
{a : A & {f : A -> A & f pt = a}}
H: Funext A: pType H0: IsHSpace A H1: foralla : A, IsEquiv (sg_op a) a: A
(A ->* A) <~> {f : A -> A & f pt = a}
exact ((issig_pmap A [A,a])^-1%equiv oE equiv_pmap_hspace a).Defined.(** The above is a pointed equivalence. *)
H: Funext A: pType H0: IsHSpace A H1: foralla : A, IsEquiv (sg_op a)
[(A ->* A) * A, (pmap_idmap, pt)] <~>* selfmaps A
H: Funext A: pType H0: IsHSpace A H1: foralla : A, IsEquiv (sg_op a)
[(A ->* A) * A, (pmap_idmap, pt)] <~>* selfmaps A
H: Funext A: pType H0: IsHSpace A H1: foralla : A, IsEquiv (sg_op a)
[(A ->* A) * A, (pmap_idmap, pt)] <~> selfmaps A
H: Funext A: pType H0: IsHSpace A H1: foralla : A, IsEquiv (sg_op a)
?f pt = pt
H: Funext A: pType H0: IsHSpace A H1: foralla : A, IsEquiv (sg_op a)
equiv_map_pmap_hspace pt = pt
H: Funext A: pType H0: IsHSpace A H1: foralla : A, IsEquiv (sg_op a)
(funx : A => pt * x) = idmap
apply path_forall, hspace_left_identity.Defined.(** When [A] is coherent, the pointed equivalence [pequiv_map_pmap_hspace] is a pointed equivalence over [A], i.e., a trivialization of [ev A]. *)
H: Funext A: pType H0: IsHSpace A H1: IsCoherent A H2: foralla : A, IsEquiv (sg_op a)
ev A o* pequiv_map_pmap_hspace ==* psnd
H: Funext A: pType H0: IsHSpace A H1: IsCoherent A H2: foralla : A, IsEquiv (sg_op a)
ev A o* pequiv_map_pmap_hspace ==* psnd
H: Funext A: pType H0: IsHSpace A H1: IsCoherent A H2: foralla : A, IsEquiv (sg_op a)
ev A o* pequiv_map_pmap_hspace == psnd
H: Funext A: pType H0: IsHSpace A H1: IsCoherent A H2: foralla : A, IsEquiv (sg_op a)
exact iscoherent.Defined.(** ** The equivalence [IsCohHSpace A <~> (A ->* (A ->** A))] *)
H: Funext A: pType H0: IsHSpace A H1: IsCoherent A H2: foralla : A, IsEquiv (hspace_op a)
IsCohHSpace A <~> (A ->* (A ->** A))
H: Funext A: pType H0: IsHSpace A H1: IsCoherent A H2: foralla : A, IsEquiv (hspace_op a)
IsCohHSpace A <~> (A ->* (A ->** A))
H: Funext A: pType H0: IsHSpace A H1: IsCoherent A H2: foralla : A, IsEquiv (hspace_op a)
pSect (ev A) <~> (A ->* (A ->** A))
H: Funext A: pType H0: IsHSpace A H1: IsCoherent A H2: foralla : A, IsEquiv (hspace_op a)
pSect psnd <~> (A ->* (A ->** A))
H: Funext A: pType H0: IsHSpace A H1: IsCoherent A H2: foralla : A, IsEquiv (hspace_op a)
(A ->* [A ->* A, pmap_idmap]) <~> (A ->* (A ->** A))
H: Funext A: pType H0: IsHSpace A H1: IsCoherent A H2: foralla : A, IsEquiv (hspace_op a)
(A ->** A) <~>* [A ->* A, pmap_idmap]
rapply pequiv_hspace_left_op.Defined.(** Here is a third characterization of the type of coherent H-space structures. It simply involves shuffling the data around and using [Funext]. *)
H: Funext A: pType
IsCohHSpace A <~>
{act : foralla : IsPointed A, A ->* [A, a] &
act pt ==* pmap_idmap}
H: Funext A: pType
IsCohHSpace A <~>
{act : foralla : IsPointed A, A ->* [A, a] &
act pt ==* pmap_idmap}
(* First we shuffle the data on the LHS to be of this form: *)
H: Funext A: pType
{hspace_op : SgOp A &
{hspace_left_identity : LeftIdentity hspace_op pt &
{hspace_right_identity : RightIdentity hspace_op pt &
hspace_left_identity pt = hspace_right_identity pt}}} <~>
{s : {act : A -> A -> A & foralla : A, act a pt = a}
& {h : s.1 pt == idmap & h pt = s.2 pt}}
H: Funext A: pType
{s : {act : A -> A -> A & foralla : A, act a pt = a}
& {h : s.1 pt == idmap & h pt = s.2 pt}} <~>
{act : foralla : A, A ->* [A, a] &
act pt ==* pmap_idmap}
H: Funext A: pType
{s : {act : A -> A -> A & foralla : A, act a pt = a}
& {h : s.1 pt == idmap & h pt = s.2 pt}} <~>
{act : foralla : A, A ->* [A, a] &
act pt ==* pmap_idmap}
(* Then we break up [->*] and [==*] on the RHS using issig lemmas, and handle a trailing [@ 1]. *)
H: Funext A: pType
{act : A -> A -> A & foralla : A, act a pt = a} <~>
(foralla : A, A ->* [A, a])
H: Funext A: pType
foralla : {act : A -> A -> A & foralla : A, act a pt = a},
(funs : {act : A -> A -> A &
foralla0 : A, act a0 pt = a0} =>
{h : s.1 pt == idmap & h pt = s.2 pt}) a <~>
(funact : foralla0 : A, A ->* [A, a0] =>
act pt ==* pmap_idmap) (?f a)
H: Funext A: pType
{act : A -> A -> A & foralla : A, act a pt = a} <~>
(foralla : A, A ->* [A, a])
H: Funext A: pType
{act : A -> A -> A & foralla : A, act a pt = a} <~>
(foralla : IsPointed A, {f : A -> [A, a] & f pt = pt})
H: Funext A: pType
{act : A -> A -> A & foralla : A, act a pt = a} <~>
(foralla : A, {f : A -> [A, a] & f pt = pt})
napply equiv_sig_coind.
H: Funext A: pType
foralla : {act : A -> A -> A & foralla : A, act a pt = a},
(funs : {act : A -> A -> A &
foralla0 : A, act a0 pt = a0} =>
{h : s.1 pt == idmap & h pt = s.2 pt}) a <~>
(funact : foralla0 : A, A ->* [A, a0] =>
act pt ==* pmap_idmap)
((equiv_functor_forall_id
(funa0 : IsPointed A => issig_pmap A [A, a0])
oE (equiv_sig_coind (fun_ : A => A -> A)
(fun (x : A) (f : A -> [A, x]) => f pt = pt)
:
{act : A -> A -> A &
foralla0 : A, act a0 pt = a0} <~>
(foralla0 : IsPointed A,
{f : A -> [A, a0] & f pt = pt}))) a)
H: Funext A: pType
foralla : {act : A -> A -> A & foralla : A, act a pt = a},
{h : a.1 pt == idmap & h pt = a.2 pt} <~>
{| pointed_fun := a.1 pt; dpoint_eq := a.2 pt |} ==*
pmap_idmap
H: Funext A: pType act: A -> A -> A p: foralla : A, act a pt = a
{h : act pt == idmap & h pt = p pt} <~>
{| pointed_fun := act pt; dpoint_eq := p pt |} ==*
pmap_idmap
H: Funext A: pType act: A -> A -> A p: foralla : A, act a pt = a
{h : act pt == idmap & h pt = p pt} <~>
{p0 : act pt == idmap & p0 pt = p pt @ 1}
H: Funext A: pType act: A -> A -> A p: foralla : A, act a pt = a q: act pt == idmap
q pt = p pt <~> q pt = p pt @ 1
apply equiv_concat_r; symmetry; apply concat_p1.Defined.(** It follows that any homogeneous type is a coherent H-space. This generalizes [ishspace_homogeneous]. *)
H: Funext A: pType H0: IsHomogeneous A
IsCohHSpace A
H: Funext A: pType H0: IsHomogeneous A
IsCohHSpace A
H: Funext A: pType H0: IsHomogeneous A
{act : foralla : IsPointed A, A ->* [A, a] &
act pt ==* pmap_idmap}
H: Funext A: pType H0: IsHomogeneous A
homogeneous_pt_id pt ==* pmap_idmap
exact homogeneous_pt_id_beta.Defined.(** One can also show directly that the H-space structure defined by [ishspace_homogeneous] is coherent. This also avoids [Funext]. *)
A: pType H: IsHomogeneous A f:= ishomogeneous pt: A <~>* [A, pt]
eisretr f pt =
ap f (moveR_equiv_V pt pt (point_eq f)^) @ point_eq f
A: pType H: IsHomogeneous A f:= ishomogeneous pt: A <~>* [A, pt]
eisretr f pt = ap f (moveR_equiv_V pt pt 1^) @ 1
A: pType H: IsHomogeneous A f:= ishomogeneous pt: A <~>* [A, pt]
eisretr f pt = ap f (1 @ eissect f pt) @ 1
A: pType H: IsHomogeneous A f:= ishomogeneous pt: A <~>* [A, pt]
eisretr f pt = ap f (1 @ eissect f pt)
A: pType H: IsHomogeneous A f:= ishomogeneous pt: A <~>* [A, pt]
ap f (eissect f pt) = ap f (1 @ eissect f pt)
A: pType H: IsHomogeneous A f:= ishomogeneous pt: A <~>* [A, pt]
eissect f pt = 1 @ eissect f pt
symmetry; apply concat_1p.Defined.(** Using either of these, we can "upgrade" any left-invertible H-space structure to a coherent one. This one has a prime because the direct proof below computes better. *)
A: pType H: IsHSpace A H0: foralla : A, IsEquiv (sg_op a)
IsCohHSpace A
A: pType H: IsHSpace A H0: foralla : A, IsEquiv (sg_op a)
IsCohHSpace A
A: pType H: IsHSpace A H0: foralla : A, IsEquiv (sg_op a)
IsHSpace A
A: pType H: IsHSpace A H0: foralla : A, IsEquiv (sg_op a)
IsCoherent A
A: pType H: IsHSpace A H0: foralla : A, IsEquiv (sg_op a)
IsHSpace A
A: pType H: IsHSpace A H0: foralla : A, IsEquiv (sg_op a)
IsHomogeneous A
exact ishomogeneous_hspace.
A: pType H: IsHSpace A H0: foralla : A, IsEquiv (sg_op a)
IsCoherent A
exact iscoherent_homogeneous.Defined.(** The new multiplication is homotopic to the original one. Relative to this, we expect that one of the identity laws also agrees, but that the other does not. *)
H: Funext A: pType m: IsHSpace A H0: foralla : A, IsEquiv (sg_op a)
hspace_op = hspace_op
H: Funext A: pType m: IsHSpace A H0: foralla : A, IsEquiv (sg_op a)
hspace_op = hspace_op
H: Funext A: pType m: IsHSpace A H0: foralla : A, IsEquiv (sg_op a)
(funab : A => a * (sg_op pt)^-1 b) = hspace_op
H: Funext A: pType m: IsHSpace A H0: foralla : A, IsEquiv (sg_op a) a, b: A
a * (sg_op pt)^-1 b = hspace_op a b
H: Funext A: pType m: IsHSpace A H0: foralla : A, IsEquiv (sg_op a) a, b: A
(sg_op pt)^-1 b = b
H: Funext A: pType m: IsHSpace A H0: foralla : A, IsEquiv (sg_op a) a, b: A
b = pt * b
symmetry; apply left_identity.Defined.(** Here's a different proof that directly upgrades an H-space structure, leaving the multiplication and left-identity definitionally the same, but changing the right-identity. *)
A: pType m: IsHSpace A H: foralla : A, IsEquiv (sg_op a)
IsCohHSpace A
A: pType m: IsHSpace A H: foralla : A, IsEquiv (sg_op a)
IsCohHSpace A
A: pType m: IsHSpace A H: foralla : A, IsEquiv (sg_op a)
IsHSpace A
A: pType m: IsHSpace A H: foralla : A, IsEquiv (sg_op a)
IsCoherent A
A: pType m: IsHSpace A H: foralla : A, IsEquiv (sg_op a)
SgOp A
A: pType m: IsHSpace A H: foralla : A, IsEquiv (sg_op a)
LeftIdentity ?hspace_op pt
A: pType m: IsHSpace A H: foralla : A, IsEquiv (sg_op a)
RightIdentity ?hspace_op pt
A: pType m: IsHSpace A H: foralla : A, IsEquiv (sg_op a)
IsCoherent A
A: pType m: IsHSpace A H: foralla : A, IsEquiv (sg_op a)
SgOp A
exact (@hspace_op A m).
A: pType m: IsHSpace A H: foralla : A, IsEquiv (sg_op a)
LeftIdentity hspace_op pt
exact (@hspace_left_identity A m).
A: pType m: IsHSpace A H: foralla : A, IsEquiv (sg_op a)
RightIdentity hspace_op pt
A: pType m: IsHSpace A H: foralla : A, IsEquiv (sg_op a) a: A
hspace_op a pt = a
A: pType m: IsHSpace A H: foralla : A, IsEquiv (sg_op a) a: A
a * hspace_op pt pt = a
A: pType m: IsHSpace A H: foralla : A, IsEquiv (sg_op a) a: A
a * pt = a
exact (hspace_right_identity a).
A: pType m: IsHSpace A H: foralla : A, IsEquiv (sg_op a)
IsCoherent A
A: pType m: IsHSpace A H: foralla : A, IsEquiv (sg_op a)
hspace_left_identity pt =
(ap (sg_op pt) (hspace_right_identity pt))^ @
(ap (sg_op pt) (hspace_left_identity pt) @
hspace_right_identity pt)
A: pType m: IsHSpace A H: foralla : A, IsEquiv (sg_op a)
ap (sg_op pt) (hspace_right_identity pt) @
hspace_left_identity pt =
ap (sg_op pt) (hspace_left_identity pt) @
hspace_right_identity pt
A: pType m: IsHSpace A H: foralla : A, IsEquiv (sg_op a)