Theorem: TopCat.GlueData.isOpen_iff
File: Mathlib/Topology/Gluing.lean

Proof steps:
state_before: D : GlueData
U : Set ↑D.glued
⊢ IsOpen U ↔ ∀ (i : D.J), IsOpen (⇑(D.ι i) ⁻¹' U)
state_after: D : GlueData
U : Set ↑D.glued
⊢ IsOpen U ↔ ∀ (i : D.J), IsOpen (⇑(Multicoequalizer.π D.diagram i) ⁻¹' U)
tactic: delta CategoryTheory.GlueData.ι
state_before: D : GlueData
U : Set ↑D.glued
⊢ IsOpen U ↔ ∀ (i : D.J), IsOpen (⇑(Multicoequalizer.π D.diagram i) ⁻¹' U)
state_after: D : GlueData
U : Set ↑D.glued
⊢ IsOpen U ↔ ∀ (i : D.J), IsOpen (⇑(Sigma.ι D.diagram.right i ≫ Multicoequalizer.sigmaπ D.diagram) ⁻¹' U)
tactic: simp_rw [← Multicoequalizer.ι_sigmaπ 𝖣.diagram]
state_before: D : GlueData
U : Set ↑D.glued
⊢ IsOpen U ↔ ∀ (i : D.J), IsOpen (⇑(Sigma.ι D.diagram.right i ≫ Multicoequalizer.sigmaπ D.diagram) ⁻¹' U)
state_after: D : GlueData
U : Set ↑D.glued
⊢ IsOpen (⇑(homeoOfIso (Multicoequalizer.isoCoequalizer D.diagram).symm) ⁻¹' U) ↔
    ∀ (i : D.J), IsOpen (⇑(Sigma.ι D.diagram.right i ≫ Multicoequalizer.sigmaπ D.diagram) ⁻¹' U)
tactic: rw [← (homeoOfIso (Multicoequalizer.isoCoequalizer 𝖣.diagram).symm).isOpen_preimage]
state_before: D : GlueData
U : Set ↑D.glued
⊢ IsOpen (⇑(homeoOfIso (Multicoequalizer.isoCoequalizer D.diagram).symm) ⁻¹' U) ↔
    ∀ (i : D.J), IsOpen (⇑(Sigma.ι D.diagram.right i ≫ Multicoequalizer.sigmaπ D.diagram) ⁻¹' U)
state_after: D : GlueData
U : Set ↑D.glued
⊢ IsOpen
      (⇑(colimit.ι (parallelPair D.diagram.fstSigmaMap D.diagram.sndSigmaMap) WalkingParallelPair.one) ⁻¹'
        (⇑(homeoOfIso (Multicoequalizer.isoCoequalizer D.diagram).symm) ⁻¹' U)) ↔
    ∀ (i : D.J), IsOpen (⇑(Sigma.ι D.diagram.right i ≫ Multicoequalizer.sigmaπ D.diagram) ⁻¹' U)
tactic: rw [coequalizer_isOpen_iff]
state_before: D : GlueData
U : Set ↑D.glued
⊢ IsOpen
      (⇑(colimit.ι (parallelPair D.diagram.fstSigmaMap D.diagram.sndSigmaMap) WalkingParallelPair.one) ⁻¹'
        (⇑(homeoOfIso (Multicoequalizer.isoCoequalizer D.diagram).symm) ⁻¹' U)) ↔
    ∀ (i : D.J), IsOpen (⇑(Sigma.ι D.diagram.right i ≫ Multicoequalizer.sigmaπ D.diagram) ⁻¹' U)
state_after: D : GlueData
U : Set ↑D.glued
⊢ IsOpen
      (⇑(colimit.ι (parallelPair D.diagram.fstSigmaMap D.diagram.sndSigmaMap) WalkingParallelPair.one) ⁻¹'
        (⇑(homeoOfIso (Multicoequalizer.isoCoequalizer D.diagram).symm) ⁻¹' U)) ↔
    ∀ (i : D.J), IsOpen (⇑(Sigma.ι D.U i ≫ Multicoequalizer.sigmaπ D.diagram) ⁻¹' U)
tactic: dsimp only [GlueData.diagram_l, GlueData.diagram_left, GlueData.diagram_r, GlueData.diagram_right,
    parallelPair_obj_one]
state_before: D : GlueData
U : Set ↑D.glued
⊢ IsOpen
      (⇑(colimit.ι (parallelPair D.diagram.fstSigmaMap D.diagram.sndSigmaMap) WalkingParallelPair.one) ⁻¹'
        (⇑(homeoOfIso (Multicoequalizer.isoCoequalizer D.diagram).symm) ⁻¹' U)) ↔
    ∀ (i : D.J), IsOpen (⇑(Sigma.ι D.U i ≫ Multicoequalizer.sigmaπ D.diagram) ⁻¹' U)
state_after: D : GlueData
U : Set ↑D.glued
⊢ (∀ (j : Discrete D.J),
      IsOpen
        (⇑(colimit.ι (Discrete.functor D.U) j) ⁻¹'
          (⇑(colimit.ι (parallelPair D.diagram.fstSigmaMap D.diagram.sndSigmaMap) WalkingParallelPair.one) ⁻¹'
            (⇑(homeoOfIso (Multicoequalizer.isoCoequalizer D.diagram).symm) ⁻¹' U)))) ↔
    ∀ (i : D.J), IsOpen (⇑(Sigma.ι D.U i ≫ Multicoequalizer.sigmaπ D.diagram) ⁻¹' U)
tactic: rw [colimit_isOpen_iff.{_,u}]
state_before: D : GlueData
U : Set ↑D.glued
⊢ (∀ (j : Discrete D.J),
      IsOpen
        (⇑(colimit.ι (Discrete.functor D.U) j) ⁻¹'
          (⇑(colimit.ι (parallelPair D.diagram.fstSigmaMap D.diagram.sndSigmaMap) WalkingParallelPair.one) ⁻¹'
            (⇑(homeoOfIso (Multicoequalizer.isoCoequalizer D.diagram).symm) ⁻¹' U)))) ↔
    ∀ (i : D.J), IsOpen (⇑(Sigma.ι D.U i ≫ Multicoequalizer.sigmaπ D.diagram) ⁻¹' U)
state_after: case mp
D : GlueData
U : Set ↑D.glued
⊢ (∀ (j : Discrete D.J),
      IsOpen
        (⇑(colimit.ι (Discrete.functor D.U) j) ⁻¹'
          (⇑(colimit.ι (parallelPair D.diagram.fstSigmaMap D.diagram.sndSigmaMap) WalkingParallelPair.one) ⁻¹'
            (⇑(homeoOfIso (Multicoequalizer.isoCoequalizer D.diagram).symm) ⁻¹' U)))) →
    ∀ (i : D.J), IsOpen (⇑(Sigma.ι D.U i ≫ Multicoequalizer.sigmaπ D.diagram) ⁻¹' U)

case mpr
D : GlueData
U : Set ↑D.glued
⊢ (∀ (i : D.J), IsOpen (⇑(Sigma.ι D.U i ≫ Multicoequalizer.sigmaπ D.diagram) ⁻¹' U)) →
    ∀ (j : Discrete D.J),
      IsOpen
        (⇑(colimit.ι (Discrete.functor D.U) j) ⁻¹'
          (⇑(colimit.ι (parallelPair D.diagram.fstSigmaMap D.diagram.sndSigmaMap) WalkingParallelPair.one) ⁻¹'
            (⇑(homeoOfIso (Multicoequalizer.isoCoequalizer D.diagram).symm) ⁻¹' U)))
tactic: constructor