Built with Alectryon, running Coq+SerAPI v8.18.0+0.18.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.
(* -*- mode: coq; mode: visual-line -*- *)
[Loading ML file number_string_notation_plugin.cmxs (using legacy method) ... done]
Require Import WildCat.Equiv.Require Import NullHomotopy.Require Import Homotopy.Suspension.Require Import Pointed.Require Import Truncations.Require Import Spaces.Circle Spaces.TwoSphere.(** * The spheres, in all dimensions. *)LocalOpen Scope pointed_scope.LocalOpen Scope trunc_scope.LocalOpen Scope path_scope.Generalizable VariablesX A B f g n.(** ** Definition, by iterated suspension. *)(** To match the usual indexing for spheres, we have to pad the sequence with a dummy term [Sphere -2]. *)FixpointSphere (n : trunc_index)
:= match n returnTypewith
| -2 => Empty
| -1 => Empty
| n'.+1 => Susp (Sphere n')
end.(** ** Pointed sphere for non-negative dimensions. *)Definitionpsphere (n : nat) : pType := [Sphere n, _].Arguments Sphere : simpl never.Arguments psphere : simpl never.(** ** Explicit equivalences in low dimensions *)(** *** [Sphere 0] *)
Sphere 0 -> Bool
Sphere 0 -> Bool
Sphere 0 -> Bool
Empty -> true = false
intros [].Defined.
Bool -> Sphere 0
Bool -> Sphere 0
exact (funb => if b then North else South).Defined.
1 =
(((transport_paths_FFlr 11 @
ap
(funu : S2_to_TwoSphere (TwoSphere_to_S2 base) =
base => u @ 1)
(concat_p1
(ap S2_to_TwoSphere (ap TwoSphere_to_S2 1))^)) @
ap
(funw : base = base =>
(ap S2_to_TwoSphere (ap TwoSphere_to_S2 1))^ @ w)
(inv_V 1)^) @
(inv_pp 1^
(ap S2_to_TwoSphere (ap TwoSphere_to_S2 1)))^) @
ap
(funp : base = base =>
(p^ @ ap S2_to_TwoSphere (ap TwoSphere_to_S2 p))^)
surf
1 =
ap
(funp : base = base =>
(p^ @ ap S2_to_TwoSphere (ap TwoSphere_to_S2 p))^)
surf
1 =
ap inverse
(ap
(funp : base = base =>
p^ @ ap S2_to_TwoSphere (ap TwoSphere_to_S2 p))
surf)
1 =
ap
(funp : base = base =>
p^ @ ap S2_to_TwoSphere (ap TwoSphere_to_S2 p))
surf
1 =
ap inverse surf @@
ap
(funu : base = base =>
ap S2_to_TwoSphere (ap TwoSphere_to_S2 u)) surf
1 =
inverse2 surf @@
ap (ap S2_to_TwoSphere) (ap (ap TwoSphere_to_S2) surf)
(inverse2 surf @@ surf) @ concat_Vp 1 =
inverse2 surf @@
ap (ap S2_to_TwoSphere) (ap (ap TwoSphere_to_S2) surf)
inverse2 surf @@ surf =
inverse2 surf @@
ap (ap S2_to_TwoSphere) (ap (ap TwoSphere_to_S2) surf)
surf =
ap (ap S2_to_TwoSphere) (ap (ap TwoSphere_to_S2) surf)
ap (ap S2_to_TwoSphere) (ap (ap TwoSphere_to_S2) surf) =
surf
ap (ap S2_to_TwoSphere)
(transport (funx : North = North => x = x)
(concat_pV (merid North))
(ap
(funu : Susp (Susp Empty) =>
merid u @ (merid North)^)
(merid North @ (merid South)^))) = surf
transport
(funz : North = North =>
ap S2_to_TwoSphere z = ap S2_to_TwoSphere z)
(concat_pV (merid North))
(ap (ap S2_to_TwoSphere)
(ap
(funu : Susp (Susp Empty) =>
merid u @ (merid North)^)
(merid North @ (merid South)^))) = surf
transport
(funz : North = North =>
ap S2_to_TwoSphere z = ap S2_to_TwoSphere z)
(concat_pV (merid North))
(ap
(funx : Susp (Susp Empty) =>
ap S2_to_TwoSphere (merid x @ (merid North)^))
(merid North @ (merid South)^)) = surf
ap
(funx : Susp (Susp Empty) =>
ap S2_to_TwoSphere (merid x @ (merid North)^))
(merid North @ (merid South)^) @
ap (ap S2_to_TwoSphere) (concat_pV (merid North)) =
ap (ap S2_to_TwoSphere) (concat_pV (merid North)) @
surf
ap
(funx : Susp (Susp Empty) =>
ap S2_to_TwoSphere (merid x @ (merid North)^))
(merid North @ (merid South)^) @
(ap_pp S2_to_TwoSphere (merid North) (merid North)^ @
((1 @@ ap_V S2_to_TwoSphere (merid North)) @
concat_pV (ap S2_to_TwoSphere (merid North)))) =
ap (ap S2_to_TwoSphere) (concat_pV (merid North)) @
surf
ap
(funx : Susp (Susp Empty) =>
ap S2_to_TwoSphere (merid x @ (merid North)^))
(merid North @ (merid South)^) @
(ap_pp S2_to_TwoSphere (merid North) (merid North)^ @
((1 @@ ap_V S2_to_TwoSphere (merid North)) @
((Susp_rec_beta_merid North @@
inverse2 (Susp_rec_beta_merid North)) @
concat_pV
(Susp_rec 11 (Susp_rec surf 1 Empty_rec) North)))) =
ap (ap S2_to_TwoSphere) (concat_pV (merid North)) @
surf
(ap_pp S2_to_TwoSphere (merid North) (merid North)^ @
((1 @@ ap_V S2_to_TwoSphere (merid North)) @
((Susp_rec_beta_merid North @@
inverse2 (Susp_rec_beta_merid North)) @ 1))) @
ap
(funx : Sphere 1 =>
Susp_rec 11 (Susp_rec surf 1 Empty_rec) x @ 1)
(merid North @ (merid South)^) =
ap (ap S2_to_TwoSphere) (concat_pV (merid North)) @
surf
ap_pp S2_to_TwoSphere (merid North) (merid North)^ @
((1 @@ ap_V S2_to_TwoSphere (merid North)) @
((Susp_rec_beta_merid North @@
inverse2 (Susp_rec_beta_merid North)) @ 1)) =
ap (ap S2_to_TwoSphere) (concat_pV (merid North))
ap
(funx : Sphere 1 =>
Susp_rec 11 (Susp_rec surf 1 Empty_rec) x @ 1)
(merid North @ (merid South)^) = surf
ap_pp S2_to_TwoSphere (merid North) (merid North)^ @
((1 @@ ap_V S2_to_TwoSphere (merid North)) @
((Susp_rec_beta_merid North @@
inverse2 (Susp_rec_beta_merid North)) @ 1)) =
ap (ap S2_to_TwoSphere) (concat_pV (merid North))
concat_pV (merid North) @
ap
(funx : Susp (Susp Empty) =>
ap TwoSphere_to_S2
(Susp_rec 11 (Susp_rec surf 1 Empty_rec) x))
(merid x) =
(ap
(funx : Susp (Susp Empty) =>
merid x @ (merid North)^) (merid x) @
ap
(funw : Susp (Susp Empty) =>
merid w @ (merid North)^) (merid South)^) @
concat_pV (merid North)
x: Susp Empty
(ap
(funx : Susp (Susp Empty) =>
merid x @ (merid North)^) (merid x) @
ap
(funw : Susp (Susp Empty) =>
merid w @ (merid North)^) (merid South)^) @
concat_pV (merid North) =
concat_pV (merid North) @
ap
(funx : Susp (Susp Empty) =>
ap TwoSphere_to_S2
(Susp_rec 11 (Susp_rec surf 1 Empty_rec) x))
(merid x)
x: Susp Empty
transport (funx : North = North => x = x)
(concat_pV (merid North))
(ap
(funx : Susp (Susp Empty) =>
merid x @ (merid North)^) (merid x) @
ap
(funw : Susp (Susp Empty) =>
merid w @ (merid North)^) (merid South)^) =
ap
(funx : Susp (Susp Empty) =>
ap TwoSphere_to_S2
(Susp_rec 11 (Susp_rec surf 1 Empty_rec) x))
(merid x)
x: Susp Empty
transport (funx : North = North => x = x)
(concat_pV (merid North))
(ap
(funx : Susp (Susp Empty) =>
merid x @ (merid North)^)
(merid x @ (merid South)^)) =
ap
(funx : Susp (Susp Empty) =>
ap TwoSphere_to_S2
(Susp_rec 11 (Susp_rec surf 1 Empty_rec) x))
(merid x)
x: Susp Empty
transport (funx : North = North => x = x)
(concat_pV (merid North))
(ap
(funx : Susp (Susp Empty) =>
merid x @ (merid North)^)
(merid x @ (merid South)^)) =
ap (ap TwoSphere_to_S2)
(ap (Susp_rec 11 (Susp_rec surf 1 Empty_rec))
(merid x))
x: Susp Empty
transport (funx : North = North => x = x)
(concat_pV (merid North))
(ap
(funx : Susp (Susp Empty) =>
merid x @ (merid North)^)
(merid x @ (merid South)^)) =
ap02 TwoSphere_to_S2 (Susp_rec surf 1 Empty_rec x)
x: Susp Empty
ap02 TwoSphere_to_S2 (Susp_rec surf 1 Empty_rec x) =
transport (funx : North = North => x = x)
(concat_pV (merid North))
(ap
(funx : Susp (Susp Empty) =>
merid x @ (merid North)^)
(merid x @ (merid South)^))
forallx : Susp Empty,
ap02 TwoSphere_to_S2 (Susp_rec surf 1 Empty_rec x) =
transport (funx0 : North = North => x0 = x0)
(concat_pV (merid North))
(ap
(funx0 : Susp (Susp Empty) =>
merid x0 @ (merid North)^)
(merid x @ (merid South)^))
(funy : Susp Empty =>
ap02 TwoSphere_to_S2 (Susp_rec surf 1 Empty_rec y) =
transport (funx : North = North => x = x)
(concat_pV (merid North))
(ap
(funx : Susp (Susp Empty) =>
merid x @ (merid North)^)
(merid y @ (merid South)^))) North
(funy : Susp Empty =>
ap02 TwoSphere_to_S2 (Susp_rec surf 1 Empty_rec y) =
transport (funx : North = North => x = x)
(concat_pV (merid North))
(ap
(funx : Susp (Susp Empty) =>
merid x @ (merid North)^)
(merid y @ (merid South)^))) South
forallx : Empty,
transport
(funy : Susp Empty =>
ap02 TwoSphere_to_S2 (Susp_rec surf 1 Empty_rec y) =
transport (funx0 : North = North => x0 = x0)
(concat_pV (merid North))
(ap
(funx0 : Susp (Susp Empty) =>
merid x0 @ (merid North)^)
(merid y @ (merid South)^))) (merid x) ?H_N =
?H_S
(funy : Susp Empty =>
ap02 TwoSphere_to_S2 (Susp_rec surf 1 Empty_rec y) =
transport (funx : North = North => x = x)
(concat_pV (merid North))
(ap
(funx : Susp (Susp Empty) =>
merid x @ (merid North)^)
(merid y @ (merid South)^))) North
refine (TwoSphere_rec_beta_surf _ _ _).
(funy : Susp Empty =>
ap02 TwoSphere_to_S2 (Susp_rec surf 1 Empty_rec y) =
transport (funx : North = North => x = x)
(concat_pV (merid North))
(ap
(funx : Susp (Susp Empty) =>
merid x @ (merid North)^)
(merid y @ (merid South)^))) South
ap02 TwoSphere_to_S2 (Susp_rec surf 1 Empty_rec South) =
transport (funx : North = North => x = x)
(concat_pV (merid North))
(ap
(funx : Susp (Susp Empty) =>
merid x @ (merid North)^) 1)
apply isconnected_susp.Defined.(** ** Truncatedness via spheres *)(** We show here that a type is n-truncated if and only if every map from the (n+1)-sphere into it is null-homotopic. (One direction of this is of course the assertion that the (n+1)-sphere is n-connected.) *)(** TODO: re-type these lemmas in terms of truncation. *)
allnullhomot_trunc: forall (n : trunc_index)
(X : Type),
IsTrunc n X ->
forallf : Sphere n.+1 -> X,
NullHomotopy f n: trunc_index X: Type IsTrunc0: IsTrunc n X f: Sphere n.+1 -> X
NullHomotopy f
allnullhomot_trunc: forall (n : trunc_index)
(X : Type),
IsTrunc n X ->
forallf : Sphere n.+1 -> X,
NullHomotopy f n: trunc_index X: Type IsTrunc0: IsTrunc n X f: Sphere n.+1 -> X
NullHomotopy f
allnullhomot_trunc: forall (n : trunc_index)
(X : Type),
IsTrunc n X ->
forallf : Sphere n.+1 -> X,
NullHomotopy f X: Type IsTrunc0: Contr X f: Sphere (-1) -> X
NullHomotopy f
allnullhomot_trunc: forall (n : trunc_index)
(X : Type),
IsTrunc n X ->
forallf : Sphere n.+1 -> X,
NullHomotopy f n': trunc_index X: Type IsTrunc0: IsTrunc n'.+1 X f: Sphere n'.+2 -> X
NullHomotopy f
allnullhomot_trunc: forall (n : trunc_index)
(X : Type),
IsTrunc n X ->
forallf : Sphere n.+1 -> X,
NullHomotopy f X: Type IsTrunc0: Contr X f: Sphere (-1) -> X
NullHomotopy f
allnullhomot_trunc: forall (n : trunc_index)
(X : Type),
IsTrunc n X ->
forallf : Sphere n.+1 -> X,
NullHomotopy f X: Type IsTrunc0: Contr X f: Sphere (-1) -> X
forallx : Sphere (-1), f x = center X
intros [].
allnullhomot_trunc: forall (n : trunc_index)
(X : Type),
IsTrunc n X ->
forallf : Sphere n.+1 -> X,
NullHomotopy f n': trunc_index X: Type IsTrunc0: IsTrunc n'.+1 X f: Sphere n'.+2 -> X
NullHomotopy f
allnullhomot_trunc: forall (n : trunc_index)
(X : Type),
IsTrunc n X ->
forallf : Sphere n.+1 -> X,
NullHomotopy f n': trunc_index X: Type IsTrunc0: IsTrunc n'.+1 X f: Sphere n'.+2 -> X
NullHomotopy
(funx : match n' with
| -2 => Empty
| _.+1 =>
Susp
((fix Sphere
(n : trunc_index) : Type :=
match n with
| (_.+1as n').+1 => Susp (Sphere n')
| _ => Empty
end) n')
end => ap f (merid x))
apply nullhomot_paths_from_susp, HX.Defined.(** Iterated loop spaces can be described using pointed maps from spheres. The [n = 0] case of this is stated using Bool in [pmap_from_bool] above, and the [n = 1] case of this is stated using [Circle] in [pmap_from_circle_loops] in Circle.v. *)
H: Funext n: nat X: pType
(psphere n ->** X) <~>* iterated_loops n X
H: Funext n: nat X: pType
(psphere n ->** X) <~>* iterated_loops n X
H: Funext X: pType
(psphere 0 ->** X) <~>* X
H: Funext n: nat X: pType IHn: (psphere n ->** X) <~>* iterated_loops n X
(psphere n.+1 ->** X) <~>* loops (iterated_loops n X)
H: Funext X: pType
(psphere 0 ->** X) <~>* X
exact (pmap_from_bool X o*E pequiv_pequiv_precompose pequiv_S0_Bool^-1* ).
H: Funext n: nat X: pType IHn: (psphere n ->** X) <~>* iterated_loops n X
(psphere n.+1 ->** X) <~>* loops (iterated_loops n X)
H: Funext n: nat X: pType IHn: (psphere n ->** X) <~>* iterated_loops n X
(psphere n.+1 ->** X) <~>* loops (psphere n ->** X)
H: Funext n: nat X: pType IHn: (psphere n ->** X) <~>* iterated_loops n X
(psphere n ->** loops X) <~>* loops (psphere n ->** X)