https://github.com/jarlg/Yoneda-Ext
Raw File
Tip revision: 0d8bfe8e168bbdf325e805d7268e826e889189f0 authored by Jarl G. Taxerås Flaten on 30 April 2023, 16:47:45 UTC
Update README.md
Tip revision: 0d8bfe8
XII_5.v
From HoTT Require Import Basics Types Spaces.Nat WildCat Pointed
  Truncations HProp HSet HFiber Limits.Pullback ExactSequence
  AbGroups AbSES.


Require Import Lemmas EquivalenceRelation ES HigherExt.

Local Open Scope pointed_scope.
Local Open Scope type_scope.

(** We prove Lemma XII.5.3, Lemma XII.5.4, and Lemma XII.5.5 in Mac Lane's "Homology". Using these, we deduce the long exact sequence in LES.v. The statements are named [XII_5_3], [XII_5_4], and [XII_5_5], respectively. We do the proof on the level of [ES n] as opposed to the quotient [Ext n], since it's simpler to express things before truncating. Afterwards we show that analogous statements hold for [Ext n] in HigherExt.v. *)

(** Since we'll be proving several goals of the form "the following 3 statements are equivalent" we make a helper structure: *)

Definition TFAE3 (P Q R : Type) := (P -> Q) * (Q -> R) * (R -> P).

Definition TFAE3_merely (P Q R : Type)
  : TFAE3 P Q R -> TFAE3 (merely P) (merely Q) (merely R).
Proof.
  intros [[PQ QR] RP]; repeat split;
    apply Trunc_functor; assumption.
Defined.

Definition iff_TFAE3 {P P' Q Q' R R' : Type}
  (p : P <-> P') (q : Q <-> Q') (r : R <-> R')
  : TFAE3 P Q R -> TFAE3 P' Q' R'.
Proof.
  intros [[PQ QR] RP]; repeat split.
  - exact (fst q o PQ o snd p).
  - exact (fst r o QR o snd q).
  - exact (fst p o RP o snd r).
Defined.


(** * Lemma XII.5.3 *)

(** Given two short exact sequences [F] and [E] which can be spliced, the following are logically equivalent:
    a) F is in the image of of pullback along [inclusion E]
    b) E is in the image of pushout along [projection F]
    c) [es_splice F E] is trivial
**)

(** We start by showing that (a) <-> (b), which we need in order to show that (c) is equivalent to either. *)

Definition abses_spliceable_hfiber_inclusion_to_hfiber_projection
  `{Univalence} {C B A : AbGroup} (F : AbSES B A) (E : AbSES C B)
  : hfiber (abses_pullback (inclusion E)) F
    -> hfiber (abses_pushout (projection F)) E.
Proof.
  (* By inducting on the path, we assume definitionally that
     [F = abses_pullback (inclusion F) G]
     for some [G]. *)
  intros [G []].
  (* We construct the sequence [K] then show it lies in the fiber. *)
  srefine (let K:=_ in (K; _)).
  { srapply (Build_AbSES G).
    1: apply grp_pullback_pr1.
    1: exact (projection E $o projection G).
    1: rapply istruncmap_mapinO_tr.
    1: exact _.
    snrapply Build_IsExact.
    { apply phomotopy_homotopy_hset; intros [g [b q]]; cbn.
      refine (ap _ q @ _).
      apply isexact_inclusion_projection. }
    intros [g q]; rapply contr_inhabited_hprop; cbn.
    assert (b : Tr (-1) (hfiber (inclusion E) (projection G g))).
    1: exact (isexact_preimage _ _ (projection E) _ q).
    strip_truncations; apply tr.
    srefine ((g; b.1; _); _); cbn.
    1: exact b.2^.
    by apply equiv_path_sigma_hprop. }
  (* We construct a morphism which exhibits [K] as the pullback of [F]: *)
  snrefine (abses_pushout_component3_id
              (Build_AbSESMorphism _ _ grp_homo_id _ _)
              (fun _ => idpath)).
  1: exact (projection G).
  - intros [g [b q]]; cbn.
    exact q^.
  - reflexivity.
Defined.

Definition abses_spliceable_hfiber_projection_to_hfiber_inclusion
  `{U : Univalence} {C B A : AbGroup} (F : AbSES B A) (E : AbSES C B)
  : hfiber (abses_pushout (projection F)) E
    -> hfiber (abses_pullback (inclusion E)) F.
