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

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.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: 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 : ℕ
⊢ (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: 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.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: 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)
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: simp
state_before: C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Abelian C
inst✝¹ : HasProjectiveResolutions C
inst✝ : EnoughProjectives C
Z : C
n : ℕ
⊢ (ComplexShape.down ℕ).prev (n + 1) = n + 1 + 1
state_after: no goals

tactic: simp
state_before: C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Abelian C
inst✝¹ : HasProjectiveResolutions C
inst✝ : EnoughProjectives C
Z : C
n : ℕ
⊢ (ComplexShape.down ℕ).next (n + 1) = n
state_after: no goals

tactic: apply exact_d_f ((ChainComplex.mkAux _ _ _ (d (Projective.π Z)) (d (d (Projective.π Z))) _ _
  0).g)
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, ⋯⟩⟩) (0 + 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, ⋯⟩⟩) 0).g
      ⋯).Exact
state_after: no goals

tactic: apply exact_d_f ((ChainComplex.mkAux _ _ _ (d (Projective.π Z)) (d (d (Projective.π Z))) _ _
  (n+1)).g)
state_before: C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Abelian C
inst✝¹ : HasProjectiveResolutions C
inst✝ : EnoughProjectives C
Z : C
n✝ 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 + 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 + 1)).g
      ⋯).Exact
state_after: no goals