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.{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: 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}
⊢ ∃ 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: obtain ⟨sec, h⟩ := nonempty_sections_of_finite_cofiltered_system (F.toPreimages s)
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: 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.{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: simpa [Subtype.ext_iff] using h jk
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)
sec : (j : J) → (F.toPreimages s).obj j
h : sec ∈ (F.toPreimages s).sections
j✝ j'✝ : J
jk : j✝ ⟶ j'✝
⊢ F.map jk ((fun j => ↑(sec j)) j✝) = (fun j => ↑(sec j)) j'✝
state_after: no goals

tactic: have := (sec i).prop
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
⊢ (fun s => ↑s i) ⟨fun j => ↑(sec j), ⋯⟩ = 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
this : ↑(sec i) ∈ ⋂ f, F.map f ⁻¹' s
⊢ (fun s => ↑s i) ⟨fun j => ↑(sec j), ⋯⟩ = x

tactic: simp only [mem_iInter, mem_preimage, mem_singleton_iff] at this
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
this : ↑(sec i) ∈ ⋂ f, F.map f ⁻¹' s
⊢ (fun s => ↑s i) ⟨fun j => ↑(sec j), ⋯⟩ = 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
this : ∀ (i_1 : i ⟶ i), F.map i_1 ↑(sec i) ∈ s
⊢ (fun s => ↑s i) ⟨fun j => ↑(sec j), ⋯⟩ = x

tactic: have := this (𝟙 i)
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
this : ∀ (i_1 : i ⟶ i), F.map i_1 ↑(sec i) ∈ s
⊢ (fun s => ↑s i) ⟨fun j => ↑(sec j), ⋯⟩ = 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
this✝ : ∀ (i_1 : i ⟶ i), F.map i_1 ↑(sec i) ∈ s
this : F.map (𝟙 i) ↑(sec i) ∈ s
⊢ (fun s => ↑s i) ⟨fun j => ↑(sec j), ⋯⟩ = x

tactic: rwa [map_id_apply] at this
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
this✝ : ∀ (i_1 : i ⟶ i), F.map i_1 ↑(sec i) ∈ s
this : F.map (𝟙 i) ↑(sec i) ∈ s
⊢ (fun s => ↑s i) ⟨fun j => ↑(sec j), ⋯⟩ = x
state_after: no goals