-- Module: Mathlib.Algebra.Homology.DerivedCategory.Ext.ExactSequences
Goal:
C : Type u
inst : Category.{v, u} C
inst_1 : Abelian.{v, u} C
inst_2 : HasExt.{w, v, u} C
X : C
S : ShortComplex.{v, u} C
hS : S.ShortExact
n₀ n₁ : ℕ
h : n₀ + 1 = n₁
this_1 : HasDerivedCategory C := HasDerivedCategory.standard C
this :
  Function.Exact (M :=
    (↑(ShortComplex.mk (X₁ :=
            Functor.obj (C := DerivedCategory C)
              (Functor.shift (Functor.obj preadditiveCoyoneda (op (Functor.obj (singleFunctor C 0) X))) (M := ℤ)
                (↑n₀ : ℤ))
              (Triangle.obj₃ hS.singleTriangle))
            (Functor.homologySequenceδ (Functor.obj preadditiveCoyoneda (op (Functor.obj (singleFunctor C 0) X)))
              hS.singleTriangle (↑n₀ : ℤ) (↑n₁ : ℤ) ⋯)
            (Functor.map
              (Functor.shift (Functor.obj preadditiveCoyoneda (op (Functor.obj (singleFunctor C 0) X))) (M := ℤ)
                (↑n₁ : ℤ))
              (Triangle.mor₁ hS.singleTriangle))
            ⋯).X₁ :
      Type (max u v)))
    (N :=
    (↑(ShortComplex.mk (X₁ :=
            Functor.obj (C := DerivedCategory C)
              (Functor.shift (Functor.obj preadditiveCoyoneda (op (Functor.obj (singleFunctor C 0) X))) (M := ℤ)
                (↑n₀ : ℤ))
              (Triangle.obj₃ hS.singleTriangle))
            (Functor.homologySequenceδ (Functor.obj preadditiveCoyoneda (op (Functor.obj (singleFunctor C 0) X)))
              hS.singleTriangle (↑n₀ : ℤ) (↑n₁ : ℤ) ⋯)
            (Functor.map
              (Functor.shift (Functor.obj preadditiveCoyoneda (op (Functor.obj (singleFunctor C 0) X))) (M := ℤ)
                (↑n₁ : ℤ))
              (Triangle.mor₁ hS.singleTriangle))
            ⋯).X₂ :
      Type (max u v)))
    (P :=
    (↑(ShortComplex.mk (X₁ :=
            Functor.obj (C := DerivedCategory C)
              (Functor.shift (Functor.obj preadditiveCoyoneda (op (Functor.obj (singleFunctor C 0) X))) (M := ℤ)
                (↑n₀ : ℤ))
              (Triangle.obj₃ hS.singleTriangle))
            (Functor.homologySequenceδ (Functor.obj preadditiveCoyoneda (op (Functor.obj (singleFunctor C 0) X)))
              hS.singleTriangle (↑n₀ : ℤ) (↑n₁ : ℤ) ⋯)
            (Functor.map
              (Functor.shift (Functor.obj preadditiveCoyoneda (op (Functor.obj (singleFunctor C 0) X))) (M := ℤ)
                (↑n₁ : ℤ))
              (Triangle.mor₁ hS.singleTriangle))
            ⋯).X₃ :
      Type (max u v)))
    (⇑(ConcreteCategory.hom (FC := fun (x1 x2 : AddCommGrpCat) ↦ (↑x1 : Type (max u v)) →+ (↑x2 : Type (max u v)))
          (CC := AddCommGrpCat.carrier)
          (ShortComplex.mk (X₁ :=
              Functor.obj (C := DerivedCategory C)
                (Functor.shift (Functor.obj preadditiveCoyoneda (op (Functor.obj (singleFunctor C 0) X))) (M := ℤ)
                  (↑n₀ : ℤ))
                (Triangle.obj₃ hS.singleTriangle))
              (Functor.homologySequenceδ (Functor.obj preadditiveCoyoneda (op (Functor.obj (singleFunctor C 0) X)))
                hS.singleTriangle (↑n₀ : ℤ) (↑n₁ : ℤ) ⋯)
              (Functor.map
                (Functor.shift (Functor.obj preadditiveCoyoneda (op (Functor.obj (singleFunctor C 0) X))) (M := ℤ)
                  (↑n₁ : ℤ))
                (Triangle.mor₁ hS.singleTriangle))
              ⋯).f) :
      (a :
          (↑{
                  X₁ :=
                    ((preadditiveCoyoneda.obj (op ((singleFunctor C 0).obj X))).shift (↑n₀ : ℤ)).obj
                      hS.singleTriangle.obj₃,
                  X₂ :=
                    ((preadditiveCoyoneda.obj (op ((singleFunctor C 0).obj X))).shift (↑n₁ : ℤ)).obj
                      hS.singleTriangle.obj₁,
                  X₃ :=
                    ((preadditiveCoyoneda.obj (op ((singleFunctor C 0).obj X))).shift (↑n₁ : ℤ)).obj
                      hS.singleTriangle.obj₂,
                  f :=
                    (preadditiveCoyoneda.obj (op ((singleFunctor C 0).obj X))).homologySequenceδ hS.singleTriangle
                      (↑n₀ : ℤ) (↑n₁ : ℤ) ⋯,
                  g :=
                    ((preadditiveCoyoneda.obj (op ((singleFunctor C 0).obj X))).shift (↑n₁ : ℤ)).map
                      hS.singleTriangle.mor₁,
                  zero := ⋯ }.X₁ :
            Type (max u v))) →
        (↑{
                X₁ :=
                  ((preadditiveCoyoneda.obj (op ((singleFunctor C 0).obj X))).shift (↑n₀ : ℤ)).obj
                    hS.singleTriangle.obj₃,
                X₂ :=
                  ((preadditiveCoyoneda.obj (op ((singleFunctor C 0).obj X))).shift (↑n₁ : ℤ)).obj
                    hS.singleTriangle.obj₁,
                X₃ :=
                  ((preadditiveCoyoneda.obj (op ((singleFunctor C 0).obj X))).shift (↑n₁ : ℤ)).obj
                    hS.singleTriangle.obj₂,
                f :=
                  (preadditiveCoyoneda.obj (op ((singleFunctor C 0).obj X))).homologySequenceδ hS.singleTriangle
                    (↑n₀ : ℤ) (↑n₁ : ℤ) ⋯,
                g :=
                  ((preadditiveCoyoneda.obj (op ((singleFunctor C 0).obj X))).shift (↑n₁ : ℤ)).map
                    hS.singleTriangle.mor₁,
                zero := ⋯ }.X₂ :
          Type (max u v)))
    (⇑(ConcreteCategory.hom (FC := fun (x1 x2 : AddCommGrpCat) ↦ (↑x1 : Type (max u v)) →+ (↑x2 : Type (max u v)))
          (CC := AddCommGrpCat.carrier)
          (ShortComplex.mk (X₁ :=
              Functor.obj (C := DerivedCategory C)
                (Functor.shift (Functor.obj preadditiveCoyoneda (op (Functor.obj (singleFunctor C 0) X))) (M := ℤ)
                  (↑n₀ : ℤ))
                (Triangle.obj₃ hS.singleTriangle))
              (Functor.homologySequenceδ (Functor.obj preadditiveCoyoneda (op (Functor.obj (singleFunctor C 0) X)))
                hS.singleTriangle (↑n₀ : ℤ) (↑n₁ : ℤ) ⋯)
              (Functor.map
                (Functor.shift (Functor.obj preadditiveCoyoneda (op (Functor.obj (singleFunctor C 0) X))) (M := ℤ)
                  (↑n₁ : ℤ))
                (Triangle.mor₁ hS.singleTriangle))
              ⋯).g) :
      (a :
          (↑{
                  X₁ :=
                    ((preadditiveCoyoneda.obj (op ((singleFunctor C 0).obj X))).shift (↑n₀ : ℤ)).obj
                      hS.singleTriangle.obj₃,
                  X₂ :=
                    ((preadditiveCoyoneda.obj (op ((singleFunctor C 0).obj X))).shift (↑n₁ : ℤ)).obj
                      hS.singleTriangle.obj₁,
                  X₃ :=
                    ((preadditiveCoyoneda.obj (op ((singleFunctor C 0).obj X))).shift (↑n₁ : ℤ)).obj
                      hS.singleTriangle.obj₂,
                  f :=
                    (preadditiveCoyoneda.obj (op ((singleFunctor C 0).obj X))).homologySequenceδ hS.singleTriangle
                      (↑n₀ : ℤ) (↑n₁ : ℤ) ⋯,
                  g :=
                    ((preadditiveCoyoneda.obj (op ((singleFunctor C 0).obj X))).shift (↑n₁ : ℤ)).map
                      hS.singleTriangle.mor₁,
                  zero := ⋯ }.X₂ :
            Type (max u v))) →
        (↑{
                X₁ :=
                  ((preadditiveCoyoneda.obj (op ((singleFunctor C 0).obj X))).shift (↑n₀ : ℤ)).obj
                    hS.singleTriangle.obj₃,
                X₂ :=
                  ((preadditiveCoyoneda.obj (op ((singleFunctor C 0).obj X))).shift (↑n₁ : ℤ)).obj
                    hS.singleTriangle.obj₁,
                X₃ :=
                  ((preadditiveCoyoneda.obj (op ((singleFunctor C 0).obj X))).shift (↑n₁ : ℤ)).obj
                    hS.singleTriangle.obj₂,
                f :=
                  (preadditiveCoyoneda.obj (op ((singleFunctor C 0).obj X))).homologySequenceδ hS.singleTriangle
                    (↑n₀ : ℤ) (↑n₁ : ℤ) ⋯,
                g :=
                  ((preadditiveCoyoneda.obj (op ((singleFunctor C 0).obj X))).shift (↑n₁ : ℤ)).map
                    hS.singleTriangle.mor₁,
                zero := ⋯ }.X₃ :
          Type (max u v)))
