Theorem: AlgebraicGeometry.PresheafedSpace.GlueData.ι_image_preimage_eq
File: Mathlib/Geometry/RingedSpace/PresheafedSpace/Gluing.lean

tactic: ext1
state_before: C : Type u
inst✝¹ : Category.{v, u} C
D : GlueData C
inst✝ : HasLimits C
i j : D.J
U : Opens ↑↑(D.U i)
⊢ (Opens.map (D.ι j).base).obj (⋯.functor.obj U) =
    (opensFunctor (D.f j i)).obj ((Opens.map (D.t j i).base).obj ((Opens.map (D.f i j).base).obj U))
state_after: case h
C : Type u
inst✝¹ : Category.{v, u} C
D : GlueData C
inst✝ : HasLimits C
i j : D.J
U : Opens ↑↑(D.U i)
⊢ ↑((Opens.map (D.ι j).base).obj (⋯.functor.obj U)) =
    ↑((opensFunctor (D.f j i)).obj ((Opens.map (D.t j i).base).obj ((Opens.map (D.f i j).base).obj U)))

tactic: dsimp only [Opens.map_coe, IsOpenMap.functor_obj_coe]
state_before: case h
C : Type u
inst✝¹ : Category.{v, u} C
D : GlueData C
inst✝ : HasLimits C
i j : D.J
U : Opens ↑↑(D.U i)
⊢ ↑((Opens.map (D.ι j).base).obj (⋯.functor.obj U)) =
    ↑((opensFunctor (D.f j i)).obj ((Opens.map (D.t j i).base).obj ((Opens.map (D.f i j).base).obj U)))
state_after: case h
C : Type u
inst✝¹ : Category.{v, u} C
D : GlueData C
inst✝ : HasLimits C
i j : D.J
U : Opens ↑↑(D.U i)
⊢ ⇑(D.ι j).base ⁻¹' (⇑(D.ι i).base '' ↑U) = ⇑(D.f j i).base '' (⇑(D.t j i).base ⁻¹' (⇑(D.f i j).base ⁻¹' ↑U))

tactic: rw [← show _ = (𝖣.ι i).base from 𝖣.ι_gluedIso_inv (PresheafedSpace.forget _) i, ←
  show _ = (𝖣.ι j).base from 𝖣.ι_gluedIso_inv (PresheafedSpace.forget _) j]
state_before: case h
C : Type u
inst✝¹ : Category.{v, u} C
D : GlueData C
inst✝ : HasLimits C
i j : D.J
U : Opens ↑↑(D.U i)
⊢ ⇑(D.ι j).base ⁻¹' (⇑(D.ι i).base '' ↑U) = ⇑(D.f j i).base '' (⇑(D.t j i).base ⁻¹' (⇑(D.f i j).base ⁻¹' ↑U))
state_after: case h
C : Type u
inst✝¹ : Category.{v, u} C
D : GlueData C
inst✝ : HasLimits C
i j : D.J
U : Opens ↑↑(D.U i)
⊢ ⇑((D.mapGlueData (forget C)).ι j ≫ (D.gluedIso (forget C)).inv) ⁻¹'
      (⇑((D.mapGlueData (forget C)).ι i ≫ (D.gluedIso (forget C)).inv) '' ↑U) =
    ⇑(D.f j i).base '' (⇑(D.t j i).base ⁻¹' (⇑(D.f i j).base ⁻¹' ↑U))

tactic: erw [coe_comp, coe_comp, coe_comp]
state_before: case h
C : Type u
inst✝¹ : Category.{v, u} C
D : GlueData C
inst✝ : HasLimits C
i j : D.J
U : Opens ↑↑(D.U i)
⊢ ⇑((D.mapGlueData (forget C)).ι j ≫ (D.gluedIso (forget C)).inv) ⁻¹'
      (⇑((D.mapGlueData (forget C)).ι i ≫ (D.gluedIso (forget C)).inv) '' ↑U) =
    ⇑(D.f j i).base '' (⇑(D.t j i).base ⁻¹' (⇑(D.f i j).base ⁻¹' ↑U))
