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

tactic: constructor
state_before: X Y : CompHaus
f : X ⟶ Y
⊢ Epi f ↔ Function.Surjective ⇑f
state_after: case mp
X Y : CompHaus
f : X ⟶ Y
⊢ Epi f → Function.Surjective ⇑f

case mpr
X Y : CompHaus
f : X ⟶ Y
⊢ Function.Surjective ⇑f → Epi f

tactic: dsimp [Function.Surjective]
state_before: case mp
X Y : CompHaus
f : X ⟶ Y
⊢ Epi f → Function.Surjective ⇑f
state_after: case mp
X Y : CompHaus
f : X ⟶ Y
⊢ Epi f → ∀ (b : (forget CompHaus).obj Y), ∃ a, f a = b

tactic: contrapose!
state_before: case mp
X Y : CompHaus
f : X ⟶ Y
⊢ Epi f → ∀ (b : (forget CompHaus).obj Y), ∃ a, f a = b
state_after: case mp
X Y : CompHaus
f : X ⟶ Y
⊢ (∃ b, ∀ (a : (forget CompHaus).obj X), f a ≠ b) → ¬Epi f

tactic: rintro ⟨y, hy⟩ hf
state_before: case mp
X Y : CompHaus
f : X ⟶ Y
⊢ (∃ b, ∀ (a : (forget CompHaus).obj X), f a ≠ b) → ¬Epi f
state_after: case mp.intro
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), f a ≠ y
hf : Epi f
⊢ False

tactic: let C := Set.range f
state_before: case mp.intro
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), f a ≠ y
hf : Epi f
⊢ False
state_after: case mp.intro
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ⇑f
⊢ False

tactic: have hC : IsClosed C := (isCompact_range f.continuous).isClosed
state_before: case mp.intro
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ⇑f
⊢ False
state_after: case mp.intro
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ⇑f
hC : IsClosed C
⊢ False

tactic: let D := ({y} : Set Y)
state_before: case mp.intro
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ⇑f
hC : IsClosed C
⊢ False
state_after: case mp.intro
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ⇑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
⊢ False

tactic: have hD : IsClosed D := isClosed_singleton
state_before: case mp.intro
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ⇑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
⊢ False
state_after: case mp.intro
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ⇑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
⊢ False

tactic: have hCD : Disjoint C D := by
  rw [Set.disjoint_singleton_right]
  rintro ⟨y', hy'⟩
  exact hy y' hy'
state_before: case mp.intro
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ⇑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
⊢ False
state_after: case mp.intro
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ⇑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
hCD : Disjoint C D
⊢ False

tactic: obtain ⟨φ, hφ0, hφ1, hφ01⟩ := exists_continuous_zero_one_of_isClosed hC hD hCD
state_before: case mp.intro
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ⇑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
hCD : Disjoint C D
⊢ False
state_after: case mp.intro.intro.intro.intro
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ⇑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
hCD : Disjoint C D
φ : C((forget CompHaus).obj Y, ℝ)
hφ0 : Set.EqOn (⇑φ) 0 C
hφ1 : Set.EqOn (⇑φ) 1 D
hφ01 : ∀ (x : (forget CompHaus).obj Y), φ x ∈ Set.Icc 0 1
⊢ False

tactic: haveI : CompactSpace (ULift.{u} <| Set.Icc (0 : ℝ) 1) := Homeomorph.ulift.symm.compactSpace
state_before: case mp.intro.intro.intro.intro
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ⇑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
hCD : Disjoint C D
φ : C((forget CompHaus).obj Y, ℝ)
hφ0 : Set.EqOn (⇑φ) 0 C
hφ1 : Set.EqOn (⇑φ) 1 D
hφ01 : ∀ (x : (forget CompHaus).obj Y), φ x ∈ Set.Icc 0 1
⊢ False
state_after: case mp.intro.intro.intro.intro
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ⇑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
hCD : Disjoint C D
φ : C((forget CompHaus).obj Y, ℝ)
hφ0 : Set.EqOn (⇑φ) 0 C
hφ1 : Set.EqOn (⇑φ) 1 D
hφ01 : ∀ (x : (forget CompHaus).obj Y), φ x ∈ Set.Icc 0 1
this : CompactSpace (ULift.{u, 0} ↑(Set.Icc 0 1))
⊢ False