comm₁₂ :
  (ConcreteCategory.hom (FC := fun (x1 x2 : AddCommGrpCat) ↦ (↑x1 : Type (max u v)) →+ (↑x2 : Type (max u v))) (CC :=
          AddCommGrpCat.carrier)
          (ShortComplex.mk (X₁ :=
              Functor.obj (C := DerivedCategory C)
                (Functor.shift (Functor.obj preadditiveCoyoneda (op (Functor.obj (singleFunctor C 0) X))) (M := ℤ)
                  (↑n₀ : ℤ))
                (Triangle.obj₃ hS.singleTriangle))
              (Functor.homologySequenceδ (Functor.obj preadditiveCoyoneda (op (Functor.obj (singleFunctor C 0) X)))
                hS.singleTriangle (↑n₀ : ℤ) (↑n₁ : ℤ) ⋯)
              (Functor.map
                (Functor.shift (Functor.obj preadditiveCoyoneda (op (Functor.obj (singleFunctor C 0) X))) (M := ℤ)
                  (↑n₁ : ℤ))
                (Triangle.mor₁ hS.singleTriangle))
              ⋯).f).comp
      (↑homAddEquiv :
        Ext X S.X₃ n₀ →+ ShiftedHom ((singleFunctor C 0).obj X) ((singleFunctor C 0).obj S.X₃) (↑n₀ : ℤ)) =
    AddMonoidHom.comp
      (↑homAddEquiv : Ext X S.X₁ n₁ →+ ShiftedHom ((singleFunctor C 0).obj X) ((singleFunctor C 0).obj S.X₁) (↑n₁ : ℤ))
      (ConcreteCategory.hom (FC := fun (x1 x2 : AddCommGrpCat.{w}) ↦ (↑x1 : Type w) →+ (↑x2 : Type w)) (CC :=
        AddCommGrpCat.carrier)
        (ShortComplex.mk (X₁ := AddCommGrpCat.of (Ext.{w, v, u} X S.X₃ n₀))
            (AddCommGrpCat.ofHom (postcomp hS.extClass X h)) (AddCommGrpCat.ofHom (postcomp (mk₀ S.f) X ⋯)) ⋯).f)
