Theorem: CategoryTheory.Limits.Concrete.from_union_surjective_of_isColimit
File: Mathlib/CategoryTheory/Limits/ConcreteCategory.lean

tactic: intro ff x
state_before: C : Type u
inst✝³ : Category.{v, u} C
inst✝² : ConcreteCategory C
J : Type w
inst✝¹ : Category.{r, w} J
F : J ⥤ C
inst✝ : PreservesColimit F (forget C)
D : Cocone F
hD : IsColimit D
⊢ let ff := fun a => (D.ι.app a.fst) a.snd;
  Function.Surjective ff
state_after: C : Type u
inst✝³ : Category.{v, u} C
inst✝² : ConcreteCategory C
J : Type w
inst✝¹ : Category.{r, w} J
F : J ⥤ C
inst✝ : PreservesColimit F (forget C)
D : Cocone F
hD : IsColimit D
ff : (j : J) × (forget C).obj (F.obj j) → (forget C).obj D.pt := fun a => (D.ι.app a.fst) a.snd
x : (forget C).obj D.pt
⊢ ∃ a, ff a = x

tactic: let E : Cocone (F ⋙ forget C) := (forget C).mapCocone D
state_before: C : Type u
inst✝³ : Category.{v, u} C
inst✝² : ConcreteCategory C
J : Type w
inst✝¹ : Category.{r, w} J
F : J ⥤ C
inst✝ : PreservesColimit F (forget C)
D : Cocone F
hD : IsColimit D
ff : (j : J) × (forget C).obj (F.obj j) → (forget C).obj D.pt := fun a => (D.ι.app a.fst) a.snd
x : (forget C).obj D.pt
⊢ ∃ a, ff a = x
state_after: C : Type u
inst✝³ : Category.{v, u} C
inst✝² : ConcreteCategory C
J : Type w
inst✝¹ : Category.{r, w} J
F : J ⥤ C
inst✝ : PreservesColimit F (forget C)
D : Cocone F
hD : IsColimit D
ff : (j : J) × (forget C).obj (F.obj j) → (forget C).obj D.pt := fun a => (D.ι.app a.fst) a.snd
x : (forget C).obj D.pt
E : Cocone (F ⋙ forget C) := (forget C).mapCocone D
⊢ ∃ a, ff a = x

tactic: let hE : IsColimit E := isColimitOfPreserves (forget C) hD
state_before: C : Type u
inst✝³ : Category.{v, u} C
inst✝² : ConcreteCategory C
J : Type w
inst✝¹ : Category.{r, w} J
F : J ⥤ C
inst✝ : PreservesColimit F (forget C)
D : Cocone F
hD : IsColimit D
ff : (j : J) × (forget C).obj (F.obj j) → (forget C).obj D.pt := fun a => (D.ι.app a.fst) a.snd
x : (forget C).obj D.pt
E : Cocone (F ⋙ forget C) := (forget C).mapCocone D
⊢ ∃ a, ff a = x
state_after: C : Type u
inst✝³ : Category.{v, u} C
inst✝² : ConcreteCategory C
J : Type w
inst✝¹ : Category.{r, w} J
F : J ⥤ C
inst✝ : PreservesColimit F (forget C)
D : Cocone F
hD : IsColimit D
ff : (j : J) × (forget C).obj (F.obj j) → (forget C).obj D.pt := fun a => (D.ι.app a.fst) a.snd
x : (forget C).obj D.pt
E : Cocone (F ⋙ forget C) := (forget C).mapCocone D
hE : IsColimit E := isColimitOfPreserves (forget C) hD
⊢ ∃ a, ff a = x

tactic: obtain ⟨j, y, hy⟩ := Types.jointly_surjective_of_isColimit hE x
state_before: C : Type u
inst✝³ : Category.{v, u} C
inst✝² : ConcreteCategory C
J : Type w
inst✝¹ : Category.{r, w} J
F : J ⥤ C
inst✝ : PreservesColimit F (forget C)
D : Cocone F
hD : IsColimit D
ff : (j : J) × (forget C).obj (F.obj j) → (forget C).obj D.pt := fun a => (D.ι.app a.fst) a.snd
x : (forget C).obj D.pt
E : Cocone (F ⋙ forget C) := (forget C).mapCocone D
hE : IsColimit E := isColimitOfPreserves (forget C) hD
⊢ ∃ a, ff a = x
state_after: case intro.intro
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : ConcreteCategory C
J : Type w
inst✝¹ : Category.{r, w} J
F : J ⥤ C
inst✝ : PreservesColimit F (forget C)
D : Cocone F
hD : IsColimit D
ff : (j : J) × (forget C).obj (F.obj j) → (forget C).obj D.pt := fun a => (D.ι.app a.fst) a.snd
x : (forget C).obj D.pt
E : Cocone (F ⋙ forget C) := (forget C).mapCocone D
hE : IsColimit E := isColimitOfPreserves (forget C) hD
j : J
y : (F ⋙ forget C).obj j
hy : E.ι.app j y = x
⊢ ∃ a, ff a = x

tactic: exact ⟨⟨j, y⟩, hy⟩
state_before: case intro.intro
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : ConcreteCategory C
J : Type w
inst✝¹ : Category.{r, w} J
F : J ⥤ C
inst✝ : PreservesColimit F (forget C)
D : Cocone F
hD : IsColimit D
ff : (j : J) × (forget C).obj (F.obj j) → (forget C).obj D.pt := fun a => (D.ι.app a.fst) a.snd
x : (forget C).obj D.pt
E : Cocone (F ⋙ forget C) := (forget C).mapCocone D
hE : IsColimit E := isColimitOfPreserves (forget C) hD
j : J
y : (F ⋙ forget C).obj j
hy : E.ι.app j y = x
⊢ ∃ a, ff a = x
state_after: no goals