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 Types.Require Import Cubical.DPath Cubical.DPathSquare.Require Import WildCat.Require Import Colimits.Pushout.Require Import Homotopy.NullHomotopy.Require Import Truncations.Core.Require Import Modalities.Modality.Require Import Extensions.(** * The suspension of a type *)Generalizable VariablesX A B f g n.LocalOpen Scope path_scope.(* ** Definition of suspension *)(** We define the suspension of a type X as the pushout of 1 <- X -> 1 *)DefinitionSusp (X : Type) := Pushout@{_ SetSet _} (const_tt X) (const_tt X).DefinitionNorth {X} : Susp X := pushl tt.DefinitionSouth {X} : Susp X := pushr tt.Definitionmerid {X} (x : X) : North = South := pglue x.(** We think of this as the HIT with two points [North] and [South] and a path [merid] between them *)(** We can derive an induction principle for the suspension *)
X: Type P: Susp X -> Type H_N: P North H_S: P South H_merid: forallx : X,
transport P (merid x) H_N = H_S
forally : Susp X, P y
X: Type P: Susp X -> Type H_N: P North H_S: P South H_merid: forallx : X,
transport P (merid x) H_N = H_S
forally : Susp X, P y
X: Type P: Susp X -> Type H_N: P North H_S: P South H_merid: forallx : X,
transport P (merid x) H_N = H_S
forallb : Unit, P (pushl b)
X: Type P: Susp X -> Type H_N: P North H_S: P South H_merid: forallx : X,
transport P (merid x) H_N = H_S
forallc : Unit, P (pushr c)
X: Type P: Susp X -> Type H_N: P North H_S: P South H_merid: forallx : X,
transport P (merid x) H_N = H_S
foralla : X,
transport P (pglue a) (?pushb (const_tt X a)) =
?pushc (const_tt X a)
X: Type P: Susp X -> Type H_N: P North H_S: P South H_merid: forallx : X,
transport P (merid x) H_N = H_S
forallb : Unit, P (pushl b)
exact (Unit_ind H_N).
X: Type P: Susp X -> Type H_N: P North H_S: P South H_merid: forallx : X,
transport P (merid x) H_N = H_S
forallc : Unit, P (pushr c)
exact (Unit_ind H_S).
X: Type P: Susp X -> Type H_N: P North H_S: P South H_merid: forallx : X,
transport P (merid x) H_N = H_S
foralla : X,
transport P (pglue a) (Unit_ind H_N (const_tt X a)) =
Unit_ind H_S (const_tt X a)
exact (H_merid).Defined.(** We can also derive the computation rule *)
X: Type P: Susp X -> Type H_N: P North H_S: P South H_merid: forallx : X,
transport P (merid x) H_N = H_S x: X
apD (Susp_ind P H_N H_S H_merid) (merid x) = H_merid x
X: Type P: Susp X -> Type H_N: P North H_S: P South H_merid: forallx : X,
transport P (merid x) H_N = H_S x: X
apD (Susp_ind P H_N H_S H_merid) (merid x) = H_merid x
srapply Pushout_ind_beta_pglue.Defined.(** We want to allow the user to forget that we've defined suspension as a pushout and make it look like it was defined directly as a HIT. This has the advantage of not having to assume any new HITs but allowing us to have conceptual clarity. *)Arguments Susp : simpl never.Arguments North : simpl never.Arguments South : simpl never.Arguments merid : simpl never.Arguments Susp_ind_beta_merid : simpl never.(** A version of [Susp_ind] specifically for proving that two functions defined on a suspension are homotopic. *)
X, Y: Type f, g: Susp X -> Y HN: f North = g North HS: f South = g South Hmerid: forallx : X,
ap f (merid x) @ HS = HN @ ap g (merid x)
f == g
X, Y: Type f, g: Susp X -> Y HN: f North = g North HS: f South = g South Hmerid: forallx : X,
ap f (merid x) @ HS = HN @ ap g (merid x)
f == g
X, Y: Type f, g: Susp X -> Y HN: f North = g North HS: f South = g South Hmerid: forallx : X,
ap f (merid x) @ HS = HN @ ap g (merid x)
forallx : X,
transport (funy : Susp X => f y = g y) (merid x) HN =
HS
X, Y: Type f, g: Susp X -> Y HN: f North = g North HS: f South = g South Hmerid: forallx : X,
ap f (merid x) @ HS = HN @ ap g (merid x) x: X
transport (funy : Susp X => f y = g y) (merid x) HN =
HS
X, Y: Type f, g: Susp X -> Y HN: f North = g North HS: f South = g South Hmerid: forallx : X,
ap f (merid x) @ HS = HN @ ap g (merid x) x: X
ap f (merid x) @ HS = HN @ ap g (merid x)
exact (Hmerid x).Defined.(** A version of [Susp_ind] specifically for proving that the composition of two functions to and from a suspension are homotopic to the identity map. *)
X, Y: Type f: Susp X -> Y g: Y -> Susp X HN: g (f North) = North HS: g (f South) = South Hmerid: forallx : X,
ap g (ap f (merid x)) @ HS = HN @ merid x
g o f == idmap
X, Y: Type f: Susp X -> Y g: Y -> Susp X HN: g (f North) = North HS: g (f South) = South Hmerid: forallx : X,
ap g (ap f (merid x)) @ HS = HN @ merid x
g o f == idmap
X, Y: Type f: Susp X -> Y g: Y -> Susp X HN: g (f North) = North HS: g (f South) = South Hmerid: forallx : X,
ap g (ap f (merid x)) @ HS = HN @ merid x
forallx : X,
transport (funy : Susp X => (g o f) y = idmap y)
(merid x) HN = HS
X, Y: Type f: Susp X -> Y g: Y -> Susp X HN: g (f North) = North HS: g (f South) = South Hmerid: forallx : X,
ap g (ap f (merid x)) @ HS = HN @ merid x x: X
transport (funy : Susp X => g (f y) = y) (merid x) HN =
HS
X, Y: Type f: Susp X -> Y g: Y -> Susp X HN: g (f North) = North HS: g (f South) = South Hmerid: forallx : X,
ap g (ap f (merid x)) @ HS = HN @ merid x x: X
ap g (ap f (merid x)) @ HS = HN @ merid x
exact (Hmerid x).Defined.
X, Y, Z: Type f: Susp X -> Y g: Y -> Z h: Susp X -> Z HN: g (f North) = h North HS: g (f South) = h South Hmerid: forallx : X,
ap g (ap f (merid x)) @ HS =
HN @ ap h (merid x)
g o f == h
X, Y, Z: Type f: Susp X -> Y g: Y -> Z h: Susp X -> Z HN: g (f North) = h North HS: g (f South) = h South Hmerid: forallx : X,
ap g (ap f (merid x)) @ HS =
HN @ ap h (merid x)
g o f == h
X, Y, Z: Type f: Susp X -> Y g: Y -> Z h: Susp X -> Z HN: g (f North) = h North HS: g (f South) = h South Hmerid: forallx : X,
ap g (ap f (merid x)) @ HS =
HN @ ap h (merid x)
forallx : X,
transport (funy : Susp X => (g o f) y = h y)
(merid x) HN = HS
X, Y, Z: Type f: Susp X -> Y g: Y -> Z h: Susp X -> Z HN: g (f North) = h North HS: g (f South) = h South Hmerid: forallx : X,
ap g (ap f (merid x)) @ HS =
HN @ ap h (merid x) x: X
transport (funy : Susp X => g (f y) = h y) (merid x)
HN = HS
X, Y, Z: Type f: Susp X -> Y g: Y -> Z h: Susp X -> Z HN: g (f North) = h North HS: g (f South) = h South Hmerid: forallx : X,
ap g (ap f (merid x)) @ HS =
HN @ ap h (merid x) x: X
ap g (ap f (merid x)) @ HS = HN @ ap h (merid x)
exact (Hmerid x).Defined.(** A version of [Susp_ind] specifically for proving a composition square from a suspension. *)
X, Y, Y', Z: Type f: Susp X -> Y f': Susp X -> Y' g: Y -> Z g': Y' -> Z HN: g (f North) = g' (f' North) HS: g (f South) = g' (f' South) Hmerid: forallx : X,
ap g (ap f (merid x)) @ HS =
HN @ ap g' (ap f' (merid x))
g o f == g' o f'
X, Y, Y', Z: Type f: Susp X -> Y f': Susp X -> Y' g: Y -> Z g': Y' -> Z HN: g (f North) = g' (f' North) HS: g (f South) = g' (f' South) Hmerid: forallx : X,
ap g (ap f (merid x)) @ HS =
HN @ ap g' (ap f' (merid x))
g o f == g' o f'
X, Y, Y', Z: Type f: Susp X -> Y f': Susp X -> Y' g: Y -> Z g': Y' -> Z HN: g (f North) = g' (f' North) HS: g (f South) = g' (f' South) Hmerid: forallx : X,
ap g (ap f (merid x)) @ HS =
HN @ ap g' (ap f' (merid x))
forallx : X,
transport (funy : Susp X => (g o f) y = (g' o f') y)
(merid x) HN = HS
X, Y, Y', Z: Type f: Susp X -> Y f': Susp X -> Y' g: Y -> Z g': Y' -> Z HN: g (f North) = g' (f' North) HS: g (f South) = g' (f' South) Hmerid: forallx : X,
ap g (ap f (merid x)) @ HS =
HN @ ap g' (ap f' (merid x)) x: X
transport (funy : Susp X => g (f y) = g' (f' y))
(merid x) HN = HS
X, Y, Y', Z: Type f: Susp X -> Y f': Susp X -> Y' g: Y -> Z g': Y' -> Z HN: g (f North) = g' (f' North) HS: g (f South) = g' (f' South) Hmerid: forallx : X,
ap g (ap f (merid x)) @ HS =
HN @ ap g' (ap f' (merid x)) x: X
ap g (ap f (merid x)) @ HS =
HN @ ap g' (ap f' (merid x))
X, Y: Type H_N, H_S: Y H_merid: X -> H_N = H_S x: X
ap (Susp_rec H_N H_S H_merid) (merid x) = H_merid x
X, Y: Type H_N, H_S: Y H_merid: X -> H_N = H_S x: X
ap (Susp_rec H_N H_S H_merid) (merid x) = H_merid x
srapply Pushout_rec_beta_pglue.Defined.
X, Y: Type H_N, H_S: Y H_merid: X -> H_N = H_S x, x': X
ap (Susp_rec H_N H_S H_merid) (merid x @ (merid x')^) =
H_merid x @ (H_merid x')^
X, Y: Type H_N, H_S: Y H_merid: X -> H_N = H_S x, x': X
ap (Susp_rec H_N H_S H_merid) (merid x @ (merid x')^) =
H_merid x @ (H_merid x')^
X, Y: Type H_N, H_S: Y H_merid: X -> H_N = H_S x, x': X
ap (Susp_rec H_N H_S H_merid) (merid x) @
(ap (Susp_rec H_N H_S H_merid) (merid x'))^ =
H_merid x @ (H_merid x')^
exact (Susp_rec_beta_merid x @@ inverse2 (Susp_rec_beta_merid x')).Defined.(** A variant of [Susp_ind_FlFr] specifically for two functions both defined using [Susp_rec]. *)
X, Y: Type N, S, N', S': Y f: X -> N = S f': X -> N' = S' p: N = N' q: S = S' H: forallx : X, f x @ q = p @ f' x
Susp_rec N S f == Susp_rec N' S' f'
X, Y: Type N, S, N', S': Y f: X -> N = S f': X -> N' = S' p: N = N' q: S = S' H: forallx : X, f x @ q = p @ f' x
Susp_rec N S f == Susp_rec N' S' f'
X, Y: Type N, S, N', S': Y f: X -> N = S f': X -> N' = S' p: N = N' q: S = S' H: forallx : X, f x @ q = p @ f' x
Susp_rec N S f North = Susp_rec N' S' f' North
X, Y: Type N, S, N', S': Y f: X -> N = S f': X -> N' = S' p: N = N' q: S = S' H: forallx : X, f x @ q = p @ f' x
Susp_rec N S f South = Susp_rec N' S' f' South
X, Y: Type N, S, N', S': Y f: X -> N = S f': X -> N' = S' p: N = N' q: S = S' H: forallx : X, f x @ q = p @ f' x
forallx : X,
ap (Susp_rec N S f) (merid x) @ ?HS =
?HN @ ap (Susp_rec N' S' f') (merid x)
X, Y: Type N, S, N', S': Y f: X -> N = S f': X -> N' = S' p: N = N' q: S = S' H: forallx : X, f x @ q = p @ f' x
Susp_rec N S f North = Susp_rec N' S' f' North
exact p.
X, Y: Type N, S, N', S': Y f: X -> N = S f': X -> N' = S' p: N = N' q: S = S' H: forallx : X, f x @ q = p @ f' x
Susp_rec N S f South = Susp_rec N' S' f' South
exact q.
X, Y: Type N, S, N', S': Y f: X -> N = S f': X -> N' = S' p: N = N' q: S = S' H: forallx : X, f x @ q = p @ f' x
forallx : X,
ap (Susp_rec N S f) (merid x) @ q =
p @ ap (Susp_rec N' S' f') (merid x)
X, Y: Type N, S, N', S': Y f: X -> N = S f': X -> N' = S' p: N = N' q: S = S' H: forallx : X, f x @ q = p @ f' x x: X
ap (Susp_rec N S f) (merid x) @ q =
p @ ap (Susp_rec N' S' f') (merid x)
X, Y: Type N, S, N', S': Y f: X -> N = S f': X -> N' = S' p: N = N' q: S = S' H: forallx : X, f x @ q = p @ f' x x: X
f x @ q = p @ ap (Susp_rec N' S' f') (merid x)
X, Y: Type N, S, N', S': Y f: X -> N = S f': X -> N' = S' p: N = N' q: S = S' H: forallx : X, f x @ q = p @ f' x x: X
f x @ q = p @ f' x
apply H.Defined.(** And the special case where the two functions agree definitionally on [North] and [South]. *)
X, Y: Type N, S: Y f, g: X -> N = S H: f == g
Susp_rec N S f == Susp_rec N S g
X, Y: Type N, S: Y f, g: X -> N = S H: f == g
Susp_rec N S f == Susp_rec N S g
X, Y: Type N, S: Y f, g: X -> N = S H: f == g
N = N
X, Y: Type N, S: Y f, g: X -> N = S H: f == g
S = S
X, Y: Type N, S: Y f, g: X -> N = S H: f == g
forallx : X, f x @ ?q = ?p @ g x
X, Y: Type N, S: Y f, g: X -> N = S H: f == g
forallx : X, f x @ 1 = 1 @ g x
intro x; apply equiv_p1_1q, H.Defined.(** ** Eta-rule. *)(** The eta-rule for suspension states that any function out of a suspension is equal to one defined by [Susp_ind] in the obvious way. We give it first in a weak form, producing just a pointwise equality, and then turn this into an actual equality using [Funext]. *)
X: Type P: Susp X -> Type f: forally : Susp X, P y
f ==
Susp_ind P (f North) (f South)
(funx : X => apD f (merid x))
X: Type P: Susp X -> Type f: forally : Susp X, P y
f ==
Susp_ind P (f North) (f South)
(funx : X => apD f (merid x))
X: Type P: Susp X -> Type f: forally : Susp X, P y
forallx : Susp X,
f x =
Susp_ind P (f North) (f South)
(funx0 : X => apD f (merid x0)) x
X: Type P: Susp X -> Type f: forally : Susp X, P y
forallx : X,
transport
(funy : Susp X =>
f y =
Susp_ind P (f North) (f South)
(funx0 : X => apD f (merid x0)) y) (merid x) 1 =
1
X: Type P: Susp X -> Type f: forally : Susp X, P y x: X
transport
(funy : Susp X =>
f y =
Susp_ind P (f North) (f South)
(funx : X => apD f (merid x)) y) (merid x) 1 = 1
X: Type P: Susp X -> Type f: forally : Susp X, P y x: X
((apD f (merid x))^ @ 1) @
apD
(Susp_ind P (f North) (f South)
(funx : X => apD f (merid x))) (merid x) = 1
X: Type P: Susp X -> Type f: forally : Susp X, P y x: X
(apD f (merid x))^ @ 1 =
1 @
(apD
(Susp_ind P (f North) (f South)
(funx : X => apD f (merid x))) (merid x))^
X: Type P: Susp X -> Type f: forally : Susp X, P y x: X
(apD f (merid x))^ =
(apD
(Susp_ind P (f North) (f South)
(funx : X => apD f (merid x))) (merid x))^
X: Type P: Susp X -> Type f: forally : Susp X, P y x: X
apD
(Susp_ind P (f North) (f South)
(funx : X => apD f (merid x))) (merid x) =
apD f (merid x)
exact (Susp_ind_beta_merid _ _ _ _ _).Defined.
X, Y: Type f: Susp X -> Y
f ==
Susp_rec (f North) (f South)
(funx : X => ap f (merid x))
X, Y: Type f: Susp X -> Y
f ==
Susp_rec (f North) (f South)
(funx : X => ap f (merid x))
X, Y: Type f: Susp X -> Y
f North =
Susp_rec (f North) (f South)
(funx : X => ap f (merid x)) North
X, Y: Type f: Susp X -> Y
f South =
Susp_rec (f North) (f South)
(funx : X => ap f (merid x)) South
X, Y: Type f: Susp X -> Y
forallx : X,
ap f (merid x) @ ?HS =
?HN @
ap
(Susp_rec (f North) (f South)
(funx0 : X => ap f (merid x0))) (merid x)
X, Y: Type f: Susp X -> Y
forallx : X,
ap f (merid x) @ 1 =
1 @
ap
(Susp_rec (f North) (f South)
(funx0 : X => ap f (merid x0))) (merid x)
X, Y: Type f: Susp X -> Y x: X
ap f (merid x) @ 1 =
1 @
ap
(Susp_rec (f North) (f South)
(funx : X => ap f (merid x))) (merid x)
X, Y: Type f: Susp X -> Y x: X
ap f (merid x) =
ap
(Susp_rec (f North) (f South)
(funx : X => ap f (merid x))) (merid x)
exact (Susp_rec_beta_merid _)^.Defined.DefinitionSusp_ind_eta `{Funext}
{X : Type} {P : Susp X -> Type} (f : forally, P y)
: f = Susp_ind P (f North) (f South) (funx => apD f (merid x))
:= path_forall _ _ (Susp_ind_eta_homotopic f).DefinitionSusp_rec_eta `{Funext} {X Y : Type} (f : Susp X -> Y)
: f = Susp_rec (f North) (f South) (funx => ap f (merid x))
:= path_forall _ _ (Susp_rec_eta_homotopic f).(** ** Functoriality *)
X, Y: Type f: X -> Y
Susp X -> Susp Y
X, Y: Type f: X -> Y
Susp X -> Susp Y
X, Y: Type f: X -> Y
Susp Y
X, Y: Type f: X -> Y
Susp Y
X, Y: Type f: X -> Y
X -> ?H_N = ?H_S
X, Y: Type f: X -> Y
Susp Y
exact North.
X, Y: Type f: X -> Y
Susp Y
exact South.
X, Y: Type f: X -> Y
X -> North = South
intros x; exact (merid (f x)).Defined.
X, Y: Type f: X -> Y x: X
ap (functor_susp f) (merid x) = merid (f x)
X, Y: Type f: X -> Y x: X
ap (functor_susp f) (merid x) = merid (f x)
srapply Susp_rec_beta_merid.Defined.
X, Y, Z: Type f: X -> Y g: Y -> Z
functor_susp (g o f) ==
functor_susp g o functor_susp f
X, Y, Z: Type f: X -> Y g: Y -> Z
functor_susp (g o f) ==
functor_susp g o functor_susp f
X, Y, Z: Type f: X -> Y g: Y -> Z
functor_susp (g o f) North =
(funx : Susp X => functor_susp g (functor_susp f x))
North
X, Y, Z: Type f: X -> Y g: Y -> Z
functor_susp (g o f) South =
(funx : Susp X => functor_susp g (functor_susp f x))
South
X, Y, Z: Type f: X -> Y g: Y -> Z
forallx : X,
ap (functor_susp (g o f)) (merid x) @ ?HS =
?HN @
ap
(funx0 : Susp X =>
functor_susp g (functor_susp f x0)) (merid x)
X, Y, Z: Type f: X -> Y g: Y -> Z
forallx : X,
ap (functor_susp (g o f)) (merid x) @ 1 =
1 @
ap
(funx0 : Susp X =>
functor_susp g (functor_susp f x0)) (merid x)
X, Y, Z: Type f: X -> Y g: Y -> Z x: X
ap (functor_susp (g o f)) (merid x) @ 1 =
1 @
ap
(funx : Susp X => functor_susp g (functor_susp f x))
(merid x)
X, Y, Z: Type f: X -> Y g: Y -> Z x: X
ap (functor_susp (funx : X => g (f x))) (merid x) =
ap
(funx : Susp X => functor_susp g (functor_susp f x))
(merid x)
X, Y, Z: Type f: X -> Y g: Y -> Z x: X
ap
(funx : Susp X => functor_susp g (functor_susp f x))
(merid x) = merid (g (f x))
X, Y, Z: Type f: X -> Y g: Y -> Z x: X
ap (functor_susp g) (ap (functor_susp f) (merid x)) =
merid (g (f x))
(Susp X -> Y) <~> {NS : Y * Y & X -> fst NS = snd NS}
H: Funext X, Y: Type
(Susp X -> Y) <~> {NS : Y * Y & X -> fst NS = snd NS}
H: Funext X, Y: Type
(Susp X -> Y) -> {NS : Y * Y & X -> fst NS = snd NS}
H: Funext X, Y: Type
{NS : Y * Y & X -> fst NS = snd NS} -> Susp X -> Y
H: Funext X, Y: Type
?f o ?g == idmap
H: Funext X, Y: Type
?g o ?f == idmap
H: Funext X, Y: Type
(Susp X -> Y) -> {NS : Y * Y & X -> fst NS = snd NS}
H: Funext X, Y: Type f: Susp X -> Y
{NS : Y * Y & X -> fst NS = snd NS}
H: Funext X, Y: Type f: Susp X -> Y
X -> fst (f North, f South) = snd (f North, f South)
intros x; exact (ap f (merid x)).
H: Funext X, Y: Type
{NS : Y * Y & X -> fst NS = snd NS} -> Susp X -> Y
H: Funext X, Y: Type N, S: Y m: X -> fst (N, S) = snd (N, S)
Susp X -> Y
exact (Susp_rec N S m).
H: Funext X, Y: Type
(funf : Susp X -> Y =>
((f North, f South); funx : X => ap f (merid x)))
o (funX0 : {NS : Y * Y & X -> fst NS = snd NS} =>
(funproj1 : Y * Y =>
(fun (NS : Y) (m : X -> fst (N, S) = snd (N, S))
=> Susp_rec N S m) (fst proj1) (snd proj1)) X0.1
X0.2) == idmap
H: Funext X, Y: Type N, S: Y m: X -> fst (N, S) = snd (N, S)
((Susp_rec N S m North, Susp_rec N S m South);
funx : X => ap (Susp_rec N S m) (merid x)) =
((N, S); m)
H: Funext X, Y: Type N, S: Y m: X -> fst (N, S) = snd (N, S)
(funx : X => ap (Susp_rec N S m) (merid x)) == m
intros x; apply Susp_rec_beta_merid.
H: Funext X, Y: Type
(funX0 : {NS : Y * Y & X -> fst NS = snd NS} =>
(funproj1 : Y * Y =>
(fun (NS : Y) (m : X -> fst (N, S) = snd (N, S)) =>
Susp_rec N S m) (fst proj1) (snd proj1)) X0.1 X0.2)
o (funf : Susp X -> Y =>
((f North, f South); funx : X => ap f (merid x))) ==
idmap
H: Funext X, Y: Type f: Susp X -> Y
Susp_rec (f North) (f South)
(funx : X => ap f (merid x)) = f
symmetry; apply Susp_rec_eta.Defined.(** Using wild 0-groupoids, the universal property can be proven without funext. A simple equivalence of 0-groupoids between [Susp X -> Y] and [{ NS : Y * Y & X -> fst NS = snd NS }] would not carry all the higher-dimensional information, but if we generalize it to dependent functions, then it does suffice. *)SectionUnivProp.Context (X : Type) (P : Susp X -> Type).(** Here is the domain of the equivalence: sections of [P] over [Susp X]. *)DefinitionSusp_ind_type := forallz:Susp X, P z.(** [isgraph_paths] is not a global instance, so we define this by hand. The fact that this is a 01cat and a 0gpd is obtained using global instances. *)
X: Type P: Susp X -> Type
IsGraph Susp_ind_type
X: Type P: Susp X -> Type
IsGraph Susp_ind_type
apply isgraph_forall; intros; apply isgraph_paths.Defined.(** The codomain is a sigma-groupoid of this family, consisting of input data for [Susp_ind]. *)DefinitionSusp_ind_data' (NS : P North * P South)
:= forallx:X, DPath P (merid x) (fst NS) (snd NS).(** Again, the rest of the wild category structure is obtained using global instances. *)
X: Type P: Susp X -> Type NS: P North * P South
IsGraph (Susp_ind_data' NS)
X: Type P: Susp X -> Type NS: P North * P South
IsGraph (Susp_ind_data' NS)
apply isgraph_forall; intros; apply isgraph_paths.Defined.(** Here is the codomain itself. This is a 01cat and a 0gpd via global instances. *)DefinitionSusp_ind_data := sig Susp_ind_data'.(** Here is the functor. *)
X: Type P: Susp X -> Type
Susp_ind_type -> Susp_ind_data
X: Type P: Susp X -> Type
Susp_ind_type -> Susp_ind_data
X: Type P: Susp X -> Type f: Susp_ind_type
Susp_ind_data
X: Type P: Susp X -> Type f: Susp_ind_type
Susp_ind_data' (f North, f South)
X: Type P: Susp X -> Type f: Susp_ind_type x: X
DPath P (merid x) (fst (f North, f South))
(snd (f North, f South))
exact (apD f (merid x)).Defined.
X: Type P: Susp X -> Type
Is0Functor Susp_ind_inv
X: Type P: Susp X -> Type
Is0Functor Susp_ind_inv
X: Type P: Susp X -> Type
forallab : forallz : Susp X, P z,
(foralla0 : Susp X, a a0 = b a0) ->
{p : (a North, a South) = (b North, b South) &
foralla0 : X,
transport Susp_ind_data' p
(funx : X => apD a (merid x)) a0 = apD b (merid a0)}
X: Type P: Susp X -> Type f, g: forallz : Susp X, P z p: foralla : Susp X, f a = g a
{p : (f North, f South) = (g North, g South) &
foralla : X,
transport Susp_ind_data' p
(funx : X => apD f (merid x)) a = apD g (merid a)}
X: Type P: Susp X -> Type f, g: forallz : Susp X, P z p: foralla : Susp X, f a = g a
(f North, f South) = (g North, g South)
X: Type P: Susp X -> Type f, g: forallz : Susp X, P z p: foralla : Susp X, f a = g a
foralla : X,
transport Susp_ind_data' ?p
(funx : X => apD f (merid x)) a = apD g (merid a)
X: Type P: Susp X -> Type f, g: forallz : Susp X, P z p: foralla : Susp X, f a = g a
(f North, f South) = (g North, g South)
apply path_prod; apply p.
X: Type P: Susp X -> Type f, g: forallz : Susp X, P z p: foralla : Susp X, f a = g a
foralla : X,
transport Susp_ind_data'
(path_prod (f North, f South) (g North, g South)
(p North) (p South))
(funx : X => apD f (merid x)) a = apD g (merid a)
X: Type P: Susp X -> Type f, g: forallz : Susp X, P z p: foralla : Susp X, f a = g a x: X
transport Susp_ind_data'
(path_prod (f North, f South) (g North, g South)
(p North) (p South))
(funx : X => apD f (merid x)) x = apD g (merid x)
X: Type P: Susp X -> Type f, g: forallz : Susp X, P z p: foralla : Susp X, f a = g a x: X
transport
(funx0 : P North =>
transport P (merid x) x0 = g South) (p North)
(transport
(funx0 : P South =>
transport P (merid x) (f North) = x0) (p South)
(apD f (merid x))) = apD g (merid x)
X: Type P: Susp X -> Type f, g: forallz : Susp X, P z p: foralla : Susp X, f a = g a x: X
DPathSquare P (PathSquare.sq_refl_h (merid x))
(apD f (merid x)) (apD g (merid x)) (p North)
(p South)
exact (dp_apD_nat p (merid x)).Defined.(** And now we can prove that it's an equivalence of 0-groupoids, using the definition from WildCat/EquivGpd. *)
X: Type P: Susp X -> Type
IsSurjInj Susp_ind_inv
X: Type P: Susp X -> Type
IsSurjInj Susp_ind_inv
X: Type P: Susp X -> Type
SplEssSurj Susp_ind_inv
X: Type P: Susp X -> Type
forallxy : Susp_ind_type,
Susp_ind_inv x $== Susp_ind_inv y -> x $== y
X: Type P: Susp X -> Type
SplEssSurj Susp_ind_inv
X: Type P: Susp X -> Type n: P North s: P South g: Susp_ind_data' (n, s)
{a : Susp_ind_type & Susp_ind_inv a $== ((n, s); g)}
X: Type P: Susp X -> Type n: P North s: P South g: Susp_ind_data' (n, s)
{p
: (Susp_ind P n s g North, Susp_ind P n s g South) =
(n, s) &
foralla : X,
transport Susp_ind_data' p
(funx : X => apD (Susp_ind P n s g) (merid x)) a =
g a}
X: Type P: Susp X -> Type n: P North s: P South g: Susp_ind_data' (n, s)
foralla : X,
transport Susp_ind_data' 1
(funx : X => apD (Susp_ind P n s g) (merid x)) a =
g a
X: Type P: Susp X -> Type n: P North s: P South g: Susp_ind_data' (n, s) x: X
apD (Susp_ind P n s g) (merid x) = g x
apply Susp_ind_beta_merid.
X: Type P: Susp X -> Type
forallxy : Susp_ind_type,
Susp_ind_inv x $== Susp_ind_inv y -> x $== y
X: Type P: Susp X -> Type f, g: Susp_ind_type p: (f North, f South) = (g North, g South) q: foralla : X,
transport Susp_ind_data' p
(funx : X => apD f (merid x)) a =
apD g (merid a)
foralla : Susp X, f a = g a
X: Type P: Susp X -> Type f, g: Susp_ind_type p: (f North, f South) = (g North, g South) q: foralla : X,
transport Susp_ind_data' p
(funx : X => apD f (merid x)) a =
apD g (merid a)
f North = g North
X: Type P: Susp X -> Type f, g: Susp_ind_type p: (f North, f South) = (g North, g South) q: foralla : X,
transport Susp_ind_data' p
(funx : X => apD f (merid x)) a =
apD g (merid a)
f South = g South
X: Type P: Susp X -> Type f, g: Susp_ind_type p: (f North, f South) = (g North, g South) q: foralla : X,
transport Susp_ind_data' p
(funx : X => apD f (merid x)) a =
apD g (merid a)
forallx : X,
transport (funy : Susp X => f y = g y) (merid x)
?Goal = ?Goal0
X: Type P: Susp X -> Type f, g: Susp_ind_type p: (f North, f South) = (g North, g South) q: foralla : X,
transport Susp_ind_data' p
(funx : X => apD f (merid x)) a =
apD g (merid a)
f South = g South
X: Type P: Susp X -> Type f, g: Susp_ind_type p: (f North, f South) = (g North, g South) q: foralla : X,
transport Susp_ind_data' p
(funx : X => apD f (merid x)) a =
apD g (merid a)
forallx : X,
transport (funy : Susp X => f y = g y) (merid x)
(ap fst p) = ?Goal
X: Type P: Susp X -> Type f, g: Susp_ind_type p: (f North, f South) = (g North, g South) q: foralla : X,
transport Susp_ind_data' p
(funx : X => apD f (merid x)) a =
apD g (merid a)
forallx : X,
transport (funy : Susp X => f y = g y) (merid x)
(ap fst p) = ap snd p
X: Type P: Susp X -> Type f, g: Susp_ind_type p: (f North, f South) = (g North, g South) x: X q: transport Susp_ind_data' p
(funx : X => apD f (merid x)) x =
apD g (merid x)
transport (funy : Susp X => f y = g y) (merid x)
(ap fst p) = ap snd p
X: Type P: Susp X -> Type f, g: Susp_ind_type p: (f North, f South) = (g North, g South) x: X q: transport Susp_ind_data' p
(funx : X => apD f (merid x)) x =
apD g (merid x)
DPathSquare P (PathSquare.sq_refl_h (merid x))
(apD f (merid x)) (apD g (merid x)) (ap fst p)
(ap snd p)
X: Type P: Susp X -> Type f, g: Susp_ind_type p: (f North, f South) = (g North, g South) x: X q: transport Susp_ind_data' p
(funx : X => apD f (merid x)) x =
apD g (merid x)
transport
(funy : P North => DPath P (merid x) y (g South))
(ap fst p)
(transport
(funy : P South => DPath P (merid x) (f North) y)
(ap snd p) (apD f (merid x))) = apD g (merid x)
X: Type P: Susp X -> Type f, g: Susp_ind_type p: (f North, f South) = (g North, g South) x: X q: transport
(funx0 : P North * P South =>
DPath P (merid x) (fst x0) (snd x0)) p
(apD f (merid x)) = apD g (merid x)
transport
(funy : P North => DPath P (merid x) y (g South))
(ap fst p)
(transport
(funy : P South => DPath P (merid x) (f North) y)
(ap snd p) (apD f (merid x))) = apD g (merid x)
X: Type P: Susp X -> Type f, g: Susp_ind_type p: (f North, f South) = (g North, g South) x: X q: transport
(funx0 : P North * P South =>
DPath P (merid x) (fst x0) (snd x0))
(path_prod (f North, f South) (g North, g South)
(ap fst p) (ap snd p)) (apD f (merid x)) =
apD g (merid x)
transport
(funy : P North => DPath P (merid x) y (g South))
(ap fst p)
(transport
(funy : P South => DPath P (merid x) (f North) y)
(ap snd p) (apD f (merid x))) = apD g (merid x)
X: Type P: Susp X -> Type f, g: Susp_ind_type p: (f North, f South) = (g North, g South) x: X q: transport
(funx0 : P North =>
DPath P (merid x)
(fst (x0, snd (g North, g South)))
(snd (x0, snd (g North, g South))))
(ap fst p)
(transport
(funy : P South =>
DPath P (merid x)
(fst (fst (f North, f South), y))
(snd (fst (f North, f South), y)))
(ap snd p) (apD f (merid x))) =
apD g (merid x)
transport
(funy : P North => DPath P (merid x) y (g South))
(ap fst p)
(transport
(funy : P South => DPath P (merid x) (f North) y)
(ap snd p) (apD f (merid x))) = apD g (merid x)
exact q.Defined.EndUnivProp.(** The full non-funext version of the universal property should be formulated with respect to a notion of "wild hom-oo-groupoid", which we don't currently have. However, we can deduce statements about full higher universal properties that we do have, for instance the statement that a type is local for [functor_susp f] -- expressed in terms of [ooExtendableAlong] -- if and only if all its identity types are local for [f]. (We will use this in [Modalities.Localization] for separated subuniverses.) To prove this, we again generalize it to the case of dependent types, starting with naturality of the above 0-dimensional universal property. *)SectionUnivPropNat.(** We will show that [Susp_ind_inv] for [X] and [Y] commute with precomposition with [f] and [functor_susp f]. *)Context {XY : Type} (f : X -> Y) (P : Susp Y -> Type).(** We recall these instances from the previous section. *)Local Existing Instances isgraph_Susp_ind_type isgraph_Susp_ind_data'.(** Here is an intermediate family of groupoids that we have to use, since precomposition with [f] doesn't land in quite the right place. *)DefinitionSusp_ind_data'' (NS : P North * P South)
:= forallx:X, DPath P (merid (f x)) (fst NS) (snd NS).(** This is a 01cat and a 0gpd via global instances. *)
X, Y: Type f: X -> Y P: Susp Y -> Type NS: P North * P South
IsGraph (Susp_ind_data'' NS)
X, Y: Type f: X -> Y P: Susp Y -> Type NS: P North * P South
IsGraph (Susp_ind_data'' NS)
apply isgraph_forall; intros; apply isgraph_paths.Defined.(** We decompose "precomposition with [f]" into a functor_sigma of two fiberwise functors. Here is the first. *)Definitionfunctor_Susp_ind_data'' (NS : P North * P South)
: Susp_ind_data' Y P NS -> Susp_ind_data'' NS
:= fungx => g (f x).
X, Y: Type f: X -> Y P: Susp Y -> Type NS: P North * P South
Is0Functor (functor_Susp_ind_data'' NS)
X, Y: Type f: X -> Y P: Susp Y -> Type NS: P North * P South
Is0Functor (functor_Susp_ind_data'' NS)
X, Y: Type f: X -> Y P: Susp Y -> Type NS: P North * P South
forallab : Susp_ind_data' Y P NS,
(a $-> b) ->
functor_Susp_ind_data'' NS a $->
functor_Susp_ind_data'' NS b
X, Y: Type f: X -> Y P: Susp Y -> Type NS: P North * P South g, h: Susp_ind_data' Y P NS p: g $-> h a: X
functor_Susp_ind_data'' NS g a $->
functor_Susp_ind_data'' NS h a
exact (p (f a)).Defined.(** And here is the second. This one is actually a fiberwise equivalence of types at each [x]. *)
X, Y: Type f: X -> Y P: Susp Y -> Type NS: P North * P South x: X
X, Y: Type f: X -> Y P: Susp Y -> Type NS: P North * P South x: X
DPath P (merid (f x)) (fst NS) (snd NS) <~> ?Goal
X, Y: Type f: X -> Y P: Susp Y -> Type NS: P North * P South x: X
merid (f x) = ?Goal0
symmetry; apply functor_susp_beta_merid.
X, Y: Type f: X -> Y P: Susp Y -> Type NS: P North * P South x: X
DPath P (ap (functor_susp f) (merid x)) (fst NS)
(snd NS) <~>
DPath (P o functor_susp f) (merid x) (fst NS) (snd NS)
X, Y: Type f: X -> Y P: Susp Y -> Type NS: P North * P South x: X
DPath (P o functor_susp f) (merid x) (fst NS) (snd NS) <~>
DPath P (ap (functor_susp f) (merid x)) (fst NS)
(snd NS)
exact (dp_compose (functor_susp f) P (merid x)).Defined.
X, Y: Type f: X -> Y P: Susp Y -> Type NS: P North * P South
Susp_ind_data'' NS ->
Susp_ind_data' X (P o functor_susp f) NS
X, Y: Type f: X -> Y P: Susp Y -> Type NS: P North * P South
Susp_ind_data'' NS ->
Susp_ind_data' X (P o functor_susp f) NS
X, Y: Type f: X -> Y P: Susp Y -> Type NS: P North * P South x: X
(funa : X => DPath P (merid (f a)) (fst NS) (snd NS))
(idmap x) ->
(funb : X =>
DPath (P o functor_susp f) (merid b) (fst NS)
(snd NS)) x
apply equiv_Susp_ind_data'.Defined.
X, Y: Type f: X -> Y P: Susp Y -> Type NS: P North * P South
Is0Functor (functor_Susp_ind_data' NS)
X, Y: Type f: X -> Y P: Susp Y -> Type NS: P North * P South
Is0Functor (functor_Susp_ind_data' NS)
X, Y: Type f: X -> Y P: Susp Y -> Type NS: P North * P South
forallab : Susp_ind_data'' NS,
(a $-> b) ->
functor_Susp_ind_data' NS a $->
functor_Susp_ind_data' NS b
X, Y: Type f: X -> Y P: Susp Y -> Type NS: P North * P South g, h: Susp_ind_data'' NS q: g $-> h x: X
functor_Susp_ind_data' NS g x $->
functor_Susp_ind_data' NS h x
X, Y: Type f: X -> Y P: Susp Y -> Type NS: P North * P South g, h: Susp_ind_data'' NS q: g $-> h x: X
g x = h x
exact (q x).Defined.(** And therefore a fiberwise equivalence of 0-groupoids. *)
X, Y: Type f: X -> Y P: Susp Y -> Type NS: P North * P South
IsSurjInj (functor_Susp_ind_data' NS)
X, Y: Type f: X -> Y P: Susp Y -> Type NS: P North * P South
IsSurjInj (functor_Susp_ind_data' NS)
X, Y: Type f: X -> Y P: Susp Y -> Type NS: P North * P South
SplEssSurj (functor_Susp_ind_data' NS)
X, Y: Type f: X -> Y P: Susp Y -> Type NS: P North * P South
forallxy : Susp_ind_data'' NS,
functor_Susp_ind_data' NS x $==
functor_Susp_ind_data' NS y -> x $== y
X, Y: Type f: X -> Y P: Susp Y -> Type NS: P North * P South
SplEssSurj (functor_Susp_ind_data' NS)
X, Y: Type f: X -> Y P: Susp Y -> Type NS: P North * P South g: Susp_ind_data' X
(funx : Susp X => P (functor_susp f x)) NS
{a : Susp_ind_data'' NS &
functor_Susp_ind_data' NS a $== g}
X, Y: Type f: X -> Y P: Susp Y -> Type NS: P North * P South g: Susp_ind_data' X
(funx : Susp X => P (functor_susp f x)) NS
Susp_ind_data'' NS
X, Y: Type f: X -> Y P: Susp Y -> Type NS: P North * P South g: Susp_ind_data' X
(funx : Susp X => P (functor_susp f x)) NS
functor_Susp_ind_data' NS ?a $== g
X, Y: Type f: X -> Y P: Susp Y -> Type NS: P North * P South g: Susp_ind_data' X
(funx : Susp X => P (functor_susp f x)) NS
Susp_ind_data'' NS
X, Y: Type f: X -> Y P: Susp Y -> Type NS: P North * P South g: Susp_ind_data' X
(funx : Susp X => P (functor_susp f x)) NS x: X
DPath P (merid (f x)) (fst NS) (snd NS)
X, Y: Type f: X -> Y P: Susp Y -> Type NS: P North * P South g: Susp_ind_data' X
(funx : Susp X => P (functor_susp f x)) NS x: X
DPath (funx : Susp X => P (functor_susp f x))
(merid x) (fst NS) (snd NS)
exact (g x).
X, Y: Type f: X -> Y P: Susp Y -> Type NS: P North * P South g: Susp_ind_data' X
(funx : Susp X => P (functor_susp f x)) NS
functor_Susp_ind_data' NS
((funx : X => (equiv_Susp_ind_data' NS x)^-1 (g x))
:
Susp_ind_data'' NS) $== g
X, Y: Type f: X -> Y P: Susp Y -> Type NS: P North * P South g: Susp_ind_data' X
(funx : Susp X => P (functor_susp f x)) NS x: X
functor_Susp_ind_data' NS
(funx : X => (equiv_Susp_ind_data' NS x)^-1 (g x))
x $-> g x
apply eisretr.
X, Y: Type f: X -> Y P: Susp Y -> Type NS: P North * P South
forallxy : Susp_ind_data'' NS,
functor_Susp_ind_data' NS x $==
functor_Susp_ind_data' NS y -> x $== y
X, Y: Type f: X -> Y P: Susp Y -> Type NS: P North * P South g, h: Susp_ind_data'' NS p: functor_Susp_ind_data' NS g $==
functor_Susp_ind_data' NS h x: X
g x $-> h x
X, Y: Type f: X -> Y P: Susp Y -> Type NS: P North * P South g, h: Susp_ind_data'' NS p: functor_Susp_ind_data' NS g $==
functor_Susp_ind_data' NS h x: X
equiv_Susp_ind_data' NS x (g x) =
equiv_Susp_ind_data' NS x (h x)
exact (p x).Defined.(** Now we put them together. *)Definitionfunctor_Susp_ind_data
: Susp_ind_data Y P -> Susp_ind_data X (P o functor_susp f)
:= funNSg => (NSg.1 ; (functor_Susp_ind_data' NSg.1 o
(functor_Susp_ind_data'' NSg.1)) NSg.2).
X, Y: Type f: X -> Y P: Susp Y -> Type
Is0Functor functor_Susp_ind_data
X, Y: Type f: X -> Y P: Susp Y -> Type
Is0Functor functor_Susp_ind_data
exact (is0functor_sigma _ _
(funNS => functor_Susp_ind_data' NS o functor_Susp_ind_data'' NS)).Defined.(** Here is the "precomposition with [functor_susp f]" functor. *)Definitionfunctor_Susp_ind_type
: Susp_ind_type Y P -> Susp_ind_type X (P o functor_susp f)
:= fung => g o functor_susp f.
X, Y: Type f: X -> Y P: Susp Y -> Type
Is0Functor functor_Susp_ind_type
X, Y: Type f: X -> Y P: Susp Y -> Type
Is0Functor functor_Susp_ind_type
X, Y: Type f: X -> Y P: Susp Y -> Type
forallab : Susp_ind_type Y P,
(a $-> b) ->
functor_Susp_ind_type a $-> functor_Susp_ind_type b
X, Y: Type f: X -> Y P: Susp Y -> Type g, h: Susp_ind_type Y P p: g $-> h a: Susp X
functor_Susp_ind_type g a $->
functor_Susp_ind_type h a
exact (p (functor_susp f a)).Defined.(** And here is the desired naturality square. *)
X, Y: Type f: X -> Y P: Susp Y -> Type
Susp_ind_inv X (P o functor_susp f)
o functor_Susp_ind_type $=>
functor_Susp_ind_data o Susp_ind_inv Y P
X, Y: Type f: X -> Y P: Susp Y -> Type
Susp_ind_inv X (P o functor_susp f)
o functor_Susp_ind_type $=>
functor_Susp_ind_data o Susp_ind_inv Y P
X, Y: Type f: X -> Y P: Susp Y -> Type g: Susp_ind_type Y P x: X
transport
(Susp_ind_data' X
(funx : Susp X => P (functor_susp f x))) 1
(Susp_ind_inv X
(funx : Susp X => P (functor_susp f x))
(functor_Susp_ind_type g)).2 x $->
(functor_Susp_ind_data (Susp_ind_inv Y P g)).2 x
X, Y: Type f: X -> Y P: Susp Y -> Type g: Susp_ind_type Y P x: X
apD (funx0 : Susp X => g (functor_susp f x0))
(merid x) =
(functor_Susp_ind_data (Susp_ind_inv Y P g)).2 x
X, Y: Type f: X -> Y P: Susp Y -> Type g: Susp_ind_type Y P x: X
(dp_compose (functor_susp f) P (merid x))^-1
(apD g (ap (functor_susp f) (merid x))) =
(functor_Susp_ind_data (Susp_ind_inv Y P g)).2 x
X, Y: Type f: X -> Y P: Susp Y -> Type g: Susp_ind_type Y P x: X
apD g (ap (functor_susp f) (merid x)) =
transport
(funp : North = South =>
transport P p (g North) = g South)
(functor_susp_beta_merid f x)^ (apD g (merid (f x)))
X, Y: Type f: X -> Y P: Susp Y -> Type g: Susp_ind_type Y P x: X
transport
(funp : North = South =>
DPath P p (g North) (g South))
(functor_susp_beta_merid f x)
(apD g (ap (functor_susp f) (merid x))) =
apD g (merid (f x))
exact (apD (apD g) (functor_susp_beta_merid f x)).Defined.(** From this we can deduce a equivalence between extendability, which is definitionally equal to split essential surjectivity of a functor between forall 0-groupoids. *)
X, Y: Type f: X -> Y P: Susp Y -> Type
(forallg : forallx : Susp X, P (functor_susp f x),
ExtensionAlong (functor_susp f) P g) <->
(forall (NS : P North * P South)
(g : forallx : X,
(funx0 : Y =>
DPath P (merid x0) (fst NS) (snd NS)) (f x)),
ExtensionAlong f
(funx : Y => DPath P (merid x) (fst NS) (snd NS))
g)
X, Y: Type f: X -> Y P: Susp Y -> Type
(forallg : forallx : Susp X, P (functor_susp f x),
ExtensionAlong (functor_susp f) P g) <->
(forall (NS : P North * P South)
(g : forallx : X,
(funx0 : Y =>
DPath P (merid x0) (fst NS) (snd NS)) (f x)),
ExtensionAlong f
(funx : Y => DPath P (merid x) (fst NS) (snd NS))
g)
(** The proof is by chaining logical equivalences. *)
X, Y: Type f: X -> Y P: Susp Y -> Type
(forallg : forallx : Susp X, P (functor_susp f x),
ExtensionAlong (functor_susp f) P g) <->
SplEssSurj functor_Susp_ind_type
X, Y: Type f: X -> Y P: Susp Y -> Type
SplEssSurj functor_Susp_ind_type <->
(forall (NS : P North * P South)
(g : forallx : X,
(funx0 : Y =>
DPath P (merid x0) (fst NS) (snd NS)) (f x)),
ExtensionAlong f
(funx : Y => DPath P (merid x) (fst NS) (snd NS))
g)
X, Y: Type f: X -> Y P: Susp Y -> Type
(forallg : forallx : Susp X, P (functor_susp f x),
ExtensionAlong (functor_susp f) P g) <->
SplEssSurj functor_Susp_ind_type
reflexivity.
X, Y: Type f: X -> Y P: Susp Y -> Type
SplEssSurj functor_Susp_ind_type <->
(forall (NS : P North * P South)
(g : forallx : X,
(funx0 : Y =>
DPath P (merid x0) (fst NS) (snd NS)) (f x)),
ExtensionAlong f
(funx : Y => DPath P (merid x) (fst NS) (snd NS))
g)
X, Y: Type f: X -> Y P: Susp Y -> Type
SplEssSurj functor_Susp_ind_type <-> ?Goal
X, Y: Type f: X -> Y P: Susp Y -> Type
?Goal <->
(forall (NS : P North * P South)
(g : forallx : X,
(funx0 : Y =>
DPath P (merid x0) (fst NS) (snd NS)) (f x)),
ExtensionAlong f
(funx : Y => DPath P (merid x) (fst NS) (snd NS))
g)
X, Y: Type f: X -> Y P: Susp Y -> Type
SplEssSurj functor_Susp_ind_type <-> ?Goal
X, Y: Type f: X -> Y P: Susp Y -> Type
IsSurjInj (Susp_ind_inv Y P)
X, Y: Type f: X -> Y P: Susp Y -> Type
IsSurjInj
(Susp_ind_inv X
(funx : Susp X => P (functor_susp f x)))
all:apply issurjinj_Susp_ind_inv.
X, Y: Type f: X -> Y P: Susp Y -> Type
SplEssSurj functor_Susp_ind_data <->
(forall (NS : P North * P South)
(g : forallx : X,
(funx0 : Y =>
DPath P (merid x0) (fst NS) (snd NS)) (f x)),
ExtensionAlong f
(funx : Y => DPath P (merid x) (fst NS) (snd NS))
g)
X, Y: Type f: X -> Y P: Susp Y -> Type
SplEssSurj functor_Susp_ind_data <-> ?Goal
X, Y: Type f: X -> Y P: Susp Y -> Type
?Goal <->
(forall (NS : P North * P South)
(g : forallx : X,
(funx0 : Y =>
DPath P (merid x0) (fst NS) (snd NS)) (f x)),
ExtensionAlong f
(funx : Y => DPath P (merid x) (fst NS) (snd NS))
g)
(foralla : P North * P South,
SplEssSurj
((funNS : P North * P South =>
functor_Susp_ind_data' NS
o functor_Susp_ind_data'' NS) a)) <->
(forall (NS : P North * P South)
(g : forallx : X,
(funx0 : Y =>
DPath P (merid x0) (fst NS) (snd NS)) (f x)),
ExtensionAlong f
(funx : Y => DPath P (merid x) (fst NS) (snd NS))
g)
X, Y: Type f: X -> Y P: Susp Y -> Type N: P North S: P South
SplEssSurj
(funx : Susp_ind_data' Y P (N, S) =>
functor_Susp_ind_data' (N, S)
(functor_Susp_ind_data'' (N, S) x)) <->
(forallg : forallx : X, transport P (merid (f x)) N = S,
ExtensionAlong f
(funx : Y => transport P (merid x) N = S) g)
X, Y: Type f: X -> Y P: Susp Y -> Type N: P North S: P South
SplEssSurj
(funx : Susp_ind_data' Y P (N, S) =>
functor_Susp_ind_data' (N, S)
(functor_Susp_ind_data'' (N, S) x)) <-> ?Goal
X, Y: Type f: X -> Y P: Susp Y -> Type N: P North S: P South
?Goal <->
(forallg : forallx : X, transport P (merid (f x)) N = S,
ExtensionAlong f
(funx : Y => transport P (merid x) N = S) g)
X, Y: Type f: X -> Y P: Susp Y -> Type N: P North S: P South
SplEssSurj
(funx : Susp_ind_data' Y P (N, S) =>
functor_Susp_ind_data' (N, S)
(functor_Susp_ind_data'' (N, S) x)) <-> ?Goal
apply iffL_isesssurj; exact _.
X, Y: Type f: X -> Y P: Susp Y -> Type N: P North S: P South
SplEssSurj (functor_Susp_ind_data'' (N, S)) <->
(forallg : forallx : X, transport P (merid (f x)) N = S,
ExtensionAlong f
(funx : Y => transport P (merid x) N = S) g)
reflexivity.Defined.(** We have to close the section now because we have to generalize [extension_iff_functor_susp] over [P]. *)EndUnivPropNat.(** Now we can iterate, deducing [n]-extendability. *)
X, Y: Type f: X -> Y P: Susp Y -> Type n: nat
ExtendableAlong n (functor_susp f) P <->
(forallNS : P North * P South,
ExtendableAlong n f
(funx : Y => DPath P (merid x) (fst NS) (snd NS)))
X, Y: Type f: X -> Y P: Susp Y -> Type n: nat
ExtendableAlong n (functor_susp f) P <->
(forallNS : P North * P South,
ExtendableAlong n f
(funx : Y => DPath P (merid x) (fst NS) (snd NS)))
X, Y: Type f: X -> Y n: nat
forallP : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P <->
(forallNS : P North * P South,
ExtendableAlong n f
(funx : Y => DPath P (merid x) (fst NS) (snd NS)))
X, Y: Type f: X -> Y n: nat IHn: forallP : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P <->
(forallNS : P North * P South,
ExtendableAlong n f (funx : Y => DPath P (merid x) (fst NS) (snd NS))) P: Susp Y -> Type
ExtendableAlong n.+1 (functor_susp f) P <->
(forallNS : P North * P South,
ExtendableAlong n.+1 f
(funx : Y => DPath P (merid x) (fst NS) (snd NS)))
(** It would be nice to be able to do this proof by chaining logical equivalences too, especially since the two parts seem very similar. But I haven't managed to make that work. *)
X, Y: Type f: X -> Y n: nat IHn: forallP : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P <->
(forallNS : P North * P South,
ExtendableAlong n f (funx : Y => DPath P (merid x) (fst NS) (snd NS))) P: Susp Y -> Type
ExtendableAlong n.+1 (functor_susp f) P ->
forallNS : P North * P South,
ExtendableAlong n.+1 f
(funx : Y => DPath P (merid x) (fst NS) (snd NS))
X, Y: Type f: X -> Y n: nat IHn: forallP : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P <->
(forallNS : P North * P South,
ExtendableAlong n f (funx : Y => DPath P (merid x) (fst NS) (snd NS))) P: Susp Y -> Type
(forallNS : P North * P South,
ExtendableAlong n.+1 f
(funx : Y => DPath P (merid x) (fst NS) (snd NS))) ->
ExtendableAlong n.+1 (functor_susp f) P
X, Y: Type f: X -> Y n: nat IHn: forallP : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P <->
(forallNS : P North * P South,
ExtendableAlong n f (funx : Y => DPath P (merid x) (fst NS) (snd NS))) P: Susp Y -> Type
ExtendableAlong n.+1 (functor_susp f) P ->
forallNS : P North * P South,
ExtendableAlong n.+1 f
(funx : Y => DPath P (merid x) (fst NS) (snd NS))
X, Y: Type f: X -> Y n: nat IHn: forallP : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P <->
(forallNS : P North * P South,
ExtendableAlong n f (funx : Y => DPath P (merid x) (fst NS) (snd NS))) P: Susp Y -> Type e1: forallg : foralla : Susp X, P (functor_susp f a),
ExtensionAlong (functor_susp f) P g en: forallhk : forallb : Susp Y, P b,
ExtendableAlong n (functor_susp f)
(funb : Susp Y => h b = k b) N: P North S: P South
forallg : foralla : X,
DPath P (merid (f a)) (fst (N, S)) (snd (N, S)),
ExtensionAlong f
(funx : Y =>
DPath P (merid x) (fst (N, S)) (snd (N, S))) g
X, Y: Type f: X -> Y n: nat IHn: forallP : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P <->
(forallNS : P North * P South,
ExtendableAlong n f (funx : Y => DPath P (merid x) (fst NS) (snd NS))) P: Susp Y -> Type e1: forallg : foralla : Susp X, P (functor_susp f a),
ExtensionAlong (functor_susp f) P g en: forallhk : forallb : Susp Y, P b,
ExtendableAlong n (functor_susp f)
(funb : Susp Y => h b = k b) N: P North S: P South
forallhk : forallb : Y,
DPath P (merid b) (fst (N, S)) (snd (N, S)),
ExtendableAlong n f (funb : Y => h b = k b)
X, Y: Type f: X -> Y n: nat IHn: forallP : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P <->
(forallNS : P North * P South,
ExtendableAlong n f (funx : Y => DPath P (merid x) (fst NS) (snd NS))) P: Susp Y -> Type e1: forallg : foralla : Susp X, P (functor_susp f a),
ExtensionAlong (functor_susp f) P g en: forallhk : forallb : Susp Y, P b,
ExtendableAlong n (functor_susp f)
(funb : Susp Y => h b = k b) N: P North S: P South
forallg : foralla : X,
DPath P (merid (f a)) (fst (N, S)) (snd (N, S)),
ExtensionAlong f
(funx : Y =>
DPath P (merid x) (fst (N, S)) (snd (N, S))) g
X, Y: Type f: X -> Y n: nat IHn: forallP : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P <->
(forallNS : P North * P South,
ExtendableAlong n f (funx : Y => DPath P (merid x) (fst NS) (snd NS))) P: Susp Y -> Type e1: forallg : foralla : Susp X, P (functor_susp f a),
ExtensionAlong (functor_susp f) P g en: forallhk : forallb : Susp Y, P b,
ExtendableAlong n (functor_susp f)
(funb : Susp Y => h b = k b) N: P North S: P South
forallg : forallx : Susp X, P (functor_susp f x),
ExtensionAlong (functor_susp f) P g
exact e1.
X, Y: Type f: X -> Y n: nat IHn: forallP : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P <->
(forallNS : P North * P South,
ExtendableAlong n f (funx : Y => DPath P (merid x) (fst NS) (snd NS))) P: Susp Y -> Type e1: forallg : foralla : Susp X, P (functor_susp f a),
ExtensionAlong (functor_susp f) P g en: forallhk : forallb : Susp Y, P b,
ExtendableAlong n (functor_susp f)
(funb : Susp Y => h b = k b) N: P North S: P South
forallhk : forallb : Y,
DPath P (merid b) (fst (N, S)) (snd (N, S)),
ExtendableAlong n f (funb : Y => h b = k b)
X, Y: Type f: X -> Y n: nat IHn: forallP : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P <->
(forallNS : P North * P South,
ExtendableAlong n f (funx : Y => DPath P (merid x) (fst NS) (snd NS))) P: Susp Y -> Type e1: forallg : foralla : Susp X, P (functor_susp f a),
ExtensionAlong (functor_susp f) P g en: forallhk : forallb : Susp Y, P b,
ExtendableAlong n (functor_susp f)
(funb : Susp Y => h b = k b) N: P North S: P South h, k: forallb : Y, transport P (merid b) N = S
ExtendableAlong n f (funb : Y => h b = k b)
X, Y: Type f: X -> Y n: nat IHn: forallP : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P <->
(forallNS : P North * P South,
ExtendableAlong n f (funx : Y => DPath P (merid x) (fst NS) (snd NS))) P: Susp Y -> Type e1: forallg : foralla : Susp X, P (functor_susp f a),
ExtensionAlong (functor_susp f) P g en: forallhk : forallb : Susp Y, P b,
ExtendableAlong n (functor_susp f)
(funb : Susp Y => h b = k b) N: P North S: P South h, k: forallb : Y, transport P (merid b) N = S h':= Susp_ind P N S h: forally : Susp Y, P y
ExtendableAlong n f (funb : Y => h b = k b)
X, Y: Type f: X -> Y n: nat IHn: forallP : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P <->
(forallNS : P North * P South,
ExtendableAlong n f (funx : Y => DPath P (merid x) (fst NS) (snd NS))) P: Susp Y -> Type e1: forallg : foralla : Susp X, P (functor_susp f a),
ExtensionAlong (functor_susp f) P g en: forallhk : forallb : Susp Y, P b,
ExtendableAlong n (functor_susp f)
(funb : Susp Y => h b = k b) N: P North S: P South h, k: forallb : Y, transport P (merid b) N = S h':= Susp_ind P N S h: forally : Susp Y, P y k':= Susp_ind P N S k: forally : Susp Y, P y
ExtendableAlong n f (funb : Y => h b = k b)
X, Y: Type f: X -> Y n: nat IHn: forallP : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P <->
(forallNS : P North * P South,
ExtendableAlong n f (funx : Y => DPath P (merid x) (fst NS) (snd NS))) P: Susp Y -> Type e1: forallg : foralla : Susp X, P (functor_susp f a),
ExtensionAlong (functor_susp f) P g N: P North S: P South h, k: forallb : Y, transport P (merid b) N = S h':= Susp_ind P N S h: forally : Susp Y, P y k':= Susp_ind P N S k: forally : Susp Y, P y en: ExtendableAlong n (functor_susp f)
(funb : Susp Y => h' b = k' b)
ExtendableAlong n f (funb : Y => h b = k b)
X, Y: Type f: X -> Y n: nat P: Susp Y -> Type e1: forallg : foralla : Susp X, P (functor_susp f a),
ExtensionAlong (functor_susp f) P g N: P North S: P South h, k: forallb : Y, transport P (merid b) N = S h':= Susp_ind P N S h: forally : Susp Y, P y k':= Susp_ind P N S k: forally : Susp Y, P y IH: ExtendableAlong n f
(funx : Y =>
DPath (funb : Susp Y => h' b = k' b)
(merid x) (fst (1, 1)) (snd (1, 1)))
ExtendableAlong n f (funb : Y => h b = k b)
X, Y: Type f: X -> Y n: nat P: Susp Y -> Type e1: forallg : foralla : Susp X, P (functor_susp f a),
ExtensionAlong (functor_susp f) P g N: P North S: P South h, k: forallb : Y, transport P (merid b) N = S h':= Susp_ind P N S h: forally : Susp Y, P y k':= Susp_ind P N S k: forally : Susp Y, P y IH: ExtendableAlong n f
(funx : Y =>
transport (funb : Susp Y => h' b = k' b)
(merid x) 1 = 1)
ExtendableAlong n f (funb : Y => h b = k b)
X, Y: Type f: X -> Y n: nat P: Susp Y -> Type e1: forallg : foralla : Susp X, P (functor_susp f a),
ExtensionAlong (functor_susp f) P g N: P North S: P South h, k: forallb : Y, transport P (merid b) N = S h':= Susp_ind P N S h: forally : Susp Y, P y k':= Susp_ind P N S k: forally : Susp Y, P y
forallb : Y,
transport (funb0 : Susp Y => h' b0 = k' b0) (merid b)
1 = 1 <~> h b = k b
X, Y: Type f: X -> Y n: nat P: Susp Y -> Type e1: forallg : foralla : Susp X, P (functor_susp f a),
ExtensionAlong (functor_susp f) P g N: P North S: P South h, k: forallb : Y, transport P (merid b) N = S h':= Susp_ind P N S h: forally : Susp Y, P y k':= Susp_ind P N S k: forally : Susp Y, P y y: Y
transport (funb : Susp Y => h' b = k' b) (merid y) 1 =
1 <~> h y = k y
X, Y: Type f: X -> Y n: nat P: Susp Y -> Type e1: forallg : foralla : Susp X, P (functor_susp f a),
ExtensionAlong (functor_susp f) P g N: P North S: P South h, k: forallb : Y, transport P (merid b) N = S h':= Susp_ind P N S h: forally : Susp Y, P y k':= Susp_ind P N S k: forally : Susp Y, P y y: Y
transport (funb : Susp Y => h' b = k' b) (merid y) 1 =
1 <~> ?Goal0
X, Y: Type f: X -> Y n: nat P: Susp Y -> Type e1: forallg : foralla : Susp X, P (functor_susp f a),
ExtensionAlong (functor_susp f) P g N: P North S: P South h, k: forallb : Y, transport P (merid b) N = S h':= Susp_ind P N S h: forally : Susp Y, P y k':= Susp_ind P N S k: forally : Susp Y, P y y: Y
?Goal0 <~> h y = k y
X, Y: Type f: X -> Y n: nat P: Susp Y -> Type e1: forallg : foralla : Susp X, P (functor_susp f a),
ExtensionAlong (functor_susp f) P g N: P North S: P South h, k: forallb : Y, transport P (merid b) N = S h':= Susp_ind P N S h: forally : Susp Y, P y k':= Susp_ind P N S k: forally : Susp Y, P y y: Y
DPathSquare P (PathSquare.sq_refl_h (merid y))
(apD h' (merid y)) (apD k' (merid y)) 11 <~>
h y = k y
X, Y: Type f: X -> Y n: nat P: Susp Y -> Type e1: forallg : foralla : Susp X, P (functor_susp f a),
ExtensionAlong (functor_susp f) P g N: P North S: P South h, k: forallb : Y, transport P (merid b) N = S h':= Susp_ind P N S h: forally : Susp Y, P y k':= Susp_ind P N S k: forally : Susp Y, P y y: Y
DPathSquare P (PathSquare.sq_refl_h (merid y))
(apD h' (merid y)) (apD k' (merid y)) 11 <~> ?Goal0
X, Y: Type f: X -> Y n: nat P: Susp Y -> Type e1: forallg : foralla : Susp X, P (functor_susp f a),
ExtensionAlong (functor_susp f) P g N: P North S: P South h, k: forallb : Y, transport P (merid b) N = S h':= Susp_ind P N S h: forally : Susp Y, P y k':= Susp_ind P N S k: forally : Susp Y, P y y: Y
?Goal0 <~> h y = k y
X, Y: Type f: X -> Y n: nat P: Susp Y -> Type e1: forallg : foralla : Susp X, P (functor_susp f a),
ExtensionAlong (functor_susp f) P g N: P North S: P South h, k: forallb : Y, transport P (merid b) N = S h':= Susp_ind P N S h: forally : Susp Y, P y k':= Susp_ind P N S k: forally : Susp Y, P y y: Y
transport
(funy0 : P North => DPath P (merid y) y0 (k' South))
1
(transport
(funy0 : P South =>
DPath P (merid y) (h' North) y0) 1
(apD h' (merid y))) = apD k' (merid y) <~>
h y = k y
X, Y: Type f: X -> Y n: nat P: Susp Y -> Type e1: forallg : foralla : Susp X, P (functor_susp f a),
ExtensionAlong (functor_susp f) P g N: P North S: P South h, k: forallb : Y, transport P (merid b) N = S y: Y
apD (Susp_ind P N S h) (merid y) =
apD (Susp_ind P N S k) (merid y) <~> h y = k y
X, Y: Type f: X -> Y n: nat P: Susp Y -> Type e1: forallg : foralla : Susp X, P (functor_susp f a),
ExtensionAlong (functor_susp f) P g N: P North S: P South h, k: forallb : Y, transport P (merid b) N = S y: Y
h y = apD (Susp_ind P N S h) (merid y)
X, Y: Type f: X -> Y n: nat P: Susp Y -> Type e1: forallg : foralla : Susp X, P (functor_susp f a),
ExtensionAlong (functor_susp f) P g N: P North S: P South h, k: forallb : Y, transport P (merid b) N = S y: Y
apD (Susp_ind P N S k) (merid y) = k y
X, Y: Type f: X -> Y n: nat P: Susp Y -> Type e1: forallg : foralla : Susp X, P (functor_susp f a),
ExtensionAlong (functor_susp f) P g N: P North S: P South h, k: forallb : Y, transport P (merid b) N = S y: Y
h y = apD (Susp_ind P N S h) (merid y)
X, Y: Type f: X -> Y n: nat P: Susp Y -> Type e1: forallg : foralla : Susp X, P (functor_susp f a),
ExtensionAlong (functor_susp f) P g N: P North S: P South h, k: forallb : Y, transport P (merid b) N = S y: Y
apD (Susp_ind P N S h) (merid y) = h y
exact (Susp_ind_beta_merid P N S h y).
X, Y: Type f: X -> Y n: nat P: Susp Y -> Type e1: forallg : foralla : Susp X, P (functor_susp f a),
ExtensionAlong (functor_susp f) P g N: P North S: P South h, k: forallb : Y, transport P (merid b) N = S y: Y
apD (Susp_ind P N S k) (merid y) = k y
exact (Susp_ind_beta_merid P N S k y).
X, Y: Type f: X -> Y n: nat IHn: forallP : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P <->
(forallNS : P North * P South,
ExtendableAlong n f (funx : Y => DPath P (merid x) (fst NS) (snd NS))) P: Susp Y -> Type
(forallNS : P North * P South,
ExtendableAlong n.+1 f
(funx : Y => DPath P (merid x) (fst NS) (snd NS))) ->
ExtendableAlong n.+1 (functor_susp f) P
X, Y: Type f: X -> Y n: nat IHn: forallP : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P <->
(forallNS : P North * P South,
ExtendableAlong n f (funx : Y => DPath P (merid x) (fst NS) (snd NS))) P: Susp Y -> Type e: forallNS : P North * P South,
ExtendableAlong n.+1 f
(funx : Y =>
DPath P (merid x) (fst NS) (snd NS))
forallg : foralla : Susp X, P (functor_susp f a),
ExtensionAlong (functor_susp f) P g
X, Y: Type f: X -> Y n: nat IHn: forallP : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P <->
(forallNS : P North * P South,
ExtendableAlong n f (funx : Y => DPath P (merid x) (fst NS) (snd NS))) P: Susp Y -> Type e: forallNS : P North * P South,
ExtendableAlong n.+1 f
(funx : Y =>
DPath P (merid x) (fst NS) (snd NS))
forallhk : forallb : Susp Y, P b,
ExtendableAlong n (functor_susp f)
(funb : Susp Y => h b = k b)
X, Y: Type f: X -> Y n: nat IHn: forallP : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P <->
(forallNS : P North * P South,
ExtendableAlong n f (funx : Y => DPath P (merid x) (fst NS) (snd NS))) P: Susp Y -> Type e: forallNS : P North * P South,
ExtendableAlong n.+1 f
(funx : Y =>
DPath P (merid x) (fst NS) (snd NS))
forallg : foralla : Susp X, P (functor_susp f a),
ExtensionAlong (functor_susp f) P g
X, Y: Type f: X -> Y n: nat IHn: forallP : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P <->
(forallNS : P North * P South,
ExtendableAlong n f (funx : Y => DPath P (merid x) (fst NS) (snd NS))) P: Susp Y -> Type e: forallNS : P North * P South,
ExtendableAlong n.+1 f
(funx : Y =>
DPath P (merid x) (fst NS) (snd NS))
forall (NS : P North * P South)
(g : forallx : X,
DPath P (merid (f x)) (fst NS) (snd NS)),
ExtensionAlong f
(funx : Y => DPath P (merid x) (fst NS) (snd NS)) g
intros NS; exact (fst (e NS)).
X, Y: Type f: X -> Y n: nat IHn: forallP : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P <->
(forallNS : P North * P South,
ExtendableAlong n f (funx : Y => DPath P (merid x) (fst NS) (snd NS))) P: Susp Y -> Type e: forallNS : P North * P South,
ExtendableAlong n.+1 f
(funx : Y =>
DPath P (merid x) (fst NS) (snd NS))
forallhk : forallb : Susp Y, P b,
ExtendableAlong n (functor_susp f)
(funb : Susp Y => h b = k b)
X, Y: Type f: X -> Y n: nat IHn: forallP : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P <->
(forallNS : P North * P South,
ExtendableAlong n f (funx : Y => DPath P (merid x) (fst NS) (snd NS))) P: Susp Y -> Type e: forallNS : P North * P South,
ExtendableAlong n.+1 f
(funx : Y =>
DPath P (merid x) (fst NS) (snd NS)) h, k: forallb : Susp Y, P b
ExtendableAlong n (functor_susp f)
(funb : Susp Y => h b = k b)
X, Y: Type f: X -> Y n: nat IHn: forallP : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P <->
(forallNS : P North * P South,
ExtendableAlong n f (funx : Y => DPath P (merid x) (fst NS) (snd NS))) P: Susp Y -> Type e: forallNS : P North * P South,
ExtendableAlong n.+1 f
(funx : Y =>
DPath P (merid x) (fst NS) (snd NS)) h, k: forallb : Susp Y, P b
forallNS : (h North = k North) * (h South = k South),
ExtendableAlong n f
(funx : Y =>
DPath (funb : Susp Y => h b = k b) (merid x)
(fst NS) (snd NS))
X, Y: Type f: X -> Y n: nat IHn: forallP : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P <->
(forallNS : P North * P South,
ExtendableAlong n f (funx : Y => DPath P (merid x) (fst NS) (snd NS))) P: Susp Y -> Type e: forallNS : P North * P South,
ExtendableAlong n.+1 f
(funx : Y =>
DPath P (merid x) (fst NS) (snd NS)) h, k: forallb : Susp Y, P b p: h North = k North q: h South = k South
ExtendableAlong n f
(funx : Y =>
DPath (funb : Susp Y => h b = k b) (merid x)
(fst (p, q)) (snd (p, q)))
X, Y: Type f: X -> Y n: nat IHn: forallP : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P <->
(forallNS : P North * P South,
ExtendableAlong n f (funx : Y => DPath P (merid x) (fst NS) (snd NS))) P: Susp Y -> Type h, k: forallb : Susp Y, P b e: ExtendableAlong n.+1 f
(funx : Y =>
DPath P (merid x) (fst (h North, k South))
(snd (h North, k South))) p: h North = k North q: h South = k South
ExtendableAlong n f
(funx : Y =>
DPath (funb : Susp Y => h b = k b) (merid x)
(fst (p, q)) (snd (p, q)))
X, Y: Type f: X -> Y n: nat IHn: forallP : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P <->
(forallNS : P North * P South,
ExtendableAlong n f (funx : Y => transport P (merid x) (fst NS) = snd NS)) P: Susp Y -> Type h, k: forallb : Susp Y, P b e: forallh0k0 : forallb : Y,
transport P (merid b) (h North) = k South,
ExtendableAlong n f (funb : Y => h0 b = k0 b) p: h North = k North q: h South = k South
ExtendableAlong n f
(funx : Y =>
transport (funb : Susp Y => h b = k b) (merid x) p =
q)
X, Y: Type f: X -> Y n: nat IHn: forallP : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P <->
(forallNS : P North * P South,
ExtendableAlong n f (funx : Y => transport P (merid x) (fst NS) = snd NS)) P: Susp Y -> Type h, k: forallb : Susp Y, P b e: forallh0k0 : forallb : Y,
transport P (merid b) (h North) = k South,
ExtendableAlong n f (funb : Y => h0 b = k0 b) p: h North = k North q: h South = k South y: Y
?Goal y = ?Goal0 y <~>
transport (funb : Susp Y => h b = k b) (merid y) p =
q
X, Y: Type f: X -> Y n: nat IHn: forallP : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P <->
(forallNS : P North * P South,
ExtendableAlong n f (funx : Y => transport P (merid x) (fst NS) = snd NS)) P: Susp Y -> Type h, k: forallb : Susp Y, P b e: forallh0k0 : forallb : Y,
transport P (merid b) (h North) = k South,
ExtendableAlong n f (funb : Y => h0 b = k0 b) p: h North = k North q: h South = k South y: Y
transport (funb : Susp Y => h b = k b) (merid y) p =
q <~> ?Goal y = ?Goal0 y
X, Y: Type f: X -> Y n: nat IHn: forallP : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P <->
(forallNS : P North * P South,
ExtendableAlong n f (funx : Y => transport P (merid x) (fst NS) = snd NS)) P: Susp Y -> Type h, k: forallb : Susp Y, P b e: forallh0k0 : forallb : Y,
transport P (merid b) (h North) = k South,
ExtendableAlong n f (funb : Y => h0 b = k0 b) p: h North = k North q: h South = k South y: Y
transport (funb : Susp Y => h b = k b) (merid y) p =
q <~> ?Goal1
X, Y: Type f: X -> Y n: nat IHn: forallP : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P <->
(forallNS : P North * P South,
ExtendableAlong n f (funx : Y => transport P (merid x) (fst NS) = snd NS)) P: Susp Y -> Type h, k: forallb : Susp Y, P b e: forallh0k0 : forallb : Y,
transport P (merid b) (h North) = k South,
ExtendableAlong n f (funb : Y => h0 b = k0 b) p: h North = k North q: h South = k South y: Y
?Goal1 <~> ?Goal y = ?Goal0 y
X, Y: Type f: X -> Y n: nat IHn: forallP : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P <->
(forallNS : P North * P South,
ExtendableAlong n f (funx : Y => transport P (merid x) (fst NS) = snd NS)) P: Susp Y -> Type h, k: forallb : Susp Y, P b e: forallh0k0 : forallb : Y,
transport P (merid b) (h North) = k South,
ExtendableAlong n f (funb : Y => h0 b = k0 b) p: h North = k North q: h South = k South y: Y
DPathSquare P (PathSquare.sq_refl_h (merid y))
(apD h (merid y)) (apD k (merid y)) p q <~>
?Goal y = ?Goal0 y
X, Y: Type f: X -> Y n: nat IHn: forallP : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P <->
(forallNS : P North * P South,
ExtendableAlong n f (funx : Y => transport P (merid x) (fst NS) = snd NS)) P: Susp Y -> Type h, k: forallb : Susp Y, P b e: forallh0k0 : forallb : Y,
transport P (merid b) (h North) = k South,
ExtendableAlong n f (funb : Y => h0 b = k0 b) p: h North = k North q: h South = k South y: Y
DPathSquare P (PathSquare.sq_refl_h (merid y))
(apD h (merid y)) (apD k (merid y)) p q <~> ?Goal1
X, Y: Type f: X -> Y n: nat IHn: forallP : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P <->
(forallNS : P North * P South,
ExtendableAlong n f (funx : Y => transport P (merid x) (fst NS) = snd NS)) P: Susp Y -> Type h, k: forallb : Susp Y, P b e: forallh0k0 : forallb : Y,
transport P (merid b) (h North) = k South,
ExtendableAlong n f (funb : Y => h0 b = k0 b) p: h North = k North q: h South = k South y: Y
?Goal1 <~> ?Goal y = ?Goal0 y
X, Y: Type f: X -> Y n: nat IHn: forallP : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P <->
(forallNS : P North * P South,
ExtendableAlong n f (funx : Y => transport P (merid x) (fst NS) = snd NS)) P: Susp Y -> Type h, k: forallb : Susp Y, P b e: forallh0k0 : forallb : Y,
transport P (merid b) (h North) = k South,
ExtendableAlong n f (funb : Y => h0 b = k0 b) p: h North = k North q: h South = k South y: Y
transport
(funy0 : P North => DPath P (merid y) y0 (k South))
p
(transport
(funy0 : P South =>
DPath P (merid y) (h North) y0) q
(apD h (merid y))) = apD k (merid y) <~>
?Goal y = ?Goal0 y
X, Y: Type f: X -> Y n: nat IHn: forallP : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P <->
(forallNS : P North * P South,
ExtendableAlong n f (funx : Y => transport P (merid x) (fst NS) = snd NS)) P: Susp Y -> Type h, k: forallb : Susp Y, P b e: forallh0k0 : forallb : Y,
transport P (merid b) (h North) = k South,
ExtendableAlong n f (funb : Y => h0 b = k0 b) p: h North = k North q: h South = k South y: Y
transport
(funy0 : P North => DPath P (merid y) y0 (k South))
p
(transport
(funy0 : P South =>
DPath P (merid y) (h North) y0) q
(apD h (merid y))) = apD k (merid y) <~> ?Goal1
X, Y: Type f: X -> Y n: nat IHn: forallP : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P <->
(forallNS : P North * P South,
ExtendableAlong n f (funx : Y => transport P (merid x) (fst NS) = snd NS)) P: Susp Y -> Type h, k: forallb : Susp Y, P b e: forallh0k0 : forallb : Y,
transport P (merid b) (h North) = k South,
ExtendableAlong n f (funb : Y => h0 b = k0 b) p: h North = k North q: h South = k South y: Y
?Goal1 <~> ?Goal y = ?Goal0 y
X, Y: Type f: X -> Y n: nat IHn: forallP : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P <->
(forallNS : P North * P South,
ExtendableAlong n f (funx : Y => transport P (merid x) (fst NS) = snd NS)) P: Susp Y -> Type h, k: forallb : Susp Y, P b e: forallh0k0 : forallb : Y,
transport P (merid b) (h North) = k South,
ExtendableAlong n f (funb : Y => h0 b = k0 b) p: h North = k North q: h South = k South y: Y
transport
(funy0 : P North => DPath P (merid y) y0 (k South))
p
(transport
(funy0 : P South =>
DPath P (merid y) (h North) y0) q
(apD h (merid y))) = apD k (merid y) <~>
?Goal y = ?Goal0 y
X, Y: Type f: X -> Y n: nat IHn: forallP : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P <->
(forallNS : P North * P South,
ExtendableAlong n f (funx : Y => transport P (merid x) (fst NS) = snd NS)) P: Susp Y -> Type h, k: forallb : Susp Y, P b e: forallh0k0 : forallb : Y,
transport P (merid b) (h North) = k South,
ExtendableAlong n f (funb : Y => h0 b = k0 b) p: h North = k North q: h South = k South y: Y
?Goal y = ?Goal0 y <~>
transport
(funy0 : P North => DPath P (merid y) y0 (k South))
p
(transport
(funy0 : P South =>
DPath P (merid y) (h North) y0) q
(apD h (merid y))) = apD k (merid y)
apply (equiv_moveR_transport_p (funy0 : P North => DPath P (merid y) y0 (k South))).Defined.(** As usual, deducing oo-extendability is trivial. *)
X, Y: Type f: X -> Y P: Susp Y -> Type
ooExtendableAlong (functor_susp f) P <->
(forallNS : P North * P South,
ooExtendableAlong f
(funx : Y => DPath P (merid x) (fst NS) (snd NS)))
X, Y: Type f: X -> Y P: Susp Y -> Type
ooExtendableAlong (functor_susp f) P <->
(forallNS : P North * P South,
ooExtendableAlong f
(funx : Y => DPath P (merid x) (fst NS) (snd NS)))
X, Y: Type f: X -> Y P: Susp Y -> Type e: ooExtendableAlong (functor_susp f) P
forallNS : P North * P South,
ooExtendableAlong f
(funx : Y => DPath P (merid x) (fst NS) (snd NS))
X, Y: Type f: X -> Y P: Susp Y -> Type e: forallNS : P North * P South,
ooExtendableAlong f
(funx : Y =>
DPath P (merid x) (fst NS) (snd NS))
ooExtendableAlong (functor_susp f) P
X, Y: Type f: X -> Y P: Susp Y -> Type e: ooExtendableAlong (functor_susp f) P
forallNS : P North * P South,
ooExtendableAlong f
(funx : Y => DPath P (merid x) (fst NS) (snd NS))
X, Y: Type f: X -> Y P: Susp Y -> Type e: ooExtendableAlong (functor_susp f) P NS: P North * P South n: nat
ExtendableAlong n f
(funx : Y => DPath P (merid x) (fst NS) (snd NS))
X, Y: Type f: X -> Y P: Susp Y -> Type e: ooExtendableAlong (functor_susp f) P NS: P North * P South n: nat
ExtendableAlong n (functor_susp f) P
exact (e n).
X, Y: Type f: X -> Y P: Susp Y -> Type e: forallNS : P North * P South,
ooExtendableAlong f
(funx : Y =>
DPath P (merid x) (fst NS) (snd NS))
ooExtendableAlong (functor_susp f) P
X, Y: Type f: X -> Y P: Susp Y -> Type e: forallNS : P North * P South,
ooExtendableAlong f
(funx : Y =>
DPath P (merid x) (fst NS) (snd NS)) n: nat
ExtendableAlong n (functor_susp f) P
X, Y: Type f: X -> Y P: Susp Y -> Type e: forallNS : P North * P South,
ooExtendableAlong f
(funx : Y =>
DPath P (merid x) (fst NS) (snd NS)) n: nat
forallNS : P North * P South,
ExtendableAlong n f
(funx : Y => DPath P (merid x) (fst NS) (snd NS))
intros NS; exact (e NS n).Defined.(** ** Nullhomotopies of maps out of suspensions *)
X, Z: Type f: Susp X -> Z n: NullHomotopy (funx : X => ap f (merid x))
NullHomotopy f
X, Z: Type f: Susp X -> Z n: NullHomotopy (funx : X => ap f (merid x))
NullHomotopy f
X, Z: Type f: Susp X -> Z n: NullHomotopy (funx : X => ap f (merid x))
forallx : Susp X, f x = f North
X, Z: Type f: Susp X -> Z n: NullHomotopy (funx : X => ap f (merid x)) x: X
transport (funy : Susp X => f y = f North) (merid x)
1 = (n.1)^
X, Z: Type f: Susp X -> Z n: NullHomotopy (funx : X => ap f (merid x)) x: X
(ap f (merid x))^ @ 1 = (n.1)^
X, Z: Type f: Susp X -> Z n: NullHomotopy (funx : X => ap f (merid x)) x: X
ap f (merid x) = n.1
apply n.2.Defined.
X, Z: Type H_N, H_S: Z f: X -> H_N = H_S n: NullHomotopy (Susp_rec H_N H_S f)
NullHomotopy f
X, Z: Type H_N, H_S: Z f: X -> H_N = H_S n: NullHomotopy (Susp_rec H_N H_S f)
NullHomotopy f
X, Z: Type H_N, H_S: Z f: X -> H_N = H_S n: NullHomotopy (Susp_rec H_N H_S f)
forallx : X, f x = n.2 North @ (n.2 South)^
X, Z: Type H_N, H_S: Z f: X -> H_N = H_S n: NullHomotopy (Susp_rec H_N H_S f) x: X
f x = n.2 North @ (n.2 South)^
X, Z: Type H_N, H_S: Z f: X -> H_N = H_S n: NullHomotopy (Susp_rec H_N H_S f) x: X
f x @ n.2 South = n.2 North
X, Z: Type H_N, H_S: Z f: X -> H_N = H_S n: NullHomotopy (Susp_rec H_N H_S f) x: X
f x @ n.2 South =
ap (Susp_rec H_N H_S f) (merid x) @ n.2 South
X, Z: Type H_N, H_S: Z f: X -> H_N = H_S n: NullHomotopy (Susp_rec H_N H_S f) x: X
ap (Susp_rec H_N H_S f) (merid x) @ n.2 South =
n.2 North
X, Z: Type H_N, H_S: Z f: X -> H_N = H_S n: NullHomotopy (Susp_rec H_N H_S f) x: X
f x @ n.2 South =
ap (Susp_rec H_N H_S f) (merid x) @ n.2 South
apply whiskerR, inverse, Susp_rec_beta_merid.
X, Z: Type H_N, H_S: Z f: X -> H_N = H_S n: NullHomotopy (Susp_rec H_N H_S f) x: X
ap (Susp_rec H_N H_S f) (merid x) @ n.2 South =
n.2 North
X, Z: Type H_N, H_S: Z f: X -> H_N = H_S n: NullHomotopy (Susp_rec H_N H_S f) x: X
n.2 North @ ap (fun_ : Susp X => n.1) (merid x) =
n.2 North
X, Z: Type H_N, H_S: Z f: X -> H_N = H_S n: NullHomotopy (Susp_rec H_N H_S f) x: X
n.2 North @ ap (fun_ : Susp X => n.1) (merid x) =
n.2 North @ 1
apply whiskerL, ap_const.Defined.(** ** Contractibility of the suspension *)
A: Type Contr0: Contr A
Contr (Susp A)
A: Type Contr0: Contr A
Contr (Susp A)
unfold Susp; exact _.Defined.(** ** Connectedness of the suspension *)
n: trunc_index X: Type H: IsConnected (Tr n) X
IsConnected (Tr n.+1) (Susp X)
n: trunc_index X: Type H: IsConnected (Tr n) X
IsConnected (Tr n.+1) (Susp X)
n: trunc_index X: Type H: IsConnected (Tr n) X
forallC : Type,
In (Tr n.+1) C ->
forallf : Susp X -> C, NullHomotopy f
n: trunc_index X: Type H: IsConnected (Tr n) X C: Type H': In (Tr n.+1) C f: Susp X -> C
NullHomotopy f
n: trunc_index X: Type H: IsConnected (Tr n) X C: Type H': In (Tr n.+1) C f: Susp X -> C
forallx : Susp X, f x = f North
n: trunc_index X: Type H: IsConnected (Tr n) X C: Type H': In (Tr n.+1) C f: Susp X -> C p0: f North = f South allpath_p0: forallx : X, ap f (merid x) = p0
forallx : Susp X, f x = f North
n: trunc_index X: Type H: IsConnected (Tr n) X C: Type H': In (Tr n.+1) C f: Susp X -> C p0: f North = f South allpath_p0: forallx : X, ap f (merid x) = p0
forallx : X,
transport (funa : Susp X => f a = f North)
(merid x) 1 = p0^
n: trunc_index X: Type H: IsConnected (Tr n) X C: Type H': In (Tr n.+1) C f: Susp X -> C p0: f North = f South allpath_p0: forallx : X, ap f (merid x) = p0 x: X
transport (funa : Susp X => f a = f North)
(merid x) 1 = p0^
n: trunc_index X: Type H: IsConnected (Tr n) X C: Type H': In (Tr n.+1) C f: Susp X -> C p0: f North = f South allpath_p0: forallx : X, ap f (merid x) = p0 x: X
(ap f (merid x))^ @ 1 = p0^
n: trunc_index X: Type H: IsConnected (Tr n) X C: Type H': In (Tr n.+1) C f: Susp X -> C p0: f North = f South allpath_p0: forallx : X, ap f (merid x) = p0 x: X
(ap f (merid x))^ = p0^
apply ap, allpath_p0.Defined.(** ** Negation map *)(** The negation map on the suspension is defined by sending [North] to [South] and vice versa, and acting by flipping on the meridians. *)Definitionsusp_neg (A : Type) : Susp A -> Susp A
:= Susp_rec South North (funa => (merid a)^).(** The negation map is an involution. *)
A: Type
susp_neg A o susp_neg A == idmap
A: Type
susp_neg A o susp_neg A == idmap
A: Type
susp_neg A (susp_neg A North) = North
A: Type
susp_neg A (susp_neg A South) = South
A: Type
forallx : A,
ap (susp_neg A) (ap (susp_neg A) (merid x)) @ ?HS =
?HN @ merid x
A: Type
forallx : A,
ap (susp_neg A) (ap (susp_neg A) (merid x)) @ 1 =
1 @ merid x
A: Type a: A
ap (susp_neg A) (ap (susp_neg A) (merid a)) @ 1 =
1 @ merid a
A: Type a: A
ap (susp_neg A) (ap (susp_neg A) (merid a)) = merid a
A: Type a: A
ap (susp_neg A) (merid a) = ?Goal
A: Type a: A
ap (susp_neg A) ?Goal = merid a
A: Type a: A
ap (susp_neg A) (merid a)^ = merid a
A: Type a: A
(ap (susp_neg A) (merid a))^ = merid a
A: Type a: A
ap (susp_neg A) (merid a) = ?Goal
A: Type a: A
?Goal^ = merid a
A: Type a: A
((merid a)^)^ = merid a
napply inv_V.Defined.Instanceisequiv_susp_neg (A : Type) : IsEquiv (susp_neg A)
:= isequiv_involution (susp_neg A) (susp_neg_inv A).Definitionequiv_susp_neg (A : Type) : Susp A <~> Susp A
:= Build_Equiv _ _ (susp_neg A) _.(** By using the suspension functor, we can also define another negation map on [Susp (Susp A))]. It turns out these are homotopic. *)
A: Type
functor_susp (susp_neg A) == susp_neg (Susp A)
A: Type
functor_susp (susp_neg A) == susp_neg (Susp A)
A: Type
North = South
A: Type
South = North
A: Type
forallx : Susp A,
ap (functor_susp (susp_neg A)) (merid x) @ ?Goal0 =
?Goal @ ap (susp_neg (Susp A)) (merid x)
A: Type
North = South
exact (merid North).
A: Type
South = North
exact (merid South)^.
A: Type
forallx : Susp A,
ap (functor_susp (susp_neg A)) (merid x) @
(merid South)^ =
merid North @ ap (susp_neg (Susp A)) (merid x)
A: Type x: Susp A
ap (functor_susp (susp_neg A)) (merid x) @
(merid South)^ =
merid North @ ap (susp_neg (Susp A)) (merid x)
A: Type x: Susp A
ap (functor_susp (susp_neg A)) (merid x) = ?Goal
A: Type x: Susp A
?Goal @ (merid South)^ =
merid North @ ap (susp_neg (Susp A)) (merid x)
A: Type x: Susp A
merid (susp_neg A x) @ (merid South)^ =
merid North @ ap (susp_neg (Susp A)) (merid x)
A: Type x: Susp A
merid (susp_neg A x) @ (merid South)^ =
merid North @ ?Goal
A: Type x: Susp A
ap (susp_neg (Susp A)) (merid x) = ?Goal
A: Type x: Susp A
merid (susp_neg A x) @ (merid South)^ =
merid North @ (merid x)^
A: Type
merid South @ (merid South)^ =
merid North @ (merid North)^
A: Type
merid North @ (merid South)^ =
merid North @ (merid South)^
A: Type
forallx : A,
ap
(funx0 : Susp A =>
merid (susp_neg A x0) @ (merid South)^) (merid x) @
?Goal0 =
?Goal @
ap (funx0 : Susp A => merid North @ (merid x0)^)
(merid x)
A: Type
merid South @ (merid South)^ =
merid North @ (merid North)^
exact (concat_pV _ @ (concat_pV _)^).
A: Type
merid North @ (merid South)^ =
merid North @ (merid South)^
reflexivity.
A: Type
forallx : A,
ap
(funx0 : Susp A =>
merid (susp_neg A x0) @ (merid South)^) (merid x) @
1 =
(concat_pV (merid South) @ (concat_pV (merid North))^) @
ap (funx0 : Susp A => merid North @ (merid x0)^)
(merid x)
A: Type a: A
ap
(funx : Susp A =>
merid (susp_neg A x) @ (merid South)^) (merid a) @
1 =
(concat_pV (merid South) @ (concat_pV (merid North))^) @
ap (funx : Susp A => merid North @ (merid x)^)
(merid a)
A: Type a: A
ap
(funx : Susp A =>
merid (susp_neg A x) @ (merid South)^) (merid a) =
(concat_pV (merid South) @ (concat_pV (merid North))^) @
ap (funx : Susp A => merid North @ (merid x)^)
(merid a)
A: Type a: A
ap (funy : Susp A => merid y @ (merid South)^)
(ap (susp_neg A) (merid a)) =
(concat_pV (merid South) @ (concat_pV (merid North))^) @
ap (funx : Susp A => merid North @ (merid x)^)
(merid a)
A: Type a: A
ap (susp_neg A) (merid a) = ?Goal
A: Type a: A
ap (funy : Susp A => merid y @ (merid South)^) ?Goal =
(concat_pV (merid South) @ (concat_pV (merid North))^) @
ap (funx : Susp A => merid North @ (merid x)^)
(merid a)
A: Type a: A
ap (funy : Susp A => merid y @ (merid South)^)
(merid a)^ =
(concat_pV (merid South) @ (concat_pV (merid North))^) @
ap (funx : Susp A => merid North @ (merid x)^)
(merid a)
A: Type a: A
ap (funy : Susp A => merid y @ (merid South)^)
(merid a)^ =
(concat_pV (merid South) @ (concat_pV (merid North))^) @
ap (funx : Susp A => merid North @ (merid x)^)
(merid a)
A: Type a: A
forallp : North = South,
ap (funy : Susp A => merid y @ (merid South)^) p^ =
(concat_pV (merid South) @ (concat_pV (merid North))^) @
ap (funx : Susp A => merid North @ (merid x)^) p
A: Type a: A
forall (s : Susp A) (p : North = s),
ap (funy : Susp A => merid y @ (merid s)^) p^ =
(concat_pV (merid s) @ (concat_pV (merid North))^) @
ap (funx : Susp A => merid North @ (merid x)^) p
A: Type a: A
ap (funy : Susp A => merid y @ (merid North)^) 1^ =
(concat_pV (merid North) @ (concat_pV (merid North))^) @
ap (funx : Susp A => merid North @ (merid x)^) 1