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

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 → Function.Surjective ⇑f

tactic: dsimp [Function.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 : CoeSort.coe Y), ∃ a, f a = b

tactic: intro h y
state_before: X Y : Stonean
f : X ⟶ Y
⊢ Epi f → ∀ (b : CoeSort.coe Y), ∃ a, f a = b
state_after: X Y : Stonean
f : X ⟶ Y
h : Epi f
y : CoeSort.coe Y
⊢ ∃ a, f a = y

tactic: by_contra! hy
state_before: X Y : Stonean
f : X ⟶ Y
h : Epi f
y : CoeSort.coe Y
⊢ ∃ a, f a = y
state_after: X Y : Stonean
f : X ⟶ Y
h : Epi f
y : CoeSort.coe Y
hy : ∀ (a : CoeSort.coe X), f a ≠ y
⊢ False

tactic: let C := Set.range f
state_before: X Y : Stonean
f : X ⟶ Y
h : Epi f
y : CoeSort.coe Y
hy : ∀ (a : CoeSort.coe X), f a ≠ y
⊢ False
state_after: X Y : Stonean
f : X ⟶ Y
h : Epi f
y : CoeSort.coe Y
hy : ∀ (a : CoeSort.coe X), f a ≠ y
C : Set (CoeSort.coe Y) := Set.range ⇑f
⊢ False

tactic: have hC : IsClosed C := (isCompact_range f.continuous).isClosed
state_before: X Y : Stonean
f : X ⟶ Y
h : Epi f
y : CoeSort.coe Y
hy : ∀ (a : CoeSort.coe X), f a ≠ y
C : Set (CoeSort.coe Y) := Set.range ⇑f
⊢ False
state_after: X Y : Stonean
f : X ⟶ Y
h : Epi f
y : CoeSort.coe Y
hy : ∀ (a : CoeSort.coe X), f a ≠ y
C : Set (CoeSort.coe Y) := Set.range ⇑f
hC : IsClosed C
⊢ False

tactic: let U := Cᶜ
state_before: X Y : Stonean
f : X ⟶ Y
h : Epi f
y : CoeSort.coe Y
hy : ∀ (a : CoeSort.coe X), f a ≠ y
C : Set (CoeSort.coe Y) := Set.range ⇑f
hC : IsClosed C
⊢ False
state_after: X Y : Stonean
f : X ⟶ Y
h : Epi f
y : CoeSort.coe Y
hy : ∀ (a : CoeSort.coe X), f a ≠ y
C : Set (CoeSort.coe Y) := Set.range ⇑f
hC : IsClosed C
U : Set (CoeSort.coe Y) := Cᶜ
⊢ 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 : CoeSort.coe Y
hy : ∀ (a : CoeSort.coe X), f a ≠ y
C : Set (CoeSort.coe Y) := Set.range ⇑f
hC : IsClosed C
U : Set (CoeSort.coe Y) := Cᶜ
⊢ False
state_after: X Y : Stonean
f : X ⟶ Y
h : Epi f
y : CoeSort.coe Y
hy : ∀ (a : CoeSort.coe X), f a ≠ y
C : Set (CoeSort.coe Y) := Set.range ⇑f
hC : IsClosed C
U : Set (CoeSort.coe Y) := Cᶜ
hUy : U ∈ 𝓝 y
⊢ False

tactic: obtain ⟨V, hV, hyV, hVU⟩ := isTopologicalBasis_isClopen.mem_nhds_iff.mp hUy
state_before: X Y : Stonean
f : X ⟶ Y
h : Epi f
y : CoeSort.coe Y
hy : ∀ (a : CoeSort.coe X), f a ≠ y
C : Set (CoeSort.coe Y) := Set.range ⇑f
hC : IsClosed C
U : Set (CoeSort.coe Y) := Cᶜ
hUy : U ∈ 𝓝 y
⊢ False
state_after: case intro.intro.intro
X Y : Stonean
f : X ⟶ Y
h : Epi f
y : CoeSort.coe Y
hy : ∀ (a : CoeSort.coe X), f a ≠ y
C : Set (CoeSort.coe Y) := Set.range ⇑f
hC : IsClosed C
U : Set (CoeSort.coe Y) := Cᶜ
hUy : U ∈ 𝓝 y
V : Set (CoeSort.coe Y)
hV : V ∈ {s | IsClopen s}
hyV : y ∈ V
hVU : V ⊆ U
⊢ False