state_after: case h
C : Type u
inst✝¹ : Category.{v, u} C
D : GlueData C
inst✝ : HasLimits C
i j : D.J
U : Opens ↑↑(D.U i)
⊢ (⇑(preservesColimitIso (forget C) D.diagram.multispan).inv ∘
          ⇑(HasColimit.isoOfNatIso (D.diagramIso (forget C))).inv) ∘
        ⇑((D.mapGlueData (forget C)).ι j) ⁻¹'
      (⇑(D.gluedIso (forget C)).inv ∘ ⇑((D.mapGlueData (forget C)).ι i) '' ↑U) =
    ⇑(D.f j i).base '' (⇑(D.t j i).base ⁻¹' (⇑(D.f i j).base ⁻¹' ↑U))

tactic: rw [Set.image_comp, Set.preimage_comp]
state_before: case h
C : Type u
inst✝¹ : Category.{v, u} C
D : GlueData C
inst✝ : HasLimits C
i j : D.J
U : Opens ↑↑(D.U i)
⊢ (⇑(preservesColimitIso (forget C) D.diagram.multispan).inv ∘
          ⇑(HasColimit.isoOfNatIso (D.diagramIso (forget C))).inv) ∘
        ⇑((D.mapGlueData (forget C)).ι j) ⁻¹'
      (⇑(D.gluedIso (forget C)).inv ∘ ⇑((D.mapGlueData (forget C)).ι i) '' ↑U) =
    ⇑(D.f j i).base '' (⇑(D.t j i).base ⁻¹' (⇑(D.f i j).base ⁻¹' ↑U))
state_after: case h
C : Type u
inst✝¹ : Category.{v, u} C
D : GlueData C
inst✝ : HasLimits C
i j : D.J
U : Opens ↑↑(D.U i)
⊢ ⇑((D.mapGlueData (forget C)).ι j) ⁻¹'
      (⇑(preservesColimitIso (forget C) D.diagram.multispan).inv ∘
          ⇑(HasColimit.isoOfNatIso (D.diagramIso (forget C))).inv ⁻¹'
        (⇑(D.gluedIso (forget C)).inv '' (⇑((D.mapGlueData (forget C)).ι i) '' ↑U))) =
    ⇑(D.f j i).base '' (⇑(D.t j i).base ⁻¹' (⇑(D.f i j).base ⁻¹' ↑U))

tactic: erw [Set.preimage_image_eq]
state_before: case h
C : Type u
inst✝¹ : Category.{v, u} C
D : GlueData C
inst✝ : HasLimits C
i j : D.J
U : Opens ↑↑(D.U i)
⊢ ⇑((D.mapGlueData (forget C)).ι j) ⁻¹'
      (⇑(preservesColimitIso (forget C) D.diagram.multispan).inv ∘
          ⇑(HasColimit.isoOfNatIso (D.diagramIso (forget C))).inv ⁻¹'
        (⇑(D.gluedIso (forget C)).inv '' (⇑((D.mapGlueData (forget C)).ι i) '' ↑U))) =
    ⇑(D.f j i).base '' (⇑(D.t j i).base ⁻¹' (⇑(D.f i j).base ⁻¹' ↑U))
state_after: case h
C : Type u
inst✝¹ : Category.{v, u} C
D : GlueData C
inst✝ : HasLimits C
i j : D.J
U : Opens ↑↑(D.U i)
⊢ ⇑((D.mapGlueData (forget C)).ι j) ⁻¹' (⇑((D.mapGlueData (forget C)).ι i) '' ↑U) =
    ⇑(D.f j i).base '' (⇑(D.t j i).base ⁻¹' (⇑(D.f i j).base ⁻¹' ↑U))

case h.h
C : Type u
inst✝¹ : Category.{v, u} C
D : GlueData C
inst✝ : HasLimits C
i j : D.J
U : Opens ↑↑(D.U i)
⊢ Function.Injective
    (⇑(preservesColimitIso (forget C) D.diagram.multispan).inv ∘
      ⇑(HasColimit.isoOfNatIso (D.diagramIso (forget C))).inv)

tactic: refine Eq.trans (D.toTopGlueData.preimage_image_eq_image' _ _ _) ?_
state_before: case h
C : Type u
inst✝¹ : Category.{v, u} C
D : GlueData C
inst✝ : HasLimits C
i j : D.J
U : Opens ↑↑(D.U i)
⊢ ⇑((D.mapGlueData (forget C)).ι j) ⁻¹' (⇑((D.mapGlueData (forget C)).ι i) '' ↑U) =
    ⇑(D.f j i).base '' (⇑(D.t j i).base ⁻¹' (⇑(D.f i j).base ⁻¹' ↑U))
