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.From HoTT Require Import Basics.Require Import Types.Require Import Cubical.DPath Cubical.DPathSquare.From HoTT.WildCat Require Import Core Forall UniversePaths Sigma
EquivGpd NatTrans.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: forallx0 : X, transport P (merid x0) 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: forallx0 : X, transport P (merid x0) 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: forallx0 : X, ap f (merid x0) @ HS = HN @ ap g (merid x0) 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: forallx0 : X, ap f (merid x0) @ HS = HN @ ap g (merid x0) 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: forallx0 : X, ap g (ap f (merid x0)) @ HS = HN @ merid x0 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: forallx0 : X, ap g (ap f (merid x0)) @ HS = HN @ merid x0 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: forallx0 : X, ap g (ap f (merid x0)) @ HS = HN @ ap h (merid x0) 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: forallx0 : X, ap g (ap f (merid x0)) @ HS = HN @ ap h (merid x0) 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: forallx0 : X, ap g (ap f (merid x0)) @ HS = HN @ ap g' (ap f' (merid x0)) 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: forallx0 : X, ap g (ap f (merid x0)) @ HS = HN @ ap g' (ap f' (merid x0)) 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: forallx0 : X, f x0 @ q = p @ f' x0 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: forallx0 : X, f x0 @ q = p @ f' x0 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: forallx0 : X, f x0 @ q = p @ f' x0 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) (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
((apD f (merid x))^ @ 1) @
apD (Susp_ind P (f North) (f South) (funx0 : X => apD f (merid x0)))
(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) (funx0 : X => apD f (merid x0)))
(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) (funx0 : X => apD f (merid x0)))
(merid x))^
X: Type P: Susp X -> Type f: forally : Susp X, P y x: X
apD (Susp_ind P (f North) (f South) (funx0 : X => apD f (merid x0)))
(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) (funx0 : X => ap f (merid x0))) (merid x)
X, Y: Type f: Susp X -> Y x: X
ap f (merid x) =
ap (Susp_rec (f North) (f South) (funx0 : X => ap f (merid x0))) (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 (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 (funx0 : X => g (f x0))) (merid x) =
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 (funx0 : Susp X => functor_susp g (functor_susp f x0)) (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
{p0 : (f North, f South) = (g North, g South) &
foralla : X,
transport Susp_ind_data' p0 (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))
(funx0 : X => apD f (merid x0)) 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 (funx0 : X => apD f (merid x0)) 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 (funx0 : X => apD f (merid x0)) 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 (funx0 : X => apD f (merid x0)) 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 (funx0 : Susp X => P (functor_susp f x0)) 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 (funx0 : Susp X => P (functor_susp f x0)) NS x: X
DPath (funx0 : Susp X => P (functor_susp f x0)) (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 (funx0 : Susp X => P (functor_susp f x0)) NS x: X
functor_Susp_ind_data' NS
(funx0 : X => (equiv_Susp_ind_data' NS x0)^-1 (g x0)) 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_functor_sigma_id _ _
(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 (funx0 : Susp X => P (functor_susp f x0))) 1
(Susp_ind_inv X (funx0 : Susp X => P (functor_susp f x0))
(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: forallP0 : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P0 <->
(forallNS : P0 North * P0 South,
ExtendableAlong n f (funx : Y => DPath P0 (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: forallP0 : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P0 <->
(forallNS : P0 North * P0 South,
ExtendableAlong n f (funx : Y => DPath P0 (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: forallP0 : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P0 <->
(forallNS : P0 North * P0 South,
ExtendableAlong n f (funx : Y => DPath P0 (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: forallP0 : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P0 <->
(forallNS : P0 North * P0 South,
ExtendableAlong n f (funx : Y => DPath P0 (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: forallP0 : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P0 <->
(forallNS : P0 North * P0 South,
ExtendableAlong n f (funx : Y => DPath P0 (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: forallP0 : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P0 <->
(forallNS : P0 North * P0 South,
ExtendableAlong n f (funx : Y => DPath P0 (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: forallP0 : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P0 <->
(forallNS : P0 North * P0 South,
ExtendableAlong n f (funx : Y => DPath P0 (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: forallP0 : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P0 <->
(forallNS : P0 North * P0 South,
ExtendableAlong n f (funx : Y => DPath P0 (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: forallP0 : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P0 <->
(forallNS : P0 North * P0 South,
ExtendableAlong n f (funx : Y => DPath P0 (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: forallP0 : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P0 <->
(forallNS : P0 North * P0 South,
ExtendableAlong n f (funx : Y => DPath P0 (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: forallh0k0 : forallb : Susp Y, P b,
ExtendableAlong n (functor_susp f) (funb : Susp Y => h0 b = k0 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: forallP0 : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P0 <->
(forallNS : P0 North * P0 South,
ExtendableAlong n f (funx : Y => DPath P0 (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: forallh0k0 : forallb : Susp Y, P b,
ExtendableAlong n (functor_susp f) (funb : Susp Y => h0 b = k0 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: forallP0 : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P0 <->
(forallNS : P0 North * P0 South,
ExtendableAlong n f (funx : Y => DPath P0 (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: forallh0k0 : forallb : Susp Y, P b,
ExtendableAlong n (functor_susp f) (funb : Susp Y => h0 b = k0 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: forallP0 : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P0 <->
(forallNS : P0 North * P0 South,
ExtendableAlong n f (funx : Y => DPath P0 (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: forally0 : Susp Y, P y0 k':= Susp_ind P N S k: forally0 : Susp Y, P y0 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: forally0 : Susp Y, P y0 k':= Susp_ind P N S k: forally0 : Susp Y, P y0 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: forally0 : Susp Y, P y0 k':= Susp_ind P N S k: forally0 : Susp Y, P y0 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: forally0 : Susp Y, P y0 k':= Susp_ind P N S k: forally0 : Susp Y, P y0 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: forally0 : Susp Y, P y0 k':= Susp_ind P N S k: forally0 : Susp Y, P y0 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: forally0 : Susp Y, P y0 k':= Susp_ind P N S k: forally0 : Susp Y, P y0 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: forally0 : Susp Y, P y0 k':= Susp_ind P N S k: forally0 : Susp Y, P y0 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: forallP0 : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P0 <->
(forallNS : P0 North * P0 South,
ExtendableAlong n f (funx : Y => DPath P0 (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: forallP0 : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P0 <->
(forallNS : P0 North * P0 South,
ExtendableAlong n f (funx : Y => DPath P0 (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: forallP0 : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P0 <->
(forallNS : P0 North * P0 South,
ExtendableAlong n f (funx : Y => DPath P0 (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: forallP0 : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P0 <->
(forallNS : P0 North * P0 South,
ExtendableAlong n f (funx : Y => DPath P0 (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: forallP0 : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P0 <->
(forallNS : P0 North * P0 South,
ExtendableAlong n f (funx : Y => DPath P0 (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: forallP0 : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P0 <->
(forallNS : P0 North * P0 South,
ExtendableAlong n f (funx : Y => DPath P0 (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: forallP0 : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P0 <->
(forallNS : P0 North * P0 South,
ExtendableAlong n f (funx : Y => DPath P0 (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: forallP0 : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P0 <->
(forallNS : P0 North * P0 South,
ExtendableAlong n f (funx : Y => DPath P0 (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: forallP0 : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P0 <->
(forallNS : P0 North * P0 South,
ExtendableAlong n f (funx : Y => DPath P0 (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: forallP0 : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P0 <->
(forallNS : P0 North * P0 South,
ExtendableAlong n f (funx : Y => DPath P0 (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: forallP0 : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P0 <->
(forallNS : P0 North * P0 South,
ExtendableAlong n f (funx : Y => transport P0 (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: forallP0 : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P0 <->
(forallNS : P0 North * P0 South,
ExtendableAlong n f (funx : Y => transport P0 (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: forallP0 : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P0 <->
(forallNS : P0 North * P0 South,
ExtendableAlong n f (funx : Y => transport P0 (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: forallP0 : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P0 <->
(forallNS : P0 North * P0 South,
ExtendableAlong n f (funx : Y => transport P0 (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: forallP0 : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P0 <->
(forallNS : P0 North * P0 South,
ExtendableAlong n f (funx : Y => transport P0 (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: forallP0 : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P0 <->
(forallNS : P0 North * P0 South,
ExtendableAlong n f (funx : Y => transport P0 (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: forallP0 : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P0 <->
(forallNS : P0 North * P0 South,
ExtendableAlong n f (funx : Y => transport P0 (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: forallP0 : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P0 <->
(forallNS : P0 North * P0 South,
ExtendableAlong n f (funx : Y => transport P0 (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: forallP0 : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P0 <->
(forallNS : P0 North * P0 South,
ExtendableAlong n f (funx : Y => transport P0 (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: forallP0 : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P0 <->
(forallNS : P0 North * P0 South,
ExtendableAlong n f (funx : Y => transport P0 (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: forallP0 : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P0 <->
(forallNS : P0 North * P0 South,
ExtendableAlong n f (funx : Y => transport P0 (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: forallP0 : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P0 <->
(forallNS : P0 North * P0 South,
ExtendableAlong n f (funx : Y => transport P0 (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: forallP0 : Susp Y -> Type,
ExtendableAlong n (functor_susp f) P0 <->
(forallNS : P0 North * P0 South,
ExtendableAlong n f (funx : Y => transport P0 (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 (funx0 : X => ap f (merid x0)) x: X
transport (funy : Susp X => f y = f North) (merid x) 1 = (n.1)^
X, Z: Type f: Susp X -> Z n: NullHomotopy (funx0 : X => ap f (merid x0)) x: X
(ap f (merid x))^ @ 1 = (n.1)^
X, Z: Type f: Susp X -> Z n: NullHomotopy (funx0 : X => ap f (merid x0)) 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: forallx0 : X, ap f (merid x0) = 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: forallx0 : X, ap f (merid x0) = 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: forallx0 : X, ap f (merid x0) = 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