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

tactic: refine ⟨fun _ ↦ ?_, fun hπ ↦ ⟨⟨effectiveEpiStructOfQuotientMap π hπ⟩⟩⟩
state_before: B X : TopCat
π : X ⟶ B
⊢ EffectiveEpi π ↔ QuotientMap ⇑π
state_after: B X : TopCat
π : X ⟶ B
x✝ : EffectiveEpi π
⊢ QuotientMap ⇑π

tactic: have hπ : RegularEpi π := inferInstance
state_before: B X : TopCat
π : X ⟶ B
x✝ : EffectiveEpi π
⊢ QuotientMap ⇑π
state_after: B X : TopCat
π : X ⟶ B
x✝ : EffectiveEpi π
hπ : RegularEpi π
⊢ QuotientMap ⇑π

tactic: let F := parallelPair hπ.left hπ.right
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 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
⊢ 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: 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 ⇑π
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: constructor
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: 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))
this : QuotientMap (⇑(homeoOfIso i) ∘ ⇑π)
⊢ QuotientMap ⇑π
state_after: no goals

tactic: change Function.Surjective (π ≫ i.hom)
state_before: 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) ∘ ⇑π)
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 ⇑(π ≫ i.hom)

tactic: rw [← epi_iff_surjective]
state_before: 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 ⇑(π ≫ i.hom)
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))
⊢ Epi (π ≫ i.hom)

tactic: infer_instance
state_before: 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))
⊢ Epi (π ≫ i.hom)
state_after: no goals

tactic: ext U
state_before: 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
state_after: case right.a.h.a
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))
U : Set ↑(colimit F)
⊢ IsOpen U ↔ IsOpen U

tactic: have : π ≫ i.hom = colimit.ι F WalkingParallelPair.one := by simp [i, ← Iso.eq_comp_inv]
state_before: case right.a.h.a
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))
U : Set ↑(colimit F)
⊢ IsOpen U ↔ IsOpen U
state_after: case right.a.h.a
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))
U : Set ↑(colimit F)
this : π ≫ i.hom = colimit.ι F WalkingParallelPair.one
⊢ IsOpen U ↔ IsOpen U

tactic: rw [isOpen_coinduced (f := (homeoOfIso i ∘ π)), coequalizer_isOpen_iff _ U, ← this]
state_before: case right.a.h.a
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))
U : Set ↑(colimit F)
this : π ≫ i.hom = colimit.ι F WalkingParallelPair.one
⊢ IsOpen U ↔ IsOpen U
state_after: case right.a.h.a
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))
U : Set ↑(colimit F)
this : π ≫ i.hom = colimit.ι F WalkingParallelPair.one
⊢ IsOpen (⇑(π ≫ i.hom) ⁻¹' U) ↔ IsOpen (⇑(homeoOfIso i) ∘ ⇑π ⁻¹' U)

tactic: rfl
state_before: case right.a.h.a
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))
U : Set ↑(colimit F)
this : π ≫ i.hom = colimit.ι F WalkingParallelPair.one
⊢ IsOpen (⇑(π ≫ i.hom) ⁻¹' U) ↔ IsOpen (⇑(homeoOfIso i) ∘ ⇑π ⁻¹' U)
state_after: no goals

tactic: simp [i, ← Iso.eq_comp_inv]
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))
U : Set ↑(colimit F)
⊢ π ≫ i.hom = colimit.ι F WalkingParallelPair.one
state_after: no goals