tactic: 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 : CoeSort.coe Y
hy : ∀ (a : CoeSort.coe X), f a ≠ y
C : Set (CoeSort.coe Y) := Set.range ⇑f
hC : IsClosed C
U : Set (CoeSort.coe Y) := Cᶜ
⊢ U ∈ 𝓝 y
state_after: no goals

tactic: let g : Y ⟶ mkFinite (ULift (Fin 2)) :=
  ⟨(LocallyConstant.ofIsClopen hV).map ULift.up, LocallyConstant.continuous _⟩
state_before: case intro.intro.intro
X Y : Stonean
f : X ⟶ Y
h : Epi f
y : CoeSort.coe Y
hy : ∀ (a : CoeSort.coe X), f a ≠ y
C : Set (CoeSort.coe Y) := Set.range ⇑f
hC : IsClosed C
U : Set (CoeSort.coe Y) := Cᶜ
hUy : U ∈ 𝓝 y
V : Set (CoeSort.coe Y)
hV : V ∈ {s | IsClopen s}
hyV : y ∈ V
hVU : V ⊆ U
⊢ False
state_after: case intro.intro.intro
X Y : Stonean
f : X ⟶ Y
h : Epi f
y : CoeSort.coe Y
hy : ∀ (a : CoeSort.coe X), f a ≠ y
C : Set (CoeSort.coe Y) := Set.range ⇑f
hC : IsClosed C
U : Set (CoeSort.coe Y) := Cᶜ
hUy : U ∈ 𝓝 y
V : Set (CoeSort.coe Y)
hV : V ∈ {s | IsClopen s}
hyV : y ∈ V
hVU : V ⊆ U
g : Y ⟶ mkFinite (ULift.{u_1, 0} (Fin 2)) :=
  { toFun := ⇑(LocallyConstant.map ULift.up (LocallyConstant.ofIsClopen hV)), continuous_toFun := ⋯ }
⊢ False

tactic: let h : Y ⟶ mkFinite (ULift (Fin 2)) := ⟨fun _ => ⟨1⟩, continuous_const⟩
state_before: case intro.intro.intro
X Y : Stonean
f : X ⟶ Y
h : Epi f
y : CoeSort.coe Y
hy : ∀ (a : CoeSort.coe X), f a ≠ y
C : Set (CoeSort.coe Y) := Set.range ⇑f
hC : IsClosed C
U : Set (CoeSort.coe Y) := Cᶜ
hUy : U ∈ 𝓝 y
V : Set (CoeSort.coe Y)
hV : V ∈ {s | IsClopen s}
hyV : y ∈ V
hVU : V ⊆ U
g : Y ⟶ mkFinite (ULift.{u_1, 0} (Fin 2)) :=
  { toFun := ⇑(LocallyConstant.map ULift.up (LocallyConstant.ofIsClopen hV)), continuous_toFun := ⋯ }
⊢ False
state_after: case intro.intro.intro
X Y : Stonean
f : X ⟶ Y
h✝ : Epi f
y : CoeSort.coe Y
hy : ∀ (a : CoeSort.coe X), f a ≠ y
C : Set (CoeSort.coe Y) := Set.range ⇑f
hC : IsClosed C
U : Set (CoeSort.coe Y) := Cᶜ
hUy : U ∈ 𝓝 y
V : Set (CoeSort.coe Y)
hV : V ∈ {s | IsClopen s}
hyV : y ∈ V
hVU : V ⊆ U
g : Y ⟶ mkFinite (ULift.{u_1, 0} (Fin 2)) :=
  { toFun := ⇑(LocallyConstant.map ULift.up (LocallyConstant.ofIsClopen hV)), continuous_toFun := ⋯ }
