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 Pointed HSpace.Core HSpace.Coherent.From HoTT Require Import Basics Types Pointed HSpace.Core HSpace.Coherent.LocalOpen Scope pointed_scope.LocalOpen Scope mc_mult_scope.LocalOpen Scope path_scope.(** * Pointwise H-space structures *)(** Whenever [X] is an H-space, so is the type of maps into [X]. Note: When writing [f * g], Coq only finds this instance if [f] is explicitly in the pointed type [[Y -> X, const pt]]. *)
H: Funext X: pType Y: Type H0: IsHSpace X
IsHSpace [Y -> X, const pt]
H: Funext X: pType Y: Type H0: IsHSpace X
IsHSpace [Y -> X, const pt]
H: Funext X: pType Y: Type H0: IsHSpace X
SgOp [Y -> X, const pt]
H: Funext X: pType Y: Type H0: IsHSpace X
LeftIdentity ?hspace_op pt
H: Funext X: pType Y: Type H0: IsHSpace X
RightIdentity ?hspace_op pt
H: Funext X: pType Y: Type H0: IsHSpace X
SgOp [Y -> X, const pt]
exact (funfgy => (f y) * (g y)).
H: Funext X: pType Y: Type H0: IsHSpace X
LeftIdentity (fun (fg : [Y -> X, const pt]) (y : Y) => f y * g y) pt
H: Funext X: pType Y: Type H0: IsHSpace X g: [Y -> X, const pt] y: Y
pt y * g y = g y
apply hspace_left_identity.
H: Funext X: pType Y: Type H0: IsHSpace X
RightIdentity (fun (fg : [Y -> X, const pt]) (y : Y) => f y * g y) pt
H: Funext X: pType Y: Type H0: IsHSpace X f: [Y -> X, const pt] y: Y
f y * pt y = f y
apply hspace_right_identity.Defined.(** If [X] is coherent, so is [[Y -> X, const pt]]. *)
H: Funext X: pType Y: Type H0: IsHSpace X H1: IsCoherent X
IsCoherent [Y -> X, const pt]
H: Funext X: pType Y: Type H0: IsHSpace X H1: IsCoherent X
IsCoherent [Y -> X, const pt]
H: Funext X: pType Y: Type H0: IsHSpace X H1: IsCoherent X
path_forall (funy : Y => const pt y * const pt y)
(const pt) (funy : Y => hspace_left_identity (const pt y)) =
path_forall (funy : Y => const pt y * const pt y)
(const pt) (funy : Y => hspace_right_identity (const pt y))
H: Funext X: pType Y: Type H0: IsHSpace X H1: IsCoherent X
(funy : Y => hspace_left_identity (const pt y)) =
(funy : Y => hspace_right_identity (const pt y))
funext y; exact iscoherent.Defined.(** If [X] is left-invertible, so is [[Y -> X, const pt]]. *)
H: Funext X: pType Y: Type H0: IsHSpace X H1: forallx : X, IsEquiv (sg_op x)
forallf : [Y -> X, const pt], IsEquiv (sg_op f)
H: Funext X: pType Y: Type H0: IsHSpace X H1: forallx : X, IsEquiv (sg_op x)
(* Left multiplication by [f] unifies with [functor_forall]. *)exact (isequiv_functor_forall (P:=const X) (f:=idmap)
(g:=funygy => (f y) * gy)).Defined.(** The pointwise product of two pointed maps into an H-space. This is the operation underlying the H-space structure [ishspace_pmap] on [Y ->** X], but requires no coherence. *)
X, Y: pType H: IsHSpace X f, g: Y ->* X
Y ->* X
X, Y: pType H: IsHSpace X f, g: Y ->* X
Y ->* X
X, Y: pType H: IsHSpace X f, g: Y ->* X
Y -> X
X, Y: pType H: IsHSpace X f, g: Y ->* X
?f pt = pt
X, Y: pType H: IsHSpace X f, g: Y ->* X
Y -> X
exact (funy => (f y) * (g y)).
X, Y: pType H: IsHSpace X f, g: Y ->* X
(funy : Y => f y * g y) pt = pt
X, Y: pType H: IsHSpace X f, g: Y ->* X
f pt * g pt = pt
X, Y: pType H: IsHSpace X f, g: Y ->* X
f pt * pt = pt
X, Y: pType H: IsHSpace X f, g: Y ->* X
pt * pt = pt
apply hspace_left_identity.Defined.(** The constant map is a left unit for the pointwise product; this needs no coherence. *)
hspace_left_identity (g pt) @ dpoint_eq g =
ap (sg_op pt) (point_eq g) @ (1 @ hspace_left_identity pt)
exact (1 @@ concat_1p _ @ concat_A1p _ _)^.Defined.(** The constant map is a right unit for the pointwise product; the base-point coherence forces [right_identity pt = left_identity pt], so this needs [X] coherent. *)
X, Y: pType H: IsHSpace X H0: IsCoherent X f: Y ->* X
sgop_pmap f pconst ==* f
X, Y: pType H: IsHSpace X H0: IsCoherent X f: Y ->* X
sgop_pmap f pconst ==* f
X, Y: pType H: IsHSpace X H0: IsCoherent X f: Y ->* X
sgop_pmap f pconst == f
X, Y: pType H: IsHSpace X H0: IsCoherent X f: Y ->* X
?p pt = dpoint_eq (sgop_pmap f pconst) @ (dpoint_eq f)^
X, Y: pType H: IsHSpace X H0: IsCoherent X f: Y ->* X
sgop_pmap f pconst == f
X, Y: pType H: IsHSpace X H0: IsCoherent X f: Y ->* X y: Y
f y * pt = f y
apply hspace_right_identity.
X, Y: pType H: IsHSpace X H0: IsCoherent X f: Y ->* X
((funy : Y => hspace_right_identity (f y) : sgop_pmap f pconst y = f y)
:
sgop_pmap f pconst == f) pt =
dpoint_eq (sgop_pmap f pconst) @ (dpoint_eq f)^
exact iscoherent.Defined.(** For the type of pointed maps [Y ->** X], coherence of [X] is needed even to get a non-coherent H-space structure on [Y ->** X]. *)
H: Funext X, Y: pType H0: IsHSpace X H1: IsCoherent X
IsHSpace (Y ->** X)
H: Funext X, Y: pType H0: IsHSpace X H1: IsCoherent X
IsHSpace (Y ->** X)
H: Funext X, Y: pType H0: IsHSpace X H1: IsCoherent X
SgOp (Y ->** X)
H: Funext X, Y: pType H0: IsHSpace X H1: IsCoherent X
LeftIdentity ?hspace_op pt
H: Funext X, Y: pType H0: IsHSpace X H1: IsCoherent X
RightIdentity ?hspace_op pt
H: Funext X, Y: pType H0: IsHSpace X H1: IsCoherent X
SgOp (Y ->** X)
exact sgop_pmap.
H: Funext X, Y: pType H0: IsHSpace X H1: IsCoherent X