Theorem: CategoryTheory.Functor.mem_mapTriangle_essImage_of_distinguished
File: Mathlib/CategoryTheory/Triangulated/Functor.lean

Proof steps:
state_before: C : Type u_1
D : Type u_2
E : Type u_3
inst✝²¹ : Category.{u_4, u_1} C
inst✝²⁰ : Category.{u_5, u_2} D
inst✝¹⁹ : Category.{?u.362828, u_3} E
inst✝¹⁸ : HasShift C ℤ
inst✝¹⁷ : HasShift D ℤ
inst✝¹⁶ : HasShift E ℤ
F : C ⥤ D
inst✝¹⁵ : F.CommShift ℤ
G : D ⥤ E
inst✝¹⁴ : G.CommShift ℤ
inst✝¹³ : HasZeroObject C
inst✝¹² : HasZeroObject D
inst✝¹¹ : HasZeroObject E
inst✝¹⁰ : Preadditive C
inst✝⁹ : Preadditive D
inst✝⁸ : Preadditive E
inst✝⁷ : ∀ (n : ℤ), (shiftFunctor C n).Additive
inst✝⁶ : ∀ (n : ℤ), (shiftFunctor D n).Additive
inst✝⁵ : ∀ (n : ℤ), (shiftFunctor E n).Additive
inst✝⁴ : Pretriangulated C
inst✝³ : Pretriangulated D
inst✝² : Pretriangulated E
inst✝¹ : F.IsTriangulated
inst✝ : F.mapArrow.EssSurj
T : Triangle D
hT : T ∈ distinguishedTriangles
⊢ ∃ T', ∃ (_ : T' ∈ distinguishedTriangles), Nonempty (F.mapTriangle.obj T' ≅ T)
state_after: case intro.intro.intro.intro.intro
C : Type u_1
D : Type u_2
E : Type u_3
inst✝²¹ : Category.{u_4, u_1} C
inst✝²⁰ : Category.{u_5, u_2} D
inst✝¹⁹ : Category.{?u.362828, u_3} E
inst✝¹⁸ : HasShift C ℤ
inst✝¹⁷ : HasShift D ℤ
inst✝¹⁶ : HasShift E ℤ
F : C ⥤ D
inst✝¹⁵ : F.CommShift ℤ
G : D ⥤ E
inst✝¹⁴ : G.CommShift ℤ
inst✝¹³ : HasZeroObject C
inst✝¹² : HasZeroObject D
inst✝¹¹ : HasZeroObject E
inst✝¹⁰ : Preadditive C
inst✝⁹ : Preadditive D
inst✝⁸ : Preadditive E
inst✝⁷ : ∀ (n : ℤ), (shiftFunctor C n).Additive
inst✝⁶ : ∀ (n : ℤ), (shiftFunctor D n).Additive
inst✝⁵ : ∀ (n : ℤ), (shiftFunctor E n).Additive
inst✝⁴ : Pretriangulated C
inst✝³ : Pretriangulated D
inst✝² : Pretriangulated E
inst✝¹ : F.IsTriangulated
inst✝ : F.mapArrow.EssSurj
T : Triangle D
hT : T ∈ distinguishedTriangles
X Y : C
f : X ⟶ Y
e₁ : F.obj X ≅ T.obj₁
e₂ : F.obj Y ≅ T.obj₂
w : F.map f ≫ e₂.hom = e₁.hom ≫ T.mor₁
⊢ ∃ T', ∃ (_ : T' ∈ distinguishedTriangles), Nonempty (F.mapTriangle.obj T' ≅ T)
tactic: obtain ⟨X, Y, f, e₁, e₂, w⟩ : ∃ (X Y : C) (f : X ⟶ Y) (e₁ : F.obj X ≅ T.obj₁)
    (e₂ : F.obj Y ≅ T.obj₂), F.map f ≫ e₂.hom = e₁.hom ≫ T.mor₁ := by
      let e := F.mapArrow.objObjPreimageIso (Arrow.mk T.mor₁)
      exact ⟨_, _, _, Arrow.leftFunc.mapIso e, Arrow.rightFunc.mapIso e, e.hom.w.symm⟩
state_before: case intro.intro.intro.intro.intro
C : Type u_1
D : Type u_2
E : Type u_3
inst✝²¹ : Category.{u_4, u_1} C
inst✝²⁰ : Category.{u_5, u_2} D
inst✝¹⁹ : Category.{?u.362828, u_3} E
inst✝¹⁸ : HasShift C ℤ
inst✝¹⁷ : HasShift D ℤ
inst✝¹⁶ : HasShift E ℤ
F : C ⥤ D
inst✝¹⁵ : F.CommShift ℤ
G : D ⥤ E
inst✝¹⁴ : G.CommShift ℤ
inst✝¹³ : HasZeroObject C
inst✝¹² : HasZeroObject D
inst✝¹¹ : HasZeroObject E
inst✝¹⁰ : Preadditive C
inst✝⁹ : Preadditive D
inst✝⁸ : Preadditive E
inst✝⁷ : ∀ (n : ℤ), (shiftFunctor C n).Additive
inst✝⁶ : ∀ (n : ℤ), (shiftFunctor D n).Additive
inst✝⁵ : ∀ (n : ℤ), (shiftFunctor E n).Additive
inst✝⁴ : Pretriangulated C
inst✝³ : Pretriangulated D
inst✝² : Pretriangulated E
inst✝¹ : F.IsTriangulated
inst✝ : F.mapArrow.EssSurj
T : Triangle D
hT : T ∈ distinguishedTriangles
X Y : C
f : X ⟶ Y
e₁ : F.obj X ≅ T.obj₁
e₂ : F.obj Y ≅ T.obj₂
w : F.map f ≫ e₂.hom = e₁.hom ≫ T.mor₁
⊢ ∃ T', ∃ (_ : T' ∈ distinguishedTriangles), Nonempty (F.mapTriangle.obj T' ≅ T)
state_after: case intro.intro.intro.intro.intro.intro.intro.intro
C : Type u_1
D : Type u_2
E : Type u_3
inst✝²¹ : Category.{u_4, u_1} C
inst✝²⁰ : Category.{u_5, u_2} D
inst✝¹⁹ : Category.{?u.362828, u_3} E
inst✝¹⁸ : HasShift C ℤ
inst✝¹⁷ : HasShift D ℤ
inst✝¹⁶ : HasShift E ℤ
F : C ⥤ D
inst✝¹⁵ : F.CommShift ℤ
G : D ⥤ E
inst✝¹⁴ : G.CommShift ℤ
inst✝¹³ : HasZeroObject C
inst✝¹² : HasZeroObject D
inst✝¹¹ : HasZeroObject E
inst✝¹⁰ : Preadditive C
inst✝⁹ : Preadditive D
inst✝⁸ : Preadditive E
inst✝⁷ : ∀ (n : ℤ), (shiftFunctor C n).Additive
inst✝⁶ : ∀ (n : ℤ), (shiftFunctor D n).Additive
inst✝⁵ : ∀ (n : ℤ), (shiftFunctor E n).Additive
inst✝⁴ : Pretriangulated C
inst✝³ : Pretriangulated D
inst✝² : Pretriangulated E
inst✝¹ : F.IsTriangulated
inst✝ : F.mapArrow.EssSurj
T : Triangle D
hT : T ∈ distinguishedTriangles
X Y : C
f : X ⟶ Y
e₁ : F.obj X ≅ T.obj₁
e₂ : F.obj Y ≅ T.obj₂
w : F.map f ≫ e₂.hom = e₁.hom ≫ T.mor₁
W : C
g : Y ⟶ W
h : W ⟶ (shiftFunctor C 1).obj X
H : Triangle.mk f g h ∈ distinguishedTriangles
⊢ ∃ T', ∃ (_ : T' ∈ distinguishedTriangles), Nonempty (F.mapTriangle.obj T' ≅ T)
tactic: obtain ⟨W, g, h, H⟩ := distinguished_cocone_triangle f
state_before: case intro.intro.intro.intro.intro.intro.intro.intro
C : Type u_1
D : Type u_2
E : Type u_3
inst✝²¹ : Category.{u_4, u_1} C
inst✝²⁰ : Category.{u_5, u_2} D
inst✝¹⁹ : Category.{?u.362828, u_3} E
inst✝¹⁸ : HasShift C ℤ
inst✝¹⁷ : HasShift D ℤ
inst✝¹⁶ : HasShift E ℤ
F : C ⥤ D
inst✝¹⁵ : F.CommShift ℤ
G : D ⥤ E
inst✝¹⁴ : G.CommShift ℤ
inst✝¹³ : HasZeroObject C
inst✝¹² : HasZeroObject D
inst✝¹¹ : HasZeroObject E
inst✝¹⁰ : Preadditive C
inst✝⁹ : Preadditive D
inst✝⁸ : Preadditive E
inst✝⁷ : ∀ (n : ℤ), (shiftFunctor C n).Additive
inst✝⁶ : ∀ (n : ℤ), (shiftFunctor D n).Additive
inst✝⁵ : ∀ (n : ℤ), (shiftFunctor E n).Additive
inst✝⁴ : Pretriangulated C
inst✝³ : Pretriangulated D
inst✝² : Pretriangulated E
inst✝¹ : F.IsTriangulated
inst✝ : F.mapArrow.EssSurj
T : Triangle D
hT : T ∈ distinguishedTriangles
X Y : C
f : X ⟶ Y
e₁ : F.obj X ≅ T.obj₁
e₂ : F.obj Y ≅ T.obj₂
w : F.map f ≫ e₂.hom = e₁.hom ≫ T.mor₁
W : C
g : Y ⟶ W
h : W ⟶ (shiftFunctor C 1).obj X
H : Triangle.mk f g h ∈ distinguishedTriangles
⊢ ∃ T', ∃ (_ : T' ∈ distinguishedTriangles), Nonempty (F.mapTriangle.obj T' ≅ T)
state_after: no goals
tactic: exact ⟨_, H, ⟨isoTriangleOfIso₁₂ _ _ (F.map_distinguished _ H) hT e₁ e₂ w⟩⟩