Theorem: CategoryTheory.exact_f_d
File: Mathlib/CategoryTheory/Abelian/InjectiveResolution.lean

tactic: simp
state_before: C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Abelian C
inst✝ : EnoughInjectives C
X Y : C
f : X ⟶ Y
⊢ f ≫ d f = 0
state_after: no goals

tactic: let α : ShortComplex.mk f (cokernel.π f) (by simp) ⟶ ShortComplex.mk f (d f) (by simp) :=
  { τ₁ := 𝟙 _
    τ₂ := 𝟙 _
    τ₃ := Injective.ι _  }
state_before: C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Abelian C
inst✝ : EnoughInjectives C
X Y : C
f : X ⟶ Y
⊢ (ShortComplex.mk f (d f) ⋯).Exact
state_after: C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Abelian C
inst✝ : EnoughInjectives C
X Y : C
f : X ⟶ Y
α : ShortComplex.mk f (cokernel.π f) ⋯ ⟶ ShortComplex.mk f (d f) ⋯ :=
  { τ₁ := 𝟙 (ShortComplex.mk f (cokernel.π f) ⋯).X₁, τ₂ := 𝟙 (ShortComplex.mk f (cokernel.π f) ⋯).X₂,
    τ₃ := ι (ShortComplex.mk f (cokernel.π f) ⋯).X₃, comm₁₂ := ⋯, comm₂₃ := ⋯ }
⊢ (ShortComplex.mk f (d f) ⋯).Exact

tactic: have : Epi α.τ₁ := by dsimp; infer_instance
state_before: C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Abelian C
inst✝ : EnoughInjectives C
X Y : C
f : X ⟶ Y
α : ShortComplex.mk f (cokernel.π f) ⋯ ⟶ ShortComplex.mk f (d f) ⋯ :=
  { τ₁ := 𝟙 (ShortComplex.mk f (cokernel.π f) ⋯).X₁, τ₂ := 𝟙 (ShortComplex.mk f (cokernel.π f) ⋯).X₂,
    τ₃ := ι (ShortComplex.mk f (cokernel.π f) ⋯).X₃, comm₁₂ := ⋯, comm₂₃ := ⋯ }
⊢ (ShortComplex.mk f (d f) ⋯).Exact
state_after: C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Abelian C
inst✝ : EnoughInjectives C
X Y : C
f : X ⟶ Y
α : ShortComplex.mk f (cokernel.π f) ⋯ ⟶ ShortComplex.mk f (d f) ⋯ :=
  { τ₁ := 𝟙 (ShortComplex.mk f (cokernel.π f) ⋯).X₁, τ₂ := 𝟙 (ShortComplex.mk f (cokernel.π f) ⋯).X₂,
    τ₃ := ι (ShortComplex.mk f (cokernel.π f) ⋯).X₃, comm₁₂ := ⋯, comm₂₃ := ⋯ }
this : Epi α.τ₁
⊢ (ShortComplex.mk f (d f) ⋯).Exact

tactic: have : IsIso α.τ₂ := by dsimp; infer_instance
state_before: C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Abelian C
inst✝ : EnoughInjectives C
X Y : C
f : X ⟶ Y
α : ShortComplex.mk f (cokernel.π f) ⋯ ⟶ ShortComplex.mk f (d f) ⋯ :=
  { τ₁ := 𝟙 (ShortComplex.mk f (cokernel.π f) ⋯).X₁, τ₂ := 𝟙 (ShortComplex.mk f (cokernel.π f) ⋯).X₂,
    τ₃ := ι (ShortComplex.mk f (cokernel.π f) ⋯).X₃, comm₁₂ := ⋯, comm₂₃ := ⋯ }
this : Epi α.τ₁
⊢ (ShortComplex.mk f (d f) ⋯).Exact
state_after: C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Abelian C
inst✝ : EnoughInjectives C
X Y : C
f : X ⟶ Y
α : ShortComplex.mk f (cokernel.π f) ⋯ ⟶ ShortComplex.mk f (d f) ⋯ :=
  { τ₁ := 𝟙 (ShortComplex.mk f (cokernel.π f) ⋯).X₁, τ₂ := 𝟙 (ShortComplex.mk f (cokernel.π f) ⋯).X₂,
    τ₃ := ι (ShortComplex.mk f (cokernel.π f) ⋯).X₃, comm₁₂ := ⋯, comm₂₃ := ⋯ }