h : Y ⟶ mkFinite (ULift.{u_1, 0} (Fin 2)) := { toFun := fun x => { down := 1 }, continuous_toFun := ⋯ }
⊢ False

tactic: apply_fun fun e => (e y).down at H
state_before: case intro.intro.intro
X Y : Stonean
f : X ⟶ Y
h✝ : Epi f
y : CoeSort.coe Y
hy : ∀ (a : CoeSort.coe X), f a ≠ y
C : Set (CoeSort.coe Y) := Set.range ⇑f
hC : IsClosed C
U : Set (CoeSort.coe Y) := Cᶜ
hUy : U ∈ 𝓝 y
V : Set (CoeSort.coe Y)
hV : V ∈ {s | IsClopen s}
hyV : y ∈ V
hVU : V ⊆ U
g : Y ⟶ mkFinite (ULift.{u_1, 0} (Fin 2)) :=
  { toFun := ⇑(LocallyConstant.map ULift.up (LocallyConstant.ofIsClopen hV)), continuous_toFun := ⋯ }
h : Y ⟶ mkFinite (ULift.{u_1, 0} (Fin 2)) := { toFun := fun x => { down := 1 }, continuous_toFun := ⋯ }
H : h = g
⊢ False
state_after: case intro.intro.intro
X Y : Stonean
f : X ⟶ Y
h✝ : Epi f
y : CoeSort.coe Y
hy : ∀ (a : CoeSort.coe X), f a ≠ y
C : Set (CoeSort.coe Y) := Set.range ⇑f
hC : IsClosed C
U : Set (CoeSort.coe Y) := Cᶜ
hUy : U ∈ 𝓝 y
V : Set (CoeSort.coe Y)
hV : V ∈ {s | IsClopen s}
hyV : y ∈ V
hVU : V ⊆ U
g : Y ⟶ mkFinite (ULift.{u_1, 0} (Fin 2)) :=
  { toFun := ⇑(LocallyConstant.map ULift.up (LocallyConstant.ofIsClopen hV)), continuous_toFun := ⋯ }
h : Y ⟶ mkFinite (ULift.{u_1, 0} (Fin 2)) := { toFun := fun x => { down := 1 }, continuous_toFun := ⋯ }
H : (h y).down = (g y).down
⊢ False

tactic: change 1 = ite _ _ _ at H
state_before: case intro.intro.intro
X Y : Stonean
f : X ⟶ Y
h✝ : Epi f
y : CoeSort.coe Y
hy : ∀ (a : CoeSort.coe X), f a ≠ y
C : Set (CoeSort.coe Y) := Set.range ⇑f
hC : IsClosed C
U : Set (CoeSort.coe Y) := Cᶜ
hUy : U ∈ 𝓝 y
V : Set (CoeSort.coe Y)
hV : V ∈ {s | IsClopen s}
hyV : y ∈ V
hVU : V ⊆ U
g : Y ⟶ mkFinite (ULift.{u_1, 0} (Fin 2)) :=
  { toFun := ⇑(LocallyConstant.map ULift.up (LocallyConstant.ofIsClopen hV)), continuous_toFun := ⋯ }
h : Y ⟶ mkFinite (ULift.{u_1, 0} (Fin 2)) := { toFun := fun x => { down := 1 }, continuous_toFun := ⋯ }
H : (h y).down = (g y).down
⊢ False
state_after: case intro.intro.intro
X Y : Stonean
f : X ⟶ Y
h✝ : Epi f
y : CoeSort.coe Y
hy : ∀ (a : CoeSort.coe X), f a ≠ y
C : Set (CoeSort.coe Y) := Set.range ⇑f
hC : IsClosed C
U : Set (CoeSort.coe Y) := Cᶜ
hUy : U ∈ 𝓝 y
V : Set (CoeSort.coe Y)
hV : V ∈ {s | IsClopen s}
hyV : y ∈ V
hVU : V ⊆ U
g : Y ⟶ mkFinite (ULift.{u_1, 0} (Fin 2)) :=
  { toFun := ⇑(LocallyConstant.map ULift.up (LocallyConstant.ofIsClopen hV)), continuous_toFun := ⋯ }