tactic: haveI : T2Space (ULift.{u} <| Set.Icc (0 : ℝ) 1) := Homeomorph.ulift.symm.t2Space
state_before: case mp.intro.intro.intro.intro
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ⇑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
hCD : Disjoint C D
φ : C((forget CompHaus).obj Y, ℝ)
hφ0 : Set.EqOn (⇑φ) 0 C
hφ1 : Set.EqOn (⇑φ) 1 D
hφ01 : ∀ (x : (forget CompHaus).obj Y), φ x ∈ Set.Icc 0 1
this : CompactSpace (ULift.{u, 0} ↑(Set.Icc 0 1))
⊢ False
state_after: case mp.intro.intro.intro.intro
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ⇑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
hCD : Disjoint C D
φ : C((forget CompHaus).obj Y, ℝ)
hφ0 : Set.EqOn (⇑φ) 0 C
hφ1 : Set.EqOn (⇑φ) 1 D
hφ01 : ∀ (x : (forget CompHaus).obj Y), φ x ∈ Set.Icc 0 1
this✝ : CompactSpace (ULift.{u, 0} ↑(Set.Icc 0 1))
this : T2Space (ULift.{u, 0} ↑(Set.Icc 0 1))
⊢ False

tactic: let Z := of (ULift.{u} <| Set.Icc (0 : ℝ) 1)
state_before: case mp.intro.intro.intro.intro
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ⇑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
hCD : Disjoint C D
φ : C((forget CompHaus).obj Y, ℝ)
hφ0 : Set.EqOn (⇑φ) 0 C
hφ1 : Set.EqOn (⇑φ) 1 D
hφ01 : ∀ (x : (forget CompHaus).obj Y), φ x ∈ Set.Icc 0 1
this✝ : CompactSpace (ULift.{u, 0} ↑(Set.Icc 0 1))
this : T2Space (ULift.{u, 0} ↑(Set.Icc 0 1))
⊢ False
state_after: case mp.intro.intro.intro.intro
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ⇑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
hCD : Disjoint C D
φ : C((forget CompHaus).obj Y, ℝ)
hφ0 : Set.EqOn (⇑φ) 0 C
hφ1 : Set.EqOn (⇑φ) 1 D
hφ01 : ∀ (x : (forget CompHaus).obj Y), φ x ∈ Set.Icc 0 1
this✝ : CompactSpace (ULift.{u, 0} ↑(Set.Icc 0 1))
this : T2Space (ULift.{u, 0} ↑(Set.Icc 0 1))
Z : CompHaus := of (ULift.{u, 0} ↑(Set.Icc 0 1))
⊢ False

tactic: let g : Y ⟶ Z :=
  ⟨fun y' => ⟨⟨φ y', hφ01 y'⟩⟩,
    continuous_uLift_up.comp (φ.continuous.subtype_mk fun y' => hφ01 y')⟩
state_before: case mp.intro.intro.intro.intro
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ⇑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
hCD : Disjoint C D
φ : C((forget CompHaus).obj Y, ℝ)
hφ0 : Set.EqOn (⇑φ) 0 C
hφ1 : Set.EqOn (⇑φ) 1 D
hφ01 : ∀ (x : (forget CompHaus).obj Y), φ x ∈ Set.Icc 0 1
this✝ : CompactSpace (ULift.{u, 0} ↑(Set.Icc 0 1))
this : T2Space (ULift.{u, 0} ↑(Set.Icc 0 1))
Z : CompHaus := of (ULift.{u, 0} ↑(Set.Icc 0 1))
⊢ False
state_after: case mp.intro.intro.intro.intro
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ⇑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
hCD : Disjoint C D
φ : C((forget CompHaus).obj Y, ℝ)
hφ0 : Set.EqOn (⇑φ) 0 C
hφ1 : Set.EqOn (⇑φ) 1 D
hφ01 : ∀ (x : (forget CompHaus).obj Y), φ x ∈ Set.Icc 0 1
this✝ : CompactSpace (ULift.{u, 0} ↑(Set.Icc 0 1))
this : T2Space (ULift.{u, 0} ↑(Set.Icc 0 1))
Z : CompHaus := of (ULift.{u, 0} ↑(Set.Icc 0 1))
g : Y ⟶ Z := { toFun := fun y' => { down := ⟨φ y', ⋯⟩ }, continuous_toFun := ⋯ }
⊢ False