Proof.
  (* We assume that [H] is definitionally a pushout by inducting on the path. *)
  intros [H []].
  (* We first construct a sequence [K], afterwards we show that it's in the fibre. *)
  srefine (let K:=_ in (K; _)).
  { srapply (Build_AbSES H).
    1: exact (inclusion H $o inclusion F).
    1: apply ab_pushout_inr.
    1: exact _.
    1: rapply ab_pushout_surjection_inr.
    srapply Build_IsExact.
    { apply phomotopy_homotopy_hset; intro a.
      refine ((ab_pushout_commsq _)^ @ _).
      refine (ap ab_pushout_inl _ @ _).
      1: apply isexact_inclusion_projection.
      apply grp_homo_unit. }
    intros [h p]; rapply contr_inhabited_hprop.
    (* since [h] is in the kernel of [projection H], we can lift it to [e : E] *)
    assert (e : merely (hfiber (inclusion H) h)).
    { rapply (isexact_preimage (Tr (-1)) (inclusion H)).
      refine ((right_square (abses_pushout_morphism H (projection F)) h)^ @ _);
        unfold abses_pushout_morphism, component2.
      refine (ap _ p @ _).
      apply grp_homo_unit. }
    strip_truncations.
    (* since [inclusion F] is a mono, [e] is in the kernel of [projection E] *)
    assert (q : projection F e.1 = pt).
    { rapply (isinj_embedding (inclusion (abses_pushout (projection F) H))).
      refine (ab_pushout_commsq e.1 @ _ @ (grp_homo_unit _)^).
      exact (ap ab_pushout_inr e.2 @ p). }
    (* by exactness of [E] we get a preimage [a : A] of [e : E] *)
    pose (a := isexact_preimage (Tr (-1)) (inclusion F) _ _ q).
    generalize a; clear a. apply Trunc_functor; intro a.
    exists a.1.
    apply path_sigma_hprop; cbn.
    exact (ap (inclusion H) a.2 @ e.2). }
  snrefine (abses_pullback_component1_id
             (Build_AbSESMorphism grp_homo_id _ _ _ _)
             (fun _ => idpath))^.
  - exact (inclusion H).
  - reflexivity.
  - exact (fun x => (ab_pushout_commsq x)^).
Defined.

(** Lemma XII.5.3 (a) iff (b) *)
Definition iff_abses_spliceable_hfiber_projection_inclusion `{Univalence}
  {C B A : AbGroup} (F : AbSES B A) (E : AbSES C B)
  : hfiber (abses_pullback (inclusion E)) F
    <-> hfiber (abses_pushout (projection F)) E
  := (abses_spliceable_hfiber_inclusion_to_hfiber_projection F E,
       abses_spliceable_hfiber_projection_to_hfiber_inclusion F E).

(** We construct maps between fibres which are needed for the proof. *)
Definition es2_zig_fiber_projection `{Univalence} {C B B' A : AbGroup}
  {F : ES 1 B A} {E : ES 1 C B} {Y : ES 1 B' A} {X : ES 1 C B'}
  (zig : es_zig (es_splice F E) (es_splice Y X))
  : hfiber (abses_pushout (projection F)) E
    -> hfiber (abses_pushout (projection Y)) X.
Proof.
  intros [G p]; induction p.
  destruct zig as [phi [p q]]; cbn in phi, p, q.
  pose (phi' := abses_path_pullback_projection_commsq phi _ _ p^).
  destruct phi' as [phi' r].
  exists (abses_pushout phi' G).
  refine ((abses_pushout_compose _ _ _)^ @ _).
  refine (abses_pushout_homotopic _ (grp_homo_compose phi (projection F)) _ _ @ _).
  1: exact r.
  exact (abses_pushout_compose _ _ _ @ q).
Defined.

Definition es2_zag_fiber_inclusion `{Univalence} {C B B' A : AbGroup}
  {F : ES 1 B A} {E : ES 1 C B} {Y : ES 1 B' A} {X : ES 1 C B'}
  (zag : es_zig (es_splice Y X) (es_splice F E))
  : hfiber (abses_pullback (inclusion E)) F
    -> hfiber (abses_pullback (inclusion X)) Y.
Proof.
  intros [G p]; induction p.
  destruct zag as [phi [p q]]; cbn in phi, p, q.
  pose (phi' := abses_path_pushout_inclusion_commsq phi _ _ q).
  destruct phi' as [phi' r].
  exists (abses_pullback phi' G).
  refine (abses_pullback_compose _ _ _ @ _).
  refine (abses_pullback_homotopic _ (inclusion E $o phi) _ _ @ _).
  1: symmetry; exact r.
  exact ((abses_pullback_compose _ _ _)^ @ p^).
Defined.

Lemma XII_5_3 `{Univalence} {C B A : AbGroup} (F : ES 1 B A) (E : ES 1 C B)
  : TFAE3 (hfiber (abses_pullback (inclusion E)) F)
      (hfiber (abses_pushout (projection F)) E)
      (pt ~ (es_splice F E)).
Proof.
  repeat split.
  - apply abses_spliceable_hfiber_inclusion_to_hfiber_projection.
  - (* (b) -> (c)  can be shown directly *)
    intros [G p]; induction p.
    exists 2%nat. (* pt <- (E (projection E) <> F) -> E <> (projection E) F *)
    refine (_; (_, inl (es_morphism_abses_zig _ _ _))).
    refine (pt; (idpath, inr _)).
    exists grp_homo_const; split; cbn.
    + refine (_ @ (abses_pullback_point _)^).
      exact (abses_pullback_projection F)^.
    + exact (abses_pushout_const G).
  - (* for (c) -> (a) we need to use that we know (a) <-> (b) *)
    intros [n zzs].
    revert dependent B.
    induction n as [|n IH]; intros.
    + (* the base case can be shown directly *)
      cbn in zzs.
      apply (transport (fun X : ES 2 C A =>
                          hfiber (abses_pullback (inclusion (snd X.2)))
                            (fst X.2)) zzs); cbn.
      exists pt.
      apply abses_pullback_point.
    + destruct zzs as [[D [X0 X1]] [zzs [zig|zag]]].
      (* note: X is definitionally in the image of es_splice *)
      * apply abses_spliceable_hfiber_projection_to_hfiber_inclusion.
        apply (es2_zig_fiber_projection zig).
        apply abses_spliceable_hfiber_inclusion_to_hfiber_projection.
        exact (IH _ X0 X1 zzs).
      * apply (es2_zag_fiber_inclusion zag).
        by apply IH.
Defined.


(** * Lemma XII.5.4 *)

(** Lemma XII.5.4 gives an equivalent condition to (b) in Lemma XII.5.3 which generalises to [ES n]. The condition is that the following type is inhabited: *)
Definition es_ii_family `{Univalence} {n : nat} {C B A : AbGroup}
  : ES n.+1 B A -> ES 1 C B -> Type
  := fun F E => { alpha : { B' : AbGroup & B' $-> B }
                       & (pt ~ es_pullback alpha.2 F)
                         * (hfiber (abses_pushout alpha.2) E) }.

(** The logical equivalence with condition (b) above. *)
Lemma XII_5_4 `{Univalence} {C B A : AbGroup} (F : ES 1 B A) (E : ES 1 C B)
  : hfiber (abses_pushout (projection F)) E <-> es_ii_family F E.
Proof.
  split.
  - intros [G p]; induction p.
    exists (middle F; projection F); split.
    + apply abses_pullback_projection.
    + cbn. exact (G; idpath).
  - intros [[B' alpha] [p [G q]]]; cbn in *.
    pose (phi := abses_pullback_trivial_factors_projection p).
    destruct phi as [phi gamma].
    exists (abses_pushout phi G).
    refine ((abses_pushout_compose _ _ _)^ @ _).
    refine (abses_pushout_homotopic _ _ _ _ @ _).
    1: exact (equiv_path_grouphomomorphism^-1 gamma^).
    assumption.
Defined.

(** We rephrase Lemma XII.5.3 in general terms for later use. *)
Theorem XII_5_3' `{Univalence} {C B A : AbGroup} (F : ES 1 B A) (E : ES 1 C B)
  : TFAE3 (rfiber es_zig (es_pullback (inclusion E)) F)
      (es_ii_family F E)
      (pt ~ (es_splice F E)).
Proof.
  repeat split.
  - refine (_ o _).
    + apply XII_5_4.
    + apply XII_5_3.
  - refine (_ o _).
    + apply XII_5_3.
    + apply XII_5_4.
  - apply XII_5_3.
Defined.


(** * Lemma XII.5.5 *)

(** For [F : ES n.+1 B A] and [E : ES 1 C B], the following are equivalent:
 a) F is in the image of pullback along [inclusion E]
 b) [es_ii_family F E] holds
 c) [es_splice F E] is trivial
**)

(** The proof is structurally similar to Lemma XII.5.3; we need to know that (a) iff (b) in order to show the equivalence with (c). *)

Definition es_zig_fiber_projection `{Univalence} {n : nat} {C B B' A : AbGroup}
  {F : ES n.+1 B A} {E : ES 1 C B} {Y : ES n.+1 B' A} {X : ES 1 C B'}
  (zig : es_zig (es_abses_splice F E) (es_abses_splice Y X))
  : es_ii_family F E -> es_ii_family Y X.
Proof.
  intros [[B'' alpha] [zz [G p]]]; induction p.
  unfold pr2 in zz, zig; unfold pr1 in G.
  destruct zig as [phi [p q]]; cbn in phi, q; unfold es_abses_splice in p.
  exists (B''; grp_homo_compose phi alpha); split; unfold pr2.
  2: exact (G; abses_pushout_compose _ _ _ @ q).
  rewrite <- es_pullback_compose.
  etransitivity.
  2: { apply rap_pullback.
       destruct n.
       + by induction p.
       + exact (zig_to_eqrel _ p). }
  assumption.
Defined.

Definition es_zag_fiber_inclusion `{Univalence} {n : nat} {C B B' A : AbGroup}
  {F : ES n.+1 B A} {E : ES 1 C B} {Y : ES n.+1 B' A} {X : ES 1 C B'}
  (zag : es_zig (es_abses_splice Y X) (es_abses_splice F E))
  : rfiber es_eqrel (es_pullback (inclusion E)) F
    -> rfiber es_eqrel (es_pullback (inclusion X)) Y.
Proof.
  destruct n.
  1: by apply es2_zag_fiber_inclusion.
  intros [G zz].
  destruct zag as [phi [p q]]; cbn in phi, q; unfold es_abses_splice in p.
  pose (phi' := abses_path_pushout_inclusion_commsq phi _ _ q).
  destruct phi' as [phi' r].
  exists (es_pullback phi' G).
  transitivity (es_pullback phi F).
  2: exact (zag_to_eqrel _ p).
  refine (transport (fun X => X ~ _) _ _).
  { refine (_ @ (es_pullback_compose _ _ _)^).
    refine (_ @ es_pullback_homotopic (f:=inclusion E $o phi) _ _).
    2: exact r.
    exact (es_pullback_compose _ _ _). }
  apply rap_pullback.
  exact zz.
Defined.

(** Lemma XII.5.5 (i) -> (ii) *)
Definition es_spliceable_rfiber_inclusion_es_ii_family `{Univalence} {n : nat}
  {C B A : AbGroup} (F : ES n.+1 B A) (E : ES 1 C B)
  : rfiber es_eqrel (es_pullback (inclusion E)) F -> es_ii_family F E.
Proof.
  destruct n.
  1: intro; by apply XII_5_4,
      abses_spliceable_hfiber_inclusion_to_hfiber_projection.
  intros [[? [G0 G1]] p].
  pose (T := abses_pullback (inclusion E) G1).
  exists (middle T; projection T); split; unfold pr2.
  - etransitivity.
    2: exact (rap_pullback _ _ _ p).
    unfold es_pullback.
    rewrite <- abses_pullback_projection.
    apply zig_to_eqrel.
    nrapply es_splice_point_abses.
  - apply abses_spliceable_hfiber_inclusion_to_hfiber_projection.
    exact (G1; idpath).
Defined.

(** A preliminary result for Lemma XII.5.5: given Lemma XII.5.5 at level n, we deduce (i) iff (ii) on level n+1. *)
Lemma XII_5_5_prelim `{Univalence} {n : nat}
  : (forall {C B A : AbGroup} (F : ES n.+1 B A) (E : ES 1 C B),
    TFAE3 (rfiber es_eqrel (es_pullback (inclusion E)) F)
      (es_ii_family F E)
      (pt ~ (es_abses_splice F E)))
    -> (forall {C B A : AbGroup} (F : ES n.+2 B A) (E : ES 1 C B),
           (rfiber es_eqrel (es_pullback (inclusion E)) F)
           <-> es_ii_family F E).
Proof.
  intro IH; split.
  1: apply es_spliceable_rfiber_inclusion_es_ii_family.
  destruct F as [C' [T F]].
  intros [[B' alpha] [p [E' q]]]; unfold pr2 in p, q.
  assert (T' : rfiber es_eqrel
                (es_pullback (inclusion (abses_pullback alpha F))) T).
  1: apply IH; exact p.
  assert (F' : hfiber (abses_pullback (inclusion E))
                 (abses_pushout (inclusion (abses_pullback alpha F)) F)).
  { apply XII_5_3.
    induction q.
    etransitivity.
    2: nrapply es_morphism_abses_eqrel.
    unfold es_pullback.
    rewrite (abses_pushout_pullback_reorder F _ alpha)^.
    rewrite abses_pushout_inclusion.
    apply zag_to_eqrel.
    nrapply es_point_splice_abses. }
  destruct F' as [F' r], T' as [T' r'].
  exists (es_abses_splice T' F').
  unfold es_pullback, es_abses_splice.
  rewrite r.
  etransitivity.
  1: symmetry; nrapply es_morphism_abses_eqrel.
  exact (rap_splice _ _ _ r').
Defined.

(** It is useful to have a name for this family below. *)
Local Definition XII_5_5_family `{Univalence} {n : nat} {B A : AbGroup}
  : ES n.+2 B A -> Type.
Proof.
  intros [C [F E]].
  exact (rfiber es_eqrel (es_pullback (inclusion E)) F).
Defined.
  
Lemma XII_5_5 `{Univalence} {n : nat}
  : forall {C B A : AbGroup} (F : ES n.+1 B A) (E : ES 1 C B),
    TFAE3 (rfiber es_eqrel (es_pullback (inclusion E)) F)
      (es_ii_family F E)
      (pt ~ (es_abses_splice F E)).
Proof.
  induction n as [|n IHn]; intros.
  1: apply XII_5_3'.
  repeat split.
  - apply es_spliceable_rfiber_inclusion_es_ii_family.
  - intros [[B' alpha] [[m zzs] [G p]]]; induction p.
    unfold pr1, pr2 in *.
    etransitivity.
    2: nrapply es_morphism_abses_eqrel.
    etransitivity (es_abses_splice (pt : ES n.+2 B' A) G).
    2: { rapply rap_splice.
         exact (m; zzs). }
    apply zag_to_eqrel.
    apply es_point_splice_abses.
  - intros [m zzs].
    revert dependent B.
    induction m as [|m IHm]; intros.
    + nrapply (transport XII_5_5_family zzs).
      exists pt.
      exists (0%nat); rapply es_pullback_point.
    + destruct zzs as [[D [X0 X1]] [zzs [zig|zag]]].
      * apply (XII_5_5_prelim IHn).
        apply (es_zig_fiber_projection zig).
        apply (XII_5_5_prelim IHn).
        by apply IHm.
      * apply (es_zag_fiber_inclusion zag).
        by apply IHm.
Defined.


(** * Lemma XII.5.5 for [Ext n] *)

(** Relating condition (i) for ES and Ext. *)

Definition es_rfiber_to_ext_hfiber `{Univalence} {n : nat}
  {C B A : AbGroup} (F : ES n.+1 B A) (E : ES 1 C B)
  : rfiber es_eqrel (es_pullback (inclusion E)) F
    -> hfiber (ext_pullback (inclusion E)) (es_in F).
Proof.
  apply (functor_sigma es_in); intros G rho.
  destruct n.
  1: by destruct rho. (* path induction *)
  rapply path_quotient.
  exact (tr rho).
Defined.

Definition ext_hfiber_to_mere_es_rfiber `{Univalence} {n : nat}
  {C B A : AbGroup} (F : ES n.+1 B A) (E : ES 1 C B)
  : hfiber (ext_pullback (inclusion E)) (es_in F)
    -> merely (rfiber es_eqrel (es_pullback (inclusion E)) F).
Proof.
  intros [G p].
  (* First we choose a representative for G. *)
  assert (G' : Tr (-1) (hfiber es_in G)).
  1: destruct n; rapply center. (* both tr and class_of are surjective *)
  strip_truncations.
  destruct G' as [G' q]; induction q.
  (* by inducting on [q], [G'] is definitionally in the image of [tr] *)
  destruct n.
  - pose proof (q := (equiv_path_Tr _ _)^-1 p); strip_truncations.
    exact (tr (G'; q)).
  -pose proof (q := (path_quotient _ _ _)^-1 p); strip_truncations.
   exact (tr (G'; q)).
Defined.

Definition iff_es_rfiber_ext_hfiber `{Univalence} {n : nat}
  {C B A : AbGroup} (F : ES n.+1 B A) (E : ES 1 C B)
  : merely (rfiber es_eqrel (es_pullback (inclusion E)) F)
    <-> merely (hfiber (ext_pullback (inclusion E)) (es_in F)).
Proof.
  split.
  - apply Trunc_functor, es_rfiber_to_ext_hfiber.
  - apply Trunc_rec, ext_hfiber_to_mere_es_rfiber.
Defined.

(** Relating condition (ii) for ES and Ext. *)

Definition ext_ii_family `{Univalence} {n : nat} {C B A : AbGroup}
  : Ext n.+1 B A -> Ext 1 C B -> Type
  := fun F E => { bt : { B' : AbGroup & B' $-> B }
                    & (pt = ext_pullback bt.2 F :> Ext n.+1 bt.1 A)
                      * (hfiber (ext_pushout bt.2) E) }.

(** Condition (iii) for ES and Ext. *)

Lemma iff_iii `{Univalence} {n : nat} {C B A : AbGroup}
  (F : ES n.+1 B A) (E : ES 1 C B)
  : (es_meqrel pt (es_abses_splice F E))
    <-> (pt = ext_abses_splice (es_in F) E).
Proof.
  apply (equiv_equiv_iff_hprop _ _)^-1.
  destruct n; rapply path_quotient.
Defined.

(** Now we show that [ext_ii_family] corresponds to the propositional truncation of [ii_family] from ES.v. *)

Lemma iff_es_ext_ii_family `{Univalence} {n : nat} {C B A : AbGroup}
  (F : ES n.+1 B A) (E : ES 1 C B)
  : merely (es_ii_family F E)
    <-> merely (ext_ii_family (es_in F) (es_in E)).
Proof.
  apply (equiv_equiv_iff_hprop _ _)^-1.
  refine (equiv_O_sigma_O _ _ oE _ oE (equiv_O_sigma_O _ _)^-1).
  apply Trunc_functor_equiv.
  apply equiv_functor_sigma_id; intros [B' alpha].
  refine ((equiv_O_prod_cmp _ _ _)^-1 oE _ oE equiv_O_prod_cmp _ _ _).
  apply equiv_functor_prod'.
  { destruct n.
    all: refine (equiv_tr _ _ oE _).
    - apply equiv_path_Tr.
    - rapply path_quotient. }
  refine (_ oE (equiv_O_sigma_O _ _)^-1).
  apply equiv_iff_hprop.
  - apply Trunc_functor.
    apply (functor_sigma tr); cbn; intro G.
    apply path_Tr.
  - apply Trunc_rec; cbn; intros [G p].
    revert p; strip_truncations; cbn.
    rapply (equiv_ind (equiv_path_Tr _ _)).
    apply Trunc_functor; intro p.
    exact (G; tr p).
Defined.

(** Now Lemma XII.5.5 follows for Ext as well. *)

Lemma ext_XII_5_5 `{Univalence} {n : nat} {C B A : AbGroup}
  (F : ES n.+1 B A) (E : ES 1 C B)
  : TFAE3 (merely (hfiber (ext_pullback (inclusion E)) (es_in F)))
      (merely (ext_ii_family (es_in F) (es_in E)))
      (pt = ext_abses_splice (es_in F) E).
Proof.
  rapply iff_TFAE3.
  - apply iff_es_rfiber_ext_hfiber.
  - apply iff_es_ext_ii_family.
  - apply iff_iii.
  - apply TFAE3_merely.
    apply XII_5_5.
Defined.
back to top