h : Y ⟶ mkFinite (ULift.{u_1, 0} (Fin 2)) := { toFun := fun x => { down := 1 }, continuous_toFun := ⋯ }
H : 1 = if y ∈ V then 0 else 1
⊢ False

tactic: rw [if_pos hyV] at H
state_before: case intro.intro.intro
X Y : Stonean
f : X ⟶ Y
h✝ : Epi f
y : CoeSort.coe Y
hy : ∀ (a : CoeSort.coe X), f a ≠ y
C : Set (CoeSort.coe Y) := Set.range ⇑f
hC : IsClosed C
U : Set (CoeSort.coe Y) := Cᶜ
hUy : U ∈ 𝓝 y
V : Set (CoeSort.coe Y)
hV : V ∈ {s | IsClopen s}
hyV : y ∈ V
hVU : V ⊆ U
g : Y ⟶ mkFinite (ULift.{u_1, 0} (Fin 2)) :=
  { toFun := ⇑(LocallyConstant.map ULift.up (LocallyConstant.ofIsClopen hV)), continuous_toFun := ⋯ }
h : Y ⟶ mkFinite (ULift.{u_1, 0} (Fin 2)) := { toFun := fun x => { down := 1 }, continuous_toFun := ⋯ }
H : 1 = if y ∈ V then 0 else 1
⊢ False
state_after: case intro.intro.intro
X Y : Stonean
f : X ⟶ Y
h✝ : Epi f
y : CoeSort.coe Y
hy : ∀ (a : CoeSort.coe X), f a ≠ y
C : Set (CoeSort.coe Y) := Set.range ⇑f
hC : IsClosed C
U : Set (CoeSort.coe Y) := Cᶜ
hUy : U ∈ 𝓝 y
V : Set (CoeSort.coe Y)
hV : V ∈ {s | IsClopen s}
hyV : y ∈ V
hVU : V ⊆ U
g : Y ⟶ mkFinite (ULift.{u_1, 0} (Fin 2)) :=
  { toFun := ⇑(LocallyConstant.map ULift.up (LocallyConstant.ofIsClopen hV)), continuous_toFun := ⋯ }
h : Y ⟶ mkFinite (ULift.{u_1, 0} (Fin 2)) := { toFun := fun x => { down := 1 }, continuous_toFun := ⋯ }
H : 1 = 0
⊢ False

tactic: exact one_ne_zero H
state_before: case intro.intro.intro
X Y : Stonean
f : X ⟶ Y
h✝ : Epi f
y : CoeSort.coe Y
hy : ∀ (a : CoeSort.coe X), f a ≠ y
C : Set (CoeSort.coe Y) := Set.range ⇑f
hC : IsClosed C
U : Set (CoeSort.coe Y) := Cᶜ
hUy : U ∈ 𝓝 y
V : Set (CoeSort.coe Y)
hV : V ∈ {s | IsClopen s}
hyV : y ∈ V
hVU : V ⊆ U
g : Y ⟶ mkFinite (ULift.{u_1, 0} (Fin 2)) :=
  { toFun := ⇑(LocallyConstant.map ULift.up (LocallyConstant.ofIsClopen hV)), continuous_toFun := ⋯ }
h : Y ⟶ mkFinite (ULift.{u_1, 0} (Fin 2)) := { toFun := fun x => { down := 1 }, continuous_toFun := ⋯ }
H : 1 = 0
⊢ False
state_after: no goals