tactic: let h : Y ⟶ Z := ⟨fun _ => ⟨⟨0, Set.left_mem_Icc.mpr zero_le_one⟩⟩, continuous_const⟩
state_before: case mp.intro.intro.intro.intro
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ⇑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
hCD : Disjoint C D
φ : C((forget CompHaus).obj Y, ℝ)
hφ0 : Set.EqOn (⇑φ) 0 C
hφ1 : Set.EqOn (⇑φ) 1 D
hφ01 : ∀ (x : (forget CompHaus).obj Y), φ x ∈ Set.Icc 0 1
this✝ : CompactSpace (ULift.{u, 0} ↑(Set.Icc 0 1))
this : T2Space (ULift.{u, 0} ↑(Set.Icc 0 1))
Z : CompHaus := of (ULift.{u, 0} ↑(Set.Icc 0 1))
g : Y ⟶ Z := { toFun := fun y' => { down := ⟨φ y', ⋯⟩ }, continuous_toFun := ⋯ }
⊢ False
state_after: case mp.intro.intro.intro.intro
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ⇑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
hCD : Disjoint C D
φ : C((forget CompHaus).obj Y, ℝ)
hφ0 : Set.EqOn (⇑φ) 0 C
hφ1 : Set.EqOn (⇑φ) 1 D
hφ01 : ∀ (x : (forget CompHaus).obj Y), φ x ∈ Set.Icc 0 1
this✝ : CompactSpace (ULift.{u, 0} ↑(Set.Icc 0 1))
this : T2Space (ULift.{u, 0} ↑(Set.Icc 0 1))
Z : CompHaus := of (ULift.{u, 0} ↑(Set.Icc 0 1))
g : Y ⟶ Z := { toFun := fun y' => { down := ⟨φ y', ⋯⟩ }, continuous_toFun := ⋯ }
h : Y ⟶ Z := { toFun := fun x => { down := ⟨0, ⋯⟩ }, continuous_toFun := ⋯ }
⊢ False

tactic: have H : h = g := by
  rw [← cancel_epi f]
  ext x
  apply ULift.ext
  apply Subtype.ext
  dsimp
  change 0 = φ (f x)
  simp only [hφ0 (Set.mem_range_self x), Pi.zero_apply]
state_before: case mp.intro.intro.intro.intro
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ⇑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
hCD : Disjoint C D
φ : C((forget CompHaus).obj Y, ℝ)
hφ0 : Set.EqOn (⇑φ) 0 C
hφ1 : Set.EqOn (⇑φ) 1 D
hφ01 : ∀ (x : (forget CompHaus).obj Y), φ x ∈ Set.Icc 0 1
this✝ : CompactSpace (ULift.{u, 0} ↑(Set.Icc 0 1))
this : T2Space (ULift.{u, 0} ↑(Set.Icc 0 1))
Z : CompHaus := of (ULift.{u, 0} ↑(Set.Icc 0 1))
g : Y ⟶ Z := { toFun := fun y' => { down := ⟨φ y', ⋯⟩ }, continuous_toFun := ⋯ }
h : Y ⟶ Z := { toFun := fun x => { down := ⟨0, ⋯⟩ }, continuous_toFun := ⋯ }
⊢ False
state_after: case mp.intro.intro.intro.intro
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ⇑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
hCD : Disjoint C D
φ : C((forget CompHaus).obj Y, ℝ)
hφ0 : Set.EqOn (⇑φ) 0 C
hφ1 : Set.EqOn (⇑φ) 1 D
hφ01 : ∀ (x : (forget CompHaus).obj Y), φ x ∈ Set.Icc 0 1
this✝ : CompactSpace (ULift.{u, 0} ↑(Set.Icc 0 1))
this : T2Space (ULift.{u, 0} ↑(Set.Icc 0 1))
Z : CompHaus := of (ULift.{u, 0} ↑(Set.Icc 0 1))
g : Y ⟶ Z := { toFun := fun y' => { down := ⟨φ y', ⋯⟩ }, continuous_toFun := ⋯ }
h : Y ⟶ Z := { toFun := fun x => { down := ⟨0, ⋯⟩ }, continuous_toFun := ⋯ }
H : h = g
⊢ False

