Theorem: CategoryTheory.hasExt_iff
File: Mathlib/Algebra/Homology/DerivedCategory/Ext.lean

Proof steps:
state_before: C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Abelian C
inst✝ : HasDerivedCategory C
⊢ HasExt C ↔
    ∀ (X Y : C) (n : ℤ),
      Small.{w, w'}
        ((DerivedCategory.singleFunctor C 0).obj X ⟶
          (shiftFunctor (DerivedCategory C) n).obj ((DerivedCategory.singleFunctor C 0).obj Y))
state_after: C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Abelian C
inst✝ : HasDerivedCategory C
⊢ (∀ (X Y : C),
      HasSmallLocalizedShiftedHom (HomologicalComplex.quasiIso C (ComplexShape.up ℤ)) ℤ
        ((CochainComplex.singleFunctor C 0).obj X) ((CochainComplex.singleFunctor C 0).obj Y)) ↔
    ∀ (X Y : C) (n : ℤ),
      Small.{w, w'}
        ((DerivedCategory.singleFunctor C 0).obj X ⟶
          (shiftFunctor (DerivedCategory C) n).obj ((DerivedCategory.singleFunctor C 0).obj Y))
tactic: dsimp [HasExt]
state_before: C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Abelian C
inst✝ : HasDerivedCategory C
⊢ (∀ (X Y : C),
      HasSmallLocalizedShiftedHom (HomologicalComplex.quasiIso C (ComplexShape.up ℤ)) ℤ
        ((CochainComplex.singleFunctor C 0).obj X) ((CochainComplex.singleFunctor C 0).obj Y)) ↔
    ∀ (X Y : C) (n : ℤ),
      Small.{w, w'}
        ((DerivedCategory.singleFunctor C 0).obj X ⟶
          (shiftFunctor (DerivedCategory C) n).obj ((DerivedCategory.singleFunctor C 0).obj Y))
state_after: C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Abelian C
inst✝ : HasDerivedCategory C
⊢ (∀ (X Y : C) (a b : ℤ),
      Small.{w, w'}
        ((shiftFunctor (DerivedCategory C) a).obj (DerivedCategory.Q.obj ((CochainComplex.singleFunctor C 0).obj X)) ⟶
          (shiftFunctor (DerivedCategory C) b).obj
            (DerivedCategory.Q.obj ((CochainComplex.singleFunctor C 0).obj Y)))) ↔
    ∀ (X Y : C) (n : ℤ),
      Small.{w, w'}
        ((DerivedCategory.singleFunctor C 0).obj X ⟶
          (shiftFunctor (DerivedCategory C) n).obj ((DerivedCategory.singleFunctor C 0).obj Y))
tactic: simp only [hasSmallLocalizedShiftedHom_iff _ _ DerivedCategory.Q]
state_before: C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Abelian C
inst✝ : HasDerivedCategory C
⊢ (∀ (X Y : C) (a b : ℤ),
      Small.{w, w'}
        ((shiftFunctor (DerivedCategory C) a).obj (DerivedCategory.Q.obj ((CochainComplex.singleFunctor C 0).obj X)) ⟶
          (shiftFunctor (DerivedCategory C) b).obj
            (DerivedCategory.Q.obj ((CochainComplex.singleFunctor C 0).obj Y)))) ↔
    ∀ (X Y : C) (n : ℤ),
      Small.{w, w'}
        ((DerivedCategory.singleFunctor C 0).obj X ⟶
          (shiftFunctor (DerivedCategory C) n).obj ((DerivedCategory.singleFunctor C 0).obj Y))
state_after: case mp
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Abelian C
inst✝ : HasDerivedCategory C
⊢ (∀ (X Y : C) (a b : ℤ),
      Small.{w, w'}
        ((shiftFunctor (DerivedCategory C) a).obj (DerivedCategory.Q.obj ((CochainComplex.singleFunctor C 0).obj X)) ⟶
          (shiftFunctor (DerivedCategory C) b).obj
            (DerivedCategory.Q.obj ((CochainComplex.singleFunctor C 0).obj Y)))) →
    ∀ (X Y : C) (n : ℤ),
      Small.{w, w'}
        ((DerivedCategory.singleFunctor C 0).obj X ⟶
          (shiftFunctor (DerivedCategory C) n).obj ((DerivedCategory.singleFunctor C 0).obj Y))

case mpr
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Abelian C
inst✝ : HasDerivedCategory C
⊢ (∀ (X Y : C) (n : ℤ),
      Small.{w, w'}
        ((DerivedCategory.singleFunctor C 0).obj X ⟶
          (shiftFunctor (DerivedCategory C) n).obj ((DerivedCategory.singleFunctor C 0).obj Y))) →
    ∀ (X Y : C) (a b : ℤ),
      Small.{w, w'}
        ((shiftFunctor (DerivedCategory C) a).obj (DerivedCategory.Q.obj ((CochainComplex.singleFunctor C 0).obj X)) ⟶
          (shiftFunctor (DerivedCategory C) b).obj (DerivedCategory.Q.obj ((CochainComplex.singleFunctor C 0).obj Y)))
tactic: constructor