tactic: rw [← cancel_epi f]
state_before: X Y : Stonean
f : X ⟶ Y
h✝ : Epi f
y : CoeSort.coe Y
hy : ∀ (a : CoeSort.coe X), f a ≠ y
C : Set (CoeSort.coe Y) := Set.range ⇑f
hC : IsClosed C
U : Set (CoeSort.coe Y) := Cᶜ
hUy : U ∈ 𝓝 y
V : Set (CoeSort.coe Y)
hV : V ∈ {s | IsClopen s}
hyV : y ∈ V
hVU : V ⊆ U
g : Y ⟶ mkFinite (ULift.{u_1, 0} (Fin 2)) :=
  { toFun := ⇑(LocallyConstant.map ULift.up (LocallyConstant.ofIsClopen hV)), continuous_toFun := ⋯ }
h : Y ⟶ mkFinite (ULift.{u_1, 0} (Fin 2)) := { toFun := fun x => { down := 1 }, continuous_toFun := ⋯ }
⊢ h = g
state_after: X Y : Stonean
f : X ⟶ Y
h✝ : Epi f
y : CoeSort.coe Y
hy : ∀ (a : CoeSort.coe X), f a ≠ y
C : Set (CoeSort.coe Y) := Set.range ⇑f
hC : IsClosed C
U : Set (CoeSort.coe Y) := Cᶜ
hUy : U ∈ 𝓝 y
V : Set (CoeSort.coe Y)
hV : V ∈ {s | IsClopen s}
hyV : y ∈ V
hVU : V ⊆ U
g : Y ⟶ mkFinite (ULift.{u_1, 0} (Fin 2)) :=
  { toFun := ⇑(LocallyConstant.map ULift.up (LocallyConstant.ofIsClopen hV)), continuous_toFun := ⋯ }
h : Y ⟶ mkFinite (ULift.{u_1, 0} (Fin 2)) := { toFun := fun x => { down := 1 }, continuous_toFun := ⋯ }
⊢ f ≫ h = f ≫ g

tactic: ext x
state_before: X Y : Stonean
f : X ⟶ Y
h✝ : Epi f
y : CoeSort.coe Y
hy : ∀ (a : CoeSort.coe X), f a ≠ y
C : Set (CoeSort.coe Y) := Set.range ⇑f
hC : IsClosed C
U : Set (CoeSort.coe Y) := Cᶜ
hUy : U ∈ 𝓝 y
V : Set (CoeSort.coe Y)
hV : V ∈ {s | IsClopen s}
hyV : y ∈ V
hVU : V ⊆ U
g : Y ⟶ mkFinite (ULift.{u_1, 0} (Fin 2)) :=
  { toFun := ⇑(LocallyConstant.map ULift.up (LocallyConstant.ofIsClopen hV)), continuous_toFun := ⋯ }
h : Y ⟶ mkFinite (ULift.{u_1, 0} (Fin 2)) := { toFun := fun x => { down := 1 }, continuous_toFun := ⋯ }
⊢ f ≫ h = f ≫ g
state_after: case w
X Y : Stonean
f : X ⟶ Y
h✝ : Epi f
y : CoeSort.coe Y
hy : ∀ (a : CoeSort.coe X), f a ≠ y
C : Set (CoeSort.coe Y) := Set.range ⇑f
hC : IsClosed C
U : Set (CoeSort.coe Y) := Cᶜ
hUy : U ∈ 𝓝 y
V : Set (CoeSort.coe Y)
hV : V ∈ {s | IsClopen s}
hyV : y ∈ V
hVU : V ⊆ U
g : Y ⟶ mkFinite (ULift.{u_1, 0} (Fin 2)) :=
  { toFun := ⇑(LocallyConstant.map ULift.up (LocallyConstant.ofIsClopen hV)), continuous_toFun := ⋯ }