tactic: apply_fun fun e => (e y).down.1 at H
state_before: case mp.intro.intro.intro.intro
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ⇑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
hCD : Disjoint C D
φ : C((forget CompHaus).obj Y, ℝ)
hφ0 : Set.EqOn (⇑φ) 0 C
hφ1 : Set.EqOn (⇑φ) 1 D
hφ01 : ∀ (x : (forget CompHaus).obj Y), φ x ∈ Set.Icc 0 1
this✝ : CompactSpace (ULift.{u, 0} ↑(Set.Icc 0 1))
this : T2Space (ULift.{u, 0} ↑(Set.Icc 0 1))
Z : CompHaus := of (ULift.{u, 0} ↑(Set.Icc 0 1))
g : Y ⟶ Z := { toFun := fun y' => { down := ⟨φ y', ⋯⟩ }, continuous_toFun := ⋯ }
h : Y ⟶ Z := { toFun := fun x => { down := ⟨0, ⋯⟩ }, continuous_toFun := ⋯ }
H : h = g
⊢ False
state_after: case mp.intro.intro.intro.intro
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ⇑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
hCD : Disjoint C D
φ : C((forget CompHaus).obj Y, ℝ)
hφ0 : Set.EqOn (⇑φ) 0 C
hφ1 : Set.EqOn (⇑φ) 1 D
hφ01 : ∀ (x : (forget CompHaus).obj Y), φ x ∈ Set.Icc 0 1
this✝ : CompactSpace (ULift.{u, 0} ↑(Set.Icc 0 1))
this : T2Space (ULift.{u, 0} ↑(Set.Icc 0 1))
Z : CompHaus := of (ULift.{u, 0} ↑(Set.Icc 0 1))
g : Y ⟶ Z := { toFun := fun y' => { down := ⟨φ y', ⋯⟩ }, continuous_toFun := ⋯ }
h : Y ⟶ Z := { toFun := fun x => { down := ⟨0, ⋯⟩ }, continuous_toFun := ⋯ }
H : ↑(h y).down = ↑(g y).down
⊢ False

tactic: change 0 = φ y at H
state_before: case mp.intro.intro.intro.intro
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ⇑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
hCD : Disjoint C D
φ : C((forget CompHaus).obj Y, ℝ)
hφ0 : Set.EqOn (⇑φ) 0 C
hφ1 : Set.EqOn (⇑φ) 1 D
hφ01 : ∀ (x : (forget CompHaus).obj Y), φ x ∈ Set.Icc 0 1
this✝ : CompactSpace (ULift.{u, 0} ↑(Set.Icc 0 1))
this : T2Space (ULift.{u, 0} ↑(Set.Icc 0 1))
Z : CompHaus := of (ULift.{u, 0} ↑(Set.Icc 0 1))
g : Y ⟶ Z := { toFun := fun y' => { down := ⟨φ y', ⋯⟩ }, continuous_toFun := ⋯ }
h : Y ⟶ Z := { toFun := fun x => { down := ⟨0, ⋯⟩ }, continuous_toFun := ⋯ }
H : ↑(h y).down = ↑(g y).down
⊢ False
state_after: case mp.intro.intro.intro.intro
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ⇑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
hCD : Disjoint C D
φ : C((forget CompHaus).obj Y, ℝ)
hφ0 : Set.EqOn (⇑φ) 0 C
hφ1 : Set.EqOn (⇑φ) 1 D
hφ01 : ∀ (x : (forget CompHaus).obj Y), φ x ∈ Set.Icc 0 1
this✝ : CompactSpace (ULift.{u, 0} ↑(Set.Icc 0 1))
this : T2Space (ULift.{u, 0} ↑(Set.Icc 0 1))
Z : CompHaus := of (ULift.{u, 0} ↑(Set.Icc 0 1))
g : Y ⟶ Z := { toFun := fun y' => { down := ⟨φ y', ⋯⟩ }, continuous_toFun := ⋯ }
h : Y ⟶ Z := { toFun := fun x => { down := ⟨0, ⋯⟩ }, continuous_toFun := ⋯ }
H : 0 = φ y
⊢ False