this✝ : Epi α.τ₁
this : IsIso α.τ₂
⊢ (ShortComplex.mk f (d f) ⋯).Exact

tactic: have : Mono α.τ₃ := by dsimp; infer_instance
state_before: C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Abelian C
inst✝ : EnoughInjectives C
X Y : C
f : X ⟶ Y
α : ShortComplex.mk f (cokernel.π f) ⋯ ⟶ ShortComplex.mk f (d f) ⋯ :=
  { τ₁ := 𝟙 (ShortComplex.mk f (cokernel.π f) ⋯).X₁, τ₂ := 𝟙 (ShortComplex.mk f (cokernel.π f) ⋯).X₂,
    τ₃ := ι (ShortComplex.mk f (cokernel.π f) ⋯).X₃, comm₁₂ := ⋯, comm₂₃ := ⋯ }
this✝ : Epi α.τ₁
this : IsIso α.τ₂
⊢ (ShortComplex.mk f (d f) ⋯).Exact
state_after: C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Abelian C
inst✝ : EnoughInjectives C
X Y : C
f : X ⟶ Y
α : ShortComplex.mk f (cokernel.π f) ⋯ ⟶ ShortComplex.mk f (d f) ⋯ :=
  { τ₁ := 𝟙 (ShortComplex.mk f (cokernel.π f) ⋯).X₁, τ₂ := 𝟙 (ShortComplex.mk f (cokernel.π f) ⋯).X₂,
    τ₃ := ι (ShortComplex.mk f (cokernel.π f) ⋯).X₃, comm₁₂ := ⋯, comm₂₃ := ⋯ }
this✝¹ : Epi α.τ₁
this✝ : IsIso α.τ₂
this : Mono α.τ₃
⊢ (ShortComplex.mk f (d f) ⋯).Exact

tactic: rw [← ShortComplex.exact_iff_of_epi_of_isIso_of_mono α]
state_before: C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Abelian C
inst✝ : EnoughInjectives C
X Y : C
f : X ⟶ Y
α : ShortComplex.mk f (cokernel.π f) ⋯ ⟶ ShortComplex.mk f (d f) ⋯ :=
  { τ₁ := 𝟙 (ShortComplex.mk f (cokernel.π f) ⋯).X₁, τ₂ := 𝟙 (ShortComplex.mk f (cokernel.π f) ⋯).X₂,
    τ₃ := ι (ShortComplex.mk f (cokernel.π f) ⋯).X₃, comm₁₂ := ⋯, comm₂₃ := ⋯ }
this✝¹ : Epi α.τ₁
this✝ : IsIso α.τ₂
this : Mono α.τ₃
⊢ (ShortComplex.mk f (d f) ⋯).Exact
state_after: C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Abelian C
inst✝ : EnoughInjectives C
X Y : C
f : X ⟶ Y
α : ShortComplex.mk f (cokernel.π f) ⋯ ⟶ ShortComplex.mk f (d f) ⋯ :=
  { τ₁ := 𝟙 (ShortComplex.mk f (cokernel.π f) ⋯).X₁, τ₂ := 𝟙 (ShortComplex.mk f (cokernel.π f) ⋯).X₂,
    τ₃ := ι (ShortComplex.mk f (cokernel.π f) ⋯).X₃, comm₁₂ := ⋯, comm₂₃ := ⋯ }
this✝¹ : Epi α.τ₁
this✝ : IsIso α.τ₂
this : Mono α.τ₃
⊢ (ShortComplex.mk f (cokernel.π f) ⋯).Exact

tactic: apply ShortComplex.exact_of_g_is_cokernel
state_before: C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Abelian C
inst✝ : EnoughInjectives C
X Y : C
f : X ⟶ Y
α : ShortComplex.mk f (cokernel.π f) ⋯ ⟶ ShortComplex.mk f (d f) ⋯ :=
  { τ₁ := 𝟙 (ShortComplex.mk f (cokernel.π f) ⋯).X₁, τ₂ := 𝟙 (ShortComplex.mk f (cokernel.π f) ⋯).X₂,
    τ₃ := ι (ShortComplex.mk f (cokernel.π f) ⋯).X₃, comm₁₂ := ⋯, comm₂₃ := ⋯ }