comm₂₃ :
  (ConcreteCategory.hom (FC := fun (x1 x2 : AddCommGrpCat) ↦ (↑x1 : Type (max u v)) →+ (↑x2 : Type (max u v))) (CC :=
          AddCommGrpCat.carrier)
          (ShortComplex.mk (X₁ :=
              Functor.obj (C := DerivedCategory C)
                (Functor.shift (Functor.obj preadditiveCoyoneda (op (Functor.obj (singleFunctor C 0) X))) (M := ℤ)
                  (↑n₀ : ℤ))
                (Triangle.obj₃ hS.singleTriangle))
              (Functor.homologySequenceδ (Functor.obj preadditiveCoyoneda (op (Functor.obj (singleFunctor C 0) X)))
                hS.singleTriangle (↑n₀ : ℤ) (↑n₁ : ℤ) ⋯)
              (Functor.map
                (Functor.shift (Functor.obj preadditiveCoyoneda (op (Functor.obj (singleFunctor C 0) X))) (M := ℤ)
                  (↑n₁ : ℤ))
                (Triangle.mor₁ hS.singleTriangle))
              ⋯).g).comp
      (↑homAddEquiv :
        Ext X S.X₁ n₁ →+ ShiftedHom ((singleFunctor C 0).obj X) ((singleFunctor C 0).obj S.X₁) (↑n₁ : ℤ)) =
    AddMonoidHom.comp
      (↑homAddEquiv : Ext X S.X₂ n₁ →+ ShiftedHom ((singleFunctor C 0).obj X) ((singleFunctor C 0).obj S.X₂) (↑n₁ : ℤ))
      (ConcreteCategory.hom (FC := fun (x1 x2 : AddCommGrpCat.{w}) ↦ (↑x1 : Type w) →+ (↑x2 : Type w)) (CC :=
        AddCommGrpCat.carrier)
        (ShortComplex.mk (X₁ := AddCommGrpCat.of (Ext.{w, v, u} X S.X₃ n₀))
            (AddCommGrpCat.ofHom (postcomp hS.extClass X h)) (AddCommGrpCat.ofHom (postcomp (mk₀ S.f) X ⋯)) ⋯).g)