tactic: simp only [hφ1 (Set.mem_singleton y), Pi.one_apply] at H
state_before: case mp.intro.intro.intro.intro
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ⇑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
hCD : Disjoint C D
φ : C((forget CompHaus).obj Y, ℝ)
hφ0 : Set.EqOn (⇑φ) 0 C
hφ1 : Set.EqOn (⇑φ) 1 D
hφ01 : ∀ (x : (forget CompHaus).obj Y), φ x ∈ Set.Icc 0 1
this✝ : CompactSpace (ULift.{u, 0} ↑(Set.Icc 0 1))
this : T2Space (ULift.{u, 0} ↑(Set.Icc 0 1))
Z : CompHaus := of (ULift.{u, 0} ↑(Set.Icc 0 1))
g : Y ⟶ Z := { toFun := fun y' => { down := ⟨φ y', ⋯⟩ }, continuous_toFun := ⋯ }
h : Y ⟶ Z := { toFun := fun x => { down := ⟨0, ⋯⟩ }, continuous_toFun := ⋯ }
H : 0 = φ y
⊢ False
state_after: case mp.intro.intro.intro.intro
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ⇑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
hCD : Disjoint C D
φ : C((forget CompHaus).obj Y, ℝ)
hφ0 : Set.EqOn (⇑φ) 0 C
hφ1 : Set.EqOn (⇑φ) 1 D
hφ01 : ∀ (x : (forget CompHaus).obj Y), φ x ∈ Set.Icc 0 1
this✝ : CompactSpace (ULift.{u, 0} ↑(Set.Icc 0 1))
this : T2Space (ULift.{u, 0} ↑(Set.Icc 0 1))
Z : CompHaus := of (ULift.{u, 0} ↑(Set.Icc 0 1))
g : Y ⟶ Z := { toFun := fun y' => { down := ⟨φ y', ⋯⟩ }, continuous_toFun := ⋯ }
h : Y ⟶ Z := { toFun := fun x => { down := ⟨0, ⋯⟩ }, continuous_toFun := ⋯ }
H : 0 = 1
⊢ False

tactic: exact zero_ne_one H
state_before: case mp.intro.intro.intro.intro
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ⇑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
hCD : Disjoint C D
φ : C((forget CompHaus).obj Y, ℝ)
hφ0 : Set.EqOn (⇑φ) 0 C
hφ1 : Set.EqOn (⇑φ) 1 D
hφ01 : ∀ (x : (forget CompHaus).obj Y), φ x ∈ Set.Icc 0 1
this✝ : CompactSpace (ULift.{u, 0} ↑(Set.Icc 0 1))
this : T2Space (ULift.{u, 0} ↑(Set.Icc 0 1))
Z : CompHaus := of (ULift.{u, 0} ↑(Set.Icc 0 1))
g : Y ⟶ Z := { toFun := fun y' => { down := ⟨φ y', ⋯⟩ }, continuous_toFun := ⋯ }
h : Y ⟶ Z := { toFun := fun x => { down := ⟨0, ⋯⟩ }, continuous_toFun := ⋯ }
H : 0 = 1
⊢ False
state_after: no goals

tactic: rw [Set.disjoint_singleton_right]
state_before: X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ⇑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
⊢ Disjoint C D
state_after: X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ⇑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
⊢ y ∉ C

