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

tactic: let s : Set (F.obj i) := {x}
state_before: J : Type u
inst✝³ : Category J
F : J ⥤ Type v
i✝ j k : J
s : Set (F.obj i✝)
inst✝² : IsCofilteredOrEmpty J
inst✝¹ : ∀ (j : J), _root_.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

tactic: haveI := F.toPreimages_nonempty_of_surjective s Fsur (singleton_nonempty x)
state_before: J : Type u
inst✝³ : Category J
F : J ⥤ Type v
i✝ j k : J
s✝ : Set (F.obj i✝)
inst✝² : IsCofilteredOrEmpty J
inst✝¹ : ∀ (j : J), _root_.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: obtain ⟨sec, h⟩ := nonempty_sections_of_finite_cofiltered_system (F.toPreimages s)
state_before: J : Type u
inst✝³ : Category J
F : J ⥤ Type v
i✝ j k : J
s✝ : Set (F.obj i✝)
inst✝² : IsCofilteredOrEmpty J
inst✝¹ : ∀ (j : J), _root_.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), _root_.Nonempty ((toPreimages F s).obj j)
⊢ ∃ a, (fun s => ↑s i) a = x

tactic: refine' ⟨⟨fun j => (sec j).val, fun jk => by simpa [Subtype.ext_iff] using h jk⟩, _⟩
state_before: case intro
J : Type u
inst✝³ : Category J
F : J ⥤ Type v
i✝ j k : J
s✝ : Set (F.obj i✝)
inst✝² : IsCofilteredOrEmpty J
inst✝¹ : ∀ (j : J), _root_.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), _root_.Nonempty ((toPreimages F s).obj j)
sec : (j : J) → (toPreimages F s).obj j
h : sec ∈ sections (toPreimages F s)
⊢ ∃ a, (fun s => ↑s i) a = x

tactic: simpa [Subtype.ext_iff] using h jk
state_before: J : Type u
inst✝³ : Category J
F : J ⥤ Type v
i✝ j k : J
s✝ : Set (F.obj i✝)
inst✝² : IsCofilteredOrEmpty J
inst✝¹ : ∀ (j : J), _root_.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), _root_.Nonempty ((toPreimages F s).obj j)
sec : (j : J) → (toPreimages F s).obj j
h : sec ∈ sections (toPreimages F s)
j✝ j'✝ : J
jk : j✝ ⟶ j'✝
⊢ F.map jk ((fun j => ↑(sec j)) j✝) = (fun j => ↑(sec j)) j'✝

tactic: have := (sec i).prop
state_before: case intro
J : Type u
inst✝³ : Category J
F : J ⥤ Type v
i✝ j k : J
s✝ : Set (F.obj i✝)
inst✝² : IsCofilteredOrEmpty J
inst✝¹ : ∀ (j : J), _root_.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), _root_.Nonempty ((toPreimages F s).obj j)
sec : (j : J) → (toPreimages F s).obj j
h : sec ∈ sections (toPreimages F s)
⊢ (fun s => ↑s i)
      { val := fun j => ↑(sec j),
        property := (_ : ∀ {j j' : J} (jk : j ⟶ j'), F.map jk ((fun j => ↑(sec j)) j) = (fun j => ↑(sec j)) j') } =
    x

tactic: simp only [mem_iInter, mem_preimage, mem_singleton_iff] at this
state_before: case intro
J : Type u
inst✝³ : Category J
F : J ⥤ Type v
i✝ j k : J
s✝ : Set (F.obj i✝)
inst✝² : IsCofilteredOrEmpty J
inst✝¹ : ∀ (j : J), _root_.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), _root_.Nonempty ((toPreimages F s).obj j)
sec : (j : J) → (toPreimages F s).obj j
h : sec ∈ sections (toPreimages F s)
this : ↑(sec i) ∈ ⋂ (f : i ⟶ i), F.map f ⁻¹' s
⊢ (fun s => ↑s i)
      { val := fun j => ↑(sec j),
        property := (_ : ∀ {j j' : J} (jk : j ⟶ j'), F.map jk ((fun j => ↑(sec j)) j) = (fun j => ↑(sec j)) j') } =
    x

tactic: have := this (𝟙 i)
state_before: case intro
J : Type u
inst✝³ : Category J
F : J ⥤ Type v
i✝ j k : J
s✝ : Set (F.obj i✝)
inst✝² : IsCofilteredOrEmpty J
inst✝¹ : ∀ (j : J), _root_.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), _root_.Nonempty ((toPreimages F s).obj j)
sec : (j : J) → (toPreimages F s).obj j
h : sec ∈ sections (toPreimages F s)
this : ∀ (i_1 : i ⟶ i), F.map i_1 ↑(sec i) = x
⊢ (fun s => ↑s i)
      { val := fun j => ↑(sec j),
        property := (_ : ∀ {j j' : J} (jk : j ⟶ j'), F.map jk ((fun j => ↑(sec j)) j) = (fun j => ↑(sec j)) j') } =
    x

tactic: rwa [map_id_apply] at this
state_before: case intro
J : Type u
inst✝³ : Category J
F : J ⥤ Type v
i✝ j k : J
s✝ : Set (F.obj i✝)
inst✝² : IsCofilteredOrEmpty J
inst✝¹ : ∀ (j : J), _root_.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), _root_.Nonempty ((toPreimages F s).obj j)
sec : (j : J) → (toPreimages F s).obj j
h : sec ∈ sections (toPreimages F s)
this✝ : ∀ (i_1 : i ⟶ i), F.map i_1 ↑(sec i) = x
this : F.map (𝟙 i) ↑(sec i) = x
⊢ (fun s => ↑s i)
      { val := fun j => ↑(sec j),
        property := (_ : ∀ {j j' : J} (jk : j ⟶ j'), F.map jk ((fun j => ↑(sec j)) j) = (fun j => ↑(sec j)) j') } =
    x