Theorem: Stonean.epi_iff_surjective
File: Mathlib/Topology/Category/Stonean/Basic.lean

Proof steps:
state_before: X Y : Stonean
f : X ⟶ Y
⊢ Epi f ↔ Function.Surjective ⇑f
state_after: X Y : Stonean
f : X ⟶ Y
⊢ Epi f → Function.Surjective ⇑f
tactic: refine ⟨?_, ConcreteCategory.epi_of_surjective _⟩
state_before: X Y : Stonean
f : X ⟶ Y
⊢ Epi f → Function.Surjective ⇑f
state_after: X Y : Stonean
f : X ⟶ Y
⊢ Epi f → ∀ (b : (forget Stonean).obj Y), ∃ a, f a = b
tactic: dsimp [Function.Surjective]
state_before: X Y : Stonean
f : X ⟶ Y
⊢ Epi f → ∀ (b : (forget Stonean).obj Y), ∃ a, f a = b
state_after: X Y : Stonean
f : X ⟶ Y
h : Epi f
y : (forget Stonean).obj Y
⊢ ∃ a, f a = y
tactic: intro h y
state_before: X Y : Stonean
f : X ⟶ Y
h : Epi f
y : (forget Stonean).obj Y
⊢ ∃ a, f a = y
state_after: X Y : Stonean
f : X ⟶ Y
h : Epi f
y : (forget Stonean).obj Y
hy : ∀ (a : (forget Stonean).obj X), f a ≠ y
⊢ False
tactic: by_contra! hy
state_before: X Y : Stonean
f : X ⟶ Y
h : Epi f
y : (forget Stonean).obj Y
hy : ∀ (a : (forget Stonean).obj X), f a ≠ y
⊢ False
state_after: X Y : Stonean
f : X ⟶ Y
h : Epi f
y : (forget Stonean).obj Y
hy : ∀ (a : (forget Stonean).obj X), f a ≠ y
C : Set ((forget Stonean).obj Y) := Set.range ⇑f
⊢ False
tactic: let C := Set.range f
state_before: X Y : Stonean
f : X ⟶ Y
h : Epi f
y : (forget Stonean).obj Y
hy : ∀ (a : (forget Stonean).obj X), f a ≠ y
C : Set ((forget Stonean).obj Y) := Set.range ⇑f
⊢ False
state_after: X Y : Stonean
f : X ⟶ Y
h : Epi f
y : (forget Stonean).obj Y
hy : ∀ (a : (forget Stonean).obj X), f a ≠ y
C : Set ((forget Stonean).obj Y) := Set.range ⇑f
hC : IsClosed C
⊢ False
tactic: have hC : IsClosed C := (isCompact_range f.continuous).isClosed
state_before: X Y : Stonean
f : X ⟶ Y
h : Epi f
y : (forget Stonean).obj Y
hy : ∀ (a : (forget Stonean).obj X), f a ≠ y
C : Set ((forget Stonean).obj Y) := Set.range ⇑f
hC : IsClosed C
⊢ False
state_after: X Y : Stonean
f : X ⟶ Y
h : Epi f
y : (forget Stonean).obj Y
hy : ∀ (a : (forget Stonean).obj X), f a ≠ y
C : Set ((forget Stonean).obj Y) := Set.range ⇑f
hC : IsClosed C
U : Set ((forget Stonean).obj Y) := Cᶜ
⊢ False
tactic: let U := Cᶜ
state_before: X Y : Stonean
f : X ⟶ Y
h : Epi f
y : (forget Stonean).obj Y
hy : ∀ (a : (forget Stonean).obj X), f a ≠ y
C : Set ((forget Stonean).obj Y) := Set.range ⇑f
hC : IsClosed C
U : Set ((forget Stonean).obj Y) := Cᶜ
⊢ False
state_after: X Y : Stonean
f : X ⟶ Y
h : Epi f
y : (forget Stonean).obj Y
hy : ∀ (a : (forget Stonean).obj X), f a ≠ y
C : Set ((forget Stonean).obj Y) := Set.range ⇑f
hC : IsClosed C
U : Set ((forget Stonean).obj Y) := Cᶜ
hUy : U ∈ 𝓝 y
⊢ False
tactic: have hUy : U ∈ 𝓝 y := by
    simp only [C, Set.mem_range, hy, exists_false, not_false_eq_true, hC.compl_mem_nhds]
state_before: X Y : Stonean
f : X ⟶ Y
h : Epi f
y : (forget Stonean).obj Y
hy : ∀ (a : (forget Stonean).obj X), f a ≠ y
C : Set ((forget Stonean).obj Y) := Set.range ⇑f
hC : IsClosed C
U : Set ((forget Stonean).obj Y) := Cᶜ
hUy : U ∈ 𝓝 y
⊢ False
state_after: case intro.intro.intro
X Y : Stonean
f : X ⟶ Y
h : Epi f
y : (forget Stonean).obj Y
hy : ∀ (a : (forget Stonean).obj X), f a ≠ y
C : Set ((forget Stonean).obj Y) := Set.range ⇑f
hC : IsClosed C
U : Set ((forget Stonean).obj Y) := Cᶜ
hUy : U ∈ 𝓝 y
V : Set ((forget Stonean).obj Y)
hV : V ∈ {s | IsClopen s}
hyV : y ∈ V
hVU : V ⊆ U
⊢ False
tactic: obtain ⟨V, hV, hyV, hVU⟩ := isTopologicalBasis_isClopen.mem_nhds_iff.mp hUy