Theorem: CategoryTheory.Limits.Types.descFun_spec
File: Mathlib/CategoryTheory/Limits/Preserves/Ulift.lean

tactic: refine ⟨?_, fun he ↦ funext fun x ↦ ((descFun_apply_spec hc lc).mpr ?_).symm⟩
state_before: J : Type u_1
inst✝ : Category.{u_2, u_1} J
K : J ⥤ Type u
c : Cocone K
hc : IsColimit c
lc : Cocone (K ⋙ uliftFunctor.{v, u})
f : c.pt → lc.pt
⊢ f = descFun hc lc ↔ ∀ (j : J), f ∘ c.ι.app j = lc.ι.app j ∘ ULift.up
state_after: case refine_1
J : Type u_1
inst✝ : Category.{u_2, u_1} J
K : J ⥤ Type u
c : Cocone K
hc : IsColimit c
lc : Cocone (K ⋙ uliftFunctor.{v, u})
f : c.pt → lc.pt
⊢ f = descFun hc lc → ∀ (j : J), f ∘ c.ι.app j = lc.ι.app j ∘ ULift.up

case refine_2
J : Type u_1
inst✝ : Category.{u_2, u_1} J
K : J ⥤ Type u
c : Cocone K
hc : IsColimit c
lc : Cocone (K ⋙ uliftFunctor.{v, u})
f : c.pt → lc.pt
he : ∀ (j : J), f ∘ c.ι.app j = lc.ι.app j ∘ ULift.up
x : c.pt
⊢ x ∈ descSet hc {f x}

tactic: rintro rfl j
state_before: case refine_1
J : Type u_1
inst✝ : Category.{u_2, u_1} J
K : J ⥤ Type u
c : Cocone K
hc : IsColimit c
lc : Cocone (K ⋙ uliftFunctor.{v, u})
f : c.pt → lc.pt
⊢ f = descFun hc lc → ∀ (j : J), f ∘ c.ι.app j = lc.ι.app j ∘ ULift.up
state_after: case refine_1
J : Type u_1
inst✝ : Category.{u_2, u_1} J
K : J ⥤ Type u
c : Cocone K
hc : IsColimit c
lc : Cocone (K ⋙ uliftFunctor.{v, u})
j : J
⊢ descFun hc lc ∘ c.ι.app j = lc.ι.app j ∘ ULift.up

tactic: ext
state_before: case refine_1
J : Type u_1
inst✝ : Category.{u_2, u_1} J
K : J ⥤ Type u
c : Cocone K
hc : IsColimit c
lc : Cocone (K ⋙ uliftFunctor.{v, u})
j : J
⊢ descFun hc lc ∘ c.ι.app j = lc.ι.app j ∘ ULift.up
state_after: case refine_1.h
J : Type u_1
inst✝ : Category.{u_2, u_1} J
K : J ⥤ Type u
c : Cocone K
hc : IsColimit c
lc : Cocone (K ⋙ uliftFunctor.{v, u})
j : J
x✝ : K.obj j
⊢ (descFun hc lc ∘ c.ι.app j) x✝ = (lc.ι.app j ∘ ULift.up) x✝

tactic: apply (descFun_apply_spec hc lc).mpr
state_before: case refine_1.h
J : Type u_1
inst✝ : Category.{u_2, u_1} J
K : J ⥤ Type u
c : Cocone K
hc : IsColimit c
lc : Cocone (K ⋙ uliftFunctor.{v, u})
j : J
x✝ : K.obj j
⊢ (descFun hc lc ∘ c.ι.app j) x✝ = (lc.ι.app j ∘ ULift.up) x✝
state_after: case refine_1.h
J : Type u_1
inst✝ : Category.{u_2, u_1} J
K : J ⥤ Type u
c : Cocone K
hc : IsColimit c
lc : Cocone (K ⋙ uliftFunctor.{v, u})
j : J
x✝ : K.obj j
⊢ c.ι.app j x✝ ∈ descSet hc {(lc.ι.app j ∘ ULift.up) x✝}

tactic: rw [mem_descSet_singleton]
state_before: case refine_1.h
J : Type u_1
inst✝ : Category.{u_2, u_1} J
K : J ⥤ Type u
c : Cocone K
hc : IsColimit c
lc : Cocone (K ⋙ uliftFunctor.{v, u})
j : J
x✝ : K.obj j
⊢ c.ι.app j x✝ ∈ descSet hc {(lc.ι.app j ∘ ULift.up) x✝}
state_after: case refine_1.h
J : Type u_1
inst✝ : Category.{u_2, u_1} J
K : J ⥤ Type u
c : Cocone K
hc : IsColimit c
lc : Cocone (K ⋙ uliftFunctor.{v, u})
j : J
x✝ : K.obj j
⊢ lc.ι.app j { down := x✝ } = (lc.ι.app j ∘ ULift.up) x✝

tactic: rfl
state_before: case refine_1.h
J : Type u_1
inst✝ : Category.{u_2, u_1} J
K : J ⥤ Type u
c : Cocone K
hc : IsColimit c
lc : Cocone (K ⋙ uliftFunctor.{v, u})
j : J
x✝ : K.obj j
⊢ lc.ι.app j { down := x✝ } = (lc.ι.app j ∘ ULift.up) x✝
state_after: no goals

tactic: rw [← (jointly_surjective_of_isColimit hc x).choose_spec.choose_spec, mem_descSet_singleton]
state_before: case refine_2
J : Type u_1
inst✝ : Category.{u_2, u_1} J
K : J ⥤ Type u
c : Cocone K
hc : IsColimit c
lc : Cocone (K ⋙ uliftFunctor.{v, u})
f : c.pt → lc.pt
he : ∀ (j : J), f ∘ c.ι.app j = lc.ι.app j ∘ ULift.up
x : c.pt
⊢ x ∈ descSet hc {f x}
state_after: case refine_2
J : Type u_1
inst✝ : Category.{u_2, u_1} J
K : J ⥤ Type u
c : Cocone K
hc : IsColimit c
lc : Cocone (K ⋙ uliftFunctor.{v, u})
f : c.pt → lc.pt
he : ∀ (j : J), f ∘ c.ι.app j = lc.ι.app j ∘ ULift.up
x : c.pt
⊢ lc.ι.app ⋯.choose { down := ⋯.choose } = f (c.ι.app ⋯.choose ⋯.choose)

tactic: exact (congr_fun (he _) _).symm
state_before: case refine_2
J : Type u_1
inst✝ : Category.{u_2, u_1} J
K : J ⥤ Type u
c : Cocone K
hc : IsColimit c
lc : Cocone (K ⋙ uliftFunctor.{v, u})
f : c.pt → lc.pt
he : ∀ (j : J), f ∘ c.ι.app j = lc.ι.app j ∘ ULift.up
x : c.pt
⊢ lc.ι.app ⋯.choose { down := ⋯.choose } = f (c.ι.app ⋯.choose ⋯.choose)
state_after: no goals