state_after: case h
C : Type u
inst✝¹ : Category.{v, u} C
D : GlueData C
inst✝ : HasLimits C
i j : D.J
U : Opens ↑↑(D.U i)
⊢ ⇑(D.toTopGlueData.t i j ≫ D.toTopGlueData.f j i) '' (⇑(D.toTopGlueData.f i j) ⁻¹' ↑U) =
    ⇑(D.f j i).base '' (⇑(D.t j i).base ⁻¹' (⇑(D.f i j).base ⁻¹' ↑U))

tactic: dsimp
state_before: case h
C : Type u
inst✝¹ : Category.{v, u} C
D : GlueData C
inst✝ : HasLimits C
i j : D.J
U : Opens ↑↑(D.U i)
⊢ ⇑(D.toTopGlueData.t i j ≫ D.toTopGlueData.f j i) '' (⇑(D.toTopGlueData.f i j) ⁻¹' ↑U) =
    ⇑(D.f j i).base '' (⇑(D.t j i).base ⁻¹' (⇑(D.f i j).base ⁻¹' ↑U))
state_after: case h
C : Type u
inst✝¹ : Category.{v, u} C
D : GlueData C
inst✝ : HasLimits C
i j : D.J
U : Opens ↑↑(D.U i)
⊢ ⇑(D.f j i).base ∘ ⇑(D.t i j).base '' (⇑(D.f i j).base ⁻¹' ↑U) =
    ⇑(D.f j i).base '' (⇑(D.t j i).base ⁻¹' (⇑(D.f i j).base ⁻¹' ↑U))

tactic: rw [Set.image_comp]
state_before: case h
C : Type u
inst✝¹ : Category.{v, u} C
D : GlueData C
inst✝ : HasLimits C
i j : D.J
U : Opens ↑↑(D.U i)
⊢ ⇑(D.f j i).base ∘ ⇑(D.t i j).base '' (⇑(D.f i j).base ⁻¹' ↑U) =
    ⇑(D.f j i).base '' (⇑(D.t j i).base ⁻¹' (⇑(D.f i j).base ⁻¹' ↑U))