h : Y ⟶ mkFinite (ULift.{u_1, 0} (Fin 2)) := { toFun := fun x => { down := 1 }, continuous_toFun := ⋯ }
x : (forget Stonean).obj X
⊢ (f ≫ h) x = (f ≫ g) x

tactic: apply ULift.ext
state_before: case w
X Y : Stonean
f : X ⟶ Y
h✝ : Epi f
y : CoeSort.coe Y
hy : ∀ (a : CoeSort.coe X), f a ≠ y
C : Set (CoeSort.coe Y) := Set.range ⇑f
hC : IsClosed C
U : Set (CoeSort.coe Y) := Cᶜ
hUy : U ∈ 𝓝 y
V : Set (CoeSort.coe Y)
hV : V ∈ {s | IsClopen s}
hyV : y ∈ V
hVU : V ⊆ U
g : Y ⟶ mkFinite (ULift.{u_1, 0} (Fin 2)) :=
  { toFun := ⇑(LocallyConstant.map ULift.up (LocallyConstant.ofIsClopen hV)), continuous_toFun := ⋯ }
h : Y ⟶ mkFinite (ULift.{u_1, 0} (Fin 2)) := { toFun := fun x => { down := 1 }, continuous_toFun := ⋯ }
x : (forget Stonean).obj X
⊢ (f ≫ h) x = (f ≫ g) x
state_after: case w.h
X Y : Stonean
f : X ⟶ Y
h✝ : Epi f
y : CoeSort.coe Y
hy : ∀ (a : CoeSort.coe X), f a ≠ y
C : Set (CoeSort.coe Y) := Set.range ⇑f
hC : IsClosed C
U : Set (CoeSort.coe Y) := Cᶜ
hUy : U ∈ 𝓝 y
V : Set (CoeSort.coe Y)
hV : V ∈ {s | IsClopen s}
hyV : y ∈ V
hVU : V ⊆ U
g : Y ⟶ mkFinite (ULift.{u_1, 0} (Fin 2)) :=
  { toFun := ⇑(LocallyConstant.map ULift.up (LocallyConstant.ofIsClopen hV)), continuous_toFun := ⋯ }
h : Y ⟶ mkFinite (ULift.{u_1, 0} (Fin 2)) := { toFun := fun x => { down := 1 }, continuous_toFun := ⋯ }
x : (forget Stonean).obj X
⊢ ((f ≫ h) x).down = ((f ≫ g) x).down

tactic: change 1 = ite _ _ _
state_before: case w.h
X Y : Stonean
f : X ⟶ Y
h✝ : Epi f
y : CoeSort.coe Y
hy : ∀ (a : CoeSort.coe X), f a ≠ y
C : Set (CoeSort.coe Y) := Set.range ⇑f
hC : IsClosed C
U : Set (CoeSort.coe Y) := Cᶜ
hUy : U ∈ 𝓝 y
V : Set (CoeSort.coe Y)
hV : V ∈ {s | IsClopen s}
hyV : y ∈ V
hVU : V ⊆ U
g : Y ⟶ mkFinite (ULift.{u_1, 0} (Fin 2)) :=
  { toFun := ⇑(LocallyConstant.map ULift.up (LocallyConstant.ofIsClopen hV)), continuous_toFun := ⋯ }
h : Y ⟶ mkFinite (ULift.{u_1, 0} (Fin 2)) := { toFun := fun x => { down := 1 }, continuous_toFun := ⋯ }
x : (forget Stonean).obj X
⊢ ((f ≫ h) x).down = ((f ≫ g) x).down
state_after: case w.h
X Y : Stonean
f : X ⟶ Y
h✝ : Epi f
y : CoeSort.coe Y
hy : ∀ (a : CoeSort.coe X), f a ≠ y
C : Set (CoeSort.coe Y) := Set.range ⇑f
hC : IsClosed C
U : Set (CoeSort.coe Y) := Cᶜ
hUy : U ∈ 𝓝 y
V : Set (CoeSort.coe Y)
hV : V ∈ {s | IsClopen s}
hyV : y ∈ V
hVU : V ⊆ U
g : Y ⟶ mkFinite (ULift.{u_1, 0} (Fin 2)) :=
  { toFun := ⇑(LocallyConstant.map ULift.up (LocallyConstant.ofIsClopen hV)), continuous_toFun := ⋯ }
