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

Proof steps:
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: ext1
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: 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)
⊢ ⇑(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: 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.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: 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)
⊢ (⇑(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: 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)
⊢ ⇑((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: erw [Set.preimage_image_eq]