Built with Alectryon. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑Ctrl+↓ to navigate, Ctrl+🖱️ to focus. On Mac, use ⌘ instead of Ctrl.
From HoTT Require Import Basics Types.From HoTT Require Import Basics Types.Require Import SuccessorStructure.From HoTT.WildCat Require Import Core PointedCat Square Equiv.From HoTT.Pointed Require Import Core pMap pEquiv pFiber pTrunc Loops.Require Import Modalities.Identity Modalities.Descent.Require Import Truncations.Require Import HFiber.Require Import ObjectClassifier.LocalOpen Scope succ_scope.Open Scope pointed_scope.(** * Exact sequences *)(** ** Very short complexes *)(** A (very short) complex is a pair of pointed maps whose composite is the zero map. *)DefinitionIsComplex {FXY} (i : F ->* X) (f : X ->* Y)
:= (f o* i ==* pconst).(** This induces a map from the domain of [i] to the fiber of [f]. *)
F, X, Y: pType i: F ->* X f: X ->* Y cx: IsComplex i f
F ->* pfiber f
F, X, Y: pType i: F ->* X f: X ->* Y cx: IsComplex i f
F ->* pfiber f
F, X, Y: pType i: F ->* X f: X ->* Y cx: IsComplex i f
F -> pfiber f
F, X, Y: pType i: F ->* X f: X ->* Y cx: IsComplex i f
?f pt = pt
F, X, Y: pType i: F ->* X f: X ->* Y cx: IsComplex i f
F -> pfiber f
exact (funx => (i x; cx x)).
F, X, Y: pType i: F ->* X f: X ->* Y cx: IsComplex i f
(funx : F => (i x; cx x)) pt = pt
F, X, Y: pType i: F ->* X f: X ->* Y cx: IsComplex i f
(i pt; cx pt) = ispointed_fiber f
F, X, Y: pType i: F ->* X f: X ->* Y cx: IsComplex i f
transport (funx : X => f x = pt) (point_eq i) (cx pt) = point_eq f
F, X, Y: pType i: F ->* X f: X ->* Y cx: IsComplex i f
(ap f (point_eq i))^ @ cx pt = point_eq f
F, X, Y: pType i: F ->* X f: X ->* Y cx: IsComplex i f
cx pt = ap f (point_eq i) @ point_eq f
exact ((concat_p1 _)^ @ point_htpy cx).Defined.(** ...whose composite with the projection [pfib : pfiber i -> X] is [i]. *)
F, X, Y: pType i: F ->* X f: X ->* Y cx: IsComplex i f
pfib f o* cxfib cx ==* i
F, X, Y: pType i: F ->* X f: X ->* Y cx: IsComplex i f
pfib f o* cxfib cx ==* i
F, X, Y: pType i: F ->* X f: X ->* Y cx: IsComplex i f
pfib f o* cxfib cx == i
F, X, Y: pType i: F ->* X f: X ->* Y cx: IsComplex i f
apply iscomplex_loops; assumption.Defined.(** Passage across homotopies preserves complexes. *)Definitioniscomplex_homotopic_i {FXY : pType}
{ii' : F ->* X} (ii : i' ==* i) (f : X ->* Y) (cx : IsComplex i f)
: IsComplex i' f := pmap_postwhisker f ii @* cx.Definitioniscomplex_homotopic_f {FXY : pType}
(i : F ->* X) {ff' : X ->* Y} (ff : f' ==* f) (cx : IsComplex i f)
: IsComplex i f'
:= pmap_prewhisker i ff @* cx.
F, X, Y, Y': pType i: F ->* X f: X ->* Y e: Y <~>* Y' cx: IsComplex i (e o* f)
IsComplex i f
F, X, Y, Y': pType i: F ->* X f: X ->* Y e: Y <~>* Y' cx: IsComplex i (e o* f)
IsComplex i f
F, X, Y, Y': pType i: F ->* X f: X ->* Y e: Y <~>* Y' cx: IsComplex i (e o* f)
f o* i ==* e^-1* o* pconst
F, X, Y, Y': pType i: F ->* X f: X ->* Y e: Y <~>* Y' cx: IsComplex i (e o* f)
e^-1* $o (e $o (f o* i)) $== e^-1* o* pconst
F, X, Y, Y': pType i: F ->* X f: X ->* Y e: Y <~>* Y' cx: IsComplex i (e o* f)
e $o (f o* i) $== pconst
F, X, Y, Y': pType i: F ->* X f: X ->* Y e: Y <~>* Y' cx: IsComplex i (e o* f)
e $o f $o i $== pconst
exact cx.Defined.(** And likewise passage across squares with equivalences *)
F, F', X, X', Y: pType i: F ->* X i': F' ->* X' g: F' <~>* F h: X' <~>* X p: h o* i' ==* i o* g f: X ->* Y cx: IsComplex i f
IsComplex i' (f o* h)
F, F', X, X', Y: pType i: F ->* X i': F' ->* X' g: F' <~>* F h: X' <~>* X p: h o* i' ==* i o* g f: X ->* Y cx: IsComplex i f
IsComplex i' (f o* h)
F, F', X, X', Y: pType i: F ->* X i': F' ->* X' g: F' <~>* F h: X' <~>* X p: h o* i' ==* i o* g f: X ->* Y cx: IsComplex i f
f o* (h o* i') ==* pconst
F, F', X, X', Y: pType i: F ->* X i': F' ->* X' g: F' <~>* F h: X' <~>* X p: h o* i' ==* i o* g f: X ->* Y cx: IsComplex i f
f o* (i o* g) ==* pconst
F, F', X, X', Y: pType i: F ->* X i': F' ->* X' g: F' <~>* F h: X' <~>* X p: h o* i' ==* i o* g f: X ->* Y cx: IsComplex i f
f o* i o* g ==* pconst
F, F', X, X', Y: pType i: F ->* X i': F' ->* X' g: F' <~>* F h: X' <~>* X p: h o* i' ==* i o* g f: X ->* Y cx: IsComplex i f
pconst o* g ==* pconst
apply postcompose_pconst.Defined.(** A special version with only an equivalence on the fiber. *)
F, F', X, Y: pType i: F ->* X f: X ->* Y phi: F' <~>* F cx: IsComplex i f
IsComplex (i o* phi) f
F, F', X, Y: pType i: F ->* X f: X ->* Y phi: F' <~>* F cx: IsComplex i f
IsComplex (i o* phi) f
F, F', X, Y: pType i: F ->* X f: X ->* Y phi: F' <~>* F cx: IsComplex i f
f o* i o* phi ==* pconst
F, F', X, Y: pType i: F ->* X f: X ->* Y phi: F' <~>* F cx: IsComplex i f
pconst o* phi ==* pconst
apply postcompose_pconst.Defined.(** Any pointed map induces a trivial complex. *)
((funx : pUnit => point_eq f : (f o* pconst) x = pconst x)
:
f o* pconst == pconst) pt =
dpoint_eq (f o* pconst) @ (dpoint_eq pconst)^
X, Y: pType f: X ->* Y
(1 @ point_eq f) @ 1 = point_eq f
exact (concat_p1 _ @ concat_1p _).Defined.(** If [Y] is a set, then [IsComplex] is an [HProp]. *)Instanceishprop_iscomplex_hset `{Funext} {F X Y : pType} `{IsHSet Y}
(i : F ->* X) (f : X ->* Y)
: IsHProp (IsComplex i f) := _.(** ** Very short exact sequences and fiber sequences *)(** A complex is [n]-exact if the induced map [cxfib] is [n]-connected. *)CumulativeClassIsExact (n : Modality) {FXY : pType} (i : F ->* X) (f : X ->* Y) :=
{
cx_isexact : IsComplex i f ;
conn_map_isexact :: IsConnMap n (cxfib cx_isexact)
}.Definitionissig_isexact (n : Modality) {FXY : pType} (i : F ->* X) (f : X ->* Y)
: _ <~> IsExact n i f := ltac:(issig).(** If [Y] is a set, then [IsExact] is an [HProp]. *)
H: Univalence F, X, Y: pType IsHSet0: IsHSet Y n: Modality i: F ->* X f: X ->* Y
IsHProp (IsExact n i f)
H: Univalence F, X, Y: pType IsHSet0: IsHSet Y n: Modality i: F ->* X f: X ->* Y
IsHProp (IsExact n i f)
H: Univalence F, X, Y: pType IsHSet0: IsHSet Y n: Modality i: F ->* X f: X ->* Y
{cx : IsComplex i f & IsConnMap n (cxfib cx)} = IsExact n i f
H: Univalence F, X, Y: pType IsHSet0: IsHSet Y n: Modality i: F ->* X f: X ->* Y
IsHProp {cx : IsComplex i f & IsConnMap n (cxfib cx)}
H: Univalence F, X, Y: pType IsHSet0: IsHSet Y n: Modality i: F ->* X f: X ->* Y
{cx : IsComplex i f & IsConnMap n (cxfib cx)} = IsExact n i f
apply path_universe_uncurried; issig.Defined.(** With exactness we can choose preimages. *)
O: Modality F, X, Y: pType i: F ->* X f: X ->* Y H: IsExact O i f x: X p: f x = pt
O (hfiber i x)
O: Modality F, X, Y: pType i: F ->* X f: X ->* Y H: IsExact O i f x: X p: f x = pt
O (hfiber i x)
O: Modality F, X, Y: pType i: F ->* X f: X ->* Y H: IsExact O i f x: X p: f x = pt
hfiber (cxfib cx_isexact) (x; p) -> hfiber i x
O: Modality F, X, Y: pType i: F ->* X f: X ->* Y H: IsExact O i f x: X p: f x = pt
O (hfiber (cxfib cx_isexact) (x; p))
O: Modality F, X, Y: pType i: F ->* X f: X ->* Y H: IsExact O i f x: X p: f x = pt
hfiber (cxfib cx_isexact) (x; p) -> hfiber i x
O: Modality F, X, Y: pType i: F ->* X f: X ->* Y H: IsExact O i f x: X p: f x = pt z: F q: cxfib cx_isexact z = (x; p)
hfiber i x
exact (z; ap pr1 q).
O: Modality F, X, Y: pType i: F ->* X f: X ->* Y H: IsExact O i f x: X p: f x = pt
O (hfiber (cxfib cx_isexact) (x; p))
apply center, conn_map_isexact.Defined.(** Bundled version of the above. *)
O: Modality F, X, Y: pType i: F ->* X f: X ->* Y H: IsExact O i f x: hfiber f pt
O (hfiber i x.1)
O: Modality F, X, Y: pType i: F ->* X f: X ->* Y H: IsExact O i f x: hfiber f pt
O (hfiber i x.1)
srapply isexact_preimage; exact x.2.Defined.(** If the base is contractible, then [i] is [O]-connected. *)Definitionisconnmap_O_isexact_base_contr (O : Modality@{u}) {FXY : pType}
`{Contr Y} (i : F ->* X) (f : X ->* Y)
`{IsExact@{_ _ u u u} O _ _ _ i f}
: IsConnMap O i
:= conn_map_compose@{u _ u _} O (cxfib@{u u _ _} cx_isexact) pr1.(** Passage across homotopies preserves exactness. *)
n: Modality F, X, Y: pType i, i': F ->* X ii: i' ==* i f: X ->* Y H: IsExact n i f
IsExact n i' f
n: Modality F, X, Y: pType i, i': F ->* X ii: i' ==* i f: X ->* Y H: IsExact n i f
IsExact n i' f
n: Modality F, X, Y: pType i, i': F ->* X ii: i' ==* i f: X ->* Y H: IsExact n i f
IsConnMap n (cxfib (iscomplex_homotopic_i ii f cx_isexact))
n: Modality F, X, Y: pType i, i': F ->* X ii: i' ==* i f: X ->* Y H: IsExact n i f
cxfib cx_isexact == cxfib (iscomplex_homotopic_i ii f cx_isexact)
n: Modality F, X, Y: pType i, i': F ->* X ii: i' ==* i f: X ->* Y H: IsExact n i f u: F
(i u; cx_isexact u) = (i' u; ap f (ii u) @ cx_isexact u)
n: Modality F, X, Y: pType i, i': F ->* X ii: i' ==* i f: X ->* Y H: IsExact n i f u: F
transport (funx : X => f x = pt) (ii u)^ (cx_isexact u) =
ap f (ii u) @ cx_isexact u
n: Modality F, X, Y: pType i: F ->* X f, f': X ->* Y ff: f' ==* f H: IsExact n i f
IsExact n i f'
n: Modality F, X, Y: pType i: F ->* X f, f': X ->* Y ff: f' ==* f H: IsExact n i f
IsExact n i f'
n: Modality F, X, Y: pType i: F ->* X f, f': X ->* Y ff: f' ==* f H: IsExact n i f
IsConnMap n (cxfib (iscomplex_homotopic_f i ff cx_isexact))
n: Modality F, X, Y: pType i: F ->* X f, f': X ->* Y ff: f' ==* f H: IsExact n i f e:= equiv_hfiber_homotopic f' f ff pt: hfiber f' pt <~> hfiber f pt
IsConnMap n (cxfib (iscomplex_homotopic_f i ff cx_isexact))
n: Modality F, X, Y: pType i: F ->* X f, f': X ->* Y ff: f' ==* f H: IsExact n i f e:= equiv_hfiber_homotopic f' f ff pt: hfiber f' pt <~> hfiber f pt
IsEquiv e
n: Modality F, X, Y: pType i: F ->* X f, f': X ->* Y ff: f' ==* f H: IsExact n i f e:= equiv_hfiber_homotopic f' f ff pt: hfiber f' pt <~> hfiber f pt
IsConnMap n
(funx : F => e (cxfib (iscomplex_homotopic_f i ff cx_isexact) x))
n: Modality F, X, Y: pType i: F ->* X f, f': X ->* Y ff: f' ==* f H: IsExact n i f e:= equiv_hfiber_homotopic f' f ff pt: hfiber f' pt <~> hfiber f pt
IsConnMap n
(funx : F => e (cxfib (iscomplex_homotopic_f i ff cx_isexact) x))
n: Modality F, X, Y: pType i: F ->* X f, f': X ->* Y ff: f' ==* f H: IsExact n i f e:= equiv_hfiber_homotopic f' f ff pt: hfiber f' pt <~> hfiber f pt
cxfib cx_isexact ==
(funx : F => e (cxfib (iscomplex_homotopic_f i ff cx_isexact) x))
n: Modality F, X, Y: pType i: F ->* X f, f': X ->* Y ff: f' ==* f H: IsExact n i f e:= equiv_hfiber_homotopic f' f ff pt: hfiber f' pt <~> hfiber f pt u: F
cxfib cx_isexact u = e (cxfib (iscomplex_homotopic_f i ff cx_isexact) u)
n: Modality F, X, Y: pType i: F ->* X f, f': X ->* Y ff: f' ==* f H: IsExact n i f e:= equiv_hfiber_homotopic f' f ff pt: hfiber f' pt <~> hfiber f pt u: F
(i u; cx_isexact u) = (i u; (ff (i u))^ @ (ff (i u) @ cx_isexact u))
n: Modality F, X, Y: pType i: F ->* X f, f': X ->* Y ff: f' ==* f H: IsExact n i f e:= equiv_hfiber_homotopic f' f ff pt: hfiber f' pt <~> hfiber f pt u: F
(i u; cx_isexact u).1 = (i u; (ff (i u))^ @ (ff (i u) @ cx_isexact u)).1
n: Modality F, X, Y: pType i: F ->* X f, f': X ->* Y ff: f' ==* f H: IsExact n i f e:= equiv_hfiber_homotopic f' f ff pt: hfiber f' pt <~> hfiber f pt u: F
(i u; cx_isexact u).2 =
ap f ?q @ (i u; (ff (i u))^ @ (ff (i u) @ cx_isexact u)).2
n: Modality F, X, Y: pType i: F ->* X f, f': X ->* Y ff: f' ==* f H: IsExact n i f e:= equiv_hfiber_homotopic f' f ff pt: hfiber f' pt <~> hfiber f pt u: F
(i u; cx_isexact u).2 =
ap f 1 @ (i u; (ff (i u))^ @ (ff (i u) @ cx_isexact u)).2
exact (concat_1p _ @ concat_V_pp _ _)^.Defined.(** And also passage across squares with equivalences. *)
n: Modality F, F', X, X', Y: pType i: F ->* X i': F' ->* X' g: F' <~>* F h: X' <~>* X p: h o* i' ==* i o* g f: X ->* Y H: IsExact n i f
IsExact n i' (f o* h)
n: Modality F, F', X, X', Y: pType i: F ->* X i': F' ->* X' g: F' <~>* F h: X' <~>* X p: h o* i' ==* i o* g f: X ->* Y H: IsExact n i f
IsExact n i' (f o* h)
n: Modality F, F', X, X', Y: pType i: F ->* X i': F' ->* X' g: F' <~>* F h: X' <~>* X p: h o* i' ==* i o* g f: X ->* Y H: IsExact n i f
IsConnMap n
(funx : F' => (i' x; 1 @ (ap f (p x) @ (1 @ (cx_isexact (g x) @ 1)))))
n: Modality F, F', X, X', Y: pType i: F ->* X i': F' ->* X' g: F' <~>* F h: X' <~>* X p: h o* i' ==* i o* g f: X ->* Y H: IsExact n i f
hfiber (funx : X' => f (h x)) pt <~> pfiber f
n: Modality F, F', X, X', Y: pType i: F ->* X i': F' ->* X' g: F' <~>* F h: X' <~>* X p: h o* i' ==* i o* g f: X ->* Y H: IsExact n i f
IsConnMap n
(?g
o (funx : F' => (i' x; 1 @ (ap f (p x) @ (1 @ (cx_isexact (g x) @ 1))))))
n: Modality F, F', X, X', Y: pType i: F ->* X i': F' ->* X' g: F' <~>* F h: X' <~>* X p: h o* i' ==* i o* g f: X ->* Y H: IsExact n i f
hfiber (funx : X' => f (h x)) pt <~> pfiber f
exact (@equiv_functor_hfiber _ _ _ _ (f o h) f h equiv_idmap
(funx => 1%path) (point Y)).
n: Modality F, F', X, X', Y: pType i: F ->* X i': F' ->* X' g: F' <~>* F h: X' <~>* X p: h o* i' ==* i o* g f: X ->* Y H: IsExact n i f
IsConnMap n
(equiv_functor_hfiber (funx : X' => 1) pt
o (funx : F' => (i' x; 1 @ (ap f (p x) @ (1 @ (cx_isexact (g x) @ 1))))))
n: Modality F, F', X, X', Y: pType i: F ->* X i': F' ->* X' g: F' <~>* F h: X' <~>* X p: h o* i' ==* i o* g f: X ->* Y H: IsExact n i f
IsConnMap n
(funx : F' =>
(h (i' x); 1 @ ap idmap (1 @ (ap f (p x) @ (1 @ (cx_isexact (g x) @ 1))))))
n: Modality F, F', X, X', Y: pType i: F ->* X i': F' ->* X' g: F' <~>* F h: X' <~>* X p: h o* i' ==* i o* g f: X ->* Y H: IsExact n i f
(funx : F' => cxfib cx_isexact (g x)) ==
(funx : F' =>
(h (i' x); 1 @ ap idmap (1 @ (ap f (p x) @ (1 @ (cx_isexact (g x) @ 1))))))
n: Modality F, F', X, X', Y: pType i: F ->* X i': F' ->* X' g: F' <~>* F h: X' <~>* X p: h o* i' ==* i o* g f: X ->* Y H: IsExact n i f u: F'
(i (g u); cx_isexact (g u)) =
(h (i' u); 1 @ ap idmap (1 @ (ap f (p u) @ (1 @ (cx_isexact (g u) @ 1)))))
n: Modality F, F', X, X', Y: pType i: F ->* X i': F' ->* X' g: F' <~>* F h: X' <~>* X p: h o* i' ==* i o* g f: X ->* Y H: IsExact n i f u: F'
transport (funx : X => f x = pt) (p u)^ (cx_isexact (g u)) =
1 @ ap idmap (1 @ (ap f (p u) @ (1 @ (cx_isexact (g u) @ 1))))
abstract (
rewrite transport_paths_Fl, ap_V, inv_V,
!concat_1p, concat_p1, ap_idmap;
reflexivity
).Defined.(** In particular, we can transfer exactness across equivalences of the total space. *)
n: Modality F, X, X', Y: pType i: F ->* X f: X' ->* Y phi: X <~>* X' H: IsExact n (phi o* i) f
IsExact n i (f o* phi)
n: Modality F, X, X', Y: pType i: F ->* X f: X' ->* Y phi: X <~>* X' H: IsExact n (phi o* i) f
IsExact n i (f o* phi)
n: Modality F, X, X', Y: pType i: F ->* X f: X' ->* Y phi: X <~>* X' H: IsExact n (phi o* i) f
phi o* i ==* phi o* i o* pmap_idmap
exact (pmap_precompose_idmap _)^*.Defined.(** Similarly, we can cancel equivalences on the fiber. *)
n: Modality F, F', X, Y: pType i: F ->* X f: X ->* Y phi: F' <~>* F E: IsExact n i f
IsExact n (i o* phi) f
n: Modality F, F', X, Y: pType i: F ->* X f: X ->* Y phi: F' <~>* F E: IsExact n i f
IsExact n (i o* phi) f
n: Modality F, F', X, Y: pType i: F ->* X f: X ->* Y phi: F' <~>* F E: IsExact n i f
IsComplex (i o* phi) f
n: Modality F, F', X, Y: pType i: F ->* X f: X ->* Y phi: F' <~>* F E: IsExact n i f
IsConnMap n (cxfib ?cx_isexact)
n: Modality F, F', X, Y: pType i: F ->* X f: X ->* Y phi: F' <~>* F E: IsExact n i f
IsConnMap n (cxfib (iscomplex_equiv_fiber i f phi))
n: Modality F, F', X, Y: pType i: F ->* X f: X ->* Y phi: F' <~>* F E: IsExact n i f
cxfib cx_isexact o* phi == cxfib (iscomplex_equiv_fiber i f phi)
n: Modality F, F', X, Y: pType i: F ->* X f: X ->* Y phi: F' <~>* F E: IsExact n i f
IsConnMap n (cxfib cx_isexact o* phi)
n: Modality F, F', X, Y: pType i: F ->* X f: X ->* Y phi: F' <~>* F E: IsExact n i f
cxfib cx_isexact o* phi == cxfib (iscomplex_equiv_fiber i f phi)
n: Modality F, F', X, Y: pType i: F ->* X f: X ->* Y phi: F' <~>* F E: IsExact n i f x: F'
(i (phi x); cx_isexact (phi x)) = (i (phi x); 1 @ (cx_isexact (phi x) @ 1))
byrewrite concat_p1, concat_1p.
n: Modality F, F', X, Y: pType i: F ->* X f: X ->* Y phi: F' <~>* F E: IsExact n i f
IsConnMap n (cxfib cx_isexact o* phi)
exact _.Defined.(** An equivalence of short sequences preserves exactness. *)
n: Modality F, F', X, X', Y, Y': pType i: F ->* X i': F' ->* X' f: X ->* Y f': X' ->* Y' g: F' <~>* F h: X' <~>* X k: Y' <~>* Y p: h o* i' ==* i o* g q: k o* f' ==* f o* h H: IsExact n i f
IsExact n i' f'
n: Modality F, F', X, X', Y, Y': pType i: F ->* X i': F' ->* X' f: X ->* Y f': X' ->* Y' g: F' <~>* F h: X' <~>* X k: Y' <~>* Y p: h o* i' ==* i o* g q: k o* f' ==* f o* h H: IsExact n i f
IsExact n i' f'
n: Modality F, F', X, X', Y, Y': pType i: F ->* X i': F' ->* X' f: X ->* Y f': X' ->* Y' g: F' <~>* F h: X' <~>* X k: Y' <~>* Y p: h o* i' ==* i o* g q: k o* f' ==* f o* h H: IsExact n i f I:= isexact_equiv_i n i i' g h p f: IsExact n i' (f o* h)
IsExact n i' f'
n: Modality F, F', X, X', Y, Y': pType i: F ->* X i': F' ->* X' f: X ->* Y f': X' ->* Y' g: F' <~>* F h: X' <~>* X k: Y' <~>* Y p: h o* i' ==* i o* g q: k o* f' ==* f o* h H: IsExact n i f I:= isexact_equiv_i n i i' g h p f: IsExact n i' (f o* h) I2:= isexact_homotopic_f n i' q: IsExact n i' (k o* f')
IsExact n i' f'
n: Modality F, F', X, X', Y, Y': pType i: F ->* X i': F' ->* X' f: X ->* Y f': X' ->* Y' g: F' <~>* F h: X' <~>* X k: Y' <~>* Y p: h o* i' ==* i o* g q: k o* f' ==* f o* h H: IsExact n i f I:= isexact_equiv_i n i i' g h p f: IsExact n i' (f o* h) I2:= isexact_homotopic_f n i' q: IsExact n i' (k o* f')
IsConnMap n (cxfib (iscomplex_cancelL i' f' k cx_isexact))
n: Modality F, F', X, X', Y, Y': pType i: F ->* X i': F' ->* X' f: X ->* Y f': X' ->* Y' g: F' <~>* F h: X' <~>* X k: Y' <~>* Y p: h o* i' ==* i o* g q: k o* f' ==* f o* h H: IsExact n i f I:= isexact_equiv_i n i i' g h p f: IsExact n i' (f o* h) I2:= isexact_homotopic_f n i' q: IsExact n i' (k o* f') e:= pequiv_pfiber pequiv_pmap_idmap k (pmap_precompose_idmap (k o* f'))^*
:
pfiber f' <~>* pfiber (k o* f'): pfiber f' <~>* pfiber (k o* f')
IsConnMap n (cxfib (iscomplex_cancelL i' f' k cx_isexact))
n: Modality F, F', X, X', Y, Y': pType i: F ->* X i': F' ->* X' f: X ->* Y f': X' ->* Y' g: F' <~>* F h: X' <~>* X k: Y' <~>* Y p: h o* i' ==* i o* g q: k o* f' ==* f o* h H: IsExact n i f I:= isexact_equiv_i n i i' g h p f: IsExact n i' (f o* h) I2:= isexact_homotopic_f n i' q: IsExact n i' (k o* f') e:= pequiv_pfiber pequiv_pmap_idmap k (pmap_precompose_idmap (k o* f'))^*
:
pfiber f' <~>* pfiber (k o* f'): pfiber f' <~>* pfiber (k o* f')
IsEquiv e
n: Modality F, F', X, X', Y, Y': pType i: F ->* X i': F' ->* X' f: X ->* Y f': X' ->* Y' g: F' <~>* F h: X' <~>* X k: Y' <~>* Y p: h o* i' ==* i o* g q: k o* f' ==* f o* h H: IsExact n i f I:= isexact_equiv_i n i i' g h p f: IsExact n i' (f o* h) I2:= isexact_homotopic_f n i' q: IsExact n i' (k o* f') e:= pequiv_pfiber pequiv_pmap_idmap k (pmap_precompose_idmap (k o* f'))^*
:
pfiber f' <~>* pfiber (k o* f'): pfiber f' <~>* pfiber (k o* f')
IsConnMap n
(funx : F' => e (cxfib (iscomplex_cancelL i' f' k cx_isexact) x))
n: Modality F, F', X, X', Y, Y': pType i: F ->* X i': F' ->* X' f: X ->* Y f': X' ->* Y' g: F' <~>* F h: X' <~>* X k: Y' <~>* Y p: h o* i' ==* i o* g q: k o* f' ==* f o* h H: IsExact n i f I:= isexact_equiv_i n i i' g h p f: IsExact n i' (f o* h) I2:= isexact_homotopic_f n i' q: IsExact n i' (k o* f') e:= pequiv_pfiber pequiv_pmap_idmap k (pmap_precompose_idmap (k o* f'))^*
:
pfiber f' <~>* pfiber (k o* f'): pfiber f' <~>* pfiber (k o* f')
IsConnMap n
(funx : F' => e (cxfib (iscomplex_cancelL i' f' k cx_isexact) x))
n: Modality F, F', X, X', Y, Y': pType i: F ->* X i': F' ->* X' f: X ->* Y f': X' ->* Y' g: F' <~>* F h: X' <~>* X k: Y' <~>* Y p: h o* i' ==* i o* g q: k o* f' ==* f o* h H: IsExact n i f I:= isexact_equiv_i n i i' g h p f: IsExact n i' (f o* h) I2:= isexact_homotopic_f n i' q: IsExact n i' (k o* f') e:= pequiv_pfiber pequiv_pmap_idmap k (pmap_precompose_idmap (k o* f'))^*
:
pfiber f' <~>* pfiber (k o* f'): pfiber f' <~>* pfiber (k o* f')
cxfib cx_isexact ==
(funx : F' => e (cxfib (iscomplex_cancelL i' f' k cx_isexact) x))
n: Modality F, F', X, X', Y, Y': pType i: F ->* X i': F' ->* X' f: X ->* Y f': X' ->* Y' g: F' <~>* F h: X' <~>* X k: Y' <~>* Y p: h o* i' ==* i o* g q: k o* f' ==* f o* h H: IsExact n i f I:= isexact_equiv_i n i i' g h p f: IsExact n i' (f o* h) I2:= isexact_homotopic_f n i' q: IsExact n i' (k o* f') e:= pequiv_pfiber pequiv_pmap_idmap k (pmap_precompose_idmap (k o* f'))^*
:
pfiber f' <~>* pfiber (k o* f'): pfiber f' <~>* pfiber (k o* f') u: F'
cxfib cx_isexact u = e (cxfib (iscomplex_cancelL i' f' k cx_isexact) u)
n: Modality F, F', X, X', Y, Y': pType i: F ->* X i': F' ->* X' f: X ->* Y f': X' ->* Y' g: F' <~>* F h: X' <~>* X k: Y' <~>* Y p: h o* i' ==* i o* g q: k o* f' ==* f o* h H: IsExact n i f I:= isexact_equiv_i n i i' g h p f: IsExact n i' (f o* h) I2:= isexact_homotopic_f n i' q: IsExact n i' (k o* f') e:= pequiv_pfiber pequiv_pmap_idmap k (pmap_precompose_idmap (k o* f'))^*
:
pfiber f' <~>* pfiber (k o* f'): pfiber f' <~>* pfiber (k o* f') u: F'
(cxfib cx_isexact u).1 =
(e (cxfib (iscomplex_cancelL i' f' k cx_isexact) u)).1
n: Modality F, F', X, X', Y, Y': pType i: F ->* X i': F' ->* X' f: X ->* Y f': X' ->* Y' g: F' <~>* F h: X' <~>* X k: Y' <~>* Y p: h o* i' ==* i o* g q: k o* f' ==* f o* h H: IsExact n i f I:= isexact_equiv_i n i i' g h p f: IsExact n i' (f o* h) I2:= isexact_homotopic_f n i' q: IsExact n i' (k o* f') e:= pequiv_pfiber pequiv_pmap_idmap k (pmap_precompose_idmap (k o* f'))^*
:
pfiber f' <~>* pfiber (k o* f'): pfiber f' <~>* pfiber (k o* f') u: F'
(cxfib cx_isexact u).2 =
ap (k o* f') ?q @ (e (cxfib (iscomplex_cancelL i' f' k cx_isexact) u)).2
n: Modality F, F', X, X', Y, Y': pType i: F ->* X i': F' ->* X' f: X ->* Y f': X' ->* Y' g: F' <~>* F h: X' <~>* X k: Y' <~>* Y p: h o* i' ==* i o* g q: k o* f' ==* f o* h H: IsExact n i f I:= isexact_equiv_i n i i' g h p f: IsExact n i' (f o* h) I2:= isexact_homotopic_f n i' q: IsExact n i' (k o* f') e:= pequiv_pfiber pequiv_pmap_idmap k (pmap_precompose_idmap (k o* f'))^*
:
pfiber f' <~>* pfiber (k o* f'): pfiber f' <~>* pfiber (k o* f') u: F'
(cxfib cx_isexact u).1 =
(e (cxfib (iscomplex_cancelL i' f' k cx_isexact) u)).1
reflexivity.
n: Modality F, F', X, X', Y, Y': pType i: F ->* X i': F' ->* X' f: X ->* Y f': X' ->* Y' g: F' <~>* F h: X' <~>* X k: Y' <~>* Y p: h o* i' ==* i o* g q: k o* f' ==* f o* h H: IsExact n i f I:= isexact_equiv_i n i i' g h p f: IsExact n i' (f o* h) I2:= isexact_homotopic_f n i' q: IsExact n i' (k o* f') e:= pequiv_pfiber pequiv_pmap_idmap k (pmap_precompose_idmap (k o* f'))^*
:
pfiber f' <~>* pfiber (k o* f'): pfiber f' <~>* pfiber (k o* f') u: F'
(cxfib cx_isexact u).2 =
ap (k o* f') 1 @ (e (cxfib (iscomplex_cancelL i' f' k cx_isexact) u)).2
n: Modality F, F', X, X', Y, Y': pType i: F ->* X i': F' ->* X' f: X ->* Y f': X' ->* Y' g: F' <~>* F h: X' <~>* X k: Y' <~>* Y p: h o* i' ==* i o* g q: k o* f' ==* f o* h H: IsExact n i f I:= isexact_equiv_i n i i' g h p f: IsExact n i' (f o* h) I2:= isexact_homotopic_f n i' q: IsExact n i' (k o* f') e:= pequiv_pfiber pequiv_pmap_idmap k (pmap_precompose_idmap (k o* f'))^*
:
pfiber f' <~>* pfiber (k o* f'): pfiber f' <~>* pfiber (k o* f') u: F'
q (i' u) @ (1 @ (ap f (p u) @ (1 @ (cx_isexact (g u) @ 1)))) =
1 @
((1 @
ap k
((((1 @ (1 @ eissect k (f' (i' u)))) @ 1)^ @
ap k^-1
(1 @ (q (i' u) @ (1 @ (ap f (p u) @ (1 @ (cx_isexact (g u) @ 1))))))) @
moveR_equiv_V pt pt (point_eq k)^)) @
point_eq k)
n: Modality F, F', X, X', Y, Y': pType i: F ->* X i': F' ->* X' f: X ->* Y f': X' ->* Y' g: F' <~>* F h: X' <~>* X k: Y' <~>* Y p: h o* i' ==* i o* g q: k o* f' ==* f o* h H: IsExact n i f I:= isexact_equiv_i n i i' g h p f: IsExact n i' (f o* h) I2:= isexact_homotopic_f n i' q: IsExact n i' (k o* f') e:= pequiv_pfiber pequiv_pmap_idmap k (pmap_precompose_idmap (k o* f'))^*
:
pfiber f' <~>* pfiber (k o* f'): pfiber f' <~>* pfiber (k o* f') u: F'
q (i' u) @ (1 @ (ap f (p u) @ (1 @ (cx_isexact (g u) @ 1)))) =
1 @
((1 @
ap k
((((1 @ (1 @ eissect k (f' (i' u)))) @ 1)^ @
ap k^-1
(1 @ (q (i' u) @ (1 @ (ap f (p u) @ (1 @ (cx_isexact (g u) @ 1))))))) @
(ap k^-1 (point_eq k)^ @ eissect k pt))) @
point_eq k)
n: Modality F, F', X, X', Y, Y': pType i: F ->* X i': F' ->* X' f: X ->* Y f': X' ->* Y' g: F' <~>* F h: X' <~>* X k: Y' <~>* Y p: h o* i' ==* i o* g q: k o* f' ==* f o* h H: IsExact n i f I:= isexact_equiv_i n i i' g h p f: IsExact n i' (f o* h) I2:= isexact_homotopic_f n i' q: IsExact n i' (k o* f') e:= pequiv_pfiber pequiv_pmap_idmap k (pmap_precompose_idmap (k o* f'))^*
:
pfiber f' <~>* pfiber (k o* f'): pfiber f' <~>* pfiber (k o* f') u: F'
q (i' u) @ (ap f (p u) @ cx_isexact (g u)) =
((eisretr k (k (f' (i' u))))^ @
ap k (ap k^-1 (q (i' u) @ (ap f (p u) @ cx_isexact (g u))))) @
((ap k (ap k^-1 (point_eq k)^) @ eisretr k (k pt)) @ point_eq k)
n: Modality F, F', X, X', Y, Y': pType i: F ->* X i': F' ->* X' f: X ->* Y f': X' ->* Y' g: F' <~>* F h: X' <~>* X k: Y' <~>* Y p: h o* i' ==* i o* g q: k o* f' ==* f o* h H: IsExact n i f I:= isexact_equiv_i n i i' g h p f: IsExact n i' (f o* h) I2:= isexact_homotopic_f n i' q: IsExact n i' (k o* f') e:= pequiv_pfiber pequiv_pmap_idmap k (pmap_precompose_idmap (k o* f'))^*
:
pfiber f' <~>* pfiber (k o* f'): pfiber f' <~>* pfiber (k o* f') u: F'
q (i' u) @ (ap f (p u) @ cx_isexact (g u)) =
(eisretr k (k (f' (i' u))))^ @
(ap (funx : Y => k (k^-1 x)) (q (i' u) @ (ap f (p u) @ cx_isexact (g u))) @
((ap (funx : Y => k (k^-1 x)) (point_eq k)^ @ eisretr k (k pt)) @
point_eq k))
n: Modality F, F', X, X', Y, Y': pType i: F ->* X i': F' ->* X' f: X ->* Y f': X' ->* Y' g: F' <~>* F h: X' <~>* X k: Y' <~>* Y p: h o* i' ==* i o* g q: k o* f' ==* f o* h H: IsExact n i f I:= isexact_equiv_i n i i' g h p f: IsExact n i' (f o* h) I2:= isexact_homotopic_f n i' q: IsExact n i' (k o* f') e:= pequiv_pfiber pequiv_pmap_idmap k (pmap_precompose_idmap (k o* f'))^*
:
pfiber f' <~>* pfiber (k o* f'): pfiber f' <~>* pfiber (k o* f') u: F'
q (i' u) @ (ap f (p u) @ cx_isexact (g u)) =
(eisretr k (k (f' (i' u))))^ @
(ap (funx : Y => k (k^-1 x)) (q (i' u) @ (ap f (p u) @ cx_isexact (g u))) @
eisretr k pt)
n: Modality F, F', X, X', Y, Y': pType i: F ->* X i': F' ->* X' f: X ->* Y f': X' ->* Y' g: F' <~>* F h: X' <~>* X k: Y' <~>* Y p: h o* i' ==* i o* g q: k o* f' ==* f o* h H: IsExact n i f I:= isexact_equiv_i n i i' g h p f: IsExact n i' (f o* h) I2:= isexact_homotopic_f n i' q: IsExact n i' (k o* f') e:= pequiv_pfiber pequiv_pmap_idmap k (pmap_precompose_idmap (k o* f'))^*
:
pfiber f' <~>* pfiber (k o* f'): pfiber f' <~>* pfiber (k o* f') u: F'
q (i' u) @ (ap f (p u) @ cx_isexact (g u)) =
q (i' u) @ (ap f (p u) @ cx_isexact (g u))
reflexivity.Defined.(** If a complex [F -> E -> B] is [O]-exact, the map [F -> B] is [O]-local, and path types in [Y] are [O]-local, then the induced map [cxfib] is an equivalence. *)
O: Modality F, X, Y: pType i: F ->* X f: X ->* Y H: forallyy' : Y, In O (y = y') H0: MapIn O i ex: IsExact O i f
IsEquiv (cxfib cx_isexact)
O: Modality F, X, Y: pType i: F ->* X f: X ->* Y H: forallyy' : Y, In O (y = y') H0: MapIn O i ex: IsExact O i f
IsEquiv (cxfib cx_isexact)
O: Modality F, X, Y: pType i: F ->* X f: X ->* Y H: forallyy' : Y, In O (y = y') H0: MapIn O i ex: IsExact O i f
IsConnMap ?Goal (cxfib cx_isexact)
O: Modality F, X, Y: pType i: F ->* X f: X ->* Y H: forallyy' : Y, In O (y = y') H0: MapIn O i ex: IsExact O i f
MapIn ?Goal (cxfib cx_isexact)
O: Modality F, X, Y: pType i: F ->* X f: X ->* Y H: forallyy' : Y, In O (y = y') H0: MapIn O i ex: IsExact O i f
MapIn O (cxfib cx_isexact)
rapply (cancelL_mapinO _ _ pr1).Defined.Definitionequiv_cxfib {O : Modality} {FXY : pType} {i : F ->* X} {f : X ->* Y}
`{forallyy' : Y, In O (y = y')} `{MapIn O _ _ i} (ex : IsExact O i f)
: F <~>* pfiber f
:= Build_pEquiv _ (isequiv_cxfib ex).
F, X, Y: pType i: F ->* X f: X ->* Y H: forallyy' : Y, In (Tr 0%nat) (y = y') H0: MapIn (Tr 0%nat) i ex: IsExact (Tr 0%nat) i f
i o pequiv_inverse (equiv_cxfib ex) == pfib f
F, X, Y: pType i: F ->* X f: X ->* Y H: forallyy' : Y, In (Tr 0%nat) (y = y') H0: MapIn (Tr 0%nat) i ex: IsExact (Tr 0%nat) i f
i o pequiv_inverse (equiv_cxfib ex) == pfib f
F, X, Y: pType i: F ->* X f: X ->* Y H: forallyy' : Y, In (Tr 0%nat) (y = y') H0: MapIn (Tr 0%nat) i ex: IsExact (Tr 0%nat) i f
IsEquiv ?Goal0
F, X, Y: pType i: F ->* X f: X ->* Y H: forallyy' : Y, In (Tr 0%nat) (y = y') H0: MapIn (Tr 0%nat) i ex: IsExact (Tr 0%nat) i f
forallx : ?Goal,
i (pequiv_inverse (equiv_cxfib ex) (?Goal0 x)) = pfib f (?Goal0 x)
F, X, Y: pType i: F ->* X f: X ->* Y H: forallyy' : Y, In (Tr 0%nat) (y = y') H0: MapIn (Tr 0%nat) i ex: IsExact (Tr 0%nat) i f
forallx : F,
i (pequiv_inverse (equiv_cxfib ex) (cxfib cx_isexact x)) =
pfib f (cxfib cx_isexact x)
F, X, Y: pType i: F ->* X f: X ->* Y H: forallyy' : Y, In (Tr 0%nat) (y = y') H0: MapIn (Tr 0%nat) i ex: IsExact (Tr 0%nat) i f x: F
i (pequiv_inverse (equiv_cxfib ex) (cxfib cx_isexact x)) =
pfib f (cxfib cx_isexact x)
exact (ap (fung => i g) (eissect _ x)).Defined.(** A purely exact sequence is [O]-exact for any modality [O]. *)
O: Modality F, X, Y: pType i: F ->* X f: X ->* Y H: IsExact purely i f
IsExact O i f
O: Modality F, X, Y: pType i: F ->* X f: X ->* Y H: IsExact purely i f
IsExact O i f
O: Modality F, X, Y: pType i: F ->* X f: X ->* Y H: IsExact purely i f
IsComplex i f
O: Modality F, X, Y: pType i: F ->* X f: X ->* Y H: IsExact purely i f
IsConnMap O (cxfib ?cx_isexact)
O: Modality F, X, Y: pType i: F ->* X f: X ->* Y H: IsExact purely i f
IsConnMap O (cxfib cx_isexact)
exact _.Defined.(** When [n] is the identity modality [purely], so that [cxfib] is an equivalence, we get simply a fiber sequence. In particular, the fiber of a given map yields an purely-exact sequence. *)
((funx0 : pfiber f => (funx : X => idmap) x0.1 x0.2)
:
f o* pfib f == pconst) pt =
dpoint_eq (f o* pfib f) @ (dpoint_eq pconst)^
X, Y: pType f: X ->* Y
point_eq f = (1 @ point_eq f) @ 1
exact (concat_p1 _ @ concat_1p _)^.Defined.
X, Y: pType f: X ->* Y
IsExact purely (pfib f) f
X, Y: pType f: X ->* Y
IsExact purely (pfib f) f
X, Y: pType f: X ->* Y
IsConnMap purely (cxfib (iscomplex_pfib f))
exact _.Defined.(** Fiber sequences can alternatively be defined as an equivalence to the fiber of some map. *)DefinitionFiberSeq (FXY : pType) := { f : X ->* Y & F <~>* pfiber f }.Definitioni_fiberseq {FXY} (fs : FiberSeq F X Y)
: F ->* X
:= pfib fs.1 o* fs.2.
change (IsEquiv fs.2); exact _.Defined.Definitionpequiv_cxfib {FXY : pType} {i : F ->* X} {f : X ->* Y}
`{IsExact purely F X Y i f}
: F <~>* pfiber f
:= Build_pEquiv (cxfib cx_isexact) _.Definitionfiberseq_isexact_purely {FXY : pType} (i : F ->* X) (f : X ->* Y)
`{IsExact purely F X Y i f} : FiberSeq F X Y
:= (f; pequiv_cxfib).(** It's easier to show that [loops] preserves fiber sequences than that it preserves purely-exact sequences. *)
exact (pfiber_fmap_loops fs.1)^-1*.Defined.(** Now we can deduce that [loops] preserves purely-exact sequences. The hardest part is modifying the first map back to [fmap loops i]. *)
F, X, Y: pType i: F ->* X f: X ->* Y H: IsExact purely i f
IsExact purely (fmap loops i) (fmap loops f)
F, X, Y: pType i: F ->* X f: X ->* Y H: IsExact purely i f
IsExact purely (fmap loops i) (fmap loops f)
F, X, Y: pType i: F ->* X f: X ->* Y H: IsExact purely i f
fmap loops i ==* i_fiberseq (fiberseq_loops (fiberseq_isexact_purely i f))
F, X, Y: pType i: F ->* X f: X ->* Y H: IsExact purely i f
H: Univalence n: trunc_index F, X, Y: pType i: F ->* X f: X ->* Y H0: IsExact (Tr n) i f
IsConnMap (Tr n) (cxfib (iscomplex_ptr n.+1 i f cx_isexact))
H: Univalence n: trunc_index F, X, Y: pType i: F ->* X f: X ->* Y H0: IsExact (Tr n) i f
IsConnMap (Tr n) tr
H: Univalence n: trunc_index F, X, Y: pType i: F ->* X f: X ->* Y H0: IsExact (Tr n) i f
IsConnMap (Tr n) (cxfib (iscomplex_ptr n.+1 i f cx_isexact) o tr)
H: Univalence n: trunc_index F, X, Y: pType i: F ->* X f: X ->* Y H0: IsExact (Tr n) i f
IsConnMap (Tr n) tr
intros x; rapply isconnected_pred.
H: Univalence n: trunc_index F, X, Y: pType i: F ->* X f: X ->* Y H0: IsExact (Tr n) i f
IsConnMap (Tr n) (cxfib (iscomplex_ptr n.+1 i f cx_isexact) o tr)
H: Univalence n: trunc_index F, X, Y: pType i: F ->* X f: X ->* Y H0: IsExact (Tr n) i f
?Goal == (funx : F => cxfib (iscomplex_ptr n.+1 i f cx_isexact) (tr x))
H: Univalence n: trunc_index F, X, Y: pType i: F ->* X f: X ->* Y H0: IsExact (Tr n) i f
IsConnMap (Tr n) ?Goal
H: Univalence n: trunc_index F, X, Y: pType i: F ->* X f: X ->* Y H0: IsExact (Tr n) i f
(funx : F =>
functor_hfiber (funy : X => (to_O_natural (Tr n.+1) f y)^) pt
(cxfib ?Goal1 x)) ==
(funx : F => cxfib (iscomplex_ptr n.+1 i f cx_isexact) (tr x))
H: Univalence n: trunc_index F, X, Y: pType i: F ->* X f: X ->* Y H0: IsExact (Tr n) i f
IsConnMap (Tr n) (cxfib ?Goal1)
H: Univalence n: trunc_index F, X, Y: pType i: F ->* X f: X ->* Y H0: IsExact (Tr n) i f
IsConnMap (Tr n)
(functor_hfiber (funy : X => (to_O_natural (Tr n.+1) f y)^) pt)
H: Univalence n: trunc_index F, X, Y: pType i: F ->* X f: X ->* Y H0: IsExact (Tr n) i f
(funx : F =>
functor_hfiber (funy : X => (to_O_natural (Tr n.+1) f y)^) pt
(cxfib ?Goal1 x)) ==
(funx : F => cxfib (iscomplex_ptr n.+1 i f cx_isexact) (tr x))
H: Univalence n: trunc_index F, X, Y: pType i: F ->* X f: X ->* Y H0: IsExact (Tr n) i f
IsConnMap (Tr n) (cxfib ?Goal1)
H: Univalence n: trunc_index F, X, Y: pType i: F ->* X f: X ->* Y H0: IsExact (Tr n) i f
(funx : F =>
functor_hfiber (funy : X => (to_O_natural (Tr n.+1) f y)^) pt
(cxfib ?Goal1 x)) ==
(funx : F => cxfib (iscomplex_ptr n.+1 i f cx_isexact) (tr x))
H: Univalence n: trunc_index F, X, Y: pType i: F ->* X f: X ->* Y H0: IsExact (Tr n) i f x: F
((to_O_natural (Tr n.+1) f (i x))^)^ @ ap tr (?Goal x) =
1 @ (ap tr (cx_isexact x) @ 1)
(* This is even simpler than it looks, because for truncations [to_O_natural n.+1 := 1], [to n.+1 := tr], and [cx_const := H]. *)exact (1 @@ (concat_p1 _)^).
H: Univalence n: trunc_index F, X, Y: pType i: F ->* X f: X ->* Y H0: IsExact (Tr n) i f
IsConnMap (Tr n) (cxfib cx_isexact)
exact _.Defined.(** In particular, (n.+1)-truncation takes fiber sequences to n-exact ones. *)
H: Univalence n: trunc_index F, X, Y: pType i: F ->* X f: X ->* Y H0: IsExact purely i f
H: Univalence n: trunc_index F, X, Y: pType i: F ->* X f: X ->* Y H0: IsExact purely i f
IsExact (Tr n) i f
H: Univalence n: trunc_index F, X, Y: pType i: F ->* X f: X ->* Y H0: IsExact purely i f
IsConnMap (Tr n) (cxfib cx_isexact)
H: Univalence n: trunc_index F, X, Y: pType i: F ->* X f: X ->* Y H0: IsExact purely i f z: pfiber f
Contr (hfiber (cxfib cx_isexact) z)
exact (conn_map_isexact (f := f) (i := i) z).Defined.(** ** Connecting maps *)(** It's useful to see [pfib_cxfib] as a degenerate square. *)
F, X, Y: pType i: F ->* X f: X ->* Y H: IsExact purely i f
pequiv_pmap_idmap o* i ==* pfib f o* pequiv_cxfib
F, X, Y: pType i: F ->* X f: X ->* Y H: IsExact purely i f
pequiv_pmap_idmap o* i ==* pfib f o* pequiv_cxfib
F, X, Y: pType i: F ->* X f: X ->* Y H: IsExact purely i f
i ==* pfib f o* pequiv_cxfib
symmetry; apply pfib_cxfib.Defined.(** The connecting maps for the long exact sequence of loop spaces, defined as an extension to a fiber sequence. *)
F, X, Y: pType i: F ->* X f: X ->* Y H: IsExact purely i f
FiberSeq (loops Y) F X
F, X, Y: pType i: F ->* X f: X ->* Y H: IsExact purely i f
FiberSeq (loops Y) F X
F, X, Y: pType i: F ->* X f: X ->* Y H: IsExact purely i f
loops Y <~>* pfiber i
exact (((pfiber2_loops f) o*E (pequiv_pfiber _ _ (square_pfib_pequiv_cxfib i f)))^-1*).Defined.Definitionconnecting_map {FXY}
(i : F ->* X) (f : X ->* Y) `{IsExact purely F X Y i f}
: loops Y ->* F
:= i_fiberseq (connect_fiberseq i f).
F, X, Y: pType i: F ->* X f: X ->* Y H: IsExact purely i f
IsExact purely (fmap loops f) (connecting_map i f)
F, X, Y: pType i: F ->* X f: X ->* Y H: IsExact purely i f
IsExact purely (fmap loops f) (connecting_map i f)
F, X, Y: pType i: F ->* X f: X ->* Y H: IsExact purely i f
(pfiber2_loops f
o*E pequiv_pfiber pequiv_cxfib pequiv_pmap_idmap
(square_pfib_pequiv_cxfib i f))^-1*
o* fmap loops f ==*
pfib (pfib i)
o* (loops_inv X o*E pfiber2_loops (pfib f)
o*E pequiv_pfiber
(pequiv_pfiber pequiv_cxfib pequiv_pmap_idmap
(square_pfib_pequiv_cxfib i f))
pequiv_cxfib
(square_pequiv_pfiber pequiv_cxfib pequiv_pmap_idmap
(square_pfib_pequiv_cxfib i f)))^-1*
F, X, Y: pType i: F ->* X f: X ->* Y H: IsExact purely i f
Square
(loops_inv X o*E pfiber2_loops (pfib f)
o*E pequiv_pfiber
(pequiv_pfiber pequiv_cxfib pequiv_pmap_idmap
(square_pfib_pequiv_cxfib i f))
pequiv_cxfib
(square_pequiv_pfiber pequiv_cxfib pequiv_pmap_idmap
(square_pfib_pequiv_cxfib i f)))
(pfiber2_loops f
o*E pequiv_pfiber pequiv_cxfib pequiv_pmap_idmap
(square_pfib_pequiv_cxfib i f))
(pfib (pfib i)) (fmap loops f)
F, X, Y: pType i: F ->* X f: X ->* Y H: IsExact purely i f
Square
(pequiv_pfiber
(pequiv_pfiber pequiv_cxfib pequiv_pmap_idmap
(square_pfib_pequiv_cxfib i f))
pequiv_cxfib
(square_pequiv_pfiber pequiv_cxfib pequiv_pmap_idmap
(square_pfib_pequiv_cxfib i f)))
(pequiv_pfiber pequiv_cxfib pequiv_pmap_idmap
(square_pfib_pequiv_cxfib i f))
(pfib (pfib i)) ?Goal
F, X, Y: pType i: F ->* X f: X ->* Y H: IsExact purely i f
exact (pfiber2_fmap_loops f).Defined.(** The connecting map associated to a pointed family. *)
Y: pType P: pFam Y
loops Y ->* [P pt, dpoint P]
Y: pType P: pFam Y
loops Y ->* [P pt, dpoint P]
Y: pType P: pFam Y
loops Y -> [P pt, dpoint P]
Y: pType P: pFam Y
?f pt = pt
Y: pType P: pFam Y
loops Y -> [P pt, dpoint P]
Y: pType P: pFam Y l: loops Y
[P pt, dpoint P]
Y: pType P: pFam Y l: loops Y
P pt
apply P.
Y: pType P: pFam Y
(funl : loops Y => transport P l (letX := dpoint P in X)) pt = pt
reflexivity.Defined.(** ** Long exact sequences *)RecordLongExactSequence (k : Modality) (N : SuccStr) : Type :=
{
les_carrier : N -> pType;
les_fn : foralln, les_carrier n.+1 ->* les_carrier n;
les_isexact :: foralln, IsExact k (les_fn n.+1) (les_fn n)
}.Coercionles_carrier : LongExactSequence >-> Funclass.Arguments les_fn {k N} S n : rename.(** Long exact sequences are preserved by truncation. *)Definitiontrunc_les `{Univalence} (k : trunc_index) {N : SuccStr}
(S : LongExactSequence purely N)
: LongExactSequence (Tr k) N
:= Build_LongExactSequence
(Tr k) N (funn => pTr k.+1 (S n))
(funn => fmap (pTr k.+1) (les_fn S n)) _.(** ** LES of loop spaces and homotopy groups *)Definitionloops_carrier (FXY : pType) (n : N3) : pType :=
match n with
| (n, inl (inl (inl x))) => Empty_ind _ x
| (n, inl (inl (inr tt))) => iterated_loops n Y
| (n, inl (inr tt)) => iterated_loops n X
| (n, inr tt) => iterated_loops n F
end.(** Starting from a fiber sequence, we can obtain a long purely-exact sequence of loop spaces. *)
F, X, Y: pType i: F ->* X f: X ->* Y H: IsExact purely i f
LongExactSequence purely N3
F, X, Y: pType i: F ->* X f: X ->* Y H: IsExact purely i f
LongExactSequence purely N3
F, X, Y: pType i: F ->* X f: X ->* Y H: IsExact purely i f
foralln : N3, loops_carrier F X Y n.+1 ->* loops_carrier F X Y n
F, X, Y: pType i: F ->* X f: X ->* Y H: IsExact purely i f
F, X, Y: pType i: F ->* X f: X ->* Y H: IsExact purely i f n: +N
(fix F0 (m : nat) : pType :=
match m with
| 0%nat => X
| m'.+1%nat => loops (F0 m')
end)
n ->*
(fix F0 (m : nat) : pType :=
match m with
| 0%nat => Y
| m'.+1%nat => loops (F0 m')
end)
n
F, X, Y: pType i: F ->* X f: X ->* Y H: IsExact purely i f n: +N
(fix F0 (m : nat) : pType :=
match m with
| 0%nat => F
| m'.+1%nat => loops (F0 m')
end)
n ->*
(fix F0 (m : nat) : pType :=
match m with
| 0%nat => X
| m'.+1%nat => loops (F0 m')
end)
n
F, X, Y: pType i: F ->* X f: X ->* Y H: IsExact purely i f n: +N
loops
((fix F0 (m : nat) : pType :=
match m with
| 0%nat => Y
| m'.+1%nat => loops (F0 m')
end)
n) ->*
(fix F0 (m : nat) : pType :=
match m with
| 0%nat => F
| m'.+1%nat => loops (F0 m')
end)
n
F, X, Y: pType i: F ->* X f: X ->* Y H: IsExact purely i f n: +N
IsExact purely ?Goal0?Goal
F, X, Y: pType i: F ->* X f: X ->* Y H: IsExact purely i f n: +N
IsExact purely ?Goal1?Goal0
F, X, Y: pType i: F ->* X f: X ->* Y H: IsExact purely i f n: +N
IsExact purely ?Goal@{n:=n.+1%nat} ?Goal1
F, X, Y: pType i: F ->* X f: X ->* Y H: IsExact purely i f n: +N
(fix F0 (m : nat) : pType :=
match m with
| 0%nat => X
| m'.+1%nat => loops (F0 m')
end)
n ->*
(fix F0 (m : nat) : pType :=
match m with
| 0%nat => Y
| m'.+1%nat => loops (F0 m')
end)
n
exact (fmap (iterated_loops n) f).
F, X, Y: pType i: F ->* X f: X ->* Y H: IsExact purely i f n: +N
(fix F0 (m : nat) : pType :=
match m with
| 0%nat => F
| m'.+1%nat => loops (F0 m')
end)
n ->*
(fix F0 (m : nat) : pType :=
match m with
| 0%nat => X
| m'.+1%nat => loops (F0 m')
end)
n
F, X, Y: pType i: F ->* X f: X ->* Y H: IsExact purely i f n: +N
loops
((fix F0 (m : nat) : pType :=
match m with
| 0%nat => Y
| m'.+1%nat => loops (F0 m')
end)
n) ->*
(fix F0 (m : nat) : pType :=
match m with
| 0%nat => F
| m'.+1%nat => loops (F0 m')
end)
n
F, X, Y: pType i: F ->* X f: X ->* Y H: IsExact purely i f n: +N
IsExact purely ?Goal (fmap (iterated_loops n) f)
F, X, Y: pType i: F ->* X f: X ->* Y H: IsExact purely i f n: +N
IsExact purely ?Goal0?Goal
F, X, Y: pType i: F ->* X f: X ->* Y H: IsExact purely i f n: +N
F, X, Y: pType i: F ->* X f: X ->* Y H: IsExact purely i f n: +N
(fix F0 (m : nat) : pType :=
match m with
| 0%nat => F
| m'.+1%nat => loops (F0 m')
end)
n ->*
(fix F0 (m : nat) : pType :=
match m with
| 0%nat => X
| m'.+1%nat => loops (F0 m')
end)
n
exact (fmap (iterated_loops n) i).
F, X, Y: pType i: F ->* X f: X ->* Y H: IsExact purely i f n: +N
loops
((fix F0 (m : nat) : pType :=
match m with
| 0%nat => Y
| m'.+1%nat => loops (F0 m')
end)
n) ->*
(fix F0 (m : nat) : pType :=
match m with
| 0%nat => F
| m'.+1%nat => loops (F0 m')
end)
n
F, X, Y: pType i: F ->* X f: X ->* Y H: IsExact purely i f n: +N
all:exact _.Defined.(** And from that, a long exact sequence of homotopy groups (though for now it is just a sequence of pointed sets). *)DefinitionPi_les `{Univalence} {F X Y : pType}
(i : F ->* X) (f : X ->* Y) `{IsExact purely F X Y i f}
: LongExactSequence (Tr (-1)) (N3)
:= trunc_les (-1) (loops_les i f).(** * Classifying fiber sequences *)(** Fiber sequences correspond to pointed maps into the universe. *)
H: Univalence Y, F: pType
(Y ->* [Type, F]) <~> {X : pType & FiberSeq F X Y}
H: Univalence Y, F: pType
(Y ->* [Type, F]) <~> {X : pType & FiberSeq F X Y}
H: Univalence Y, F: pType
?Goal <~> {X : pType & FiberSeq F X Y}
H: Univalence Y, F: pType
(Y ->* [Type, F]) <~> ?Goal
(** To apply [equiv_sigma_pfibration] we need to invert the equivalence on the fiber. *)
H: Univalence Y, F: pType
?Goal <~> {X : pType & FiberSeq F X Y}
H: Univalence Y, F, a: pType a0: a ->* Y
?Goal0 a0 <~> (F <~>* pfiber a0)
exact equiv_pequiv_inverse.
H: Univalence Y, F: pType
(Y ->* [Type, F]) <~> {a : pType & {a0 : a ->* Y & pfiber a0 <~>* F}}