Theorem: CategoryTheory.ProjectiveResolution.ofComplex_exactAt_succ
File: Mathlib/CategoryTheory/Abelian/ProjectiveResolution.lean

Proof steps:
state_before: C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Abelian C
inst✝¹ : HasProjectiveResolutions C
inst✝ : EnoughProjectives C
Z : C
n : ℕ
⊢ HomologicalComplex.ExactAt (ofComplex Z) (n + 1)
state_after: C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Abelian C
inst✝¹ : HasProjectiveResolutions C
inst✝ : EnoughProjectives C
Z : C
n : ℕ
⊢ (HomologicalComplex.sc' (ofComplex Z) (n + 1 + 1) (n + 1) n).Exact
tactic: rw [HomologicalComplex.exactAt_iff' _ (n + 1 + 1) (n + 1) n (by simp) (by simp)]
state_before: C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Abelian C
inst✝¹ : HasProjectiveResolutions C
inst✝ : EnoughProjectives C
Z : C
n : ℕ
⊢ (HomologicalComplex.sc' (ofComplex Z) (n + 1 + 1) (n + 1) n).Exact
state_after: C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Abelian C
inst✝¹ : HasProjectiveResolutions C
inst✝ : EnoughProjectives C
Z : C
n : ℕ
⊢ (ShortComplex.mk
      ((ChainComplex.of
            (fun n =>
              (ChainComplex.mkAux (over Z) (syzygies (Projective.π Z)) (syzygies (d (Projective.π Z)))
                  (d (Projective.π Z)) (d (d (Projective.π Z))) ⋯ (fun S => ⟨syzygies S.f, ⟨d S.f, ⋯⟩⟩) n).X₃)
            (fun n =>
              (ChainComplex.mkAux (over Z) (syzygies (Projective.π Z)) (syzygies (d (Projective.π Z)))
                  (d (Projective.π Z)) (d (d (Projective.π Z))) ⋯ (fun S => ⟨syzygies S.f, ⟨d S.f, ⋯⟩⟩) n).g)
            ⋯).d
        (n + 1 + 1) (n + 1))
      ((ChainComplex.of
            (fun n =>
              (ChainComplex.mkAux (over Z) (syzygies (Projective.π Z)) (syzygies (d (Projective.π Z)))
                  (d (Projective.π Z)) (d (d (Projective.π Z))) ⋯ (fun S => ⟨syzygies S.f, ⟨d S.f, ⋯⟩⟩) n).X₃)
            (fun n =>
              (ChainComplex.mkAux (over Z) (syzygies (Projective.π Z)) (syzygies (d (Projective.π Z)))
                  (d (Projective.π Z)) (d (d (Projective.π Z))) ⋯ (fun S => ⟨syzygies S.f, ⟨d S.f, ⋯⟩⟩) n).g)
            ⋯).d
        (n + 1) n)
      ⋯).Exact
tactic: dsimp [ofComplex, HomologicalComplex.sc', HomologicalComplex.shortComplexFunctor',
      ChainComplex.mk', ChainComplex.mk]
state_before: C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Abelian C
inst✝¹ : HasProjectiveResolutions C
inst✝ : EnoughProjectives C
Z : C
n : ℕ
⊢ (ShortComplex.mk
      ((ChainComplex.of
            (fun n =>
              (ChainComplex.mkAux (over Z) (syzygies (Projective.π Z)) (syzygies (d (Projective.π Z)))
                  (d (Projective.π Z)) (d (d (Projective.π Z))) ⋯ (fun S => ⟨syzygies S.f, ⟨d S.f, ⋯⟩⟩) n).X₃)
            (fun n =>
              (ChainComplex.mkAux (over Z) (syzygies (Projective.π Z)) (syzygies (d (Projective.π Z)))
                  (d (Projective.π Z)) (d (d (Projective.π Z))) ⋯ (fun S => ⟨syzygies S.f, ⟨d S.f, ⋯⟩⟩) n).g)
            ⋯).d
        (n + 1 + 1) (n + 1))
      ((ChainComplex.of
            (fun n =>
              (ChainComplex.mkAux (over Z) (syzygies (Projective.π Z)) (syzygies (d (Projective.π Z)))
                  (d (Projective.π Z)) (d (d (Projective.π Z))) ⋯ (fun S => ⟨syzygies S.f, ⟨d S.f, ⋯⟩⟩) n).X₃)
            (fun n =>
              (ChainComplex.mkAux (over Z) (syzygies (Projective.π Z)) (syzygies (d (Projective.π Z)))
                  (d (Projective.π Z)) (d (d (Projective.π Z))) ⋯ (fun S => ⟨syzygies S.f, ⟨d S.f, ⋯⟩⟩) n).g)
            ⋯).d
        (n + 1) n)
      ⋯).Exact
state_after: C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Abelian C
inst✝¹ : HasProjectiveResolutions C
inst✝ : EnoughProjectives C
Z : C
n : ℕ
⊢ (ShortComplex.mk
      (ChainComplex.mkAux (over Z) (syzygies (Projective.π Z)) (syzygies (d (Projective.π Z))) (d (Projective.π Z))
          (d (d (Projective.π Z))) ⋯ (fun S => ⟨syzygies S.f, ⟨d S.f, ⋯⟩⟩) (n + 1)).g
      (ChainComplex.mkAux (over Z) (syzygies (Projective.π Z)) (syzygies (d (Projective.π Z))) (d (Projective.π Z))
          (d (d (Projective.π Z))) ⋯ (fun S => ⟨syzygies S.f, ⟨d S.f, ⋯⟩⟩) n).g
      ⋯).Exact
tactic: simp only [ChainComplex.of_d]
state_before: C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Abelian C
inst✝¹ : HasProjectiveResolutions C
inst✝ : EnoughProjectives C
Z : C
n : ℕ
⊢ (ShortComplex.mk
      (ChainComplex.mkAux (over Z) (syzygies (Projective.π Z)) (syzygies (d (Projective.π Z))) (d (Projective.π Z))
          (d (d (Projective.π Z))) ⋯ (fun S => ⟨syzygies S.f, ⟨d S.f, ⋯⟩⟩) (n + 1)).g
      (ChainComplex.mkAux (over Z) (syzygies (Projective.π Z)) (syzygies (d (Projective.π Z))) (d (Projective.π Z))
          (d (d (Projective.π Z))) ⋯ (fun S => ⟨syzygies S.f, ⟨d S.f, ⋯⟩⟩) n).g
      ⋯).Exact
state_after: no goals
tactic: match n with
  | 0 =>
    apply exact_d_f ((ChainComplex.mkAux _ _ _ (d (Projective.π Z)) (d (d (Projective.π Z))) _ _
      0).g)
  | n+1 =>
    apply exact_d_f ((ChainComplex.mkAux _ _ _ (d (Projective.π Z)) (d (d (Projective.π Z))) _ _
      (n+1)).g)