this✝¹ : Epi α.τ₁
this✝ : IsIso α.τ₂
this : Mono α.τ₃
⊢ (ShortComplex.mk f (cokernel.π f) ⋯).Exact
state_after: case hS
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Abelian C
inst✝ : EnoughInjectives C
X Y : C
f : X ⟶ Y
α : ShortComplex.mk f (cokernel.π f) ⋯ ⟶ ShortComplex.mk f (d f) ⋯ :=
  { τ₁ := 𝟙 (ShortComplex.mk f (cokernel.π f) ⋯).X₁, τ₂ := 𝟙 (ShortComplex.mk f (cokernel.π f) ⋯).X₂,
    τ₃ := ι (ShortComplex.mk f (cokernel.π f) ⋯).X₃, comm₁₂ := ⋯, comm₂₃ := ⋯ }
this✝¹ : Epi α.τ₁
this✝ : IsIso α.τ₂
this : Mono α.τ₃
⊢ IsColimit (CokernelCofork.ofπ (ShortComplex.mk f (cokernel.π f) ⋯).g ⋯)

tactic: apply cokernelIsCokernel
state_before: case hS
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Abelian C
inst✝ : EnoughInjectives C
X Y : C
f : X ⟶ Y
α : ShortComplex.mk f (cokernel.π f) ⋯ ⟶ ShortComplex.mk f (d f) ⋯ :=
  { τ₁ := 𝟙 (ShortComplex.mk f (cokernel.π f) ⋯).X₁, τ₂ := 𝟙 (ShortComplex.mk f (cokernel.π f) ⋯).X₂,
    τ₃ := ι (ShortComplex.mk f (cokernel.π f) ⋯).X₃, comm₁₂ := ⋯, comm₂₃ := ⋯ }
this✝¹ : Epi α.τ₁
this✝ : IsIso α.τ₂
this : Mono α.τ₃
⊢ IsColimit (CokernelCofork.ofπ (ShortComplex.mk f (cokernel.π f) ⋯).g ⋯)
state_after: no goals

tactic: simp
state_before: C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Abelian C
inst✝ : EnoughInjectives C
X Y : C
f : X ⟶ Y
⊢ f ≫ cokernel.π f = 0
state_after: no goals

tactic: dsimp
state_before: C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Abelian C
inst✝ : EnoughInjectives C
X Y : C
f : X ⟶ Y
α : ShortComplex.mk f (cokernel.π f) ⋯ ⟶ ShortComplex.mk f (d f) ⋯ :=
  { τ₁ := 𝟙 (ShortComplex.mk f (cokernel.π f) ⋯).X₁, τ₂ := 𝟙 (ShortComplex.mk f (cokernel.π f) ⋯).X₂,
    τ₃ := ι (ShortComplex.mk f (cokernel.π f) ⋯).X₃, comm₁₂ := ⋯, comm₂₃ := ⋯ }
⊢ Epi α.τ₁
state_after: C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Abelian C
inst✝ : EnoughInjectives C
X Y : C
f : X ⟶ Y
α : ShortComplex.mk f (cokernel.π f) ⋯ ⟶ ShortComplex.mk f (d f) ⋯ :=
  { τ₁ := 𝟙 (ShortComplex.mk f (cokernel.π f) ⋯).X₁, τ₂ := 𝟙 (ShortComplex.mk f (cokernel.π f) ⋯).X₂,
    τ₃ := ι (ShortComplex.mk f (cokernel.π f) ⋯).X₃, comm₁₂ := ⋯, comm₂₃ := ⋯ }
⊢ Epi (𝟙 X)

tactic: infer_instance
state_before: C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Abelian C
inst✝ : EnoughInjectives C
X Y : C
f : X ⟶ Y
α : ShortComplex.mk f (cokernel.π f) ⋯ ⟶ ShortComplex.mk f (d f) ⋯ :=
  { τ₁ := 𝟙 (ShortComplex.mk f (cokernel.π f) ⋯).X₁, τ₂ := 𝟙 (ShortComplex.mk f (cokernel.π f) ⋯).X₂,
    τ₃ := ι (ShortComplex.mk f (cokernel.π f) ⋯).X₃, comm₁₂ := ⋯, comm₂₃ := ⋯ }
⊢ Epi (𝟙 X)
state_after: no goals