tactic: rintro ⟨y', hy'⟩
state_before: X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ⇑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
⊢ y ∉ C
state_after: case intro
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ⇑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
y' : (forget CompHaus).obj X
hy' : f y' = y
⊢ False

tactic: exact hy y' hy'
state_before: case intro
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ⇑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
y' : (forget CompHaus).obj X
hy' : f y' = y
⊢ False
state_after: no goals

tactic: rw [← cancel_epi f]
state_before: X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ⇑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
hCD : Disjoint C D
φ : C((forget CompHaus).obj Y, ℝ)
hφ0 : Set.EqOn (⇑φ) 0 C
hφ1 : Set.EqOn (⇑φ) 1 D
hφ01 : ∀ (x : (forget CompHaus).obj Y), φ x ∈ Set.Icc 0 1
this✝ : CompactSpace (ULift.{u, 0} ↑(Set.Icc 0 1))
this : T2Space (ULift.{u, 0} ↑(Set.Icc 0 1))
Z : CompHaus := of (ULift.{u, 0} ↑(Set.Icc 0 1))
g : Y ⟶ Z := { toFun := fun y' => { down := ⟨φ y', ⋯⟩ }, continuous_toFun := ⋯ }
h : Y ⟶ Z := { toFun := fun x => { down := ⟨0, ⋯⟩ }, continuous_toFun := ⋯ }
⊢ h = g
state_after: X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ⇑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
hCD : Disjoint C D
φ : C((forget CompHaus).obj Y, ℝ)
hφ0 : Set.EqOn (⇑φ) 0 C
hφ1 : Set.EqOn (⇑φ) 1 D
hφ01 : ∀ (x : (forget CompHaus).obj Y), φ x ∈ Set.Icc 0 1
this✝ : CompactSpace (ULift.{u, 0} ↑(Set.Icc 0 1))
this : T2Space (ULift.{u, 0} ↑(Set.Icc 0 1))
Z : CompHaus := of (ULift.{u, 0} ↑(Set.Icc 0 1))
g : Y ⟶ Z := { toFun := fun y' => { down := ⟨φ y', ⋯⟩ }, continuous_toFun := ⋯ }
h : Y ⟶ Z := { toFun := fun x => { down := ⟨0, ⋯⟩ }, continuous_toFun := ⋯ }
⊢ f ≫ h = f ≫ g

tactic: ext x
state_before: X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ⇑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
hCD : Disjoint C D
φ : C((forget CompHaus).obj Y, ℝ)
hφ0 : Set.EqOn (⇑φ) 0 C
hφ1 : Set.EqOn (⇑φ) 1 D
hφ01 : ∀ (x : (forget CompHaus).obj Y), φ x ∈ Set.Icc 0 1
this✝ : CompactSpace (ULift.{u, 0} ↑(Set.Icc 0 1))
this : T2Space (ULift.{u, 0} ↑(Set.Icc 0 1))
Z : CompHaus := of (ULift.{u, 0} ↑(Set.Icc 0 1))
g : Y ⟶ Z := { toFun := fun y' => { down := ⟨φ y', ⋯⟩ }, continuous_toFun := ⋯ }
h : Y ⟶ Z := { toFun := fun x => { down := ⟨0, ⋯⟩ }, continuous_toFun := ⋯ }
⊢ f ≫ h = f ≫ g
state_after: case w
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ⇑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
hCD : Disjoint C D
φ : C((forget CompHaus).obj Y, ℝ)
hφ0 : Set.EqOn (⇑φ) 0 C
hφ1 : Set.EqOn (⇑φ) 1 D
hφ01 : ∀ (x : (forget CompHaus).obj Y), φ x ∈ Set.Icc 0 1
this✝ : CompactSpace (ULift.{u, 0} ↑(Set.Icc 0 1))
this : T2Space (ULift.{u, 0} ↑(Set.Icc 0 1))
Z : CompHaus := of (ULift.{u, 0} ↑(Set.Icc 0 1))
g : Y ⟶ Z := { toFun := fun y' => { down := ⟨φ y', ⋯⟩ }, continuous_toFun := ⋯ }
h : Y ⟶ Z := { toFun := fun x => { down := ⟨0, ⋯⟩ }, continuous_toFun := ⋯ }
x : (forget CompHaus).obj X
⊢ (f ≫ h) x = (f ≫ g) x

