Theorem: TopCat.effectiveEpi_iff_quotientMap
File: Mathlib/Topology/Category/TopCat/EffectiveEpi.lean

Proof steps:
state_before: B X : TopCat
π : X ⟶ B
⊢ EffectiveEpi π ↔ QuotientMap ⇑π
state_after: B X : TopCat
π : X ⟶ B
x✝ : EffectiveEpi π
⊢ QuotientMap ⇑π
tactic: refine ⟨fun _ ↦ ?_, fun hπ ↦ ⟨⟨effectiveEpiStructOfQuotientMap π hπ⟩⟩⟩
state_before: B X : TopCat
π : X ⟶ B
x✝ : EffectiveEpi π
⊢ QuotientMap ⇑π
state_after: B X : TopCat
π : X ⟶ B
x✝ : EffectiveEpi π
hπ : RegularEpi π
⊢ QuotientMap ⇑π
tactic: have hπ : RegularEpi π := inferInstance
state_before: B X : TopCat
π : X ⟶ B
x✝ : EffectiveEpi π
hπ : RegularEpi π
⊢ QuotientMap ⇑π
state_after: B X : TopCat
π : X ⟶ B
x✝ : EffectiveEpi π
hπ : RegularEpi π
F : WalkingParallelPair ⥤ TopCat := parallelPair RegularEpi.left RegularEpi.right
⊢ QuotientMap ⇑π
tactic: let F := parallelPair hπ.left hπ.right
state_before: B X : TopCat
π : X ⟶ B
x✝ : EffectiveEpi π
hπ : RegularEpi π
F : WalkingParallelPair ⥤ TopCat := parallelPair RegularEpi.left RegularEpi.right
⊢ QuotientMap ⇑π
state_after: B X : TopCat
π : X ⟶ B
x✝ : EffectiveEpi π
hπ : RegularEpi π
F : WalkingParallelPair ⥤ TopCat := parallelPair RegularEpi.left RegularEpi.right
i : B ≅ colimit F :=
  RegularEpi.isColimit.coconePointUniqueUpToIso (colimit.isColimit (parallelPair RegularEpi.left RegularEpi.right))
⊢ QuotientMap ⇑π
tactic: let i : B ≅ colimit F := hπ.isColimit.coconePointUniqueUpToIso (colimit.isColimit _)
state_before: B X : TopCat
π : X ⟶ B
x✝ : EffectiveEpi π
hπ : RegularEpi π
F : WalkingParallelPair ⥤ TopCat := parallelPair RegularEpi.left RegularEpi.right
i : B ≅ colimit F :=
  RegularEpi.isColimit.coconePointUniqueUpToIso (colimit.isColimit (parallelPair RegularEpi.left RegularEpi.right))
⊢ QuotientMap ⇑π
state_after: B X : TopCat
π : X ⟶ B
x✝ : EffectiveEpi π
hπ : RegularEpi π
F : WalkingParallelPair ⥤ TopCat := parallelPair RegularEpi.left RegularEpi.right
i : B ≅ colimit F :=
  RegularEpi.isColimit.coconePointUniqueUpToIso (colimit.isColimit (parallelPair RegularEpi.left RegularEpi.right))
⊢ QuotientMap (⇑(homeoOfIso i) ∘ ⇑π)
tactic: suffices QuotientMap (homeoOfIso i ∘ π) by
    simpa [← Function.comp.assoc] using (homeoOfIso i).symm.quotientMap.comp this
state_before: B X : TopCat
π : X ⟶ B
x✝ : EffectiveEpi π
hπ : RegularEpi π
F : WalkingParallelPair ⥤ TopCat := parallelPair RegularEpi.left RegularEpi.right
i : B ≅ colimit F :=
  RegularEpi.isColimit.coconePointUniqueUpToIso (colimit.isColimit (parallelPair RegularEpi.left RegularEpi.right))
⊢ QuotientMap (⇑(homeoOfIso i) ∘ ⇑π)
state_after: case left
B X : TopCat
π : X ⟶ B
x✝ : EffectiveEpi π
hπ : RegularEpi π
F : WalkingParallelPair ⥤ TopCat := parallelPair RegularEpi.left RegularEpi.right
i : B ≅ colimit F :=
  RegularEpi.isColimit.coconePointUniqueUpToIso (colimit.isColimit (parallelPair RegularEpi.left RegularEpi.right))
⊢ Function.Surjective (⇑(homeoOfIso i) ∘ ⇑π)

case right
B X : TopCat
π : X ⟶ B
x✝ : EffectiveEpi π
hπ : RegularEpi π
F : WalkingParallelPair ⥤ TopCat := parallelPair RegularEpi.left RegularEpi.right
i : B ≅ colimit F :=
  RegularEpi.isColimit.coconePointUniqueUpToIso (colimit.isColimit (parallelPair RegularEpi.left RegularEpi.right))
⊢ (colimit F).topologicalSpace_coe = TopologicalSpace.coinduced (⇑(homeoOfIso i) ∘ ⇑π) X.topologicalSpace_coe
tactic: constructor