tactic: dsimp
state_before: C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Abelian C
inst✝ : EnoughInjectives C
X Y : C
f : X ⟶ Y
α : ShortComplex.mk f (cokernel.π f) ⋯ ⟶ ShortComplex.mk f (d f) ⋯ :=
  { τ₁ := 𝟙 (ShortComplex.mk f (cokernel.π f) ⋯).X₁, τ₂ := 𝟙 (ShortComplex.mk f (cokernel.π f) ⋯).X₂,
    τ₃ := ι (ShortComplex.mk f (cokernel.π f) ⋯).X₃, comm₁₂ := ⋯, comm₂₃ := ⋯ }
this : Epi α.τ₁
⊢ IsIso α.τ₂
state_after: C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Abelian C
inst✝ : EnoughInjectives C
X Y : C
f : X ⟶ Y
α : ShortComplex.mk f (cokernel.π f) ⋯ ⟶ ShortComplex.mk f (d f) ⋯ :=
  { τ₁ := 𝟙 (ShortComplex.mk f (cokernel.π f) ⋯).X₁, τ₂ := 𝟙 (ShortComplex.mk f (cokernel.π f) ⋯).X₂,
    τ₃ := ι (ShortComplex.mk f (cokernel.π f) ⋯).X₃, comm₁₂ := ⋯, comm₂₃ := ⋯ }
this : Epi α.τ₁
⊢ IsIso (𝟙 Y)

tactic: infer_instance
state_before: C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Abelian C
inst✝ : EnoughInjectives C
X Y : C
f : X ⟶ Y
α : ShortComplex.mk f (cokernel.π f) ⋯ ⟶ ShortComplex.mk f (d f) ⋯ :=
  { τ₁ := 𝟙 (ShortComplex.mk f (cokernel.π f) ⋯).X₁, τ₂ := 𝟙 (ShortComplex.mk f (cokernel.π f) ⋯).X₂,
    τ₃ := ι (ShortComplex.mk f (cokernel.π f) ⋯).X₃, comm₁₂ := ⋯, comm₂₃ := ⋯ }
this : Epi α.τ₁
⊢ IsIso (𝟙 Y)
state_after: no goals

tactic: dsimp
state_before: C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Abelian C
inst✝ : EnoughInjectives C
X Y : C
f : X ⟶ Y
α : ShortComplex.mk f (cokernel.π f) ⋯ ⟶ ShortComplex.mk f (d f) ⋯ :=
  { τ₁ := 𝟙 (ShortComplex.mk f (cokernel.π f) ⋯).X₁, τ₂ := 𝟙 (ShortComplex.mk f (cokernel.π f) ⋯).X₂,
    τ₃ := ι (ShortComplex.mk f (cokernel.π f) ⋯).X₃, comm₁₂ := ⋯, comm₂₃ := ⋯ }
this✝ : Epi α.τ₁
this : IsIso α.τ₂
⊢ Mono α.τ₃
state_after: C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Abelian C
inst✝ : EnoughInjectives C
X Y : C
f : X ⟶ Y
α : ShortComplex.mk f (cokernel.π f) ⋯ ⟶ ShortComplex.mk f (d f) ⋯ :=
  { τ₁ := 𝟙 (ShortComplex.mk f (cokernel.π f) ⋯).X₁, τ₂ := 𝟙 (ShortComplex.mk f (cokernel.π f) ⋯).X₂,
    τ₃ := ι (ShortComplex.mk f (cokernel.π f) ⋯).X₃, comm₁₂ := ⋯, comm₂₃ := ⋯ }
this✝ : Epi α.τ₁
this : IsIso α.τ₂
⊢ Mono (ι (cokernel f))

tactic: infer_instance
state_before: C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Abelian C
inst✝ : EnoughInjectives C
X Y : C
f : X ⟶ Y
α : ShortComplex.mk f (cokernel.π f) ⋯ ⟶ ShortComplex.mk f (d f) ⋯ :=
  { τ₁ := 𝟙 (ShortComplex.mk f (cokernel.π f) ⋯).X₁, τ₂ := 𝟙 (ShortComplex.mk f (cokernel.π f) ⋯).X₂,
    τ₃ := ι (ShortComplex.mk f (cokernel.π f) ⋯).X₃, comm₁₂ := ⋯, comm₂₃ := ⋯ }
this✝ : Epi α.τ₁
this : IsIso α.τ₂
⊢ Mono (ι (cokernel f))
state_after: no goals