tactic: apply ULift.ext
state_before: case w
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ⇑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
hCD : Disjoint C D
φ : C((forget CompHaus).obj Y, ℝ)
hφ0 : Set.EqOn (⇑φ) 0 C
hφ1 : Set.EqOn (⇑φ) 1 D
hφ01 : ∀ (x : (forget CompHaus).obj Y), φ x ∈ Set.Icc 0 1
this✝ : CompactSpace (ULift.{u, 0} ↑(Set.Icc 0 1))
this : T2Space (ULift.{u, 0} ↑(Set.Icc 0 1))
Z : CompHaus := of (ULift.{u, 0} ↑(Set.Icc 0 1))
g : Y ⟶ Z := { toFun := fun y' => { down := ⟨φ y', ⋯⟩ }, continuous_toFun := ⋯ }
h : Y ⟶ Z := { toFun := fun x => { down := ⟨0, ⋯⟩ }, continuous_toFun := ⋯ }
x : (forget CompHaus).obj X
⊢ (f ≫ h) x = (f ≫ g) x
state_after: case w.h
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ⇑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
hCD : Disjoint C D
φ : C((forget CompHaus).obj Y, ℝ)
hφ0 : Set.EqOn (⇑φ) 0 C
hφ1 : Set.EqOn (⇑φ) 1 D
hφ01 : ∀ (x : (forget CompHaus).obj Y), φ x ∈ Set.Icc 0 1
this✝ : CompactSpace (ULift.{u, 0} ↑(Set.Icc 0 1))
this : T2Space (ULift.{u, 0} ↑(Set.Icc 0 1))
Z : CompHaus := of (ULift.{u, 0} ↑(Set.Icc 0 1))
g : Y ⟶ Z := { toFun := fun y' => { down := ⟨φ y', ⋯⟩ }, continuous_toFun := ⋯ }
h : Y ⟶ Z := { toFun := fun x => { down := ⟨0, ⋯⟩ }, continuous_toFun := ⋯ }
x : (forget CompHaus).obj X
⊢ ((f ≫ h) x).down = ((f ≫ g) x).down

tactic: apply Subtype.ext
state_before: case w.h
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ⇑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
hCD : Disjoint C D
φ : C((forget CompHaus).obj Y, ℝ)
hφ0 : Set.EqOn (⇑φ) 0 C
hφ1 : Set.EqOn (⇑φ) 1 D
hφ01 : ∀ (x : (forget CompHaus).obj Y), φ x ∈ Set.Icc 0 1
this✝ : CompactSpace (ULift.{u, 0} ↑(Set.Icc 0 1))
this : T2Space (ULift.{u, 0} ↑(Set.Icc 0 1))
Z : CompHaus := of (ULift.{u, 0} ↑(Set.Icc 0 1))
g : Y ⟶ Z := { toFun := fun y' => { down := ⟨φ y', ⋯⟩ }, continuous_toFun := ⋯ }
h : Y ⟶ Z := { toFun := fun x => { down := ⟨0, ⋯⟩ }, continuous_toFun := ⋯ }
x : (forget CompHaus).obj X
⊢ ((f ≫ h) x).down = ((f ≫ g) x).down
state_after: case w.h.a
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ⇑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
hCD : Disjoint C D
φ : C((forget CompHaus).obj Y, ℝ)
hφ0 : Set.EqOn (⇑φ) 0 C
hφ1 : Set.EqOn (⇑φ) 1 D
hφ01 : ∀ (x : (forget CompHaus).obj Y), φ x ∈ Set.Icc 0 1
this✝ : CompactSpace (ULift.{u, 0} ↑(Set.Icc 0 1))
this : T2Space (ULift.{u, 0} ↑(Set.Icc 0 1))
Z : CompHaus := of (ULift.{u, 0} ↑(Set.Icc 0 1))
g : Y ⟶ Z := { toFun := fun y' => { down := ⟨φ y', ⋯⟩ }, continuous_toFun := ⋯ }
h : Y ⟶ Z := { toFun := fun x => { down := ⟨0, ⋯⟩ }, continuous_toFun := ⋯ }
x : (forget CompHaus).obj X
⊢ ↑((f ≫ h) x).down = ↑((f ≫ g) x).down

