Theorem: CategoryTheory.TwoSquare.CostructuredArrowDownwards.mk_surjective
File: Mathlib/CategoryTheory/GuitartExact/Basic.lean

Proof steps:
state_before: C₁ : Type u₁
C₂ : Type u₂
C₃ : Type u₃
C₄ : Type u₄
inst✝³ : Category.{v₁, u₁} C₁
inst✝² : Category.{v₂, u₂} C₂
inst✝¹ : Category.{v₃, u₃} C₃
inst✝ : Category.{v₄, u₄} C₄
T : C₁ ⥤ C₂
L : C₁ ⥤ C₃
R : C₂ ⥤ C₄
B : C₃ ⥤ C₄
w : TwoSquare T L R B
X₂ : C₂
X₃ : C₃
g : R.obj X₂ ⟶ B.obj X₃
X₁ : C₁
a : X₂ ⟶ T.obj X₁
b : L.obj X₁ ⟶ X₃
comm : R.map a ≫ w.app X₁ ≫ B.map b = g
f : w.CostructuredArrowDownwards g
⊢ ∃ X₁ a b, ∃ (comm : R.map a ≫ w.app X₁ ≫ B.map b = g), f = mk w g X₁ a b comm
state_after: case intro.intro
C₁ : Type u₁
C₂ : Type u₂
C₃ : Type u₃
C₄ : Type u₄
inst✝³ : Category.{v₁, u₁} C₁
inst✝² : Category.{v₂, u₂} C₂
inst✝¹ : Category.{v₃, u₃} C₃
inst✝ : Category.{v₄, u₄} C₄
T : C₁ ⥤ C₂
L : C₁ ⥤ C₃
R : C₂ ⥤ C₄
B : C₃ ⥤ C₄
w : TwoSquare T L R B
X₂ : C₂
X₃ : C₃
g✝ : R.obj X₂ ⟶ B.obj X₃
X₁ : C₁
a : X₂ ⟶ T.obj X₁
b : L.obj X₁ ⟶ X₃
comm : R.map a ≫ w.app X₁ ≫ B.map b = g✝
g : StructuredArrow X₂ T
φ : (w.structuredArrowDownwards X₂).obj g ⟶ StructuredArrow.mk g✝
⊢ ∃ X₁ a b, ∃ (comm : R.map a ≫ w.app X₁ ≫ B.map b = g✝), CostructuredArrow.mk φ = mk w g✝ X₁ a b comm
tactic: obtain ⟨g, φ, rfl⟩ := CostructuredArrow.mk_surjective f
state_before: case intro.intro
C₁ : Type u₁
C₂ : Type u₂
C₃ : Type u₃
C₄ : Type u₄
inst✝³ : Category.{v₁, u₁} C₁
inst✝² : Category.{v₂, u₂} C₂
inst✝¹ : Category.{v₃, u₃} C₃
inst✝ : Category.{v₄, u₄} C₄
T : C₁ ⥤ C₂
L : C₁ ⥤ C₃
R : C₂ ⥤ C₄
B : C₃ ⥤ C₄
w : TwoSquare T L R B
X₂ : C₂
X₃ : C₃
g✝ : R.obj X₂ ⟶ B.obj X₃
X₁ : C₁
a : X₂ ⟶ T.obj X₁
b : L.obj X₁ ⟶ X₃
comm : R.map a ≫ w.app X₁ ≫ B.map b = g✝
g : StructuredArrow X₂ T
φ : (w.structuredArrowDownwards X₂).obj g ⟶ StructuredArrow.mk g✝
⊢ ∃ X₁ a b, ∃ (comm : R.map a ≫ w.app X₁ ≫ B.map b = g✝), CostructuredArrow.mk φ = mk w g✝ X₁ a b comm
state_after: case intro.intro.intro.intro
C₁ : Type u₁
C₂ : Type u₂
C₃ : Type u₃
C₄ : Type u₄
inst✝³ : Category.{v₁, u₁} C₁
inst✝² : Category.{v₂, u₂} C₂
inst✝¹ : Category.{v₃, u₃} C₃
inst✝ : Category.{v₄, u₄} C₄
T : C₁ ⥤ C₂
L : C₁ ⥤ C₃
R : C₂ ⥤ C₄
B : C₃ ⥤ C₄
w : TwoSquare T L R B
X₂ : C₂
X₃ : C₃
g : R.obj X₂ ⟶ B.obj X₃
X₁✝ : C₁
a✝ : X₂ ⟶ T.obj X₁✝
b : L.obj X₁✝ ⟶ X₃
comm : R.map a✝ ≫ w.app X₁✝ ≫ B.map b = g
X₁ : C₁
a : X₂ ⟶ T.obj X₁
φ : (w.structuredArrowDownwards X₂).obj (StructuredArrow.mk a) ⟶ StructuredArrow.mk g
⊢ ∃ X₁_1 a_1 b, ∃ (comm : R.map a_1 ≫ w.app X₁_1 ≫ B.map b = g), CostructuredArrow.mk φ = mk w g X₁_1 a_1 b comm
tactic: obtain ⟨X₁, a, rfl⟩ := g.mk_surjective
state_before: case intro.intro.intro.intro
C₁ : Type u₁
C₂ : Type u₂
C₃ : Type u₃
C₄ : Type u₄
inst✝³ : Category.{v₁, u₁} C₁
inst✝² : Category.{v₂, u₂} C₂
inst✝¹ : Category.{v₃, u₃} C₃
inst✝ : Category.{v₄, u₄} C₄
T : C₁ ⥤ C₂
L : C₁ ⥤ C₃
R : C₂ ⥤ C₄
B : C₃ ⥤ C₄
w : TwoSquare T L R B
X₂ : C₂
X₃ : C₃
g : R.obj X₂ ⟶ B.obj X₃
X₁✝ : C₁
a✝ : X₂ ⟶ T.obj X₁✝
b : L.obj X₁✝ ⟶ X₃
comm : R.map a✝ ≫ w.app X₁✝ ≫ B.map b = g
X₁ : C₁
a : X₂ ⟶ T.obj X₁
φ : (w.structuredArrowDownwards X₂).obj (StructuredArrow.mk a) ⟶ StructuredArrow.mk g
⊢ ∃ X₁_1 a_1 b, ∃ (comm : R.map a_1 ≫ w.app X₁_1 ≫ B.map b = g), CostructuredArrow.mk φ = mk w g X₁_1 a_1 b comm
state_after: case intro.intro.intro.intro.intro.intro
C₁ : Type u₁
C₂ : Type u₂
C₃ : Type u₃
C₄ : Type u₄
inst✝³ : Category.{v₁, u₁} C₁
inst✝² : Category.{v₂, u₂} C₂
inst✝¹ : Category.{v₃, u₃} C₃
inst✝ : Category.{v₄, u₄} C₄
T : C₁ ⥤ C₂
L : C₁ ⥤ C₃
R : C₂ ⥤ C₄
B : C₃ ⥤ C₄
w : TwoSquare T L R B
X₂ : C₂
X₃ : C₃
g : R.obj X₂ ⟶ B.obj X₃
X₁✝ : C₁
a✝ : X₂ ⟶ T.obj X₁✝
b✝ : L.obj X₁✝ ⟶ X₃
comm : R.map a✝ ≫ w.app X₁✝ ≫ B.map b✝ = g
X₁ : C₁
a : X₂ ⟶ T.obj X₁
b : ((w.structuredArrowDownwards X₂).obj (StructuredArrow.mk a)).right ⟶ (StructuredArrow.mk g).right
hb : ((w.structuredArrowDownwards X₂).obj (StructuredArrow.mk a)).hom ≫ B.map b = (StructuredArrow.mk g).hom
⊢ ∃ X₁_1 a_1 b_1,
    ∃ (comm : R.map a_1 ≫ w.app X₁_1 ≫ B.map b_1 = g),
      CostructuredArrow.mk (StructuredArrow.homMk b hb) = mk w g X₁_1 a_1 b_1 comm
