[GOAL]
X✝ : Type u_1
inst✝² : TopologicalSpace X✝
inst✝¹ : CompactSpace X✝
inst✝ : T2Space X✝
X Y : CompHaus
f : X ⟶ Y
bij : Function.Bijective ↑f
⊢ IsIso f
[PROOFSTEP]
let E := Equiv.ofBijective _ bij
[GOAL]
X✝ : Type u_1
inst✝² : TopologicalSpace X✝
inst✝¹ : CompactSpace X✝
inst✝ : T2Space X✝
X Y : CompHaus
f : X ⟶ Y
bij : Function.Bijective ↑f
E : (forget CompHaus).obj X ≃ (forget CompHaus).obj Y := Equiv.ofBijective (↑f) bij
⊢ IsIso f
[PROOFSTEP]
have hE : Continuous E.symm := by
  rw [continuous_iff_isClosed]
  intro S hS
  rw [← E.image_eq_preimage]
  exact isClosedMap f S hS
[GOAL]
X✝ : Type u_1
inst✝² : TopologicalSpace X✝
inst✝¹ : CompactSpace X✝
inst✝ : T2Space X✝
X Y : CompHaus
f : X ⟶ Y
bij : Function.Bijective ↑f
E : (forget CompHaus).obj X ≃ (forget CompHaus).obj Y := Equiv.ofBijective (↑f) bij
⊢ Continuous ↑E.symm
[PROOFSTEP]
rw [continuous_iff_isClosed]
[GOAL]
X✝ : Type u_1
inst✝² : TopologicalSpace X✝
inst✝¹ : CompactSpace X✝
inst✝ : T2Space X✝
X Y : CompHaus
f : X ⟶ Y
bij : Function.Bijective ↑f
E : (forget CompHaus).obj X ≃ (forget CompHaus).obj Y := Equiv.ofBijective (↑f) bij
⊢ ∀ (s : Set ((forget CompHaus).obj X)), IsClosed s → IsClosed (↑E.symm ⁻¹' s)
[PROOFSTEP]
intro S hS
[GOAL]
X✝ : Type u_1
inst✝² : TopologicalSpace X✝
inst✝¹ : CompactSpace X✝
inst✝ : T2Space X✝
X Y : CompHaus
f : X ⟶ Y
bij : Function.Bijective ↑f
E : (forget CompHaus).obj X ≃ (forget CompHaus).obj Y := Equiv.ofBijective (↑f) bij
S : Set ((forget CompHaus).obj X)
hS : IsClosed S
⊢ IsClosed (↑E.symm ⁻¹' S)
[PROOFSTEP]
rw [← E.image_eq_preimage]
[GOAL]
X✝ : Type u_1
inst✝² : TopologicalSpace X✝
inst✝¹ : CompactSpace X✝
inst✝ : T2Space X✝
X Y : CompHaus
f : X ⟶ Y
bij : Function.Bijective ↑f
E : (forget CompHaus).obj X ≃ (forget CompHaus).obj Y := Equiv.ofBijective (↑f) bij
S : Set ((forget CompHaus).obj X)
hS : IsClosed S
⊢ IsClosed (↑E '' S)
[PROOFSTEP]
exact isClosedMap f S hS
[GOAL]
X✝ : Type u_1
inst✝² : TopologicalSpace X✝
inst✝¹ : CompactSpace X✝
inst✝ : T2Space X✝
X Y : CompHaus
f : X ⟶ Y
bij : Function.Bijective ↑f
E : (forget CompHaus).obj X ≃ (forget CompHaus).obj Y := Equiv.ofBijective (↑f) bij
hE : Continuous ↑E.symm
⊢ IsIso f
[PROOFSTEP]
refine' ⟨⟨⟨E.symm, hE⟩, _, _⟩⟩
[GOAL]
case refine'_1
X✝ : Type u_1
inst✝² : TopologicalSpace X✝
inst✝¹ : CompactSpace X✝
inst✝ : T2Space X✝
X Y : CompHaus
f : X ⟶ Y
bij : Function.Bijective ↑f
E : (forget CompHaus).obj X ≃ (forget CompHaus).obj Y := Equiv.ofBijective (↑f) bij
hE : Continuous ↑E.symm
⊢ f ≫ ContinuousMap.mk ↑E.symm = 𝟙 X
[PROOFSTEP]
ext x
[GOAL]
case refine'_1.w
X✝ : Type u_1
inst✝² : TopologicalSpace X✝
inst✝¹ : CompactSpace X✝
inst✝ : T2Space X✝
X Y : CompHaus
f : X ⟶ Y
bij : Function.Bijective ↑f
E : (forget CompHaus).obj X ≃ (forget CompHaus).obj Y := Equiv.ofBijective (↑f) bij
hE : Continuous ↑E.symm
x : (forget CompHaus).obj X
⊢ ↑(f ≫ ContinuousMap.mk ↑E.symm) x = ↑(𝟙 X) x
[PROOFSTEP]
apply E.symm_apply_apply
[GOAL]
case refine'_2
X✝ : Type u_1
inst✝² : TopologicalSpace X✝
inst✝¹ : CompactSpace X✝
inst✝ : T2Space X✝
X Y : CompHaus
f : X ⟶ Y
bij : Function.Bijective ↑f
E : (forget CompHaus).obj X ≃ (forget CompHaus).obj Y := Equiv.ofBijective (↑f) bij
hE : Continuous ↑E.symm
⊢ ContinuousMap.mk ↑E.symm ≫ f = 𝟙 Y
[PROOFSTEP]
ext x
[GOAL]
case refine'_2.w
X✝ : Type u_1
inst✝² : TopologicalSpace X✝
inst✝¹ : CompactSpace X✝
inst✝ : T2Space X✝
X Y : CompHaus
f : X ⟶ Y
bij : Function.Bijective ↑f
E : (forget CompHaus).obj X ≃ (forget CompHaus).obj Y := Equiv.ofBijective (↑f) bij
hE : Continuous ↑E.symm
x : (forget CompHaus).obj Y
⊢ ↑(ContinuousMap.mk ↑E.symm ≫ f) x = ↑(𝟙 Y) x
[PROOFSTEP]
apply E.apply_symm_apply
[GOAL]
X✝ : Type u_1
inst✝² : TopologicalSpace X✝
inst✝¹ : CompactSpace X✝
inst✝ : T2Space X✝
X Y : CompHaus
f : ↑X.toTop ≃ₜ ↑Y.toTop
⊢ ContinuousMap.mk ↑f ≫ ContinuousMap.mk ↑(Homeomorph.symm f) = 𝟙 X
[PROOFSTEP]
ext x
[GOAL]
case w
X✝ : Type u_1
inst✝² : TopologicalSpace X✝
inst✝¹ : CompactSpace X✝
inst✝ : T2Space X✝
X Y : CompHaus
f : ↑X.toTop ≃ₜ ↑Y.toTop
x : (forget CompHaus).obj X
⊢ ↑(ContinuousMap.mk ↑f ≫ ContinuousMap.mk ↑(Homeomorph.symm f)) x = ↑(𝟙 X) x
[PROOFSTEP]
exact f.symm_apply_apply x
[GOAL]
X✝ : Type u_1
inst✝² : TopologicalSpace X✝
inst✝¹ : CompactSpace X✝
inst✝ : T2Space X✝
X Y : CompHaus
f : ↑X.toTop ≃ₜ ↑Y.toTop
⊢ ContinuousMap.mk ↑(Homeomorph.symm f) ≫ ContinuousMap.mk ↑f = 𝟙 Y
[PROOFSTEP]
ext x
[GOAL]
case w
X✝ : Type u_1
inst✝² : TopologicalSpace X✝
inst✝¹ : CompactSpace X✝
inst✝ : T2Space X✝
X Y : CompHaus
f : ↑X.toTop ≃ₜ ↑Y.toTop
x : (forget CompHaus).obj Y
⊢ ↑(ContinuousMap.mk ↑(Homeomorph.symm f) ≫ ContinuousMap.mk ↑f) x = ↑(𝟙 Y) x
[PROOFSTEP]
exact f.apply_symm_apply x
[GOAL]
X✝ : Type u_1
inst✝² : TopologicalSpace X✝
inst✝¹ : CompactSpace X✝
inst✝ : T2Space X✝
X Y : CompHaus
f : X ≅ Y
x : ↑X.toTop
⊢ ↑f.inv (↑f.hom x) = x
[PROOFSTEP]
simp
[GOAL]
X✝ : Type u_1
inst✝² : TopologicalSpace X✝
inst✝¹ : CompactSpace X✝
inst✝ : T2Space X✝
X Y : CompHaus
f : X ≅ Y
x : ↑Y.toTop
⊢ ↑f.hom (↑f.inv x) = x
[PROOFSTEP]
simp
[GOAL]
X✝ : Type u_1
inst✝² : TopologicalSpace X✝
inst✝¹ : CompactSpace X✝
inst✝ : T2Space X✝
X Y : CompHaus
f : X ≅ Y
⊢ isoOfHomeo (homeoOfIso f) = f
[PROOFSTEP]
ext
[GOAL]
case w.w
X✝ : Type u_1
inst✝² : TopologicalSpace X✝
inst✝¹ : CompactSpace X✝
inst✝ : T2Space X✝
X Y : CompHaus
f : X ≅ Y
x✝ : (forget CompHaus).obj X
⊢ ↑(isoOfHomeo (homeoOfIso f)).hom x✝ = ↑f.hom x✝
[PROOFSTEP]
rfl
[GOAL]
X✝ : Type u_1
inst✝² : TopologicalSpace X✝
inst✝¹ : CompactSpace X✝
inst✝ : T2Space X✝
X Y : CompHaus
f : ↑X.toTop ≃ₜ ↑Y.toTop
⊢ homeoOfIso (isoOfHomeo f) = f
[PROOFSTEP]
ext
[GOAL]
case H
X✝ : Type u_1
inst✝² : TopologicalSpace X✝
inst✝¹ : CompactSpace X✝
inst✝ : T2Space X✝
X Y : CompHaus
f : ↑X.toTop ≃ₜ ↑Y.toTop
x✝ : ↑X.toTop
⊢ ↑(homeoOfIso (isoOfHomeo f)) x✝ = ↑f x✝
[PROOFSTEP]
rfl
[GOAL]
⊢ ∀ {A B : CompHaus} (f : A ⟶ B) [inst : IsIso ((forget CompHaus).map f)], IsIso f
[PROOFSTEP]
intro A B f hf
[GOAL]
A B : CompHaus
f : A ⟶ B
hf : IsIso ((forget CompHaus).map f)
⊢ IsIso f
[PROOFSTEP]
exact CompHaus.isIso_of_bijective _ ((isIso_iff_bijective f).mp hf)
[GOAL]
X : TopCat
Y : CompHaus
⊢ Function.LeftInverse (fun f => ContinuousMap.mk (stoneCechExtend (_ : Continuous f.toFun))) fun f =>
    ContinuousMap.mk (↑f ∘ stoneCechUnit)
[PROOFSTEP]
rintro
  ⟨f : StoneCech X ⟶ Y, hf : Continuous f⟩
      -- Porting note: `ext` fails.
[GOAL]
case mk
X : TopCat
Y : CompHaus
f : StoneCech ↑X ⟶ ↑Y.toTop
hf : Continuous f
⊢ (fun f => ContinuousMap.mk (stoneCechExtend (_ : Continuous f.toFun)))
      ((fun f => ContinuousMap.mk (↑f ∘ stoneCechUnit)) (ContinuousMap.mk f)) =
    ContinuousMap.mk f
[PROOFSTEP]
apply ContinuousMap.ext
[GOAL]
case mk.h
X : TopCat
Y : CompHaus
f : StoneCech ↑X ⟶ ↑Y.toTop
hf : Continuous f
⊢ ∀ (a : ↑(stoneCechObj X).toTop),
    ↑((fun f => ContinuousMap.mk (stoneCechExtend (_ : Continuous f.toFun)))
            ((fun f => ContinuousMap.mk (↑f ∘ stoneCechUnit)) (ContinuousMap.mk f)))
        a =
      ↑(ContinuousMap.mk f) a
[PROOFSTEP]
intro (x : StoneCech X)
[GOAL]
case mk.h
X : TopCat
Y : CompHaus
f : StoneCech ↑X ⟶ ↑Y.toTop
hf : Continuous f
x : StoneCech ↑X
⊢ ↑((fun f => ContinuousMap.mk (stoneCechExtend (_ : Continuous f.toFun)))
          ((fun f => ContinuousMap.mk (↑f ∘ stoneCechUnit)) (ContinuousMap.mk f)))
      x =
    ↑(ContinuousMap.mk f) x
[PROOFSTEP]
refine' congr_fun _ x
[GOAL]
case mk.h
X : TopCat
Y : CompHaus
f : StoneCech ↑X ⟶ ↑Y.toTop
hf : Continuous f
x : StoneCech ↑X
⊢ ↑((fun f => ContinuousMap.mk (stoneCechExtend (_ : Continuous f.toFun)))
        ((fun f => ContinuousMap.mk (↑f ∘ stoneCechUnit)) (ContinuousMap.mk f))) =
    ↑(ContinuousMap.mk f)
[PROOFSTEP]
apply Continuous.ext_on denseRange_stoneCechUnit (continuous_stoneCechExtend _) hf
[GOAL]
case mk.h
X : TopCat
Y : CompHaus
f : StoneCech ↑X ⟶ ↑Y.toTop
hf : Continuous f
x : StoneCech ↑X
⊢ Set.EqOn (stoneCechExtend ?m.48961) f (Set.range stoneCechUnit)
X : TopCat
Y : CompHaus
f : StoneCech ↑X ⟶ ↑Y.toTop
hf : Continuous f
x : StoneCech ↑X
⊢ Continuous ((fun f => ContinuousMap.mk (↑f ∘ stoneCechUnit)) (ContinuousMap.mk f)).toFun
[PROOFSTEP]
rintro _ ⟨y, rfl⟩
[GOAL]
case mk.h.intro
X : TopCat
Y : CompHaus
f : StoneCech ↑X ⟶ ↑Y.toTop
hf : Continuous f
x : StoneCech ↑X
y : ↑X
⊢ stoneCechExtend ?m.48961 (stoneCechUnit y) = f (stoneCechUnit y)
X : TopCat
Y : CompHaus
f : StoneCech ↑X ⟶ ↑Y.toTop
hf : Continuous f
x : StoneCech ↑X
⊢ Continuous ((fun f => ContinuousMap.mk (↑f ∘ stoneCechUnit)) (ContinuousMap.mk f)).toFun
[PROOFSTEP]
apply congr_fun (stoneCechExtend_extends (hf.comp _)) y
[GOAL]
X : TopCat
Y : CompHaus
f : StoneCech ↑X ⟶ ↑Y.toTop
hf : Continuous f
x : StoneCech ↑X
⊢ Continuous fun x => stoneCechUnit x
[PROOFSTEP]
apply continuous_stoneCechUnit
[GOAL]
X : TopCat
Y : CompHaus
⊢ Function.RightInverse (fun f => ContinuousMap.mk (stoneCechExtend (_ : Continuous f.toFun))) fun f =>
    ContinuousMap.mk (↑f ∘ stoneCechUnit)
[PROOFSTEP]
rintro
  ⟨f : (X : Type _) ⟶ Y, hf : Continuous f⟩
      -- Porting note: `ext` fails.
[GOAL]
case mk
X : TopCat
Y : CompHaus
f : ↑X ⟶ ↑Y.toTop
hf : Continuous f
⊢ (fun f => ContinuousMap.mk (↑f ∘ stoneCechUnit))
      ((fun f => ContinuousMap.mk (stoneCechExtend (_ : Continuous f.toFun))) (ContinuousMap.mk f)) =
    ContinuousMap.mk f
[PROOFSTEP]
apply ContinuousMap.ext
[GOAL]
case mk.h
X : TopCat
Y : CompHaus
f : ↑X ⟶ ↑Y.toTop
hf : Continuous f
⊢ ∀ (a : ↑X),
    ↑((fun f => ContinuousMap.mk (↑f ∘ stoneCechUnit))
            ((fun f => ContinuousMap.mk (stoneCechExtend (_ : Continuous f.toFun))) (ContinuousMap.mk f)))
        a =
      ↑(ContinuousMap.mk f) a
[PROOFSTEP]
intro
[GOAL]
case mk.h
X : TopCat
Y : CompHaus
f : ↑X ⟶ ↑Y.toTop
hf : Continuous f
a✝ : ↑X
⊢ ↑((fun f => ContinuousMap.mk (↑f ∘ stoneCechUnit))
          ((fun f => ContinuousMap.mk (stoneCechExtend (_ : Continuous f.toFun))) (ContinuousMap.mk f)))
      a✝ =
    ↑(ContinuousMap.mk f) a✝
[PROOFSTEP]
exact congr_fun (stoneCechExtend_extends hf) _
[GOAL]
J : Type v
inst✝ : SmallCategory J
F : J ⥤ CompHaus
FF : J ⥤ TopCatMax := F ⋙ compHausToTop
⊢ CompactSpace ↑(TopCat.limitCone FF).pt
[PROOFSTEP]
show CompactSpace {u : ∀ j, F.obj j | ∀ {i j : J} (f : i ⟶ j), (F.map f) (u i) = u j}
[GOAL]
J : Type v
inst✝ : SmallCategory J
F : J ⥤ CompHaus
FF : J ⥤ TopCatMax := F ⋙ compHausToTop
⊢ CompactSpace ↑{u | ∀ {i j : J} (f : i ⟶ j), ↑(F.map f) (u i) = u j}
[PROOFSTEP]
rw [← isCompact_iff_compactSpace]
[GOAL]
J : Type v
inst✝ : SmallCategory J
F : J ⥤ CompHaus
FF : J ⥤ TopCatMax := F ⋙ compHausToTop
⊢ IsCompact {u | ∀ {i j : J} (f : i ⟶ j), ↑(F.map f) (u i) = u j}
[PROOFSTEP]
apply IsClosed.isCompact
[GOAL]
case h
J : Type v
inst✝ : SmallCategory J
F : J ⥤ CompHaus
FF : J ⥤ TopCatMax := F ⋙ compHausToTop
⊢ IsClosed {u | ∀ {i j : J} (f : i ⟶ j), ↑(F.map f) (u i) = u j}
[PROOFSTEP]
have :
  {u : ∀ j, F.obj j | ∀ {i j : J} (f : i ⟶ j), F.map f (u i) = u j} =
    ⋂ (i : J) (j : J) (f : i ⟶ j), {u | F.map f (u i) = u j} :=
  by
  ext1
  simp only [Set.mem_iInter, Set.mem_setOf_eq]
[GOAL]
J : Type v
inst✝ : SmallCategory J
F : J ⥤ CompHaus
FF : J ⥤ TopCatMax := F ⋙ compHausToTop
⊢ {u | ∀ {i j : J} (f : i ⟶ j), ↑(F.map f) (u i) = u j} = ⋂ (i : J) (j : J) (f : i ⟶ j), {u | ↑(F.map f) (u i) = u j}
[PROOFSTEP]
ext1
[GOAL]
case h
J : Type v
inst✝ : SmallCategory J
F : J ⥤ CompHaus
FF : J ⥤ TopCatMax := F ⋙ compHausToTop
x✝ : (j : J) → ↑(F.obj j).toTop
⊢ x✝ ∈ {u | ∀ {i j : J} (f : i ⟶ j), ↑(F.map f) (u i) = u j} ↔
    x✝ ∈ ⋂ (i : J) (j : J) (f : i ⟶ j), {u | ↑(F.map f) (u i) = u j}
[PROOFSTEP]
simp only [Set.mem_iInter, Set.mem_setOf_eq]
[GOAL]
case h
J : Type v
inst✝ : SmallCategory J
F : J ⥤ CompHaus
FF : J ⥤ TopCatMax := F ⋙ compHausToTop
this :
  {u | ∀ {i j : J} (f : i ⟶ j), ↑(F.map f) (u i) = u j} = ⋂ (i : J) (j : J) (f : i ⟶ j), {u | ↑(F.map f) (u i) = u j}
⊢ IsClosed {u | ∀ {i j : J} (f : i ⟶ j), ↑(F.map f) (u i) = u j}
[PROOFSTEP]
rw [this]
[GOAL]
case h
J : Type v
inst✝ : SmallCategory J
F : J ⥤ CompHaus
FF : J ⥤ TopCatMax := F ⋙ compHausToTop
this :
  {u | ∀ {i j : J} (f : i ⟶ j), ↑(F.map f) (u i) = u j} = ⋂ (i : J) (j : J) (f : i ⟶ j), {u | ↑(F.map f) (u i) = u j}
⊢ IsClosed (⋂ (i : J) (j : J) (f : i ⟶ j), {u | ↑(F.map f) (u i) = u j})
[PROOFSTEP]
apply isClosed_iInter
[GOAL]
case h.h
J : Type v
inst✝ : SmallCategory J
F : J ⥤ CompHaus
FF : J ⥤ TopCatMax := F ⋙ compHausToTop
this :
  {u | ∀ {i j : J} (f : i ⟶ j), ↑(F.map f) (u i) = u j} = ⋂ (i : J) (j : J) (f : i ⟶ j), {u | ↑(F.map f) (u i) = u j}
⊢ ∀ (i : J), IsClosed (⋂ (j : J) (f : i ⟶ j), {u | ↑(F.map f) (u i) = u j})
[PROOFSTEP]
intro i
[GOAL]
case h.h
J : Type v
inst✝ : SmallCategory J
F : J ⥤ CompHaus
FF : J ⥤ TopCatMax := F ⋙ compHausToTop
this :
  {u | ∀ {i j : J} (f : i ⟶ j), ↑(F.map f) (u i) = u j} = ⋂ (i : J) (j : J) (f : i ⟶ j), {u | ↑(F.map f) (u i) = u j}
i : J
⊢ IsClosed (⋂ (j : J) (f : i ⟶ j), {u | ↑(F.map f) (u i) = u j})
[PROOFSTEP]
apply isClosed_iInter
[GOAL]
case h.h.h
J : Type v
inst✝ : SmallCategory J
F : J ⥤ CompHaus
FF : J ⥤ TopCatMax := F ⋙ compHausToTop
this :
  {u | ∀ {i j : J} (f : i ⟶ j), ↑(F.map f) (u i) = u j} = ⋂ (i : J) (j : J) (f : i ⟶ j), {u | ↑(F.map f) (u i) = u j}
i : J
⊢ ∀ (i_1 : J), IsClosed (⋂ (f : i ⟶ i_1), {u | ↑(F.map f) (u i) = u i_1})
[PROOFSTEP]
intro j
[GOAL]
case h.h.h
J : Type v
inst✝ : SmallCategory J
F : J ⥤ CompHaus
FF : J ⥤ TopCatMax := F ⋙ compHausToTop
this :
  {u | ∀ {i j : J} (f : i ⟶ j), ↑(F.map f) (u i) = u j} = ⋂ (i : J) (j : J) (f : i ⟶ j), {u | ↑(F.map f) (u i) = u j}
i j : J
⊢ IsClosed (⋂ (f : i ⟶ j), {u | ↑(F.map f) (u i) = u j})
[PROOFSTEP]
apply isClosed_iInter
[GOAL]
case h.h.h.h
J : Type v
inst✝ : SmallCategory J
F : J ⥤ CompHaus
FF : J ⥤ TopCatMax := F ⋙ compHausToTop
this :
  {u | ∀ {i j : J} (f : i ⟶ j), ↑(F.map f) (u i) = u j} = ⋂ (i : J) (j : J) (f : i ⟶ j), {u | ↑(F.map f) (u i) = u j}
i j : J
⊢ ∀ (i_1 : i ⟶ j), IsClosed {u | ↑(F.map i_1) (u i) = u j}
[PROOFSTEP]
intro f
[GOAL]
case h.h.h.h
J : Type v
inst✝ : SmallCategory J
F : J ⥤ CompHaus
FF : J ⥤ TopCatMax := F ⋙ compHausToTop
this :
  {u | ∀ {i j : J} (f : i ⟶ j), ↑(F.map f) (u i) = u j} = ⋂ (i : J) (j : J) (f : i ⟶ j), {u | ↑(F.map f) (u i) = u j}
i j : J
f : i ⟶ j
⊢ IsClosed {u | ↑(F.map f) (u i) = u j}
[PROOFSTEP]
apply isClosed_eq
[GOAL]
case h.h.h.h.hf
J : Type v
inst✝ : SmallCategory J
F : J ⥤ CompHaus
FF : J ⥤ TopCatMax := F ⋙ compHausToTop
this :
  {u | ∀ {i j : J} (f : i ⟶ j), ↑(F.map f) (u i) = u j} = ⋂ (i : J) (j : J) (f : i ⟶ j), {u | ↑(F.map f) (u i) = u j}
i j : J
f : i ⟶ j
⊢ Continuous fun x => ↑(F.map f) (x i)
[PROOFSTEP]
exact (ContinuousMap.continuous (F.map f)).comp (continuous_apply i)
[GOAL]
case h.h.h.h.hg
J : Type v
inst✝ : SmallCategory J
F : J ⥤ CompHaus
FF : J ⥤ TopCatMax := F ⋙ compHausToTop
this :
  {u | ∀ {i j : J} (f : i ⟶ j), ↑(F.map f) (u i) = u j} = ⋂ (i : J) (j : J) (f : i ⟶ j), {u | ↑(F.map f) (u i) = u j}
i j : J
f : i ⟶ j
⊢ Continuous fun x => x j
[PROOFSTEP]
exact continuous_apply j
[GOAL]
J : Type v
inst✝ : SmallCategory J
F : J ⥤ CompHaus
FF : J ⥤ TopCatMax := F ⋙ compHausToTop
⊢ ∀ ⦃X Y : J⦄ (f : X ⟶ Y),
    ((Functor.const J).obj (mk (TopCat.limitCone FF).pt)).map f ≫ (fun j => NatTrans.app (TopCat.limitCone FF).π j) Y =
      (fun j => NatTrans.app (TopCat.limitCone FF).π j) X ≫ F.map f
[PROOFSTEP]
intro _ _ f
[GOAL]
J : Type v
inst✝ : SmallCategory J
F : J ⥤ CompHaus
FF : J ⥤ TopCatMax := F ⋙ compHausToTop
X✝ Y✝ : J
f : X✝ ⟶ Y✝
⊢ ((Functor.const J).obj (mk (TopCat.limitCone FF).pt)).map f ≫ (fun j => NatTrans.app (TopCat.limitCone FF).π j) Y✝ =
    (fun j => NatTrans.app (TopCat.limitCone FF).π j) X✝ ≫ F.map f
[PROOFSTEP]
ext ⟨x, hx⟩
[GOAL]
case w.mk
J : Type v
inst✝ : SmallCategory J
F : J ⥤ CompHaus
FF : J ⥤ TopCatMax := F ⋙ compHausToTop
X✝ Y✝ : J
f : X✝ ⟶ Y✝
x : (j : J) → ↑(FF.obj j)
hx : x ∈ {u | ∀ {i j : J} (f : i ⟶ j), ↑(FF.map f) (u i) = u j}
⊢ ↑(((Functor.const J).obj (mk (TopCat.limitCone FF).pt)).map f ≫ (fun j => NatTrans.app (TopCat.limitCone FF).π j) Y✝)
      { val := x, property := hx } =
    ↑((fun j => NatTrans.app (TopCat.limitCone FF).π j) X✝ ≫ F.map f) { val := x, property := hx }
[PROOFSTEP]
simp only [comp_apply, Functor.const_obj_map, id_apply]
[GOAL]
case w.mk
J : Type v
inst✝ : SmallCategory J
F : J ⥤ CompHaus
FF : J ⥤ TopCatMax := F ⋙ compHausToTop
X✝ Y✝ : J
f : X✝ ⟶ Y✝
x : (j : J) → ↑(FF.obj j)
hx : x ∈ {u | ∀ {i j : J} (f : i ⟶ j), ↑(FF.map f) (u i) = u j}
⊢ ↑(NatTrans.app (TopCat.limitCone (F ⋙ compHausToTop)).π Y✝)
      (↑(𝟙 (mk (TopCat.limitCone (F ⋙ compHausToTop)).pt)) { val := x, property := hx }) =
    ↑(F.map f) (↑(NatTrans.app (TopCat.limitCone (F ⋙ compHausToTop)).π X✝) { val := x, property := hx })
[PROOFSTEP]
exact (hx f).symm
[GOAL]
X Y : CompHaus
f : X ⟶ Y
⊢ Epi f ↔ Function.Surjective ↑f
[PROOFSTEP]
constructor
[GOAL]
case mp
X Y : CompHaus
f : X ⟶ Y
⊢ Epi f → Function.Surjective ↑f
[PROOFSTEP]
dsimp [Function.Surjective]
[GOAL]
case mp
X Y : CompHaus
f : X ⟶ Y
⊢ Epi f → ∀ (b : (forget CompHaus).obj Y), ∃ a, ↑f a = b
[PROOFSTEP]
contrapose!
[GOAL]
case mp
X Y : CompHaus
f : X ⟶ Y
⊢ (∃ b, ∀ (a : (forget CompHaus).obj X), ↑f a ≠ b) → ¬Epi f
[PROOFSTEP]
rintro ⟨y, hy⟩ hf
[GOAL]
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
[PROOFSTEP]
let C := Set.range f
[GOAL]
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
[PROOFSTEP]
have hC : IsClosed C := (isCompact_range f.continuous).isClosed
[GOAL]
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
[PROOFSTEP]
let D := ({ y } : Set Y)
[GOAL]
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
[PROOFSTEP]
have hD : IsClosed D := isClosed_singleton
[GOAL]
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
[PROOFSTEP]
have hCD : Disjoint C D := by
  rw [Set.disjoint_singleton_right]
  rintro ⟨y', hy'⟩
  exact hy y' hy'
[GOAL]
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
[PROOFSTEP]
rw [Set.disjoint_singleton_right]
[GOAL]
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
[PROOFSTEP]
rintro ⟨y', hy'⟩
[GOAL]
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
[PROOFSTEP]
exact hy y' hy'
[GOAL]
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
[PROOFSTEP]
haveI : NormalSpace ((forget CompHaus).obj Y) := normalOfCompactT2
[GOAL]
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
this : NormalSpace ((forget CompHaus).obj Y)
⊢ False
[PROOFSTEP]
obtain ⟨φ, hφ0, hφ1, hφ01⟩ := exists_continuous_zero_one_of_closed hC hD hCD
[GOAL]
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
this : NormalSpace ((forget CompHaus).obj Y)
φ : 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
[PROOFSTEP]
haveI : CompactSpace (ULift.{u} <| Set.Icc (0 : ℝ) 1) := Homeomorph.ulift.symm.compactSpace
[GOAL]
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
this✝ : NormalSpace ((forget CompHaus).obj Y)
φ : 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 ↑(Set.Icc 0 1))
⊢ False
[PROOFSTEP]
haveI : T2Space (ULift.{u} <| Set.Icc (0 : ℝ) 1) := Homeomorph.ulift.symm.t2Space
[GOAL]
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
this✝¹ : NormalSpace ((forget CompHaus).obj Y)
φ : 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 ↑(Set.Icc 0 1))
this : T2Space (ULift ↑(Set.Icc 0 1))
⊢ False
[PROOFSTEP]
let Z := of (ULift.{u} <| Set.Icc (0 : ℝ) 1)
[GOAL]
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
this✝¹ : NormalSpace ((forget CompHaus).obj Y)
φ : 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 ↑(Set.Icc 0 1))
this : T2Space (ULift ↑(Set.Icc 0 1))
Z : CompHaus := of (ULift ↑(Set.Icc 0 1))
⊢ False
[PROOFSTEP]
let g : Y ⟶ Z := ⟨fun y' => ⟨⟨φ y', hφ01 y'⟩⟩, continuous_uLift_up.comp (φ.continuous.subtype_mk fun y' => hφ01 y')⟩
[GOAL]
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
this✝¹ : NormalSpace ((forget CompHaus).obj Y)
φ : 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 ↑(Set.Icc 0 1))
this : T2Space (ULift ↑(Set.Icc 0 1))
Z : CompHaus := of (ULift ↑(Set.Icc 0 1))
g : Y ⟶ Z := ContinuousMap.mk fun y' => { down := { val := ↑φ y', property := (_ : ↑φ y' ∈ Set.Icc 0 1) } }
⊢ False
[PROOFSTEP]
let h : Y ⟶ Z := ⟨fun _ => ⟨⟨0, Set.left_mem_Icc.mpr zero_le_one⟩⟩, continuous_const⟩
[GOAL]
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
this✝¹ : NormalSpace ((forget CompHaus).obj Y)
φ : 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 ↑(Set.Icc 0 1))
this : T2Space (ULift ↑(Set.Icc 0 1))
Z : CompHaus := of (ULift ↑(Set.Icc 0 1))
g : Y ⟶ Z := ContinuousMap.mk fun y' => { down := { val := ↑φ y', property := (_ : ↑φ y' ∈ Set.Icc 0 1) } }
h : Y ⟶ Z := ContinuousMap.mk fun x => { down := { val := 0, property := (_ : 0 ∈ Set.Icc 0 1) } }
⊢ False
[PROOFSTEP]
have H : h = g := by
  rw [← cancel_epi f]
  ext x
  apply ULift.ext
  apply Subtype.ext
  dsimp
    -- Porting note: This `change` is not ideal.
          -- I think lean is having issues understanding when a `ContinuousMap` should be considered
          -- as a morphism.
          -- TODO(?): Make morphisms in `CompHaus` (and other topological categories)
          -- into a one-field-structure.
  change 0 = φ (f x)
  simp only [hφ0 (Set.mem_range_self x), Pi.zero_apply]
[GOAL]
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
this✝¹ : NormalSpace ((forget CompHaus).obj Y)
φ : 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 ↑(Set.Icc 0 1))
this : T2Space (ULift ↑(Set.Icc 0 1))
Z : CompHaus := of (ULift ↑(Set.Icc 0 1))
g : Y ⟶ Z := ContinuousMap.mk fun y' => { down := { val := ↑φ y', property := (_ : ↑φ y' ∈ Set.Icc 0 1) } }
h : Y ⟶ Z := ContinuousMap.mk fun x => { down := { val := 0, property := (_ : 0 ∈ Set.Icc 0 1) } }
⊢ h = g
[PROOFSTEP]
rw [← cancel_epi f]
[GOAL]
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
this✝¹ : NormalSpace ((forget CompHaus).obj Y)
φ : 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 ↑(Set.Icc 0 1))
this : T2Space (ULift ↑(Set.Icc 0 1))
Z : CompHaus := of (ULift ↑(Set.Icc 0 1))
g : Y ⟶ Z := ContinuousMap.mk fun y' => { down := { val := ↑φ y', property := (_ : ↑φ y' ∈ Set.Icc 0 1) } }
h : Y ⟶ Z := ContinuousMap.mk fun x => { down := { val := 0, property := (_ : 0 ∈ Set.Icc 0 1) } }
⊢ f ≫ h = f ≫ g
[PROOFSTEP]
ext x
[GOAL]
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
this✝¹ : NormalSpace ((forget CompHaus).obj Y)
φ : 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 ↑(Set.Icc 0 1))
this : T2Space (ULift ↑(Set.Icc 0 1))
Z : CompHaus := of (ULift ↑(Set.Icc 0 1))
g : Y ⟶ Z := ContinuousMap.mk fun y' => { down := { val := ↑φ y', property := (_ : ↑φ y' ∈ Set.Icc 0 1) } }
h : Y ⟶ Z := ContinuousMap.mk fun x => { down := { val := 0, property := (_ : 0 ∈ Set.Icc 0 1) } }
x : (forget CompHaus).obj X
⊢ ↑(f ≫ h) x = ↑(f ≫ g) x
[PROOFSTEP]
apply ULift.ext
[GOAL]
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
this✝¹ : NormalSpace ((forget CompHaus).obj Y)
φ : 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 ↑(Set.Icc 0 1))
this : T2Space (ULift ↑(Set.Icc 0 1))
Z : CompHaus := of (ULift ↑(Set.Icc 0 1))
g : Y ⟶ Z := ContinuousMap.mk fun y' => { down := { val := ↑φ y', property := (_ : ↑φ y' ∈ Set.Icc 0 1) } }
h : Y ⟶ Z := ContinuousMap.mk fun x => { down := { val := 0, property := (_ : 0 ∈ Set.Icc 0 1) } }
x : (forget CompHaus).obj X
⊢ (↑(f ≫ h) x).down = (↑(f ≫ g) x).down
[PROOFSTEP]
apply Subtype.ext
[GOAL]
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
this✝¹ : NormalSpace ((forget CompHaus).obj Y)
φ : 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 ↑(Set.Icc 0 1))
this : T2Space (ULift ↑(Set.Icc 0 1))
Z : CompHaus := of (ULift ↑(Set.Icc 0 1))
g : Y ⟶ Z := ContinuousMap.mk fun y' => { down := { val := ↑φ y', property := (_ : ↑φ y' ∈ Set.Icc 0 1) } }
h : Y ⟶ Z := ContinuousMap.mk fun x => { down := { val := 0, property := (_ : 0 ∈ Set.Icc 0 1) } }
x : (forget CompHaus).obj X
⊢ ↑(↑(f ≫ h) x).down = ↑(↑(f ≫ g) x).down
[PROOFSTEP]
dsimp
  -- Porting note: This `change` is not ideal.
        -- I think lean is having issues understanding when a `ContinuousMap` should be considered
        -- as a morphism.
        -- TODO(?): Make morphisms in `CompHaus` (and other topological categories)
        -- into a one-field-structure.
[GOAL]
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
this✝¹ : NormalSpace ((forget CompHaus).obj Y)
φ : 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 ↑(Set.Icc 0 1))
this : T2Space (ULift ↑(Set.Icc 0 1))
Z : CompHaus := of (ULift ↑(Set.Icc 0 1))
g : Y ⟶ Z := ContinuousMap.mk fun y' => { down := { val := ↑φ y', property := (_ : ↑φ y' ∈ Set.Icc 0 1) } }
h : Y ⟶ Z := ContinuousMap.mk fun x => { down := { val := 0, property := (_ : 0 ∈ Set.Icc 0 1) } }
x : (forget CompHaus).obj X
⊢ ↑(↑(f ≫ ContinuousMap.mk fun x => { down := { val := 0, property := (_ : 0 ∈ Set.Icc 0 1) } }) x).down =
    ↑(↑(f ≫ ContinuousMap.mk fun y' => { down := { val := ↑φ y', property := (_ : ↑φ y' ∈ Set.Icc 0 1) } }) x).down
[PROOFSTEP]
change 0 = φ (f x)
[GOAL]
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
this✝¹ : NormalSpace ((forget CompHaus).obj Y)
φ : 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 ↑(Set.Icc 0 1))
this : T2Space (ULift ↑(Set.Icc 0 1))
Z : CompHaus := of (ULift ↑(Set.Icc 0 1))
g : Y ⟶ Z := ContinuousMap.mk fun y' => { down := { val := ↑φ y', property := (_ : ↑φ y' ∈ Set.Icc 0 1) } }
h : Y ⟶ Z := ContinuousMap.mk fun x => { down := { val := 0, property := (_ : 0 ∈ Set.Icc 0 1) } }
x : (forget CompHaus).obj X
⊢ 0 = ↑φ (↑f x)
[PROOFSTEP]
simp only [hφ0 (Set.mem_range_self x), Pi.zero_apply]
[GOAL]
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
this✝¹ : NormalSpace ((forget CompHaus).obj Y)
φ : 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 ↑(Set.Icc 0 1))
this : T2Space (ULift ↑(Set.Icc 0 1))
Z : CompHaus := of (ULift ↑(Set.Icc 0 1))
g : Y ⟶ Z := ContinuousMap.mk fun y' => { down := { val := ↑φ y', property := (_ : ↑φ y' ∈ Set.Icc 0 1) } }
h : Y ⟶ Z := ContinuousMap.mk fun x => { down := { val := 0, property := (_ : 0 ∈ Set.Icc 0 1) } }
H : h = g
⊢ False
[PROOFSTEP]
apply_fun fun e => (e y).down.1 at H 
[GOAL]
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
this✝¹ : NormalSpace ((forget CompHaus).obj Y)
φ : 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 ↑(Set.Icc 0 1))
this : T2Space (ULift ↑(Set.Icc 0 1))
Z : CompHaus := of (ULift ↑(Set.Icc 0 1))
g : Y ⟶ Z := ContinuousMap.mk fun y' => { down := { val := ↑φ y', property := (_ : ↑φ y' ∈ Set.Icc 0 1) } }
h : Y ⟶ Z := ContinuousMap.mk fun x => { down := { val := 0, property := (_ : 0 ∈ Set.Icc 0 1) } }
H : ↑(↑h y).down = ↑(↑g y).down
⊢ False
[PROOFSTEP]
dsimp at H 
[GOAL]
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
this✝¹ : NormalSpace ((forget CompHaus).obj Y)
φ : 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 ↑(Set.Icc 0 1))
this : T2Space (ULift ↑(Set.Icc 0 1))
Z : CompHaus := of (ULift ↑(Set.Icc 0 1))
g : Y ⟶ Z := ContinuousMap.mk fun y' => { down := { val := ↑φ y', property := (_ : ↑φ y' ∈ Set.Icc 0 1) } }
h : Y ⟶ Z := ContinuousMap.mk fun x => { down := { val := 0, property := (_ : 0 ∈ Set.Icc 0 1) } }
H :
  ↑(↑(ContinuousMap.mk fun x => { down := { val := 0, property := (_ : 0 ∈ Set.Icc 0 1) } }) y).down =
    ↑(↑(ContinuousMap.mk fun y' => { down := { val := ↑φ y', property := (_ : ↑φ y' ∈ Set.Icc 0 1) } }) y).down
⊢ False
[PROOFSTEP]
change 0 = φ y at H 
[GOAL]
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
this✝¹ : NormalSpace ((forget CompHaus).obj Y)
φ : 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 ↑(Set.Icc 0 1))
this : T2Space (ULift ↑(Set.Icc 0 1))
Z : CompHaus := of (ULift ↑(Set.Icc 0 1))
g : Y ⟶ Z := ContinuousMap.mk fun y' => { down := { val := ↑φ y', property := (_ : ↑φ y' ∈ Set.Icc 0 1) } }
h : Y ⟶ Z := ContinuousMap.mk fun x => { down := { val := 0, property := (_ : 0 ∈ Set.Icc 0 1) } }
H : 0 = ↑φ y
⊢ False
[PROOFSTEP]
simp only [hφ1 (Set.mem_singleton y), Pi.one_apply] at H 
[GOAL]
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
this✝¹ : NormalSpace ((forget CompHaus).obj Y)
φ : 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 ↑(Set.Icc 0 1))
this : T2Space (ULift ↑(Set.Icc 0 1))
Z : CompHaus := of (ULift ↑(Set.Icc 0 1))
g : Y ⟶ Z := ContinuousMap.mk fun y' => { down := { val := ↑φ y', property := (_ : ↑φ y' ∈ Set.Icc 0 1) } }
h : Y ⟶ Z := ContinuousMap.mk fun x => { down := { val := 0, property := (_ : 0 ∈ Set.Icc 0 1) } }
H : 0 = 1
⊢ False
[PROOFSTEP]
exact zero_ne_one H
[GOAL]
case mpr
X Y : CompHaus
f : X ⟶ Y
⊢ Function.Surjective ↑f → Epi f
[PROOFSTEP]
rw [← CategoryTheory.epi_iff_surjective]
[GOAL]
case mpr
X Y : CompHaus
f : X ⟶ Y
⊢ Epi ↑f → Epi f
[PROOFSTEP]
apply (forget CompHaus).epi_of_epi_map
[GOAL]
X Y : CompHaus
f : X ⟶ Y
⊢ Mono f ↔ Function.Injective ↑f
[PROOFSTEP]
constructor
[GOAL]
case mp
X Y : CompHaus
f : X ⟶ Y
⊢ Mono f → Function.Injective ↑f
[PROOFSTEP]
intro hf x₁ x₂ h
[GOAL]
case mp
X Y : CompHaus
f : X ⟶ Y
hf : Mono f
x₁ x₂ : (forget CompHaus).obj X
h : ↑f x₁ = ↑f x₂
⊢ x₁ = x₂
[PROOFSTEP]
let g₁ : of PUnit ⟶ X := ⟨fun _ => x₁, continuous_const⟩
[GOAL]
case mp
X Y : CompHaus
f : X ⟶ Y
hf : Mono f
x₁ x₂ : (forget CompHaus).obj X
h : ↑f x₁ = ↑f x₂
g₁ : of PUnit ⟶ X := ContinuousMap.mk fun x => x₁
⊢ x₁ = x₂
[PROOFSTEP]
let g₂ : of PUnit ⟶ X := ⟨fun _ => x₂, continuous_const⟩
[GOAL]
case mp
X Y : CompHaus
f : X ⟶ Y
hf : Mono f
x₁ x₂ : (forget CompHaus).obj X
h : ↑f x₁ = ↑f x₂
g₁ : of PUnit ⟶ X := ContinuousMap.mk fun x => x₁
g₂ : of PUnit ⟶ X := ContinuousMap.mk fun x => x₂
⊢ x₁ = x₂
[PROOFSTEP]
have : g₁ ≫ f = g₂ ≫ f := by
  ext
  exact h
[GOAL]
X Y : CompHaus
f : X ⟶ Y
hf : Mono f
x₁ x₂ : (forget CompHaus).obj X
h : ↑f x₁ = ↑f x₂
g₁ : of PUnit ⟶ X := ContinuousMap.mk fun x => x₁
g₂ : of PUnit ⟶ X := ContinuousMap.mk fun x => x₂
⊢ g₁ ≫ f = g₂ ≫ f
[PROOFSTEP]
ext
[GOAL]
case w
X Y : CompHaus
f : X ⟶ Y
hf : Mono f
x₁ x₂ : (forget CompHaus).obj X
h : ↑f x₁ = ↑f x₂
g₁ : of PUnit ⟶ X := ContinuousMap.mk fun x => x₁
g₂ : of PUnit ⟶ X := ContinuousMap.mk fun x => x₂
x✝ : (forget CompHaus).obj (of PUnit)
⊢ ↑(g₁ ≫ f) x✝ = ↑(g₂ ≫ f) x✝
[PROOFSTEP]
exact h
[GOAL]
case mp
X Y : CompHaus
f : X ⟶ Y
hf : Mono f
x₁ x₂ : (forget CompHaus).obj X
h : ↑f x₁ = ↑f x₂
g₁ : of PUnit ⟶ X := ContinuousMap.mk fun x => x₁
g₂ : of PUnit ⟶ X := ContinuousMap.mk fun x => x₂
this : g₁ ≫ f = g₂ ≫ f
⊢ x₁ = x₂
[PROOFSTEP]
rw [cancel_mono] at this 
[GOAL]
case mp
X Y : CompHaus
f : X ⟶ Y
hf : Mono f
x₁ x₂ : (forget CompHaus).obj X
h : ↑f x₁ = ↑f x₂
g₁ : of PUnit ⟶ X := ContinuousMap.mk fun x => x₁
g₂ : of PUnit ⟶ X := ContinuousMap.mk fun x => x₂
this : g₁ = g₂
⊢ x₁ = x₂
[PROOFSTEP]
apply_fun fun e => e PUnit.unit at this 
[GOAL]
case mp
X Y : CompHaus
f : X ⟶ Y
hf : Mono f
x₁ x₂ : (forget CompHaus).obj X
h : ↑f x₁ = ↑f x₂
g₁ : of PUnit ⟶ X := ContinuousMap.mk fun x => x₁
g₂ : of PUnit ⟶ X := ContinuousMap.mk fun x => x₂
this : ↑g₁ PUnit.unit = ↑g₂ PUnit.unit
⊢ x₁ = x₂
[PROOFSTEP]
exact this
[GOAL]
case mpr
X Y : CompHaus
f : X ⟶ Y
⊢ Function.Injective ↑f → Mono f
[PROOFSTEP]
rw [← CategoryTheory.mono_iff_injective]
[GOAL]
case mpr
X Y : CompHaus
f : X ⟶ Y
⊢ Mono ↑f → Mono f
[PROOFSTEP]
apply (forget CompHaus).mono_of_mono_map