tactic: change 0 = φ (f x)
state_before: case w.h.a
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ⇑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
hCD : Disjoint C D
φ : C((forget CompHaus).obj Y, ℝ)
hφ0 : Set.EqOn (⇑φ) 0 C
hφ1 : Set.EqOn (⇑φ) 1 D
hφ01 : ∀ (x : (forget CompHaus).obj Y), φ x ∈ Set.Icc 0 1
this✝ : CompactSpace (ULift.{u, 0} ↑(Set.Icc 0 1))
this : T2Space (ULift.{u, 0} ↑(Set.Icc 0 1))
Z : CompHaus := of (ULift.{u, 0} ↑(Set.Icc 0 1))
g : Y ⟶ Z := { toFun := fun y' => { down := ⟨φ y', ⋯⟩ }, continuous_toFun := ⋯ }
h : Y ⟶ Z := { toFun := fun x => { down := ⟨0, ⋯⟩ }, continuous_toFun := ⋯ }
x : (forget CompHaus).obj X
⊢ ↑((f ≫ h) x).down = ↑((f ≫ g) x).down
state_after: case w.h.a
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ⇑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
hCD : Disjoint C D
φ : C((forget CompHaus).obj Y, ℝ)
hφ0 : Set.EqOn (⇑φ) 0 C
hφ1 : Set.EqOn (⇑φ) 1 D
hφ01 : ∀ (x : (forget CompHaus).obj Y), φ x ∈ Set.Icc 0 1
this✝ : CompactSpace (ULift.{u, 0} ↑(Set.Icc 0 1))
this : T2Space (ULift.{u, 0} ↑(Set.Icc 0 1))
Z : CompHaus := of (ULift.{u, 0} ↑(Set.Icc 0 1))
g : Y ⟶ Z := { toFun := fun y' => { down := ⟨φ y', ⋯⟩ }, continuous_toFun := ⋯ }
h : Y ⟶ Z := { toFun := fun x => { down := ⟨0, ⋯⟩ }, continuous_toFun := ⋯ }
x : (forget CompHaus).obj X
⊢ 0 = φ (f x)

tactic: simp only [hφ0 (Set.mem_range_self x), Pi.zero_apply]
state_before: case w.h.a
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ⇑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
hCD : Disjoint C D
φ : C((forget CompHaus).obj Y, ℝ)
hφ0 : Set.EqOn (⇑φ) 0 C
hφ1 : Set.EqOn (⇑φ) 1 D
hφ01 : ∀ (x : (forget CompHaus).obj Y), φ x ∈ Set.Icc 0 1
this✝ : CompactSpace (ULift.{u, 0} ↑(Set.Icc 0 1))
this : T2Space (ULift.{u, 0} ↑(Set.Icc 0 1))
Z : CompHaus := of (ULift.{u, 0} ↑(Set.Icc 0 1))
g : Y ⟶ Z := { toFun := fun y' => { down := ⟨φ y', ⋯⟩ }, continuous_toFun := ⋯ }
h : Y ⟶ Z := { toFun := fun x => { down := ⟨0, ⋯⟩ }, continuous_toFun := ⋯ }
x : (forget CompHaus).obj X
⊢ 0 = φ (f x)
state_after: no goals

tactic: rw [← CategoryTheory.epi_iff_surjective]
state_before: case mpr
X Y : CompHaus
f : X ⟶ Y
⊢ Function.Surjective ⇑f → Epi f
state_after: case mpr
X Y : CompHaus
f : X ⟶ Y
⊢ Epi ⇑f → Epi f

tactic: apply (forget CompHaus).epi_of_epi_map
state_before: case mpr
X Y : CompHaus
f : X ⟶ Y
⊢ Epi ⇑f → Epi f
state_after: no goals