tactic: obtain ⟨b, hb, rfl⟩ := StructuredArrow.homMk_surjective φ
state_before: case intro.intro.intro.intro.intro.intro
C₁ : Type u₁
C₂ : Type u₂
C₃ : Type u₃
C₄ : Type u₄
inst✝³ : Category.{v₁, u₁} C₁
inst✝² : Category.{v₂, u₂} C₂
inst✝¹ : Category.{v₃, u₃} C₃
inst✝ : Category.{v₄, u₄} C₄
T : C₁ ⥤ C₂
L : C₁ ⥤ C₃
R : C₂ ⥤ C₄
B : C₃ ⥤ C₄
w : TwoSquare T L R B
X₂ : C₂
X₃ : C₃
g : R.obj X₂ ⟶ B.obj X₃
X₁✝ : C₁
a✝ : X₂ ⟶ T.obj X₁✝
b✝ : L.obj X₁✝ ⟶ X₃
comm : R.map a✝ ≫ w.app X₁✝ ≫ B.map b✝ = g
X₁ : C₁
a : X₂ ⟶ T.obj X₁
b : ((w.structuredArrowDownwards X₂).obj (StructuredArrow.mk a)).right ⟶ (StructuredArrow.mk g).right
hb : ((w.structuredArrowDownwards X₂).obj (StructuredArrow.mk a)).hom ≫ B.map b = (StructuredArrow.mk g).hom
⊢ ∃ X₁_1 a_1 b_1,
    ∃ (comm : R.map a_1 ≫ w.app X₁_1 ≫ B.map b_1 = g),
      CostructuredArrow.mk (StructuredArrow.homMk b hb) = mk w g X₁_1 a_1 b_1 comm
state_after: no goals
tactic: exact ⟨X₁, a, b, by simpa using hb, rfl⟩