state_after: case h
C : Type u
inst✝¹ : Category.{v, u} C
D : GlueData C
inst✝ : HasLimits C
i j : D.J
U : Opens ↑↑(D.U i)
⊢ ⇑(D.f j i).base '' (⇑(D.t i j).base '' (⇑(D.f i j).base ⁻¹' ↑U)) =
    ⇑(D.f j i).base '' (⇑(D.t j i).base ⁻¹' (⇑(D.f i j).base ⁻¹' ↑U))

tactic: rw [Set.eq_preimage_iff_image_eq, ← Set.image_comp]
state_before: case h
C : Type u
inst✝¹ : Category.{v, u} C
D : GlueData C
inst✝ : HasLimits C
i j : D.J
U : Opens ↑↑(D.U i)
⊢ ⇑(D.t i j).base '' (⇑(D.f i j).base ⁻¹' ↑U) = ⇑(D.t j i).base ⁻¹' (⇑(D.f i j).base ⁻¹' ↑U)
state_after: case h
C : Type u
inst✝¹ : Category.{v, u} C
D : GlueData C
inst✝ : HasLimits C
i j : D.J
U : Opens ↑↑(D.U i)
⊢ ⇑(D.t j i).base ∘ ⇑(D.t i j).base '' (⇑(D.f i j).base ⁻¹' ↑U) = ⇑(D.f i j).base ⁻¹' ↑U

case h.hf
C : Type u
inst✝¹ : Category.{v, u} C
D : GlueData C
inst✝ : HasLimits C
i j : D.J
U : Opens ↑↑(D.U i)
⊢ Function.Bijective ⇑(D.t j i).base

tactic: swap
state_before: case h
C : Type u
inst✝¹ : Category.{v, u} C
D : GlueData C
inst✝ : HasLimits C
i j : D.J
U : Opens ↑↑(D.U i)
⊢ ⇑(D.t j i).base ∘ ⇑(D.t i j).base '' (⇑(D.f i j).base ⁻¹' ↑U) = ⇑(D.f i j).base ⁻¹' ↑U

case h.hf
C : Type u
inst✝¹ : Category.{v, u} C
D : GlueData C
inst✝ : HasLimits C
i j : D.J
U : Opens ↑↑(D.U i)
⊢ Function.Bijective ⇑(D.t j i).base
state_after: case h.hf
C : Type u
inst✝¹ : Category.{v, u} C
D : GlueData C
inst✝ : HasLimits C
i j : D.J
U : Opens ↑↑(D.U i)
⊢ Function.Bijective ⇑(D.t j i).base

case h
C : Type u
inst✝¹ : Category.{v, u} C
D : GlueData C
inst✝ : HasLimits C
i j : D.J
U : Opens ↑↑(D.U i)
⊢ ⇑(D.t j i).base ∘ ⇑(D.t i j).base '' (⇑(D.f i j).base ⁻¹' ↑U) = ⇑(D.f i j).base ⁻¹' ↑U

tactic: change (D.t i j ≫ D.t j i).base '' _ = _
state_before: case h
C : Type u
inst✝¹ : Category.{v, u} C
D : GlueData C
inst✝ : HasLimits C
i j : D.J
U : Opens ↑↑(D.U i)
⊢ ⇑(D.t j i).base ∘ ⇑(D.t i j).base '' (⇑(D.f i j).base ⁻¹' ↑U) = ⇑(D.f i j).base ⁻¹' ↑U
state_after: case h
C : Type u
inst✝¹ : Category.{v, u} C
D : GlueData C
inst✝ : HasLimits C
i j : D.J
U : Opens ↑↑(D.U i)
⊢ ⇑(D.t i j ≫ D.t j i).base '' (⇑(D.f i j).base ⁻¹' ↑U) = ⇑(D.f i j).base ⁻¹' ↑U

tactic: rw [𝖣.t_inv]
state_before: case h
C : Type u
inst✝¹ : Category.{v, u} C
D : GlueData C
inst✝ : HasLimits C
i j : D.J
U : Opens ↑↑(D.U i)
⊢ ⇑(D.t i j ≫ D.t j i).base '' (⇑(D.f i j).base ⁻¹' ↑U) = ⇑(D.f i j).base ⁻¹' ↑U
state_after: case h
C : Type u
inst✝¹ : Category.{v, u} C
D : GlueData C
inst✝ : HasLimits C
i j : D.J
U : Opens ↑↑(D.U i)
⊢ ⇑(𝟙 (D.V (i, j))).base '' (⇑(D.f i j).base ⁻¹' ↑U) = ⇑(D.f i j).base ⁻¹' ↑U

tactic: simp
state_before: case h
C : Type u
inst✝¹ : Category.{v, u} C
D : GlueData C
inst✝ : HasLimits C
i j : D.J
U : Opens ↑↑(D.U i)
⊢ ⇑(𝟙 (D.V (i, j))).base '' (⇑(D.f i j).base ⁻¹' ↑U) = ⇑(D.f i j).base ⁻¹' ↑U
state_after: no goals

tactic: exact CategoryTheory.ConcreteCategory.bijective_of_isIso (C := TopCat) _
state_before: case h.hf
C : Type u
inst✝¹ : Category.{v, u} C
D : GlueData C
inst✝ : HasLimits C
i j : D.J
U : Opens ↑↑(D.U i)
⊢ Function.Bijective ⇑(D.t j i).base
state_after: no goals

tactic: erw [← coe_comp, ← TopCat.mono_iff_injective]
state_before: case h.h
C : Type u
inst✝¹ : Category.{v, u} C
D : GlueData C
inst✝ : HasLimits C
i j : D.J
U : Opens ↑↑(D.U i)
⊢ Function.Injective
    (⇑(preservesColimitIso (forget C) D.diagram.multispan).inv ∘
      ⇑(HasColimit.isoOfNatIso (D.diagramIso (forget C))).inv)
state_after: case h.h
C : Type u
inst✝¹ : Category.{v, u} C
D : GlueData C
inst✝ : HasLimits C
i j : D.J
U : Opens ↑↑(D.U i)
⊢ Mono
    ((HasColimit.isoOfNatIso (D.diagramIso (forget C))).inv ≫ (preservesColimitIso (forget C) D.diagram.multispan).inv)

tactic: infer_instance
state_before: case h.h
C : Type u
inst✝¹ : Category.{v, u} C
D : GlueData C
inst✝ : HasLimits C
i j : D.J
U : Opens ↑↑(D.U i)
⊢ Mono
    ((HasColimit.isoOfNatIso (D.diagramIso (forget C))).inv ≫ (preservesColimitIso (forget C) D.diagram.multispan).inv)
state_after: no goals