h : Y ⟶ mkFinite (ULift.{u_1, 0} (Fin 2)) := { toFun := fun x => { down := 1 }, continuous_toFun := ⋯ }
x : (forget Stonean).obj X
⊢ 1 = if f x ∈ V then 0 else 1

tactic: rw [if_neg]
state_before: case w.h
X Y : Stonean
f : X ⟶ Y
h✝ : Epi f
y : CoeSort.coe Y
hy : ∀ (a : CoeSort.coe X), f a ≠ y
C : Set (CoeSort.coe Y) := Set.range ⇑f
hC : IsClosed C
U : Set (CoeSort.coe Y) := Cᶜ
hUy : U ∈ 𝓝 y
V : Set (CoeSort.coe Y)
hV : V ∈ {s | IsClopen s}
hyV : y ∈ V
hVU : V ⊆ U
g : Y ⟶ mkFinite (ULift.{u_1, 0} (Fin 2)) :=
  { toFun := ⇑(LocallyConstant.map ULift.up (LocallyConstant.ofIsClopen hV)), continuous_toFun := ⋯ }
h : Y ⟶ mkFinite (ULift.{u_1, 0} (Fin 2)) := { toFun := fun x => { down := 1 }, continuous_toFun := ⋯ }
x : (forget Stonean).obj X
⊢ 1 = if f x ∈ V then 0 else 1
state_after: case w.h.hnc
X Y : Stonean
f : X ⟶ Y
h✝ : Epi f
y : CoeSort.coe Y
hy : ∀ (a : CoeSort.coe X), f a ≠ y
C : Set (CoeSort.coe Y) := Set.range ⇑f
hC : IsClosed C
U : Set (CoeSort.coe Y) := Cᶜ
hUy : U ∈ 𝓝 y
V : Set (CoeSort.coe Y)
hV : V ∈ {s | IsClopen s}
hyV : y ∈ V
hVU : V ⊆ U
g : Y ⟶ mkFinite (ULift.{u_1, 0} (Fin 2)) :=
  { toFun := ⇑(LocallyConstant.map ULift.up (LocallyConstant.ofIsClopen hV)), continuous_toFun := ⋯ }
h : Y ⟶ mkFinite (ULift.{u_1, 0} (Fin 2)) := { toFun := fun x => { down := 1 }, continuous_toFun := ⋯ }
x : (forget Stonean).obj X
⊢ f x ∉ V

tactic: simpa only [U, Set.mem_compl_iff, Set.mem_range, not_exists, not_forall, not_not]
  using exists_apply_eq_apply f x
state_before: case w.h.hnc
X Y : Stonean
f : X ⟶ Y
h✝ : Epi f
y : CoeSort.coe Y
hy : ∀ (a : CoeSort.coe X), f a ≠ y
C : Set (CoeSort.coe Y) := Set.range ⇑f
hC : IsClosed C
U : Set (CoeSort.coe Y) := Cᶜ
hUy : U ∈ 𝓝 y
V : Set (CoeSort.coe Y)
hV : V ∈ {s | IsClopen s}
hyV : y ∈ V
hVU : V ⊆ U
g : Y ⟶ mkFinite (ULift.{u_1, 0} (Fin 2)) :=
  { toFun := ⇑(LocallyConstant.map ULift.up (LocallyConstant.ofIsClopen hV)), continuous_toFun := ⋯ }
h : Y ⟶ mkFinite (ULift.{u_1, 0} (Fin 2)) := { toFun := fun x => { down := 1 }, continuous_toFun := ⋯ }
x : (forget Stonean).obj X
⊢ f x ∉ U
state_after: no goals