Theorem: CategoryTheory.Functor.eval_section_surjective_of_surjective
File: Mathlib/CategoryTheory/CofilteredSystem.lean

Proof steps:
state_before: J : Type u
inst✝³ : Category.{u_1, u} J
F : J ⥤ Type v
i✝ j k : J
s : Set (F.obj i✝)
inst✝² : IsCofilteredOrEmpty J
inst✝¹ : ∀ (j : J), Nonempty (F.obj j)
inst✝ : ∀ (j : J), Finite (F.obj j)
Fsur : ∀ ⦃i j : J⦄ (f : i ⟶ j), Function.Surjective (F.map f)
i : J
x : F.obj i
⊢ ∃ a, (fun s => ↑s i) a = x
state_after: J : Type u
inst✝³ : Category.{u_1, u} J
F : J ⥤ Type v
i✝ j k : J
s✝ : Set (F.obj i✝)
inst✝² : IsCofilteredOrEmpty J
inst✝¹ : ∀ (j : J), Nonempty (F.obj j)
inst✝ : ∀ (j : J), Finite (F.obj j)
Fsur : ∀ ⦃i j : J⦄ (f : i ⟶ j), Function.Surjective (F.map f)
i : J
x : F.obj i
s : Set (F.obj i) := {x}
⊢ ∃ a, (fun s => ↑s i) a = x
tactic: let s : Set (F.obj i) := {x}
state_before: J : Type u
inst✝³ : Category.{u_1, u} J
F : J ⥤ Type v
i✝ j k : J
s✝ : Set (F.obj i✝)
inst✝² : IsCofilteredOrEmpty J
inst✝¹ : ∀ (j : J), Nonempty (F.obj j)
inst✝ : ∀ (j : J), Finite (F.obj j)
Fsur : ∀ ⦃i j : J⦄ (f : i ⟶ j), Function.Surjective (F.map f)
i : J
x : F.obj i
s : Set (F.obj i) := {x}
⊢ ∃ a, (fun s => ↑s i) a = x
state_after: J : Type u
inst✝³ : Category.{u_1, u} J
F : J ⥤ Type v
i✝ j k : J
s✝ : Set (F.obj i✝)
inst✝² : IsCofilteredOrEmpty J
inst✝¹ : ∀ (j : J), Nonempty (F.obj j)
inst✝ : ∀ (j : J), Finite (F.obj j)
Fsur : ∀ ⦃i j : J⦄ (f : i ⟶ j), Function.Surjective (F.map f)
i : J
x : F.obj i
s : Set (F.obj i) := {x}
this : ∀ (j : J), Nonempty ((F.toPreimages s).obj j)
⊢ ∃ a, (fun s => ↑s i) a = x
tactic: haveI := F.toPreimages_nonempty_of_surjective s Fsur (singleton_nonempty x)
state_before: J : Type u
inst✝³ : Category.{u_1, u} J
F : J ⥤ Type v
i✝ j k : J
s✝ : Set (F.obj i✝)
inst✝² : IsCofilteredOrEmpty J
inst✝¹ : ∀ (j : J), Nonempty (F.obj j)
inst✝ : ∀ (j : J), Finite (F.obj j)
Fsur : ∀ ⦃i j : J⦄ (f : i ⟶ j), Function.Surjective (F.map f)
i : J
x : F.obj i
s : Set (F.obj i) := {x}
this : ∀ (j : J), Nonempty ((F.toPreimages s).obj j)
⊢ ∃ a, (fun s => ↑s i) a = x
state_after: case intro
J : Type u
inst✝³ : Category.{u_1, u} J
F : J ⥤ Type v
i✝ j k : J
s✝ : Set (F.obj i✝)
inst✝² : IsCofilteredOrEmpty J
inst✝¹ : ∀ (j : J), Nonempty (F.obj j)
inst✝ : ∀ (j : J), Finite (F.obj j)
Fsur : ∀ ⦃i j : J⦄ (f : i ⟶ j), Function.Surjective (F.map f)
i : J
x : F.obj i
s : Set (F.obj i) := {x}
this : ∀ (j : J), Nonempty ((F.toPreimages s).obj j)
sec : (j : J) → (F.toPreimages s).obj j
h : sec ∈ (F.toPreimages s).sections
⊢ ∃ a, (fun s => ↑s i) a = x
tactic: obtain ⟨sec, h⟩ := nonempty_sections_of_finite_cofiltered_system (F.toPreimages s)
state_before: case intro
J : Type u
inst✝³ : Category.{u_1, u} J
F : J ⥤ Type v
i✝ j k : J
s✝ : Set (F.obj i✝)
inst✝² : IsCofilteredOrEmpty J
inst✝¹ : ∀ (j : J), Nonempty (F.obj j)
inst✝ : ∀ (j : J), Finite (F.obj j)
Fsur : ∀ ⦃i j : J⦄ (f : i ⟶ j), Function.Surjective (F.map f)
i : J
x : F.obj i
s : Set (F.obj i) := {x}
this : ∀ (j : J), Nonempty ((F.toPreimages s).obj j)
sec : (j : J) → (F.toPreimages s).obj j
h : sec ∈ (F.toPreimages s).sections
⊢ ∃ a, (fun s => ↑s i) a = x
state_after: case intro
J : Type u
inst✝³ : Category.{u_1, u} J
F : J ⥤ Type v
i✝ j k : J
s✝ : Set (F.obj i✝)
inst✝² : IsCofilteredOrEmpty J
inst✝¹ : ∀ (j : J), Nonempty (F.obj j)
inst✝ : ∀ (j : J), Finite (F.obj j)
Fsur : ∀ ⦃i j : J⦄ (f : i ⟶ j), Function.Surjective (F.map f)
i : J
x : F.obj i
s : Set (F.obj i) := {x}
this : ∀ (j : J), Nonempty ((F.toPreimages s).obj j)
sec : (j : J) → (F.toPreimages s).obj j
h : sec ∈ (F.toPreimages s).sections
⊢ (fun s => ↑s i) ⟨fun j => ↑(sec j), ⋯⟩ = x
tactic: refine ⟨⟨fun j => (sec j).val, fun jk => by simpa [Subtype.ext_iff] using h jk⟩, ?_⟩