⊢ Function.Exact (M :=
    (↑(ShortComplex.mk (X₁ := AddCommGrpCat.of (Ext.{w, v, u} X S.X₃ n₀))
            (AddCommGrpCat.ofHom (postcomp hS.extClass X h)) (AddCommGrpCat.ofHom (postcomp (mk₀ S.f) X ⋯)) ⋯).X₁ :
      Type w))
    (N :=
    (↑(ShortComplex.mk (X₁ := AddCommGrpCat.of (Ext.{w, v, u} X S.X₃ n₀))
            (AddCommGrpCat.ofHom (postcomp hS.extClass X h)) (AddCommGrpCat.ofHom (postcomp (mk₀ S.f) X ⋯)) ⋯).X₂ :
      Type w))
    (P :=
    (↑(ShortComplex.mk (X₁ := AddCommGrpCat.of (Ext.{w, v, u} X S.X₃ n₀))
            (AddCommGrpCat.ofHom (postcomp hS.extClass X h)) (AddCommGrpCat.ofHom (postcomp (mk₀ S.f) X ⋯)) ⋯).X₃ :
      Type w))
    (⇑(ConcreteCategory.hom (FC := fun (x1 x2 : AddCommGrpCat.{w}) ↦ (↑x1 : Type w) →+ (↑x2 : Type w)) (CC :=
          AddCommGrpCat.carrier)
          (ShortComplex.mk (X₁ := AddCommGrpCat.of (Ext.{w, v, u} X S.X₃ n₀))
              (AddCommGrpCat.ofHom (postcomp hS.extClass X h)) (AddCommGrpCat.ofHom (postcomp (mk₀ S.f) X ⋯)) ⋯).f) :
      (a :
          (↑{ X₁ := AddCommGrpCat.of (Ext X S.X₃ n₀), X₂ := AddCommGrpCat.of (Ext X S.X₁ n₁),
                  X₃ := AddCommGrpCat.of (Ext X S.X₂ n₁), f := AddCommGrpCat.ofHom (hS.extClass.postcomp X h),
                  g := AddCommGrpCat.ofHom ((mk₀ S.f).postcomp X ⋯), zero := ⋯ }.X₁ :
            Type w)) →
        (↑{ X₁ := AddCommGrpCat.of (Ext X S.X₃ n₀), X₂ := AddCommGrpCat.of (Ext X S.X₁ n₁),
                X₃ := AddCommGrpCat.of (Ext X S.X₂ n₁), f := AddCommGrpCat.ofHom (hS.extClass.postcomp X h),
                g := AddCommGrpCat.ofHom ((mk₀ S.f).postcomp X ⋯), zero := ⋯ }.X₂ :
          Type w))
    (⇑(ConcreteCategory.hom (FC := fun (x1 x2 : AddCommGrpCat.{w}) ↦ (↑x1 : Type w) →+ (↑x2 : Type w)) (CC :=
          AddCommGrpCat.carrier)
          (ShortComplex.mk (X₁ := AddCommGrpCat.of (Ext.{w, v, u} X S.X₃ n₀))
              (AddCommGrpCat.ofHom (postcomp hS.extClass X h)) (AddCommGrpCat.ofHom (postcomp (mk₀ S.f) X ⋯)) ⋯).g) :
      (a :
          (↑{ X₁ := AddCommGrpCat.of (Ext X S.X₃ n₀), X₂ := AddCommGrpCat.of (Ext X S.X₁ n₁),
                  X₃ := AddCommGrpCat.of (Ext X S.X₂ n₁), f := AddCommGrpCat.ofHom (hS.extClass.postcomp X h),
                  g := AddCommGrpCat.ofHom ((mk₀ S.f).postcomp X ⋯), zero := ⋯ }.X₂ :
            Type w)) →
        (↑{ X₁ := AddCommGrpCat.of (Ext X S.X₃ n₀), X₂ := AddCommGrpCat.of (Ext X S.X₁ n₁),
                X₃ := AddCommGrpCat.of (Ext X S.X₂ n₁), f := AddCommGrpCat.ofHom (hS.extClass.postcomp X h),
                g := AddCommGrpCat.ofHom ((mk₀ S.f).postcomp X ⋯), zero := ⋯ }.X₃ :
          Type w))

Tactic:
apply Function.Exact.of_ladder_addEquiv_of_exact' (e₁ := Ext.homAddEquiv)
    (e₂ := Ext.homAddEquiv) (e₃ := Ext.homAddEquiv) (H := this)

Premises used: CategoryTheory.Abelian.Ext.homAddEquiv, Function.Exact.of_ladder_addEquiv_of_exact'