Theorem: AlgebraicGeometry.SheafedSpace.IsOpenImmersion.of_stalk_iso
File: Mathlib/Geometry/RingedSpace/OpenImmersion.lean

Proof steps:
state_before: C : Type u
inst✝⁶ : Category.{v, u} C
inst✝⁵ : HasLimits C
inst✝⁴ : HasColimits C
inst✝³ : ConcreteCategory C
inst✝² : (CategoryTheory.forget C).ReflectsIsomorphisms
inst✝¹ : PreservesLimits (CategoryTheory.forget C)
inst✝ : PreservesFilteredColimits (CategoryTheory.forget C)
X Y : SheafedSpace C
f : X ⟶ Y
hf : OpenEmbedding ⇑f.base
H : ∀ (x : ↑↑X.toPresheafedSpace), IsIso (PresheafedSpace.Hom.stalkMap f x)
U : Opens ↑↑X.toPresheafedSpace
⊢ IsIso (f.c.app (op (⋯.functor.obj U)))
state_after: case inst
C : Type u
inst✝⁶ : Category.{v, u} C
inst✝⁵ : HasLimits C
inst✝⁴ : HasColimits C
inst✝³ : ConcreteCategory C
inst✝² : (CategoryTheory.forget C).ReflectsIsomorphisms
inst✝¹ : PreservesLimits (CategoryTheory.forget C)
inst✝ : PreservesFilteredColimits (CategoryTheory.forget C)
X Y : SheafedSpace C
f : X ⟶ Y
hf : OpenEmbedding ⇑f.base
H : ∀ (x : ↑↑X.toPresheafedSpace), IsIso (PresheafedSpace.Hom.stalkMap f x)
U : Opens ↑↑X.toPresheafedSpace
⊢ ∀ (x : ↥(⋯.functor.obj U)),
    IsIso
      ((TopCat.Presheaf.stalkFunctor C ↑x).map
        (let_fun this := { val := f.c };
          this).val)
tactic: apply (config := {allowSynthFailures := true})
        TopCat.Presheaf.app_isIso_of_stalkFunctor_map_iso
          (show Y.sheaf ⟶ (TopCat.Sheaf.pushforward _ f.base).obj X.sheaf from ⟨f.c⟩)
state_before: case inst
C : Type u
inst✝⁶ : Category.{v, u} C
inst✝⁵ : HasLimits C
inst✝⁴ : HasColimits C
inst✝³ : ConcreteCategory C
inst✝² : (CategoryTheory.forget C).ReflectsIsomorphisms
inst✝¹ : PreservesLimits (CategoryTheory.forget C)
inst✝ : PreservesFilteredColimits (CategoryTheory.forget C)
X Y : SheafedSpace C
f : X ⟶ Y
hf : OpenEmbedding ⇑f.base
H : ∀ (x : ↑↑X.toPresheafedSpace), IsIso (PresheafedSpace.Hom.stalkMap f x)
U : Opens ↑↑X.toPresheafedSpace
⊢ ∀ (x : ↥(⋯.functor.obj U)),
    IsIso
      ((TopCat.Presheaf.stalkFunctor C ↑x).map
        (let_fun this := { val := f.c };
          this).val)
state_after: case inst.mk.intro.intro
C : Type u
inst✝⁶ : Category.{v, u} C
inst✝⁵ : HasLimits C
inst✝⁴ : HasColimits C
inst✝³ : ConcreteCategory C
inst✝² : (CategoryTheory.forget C).ReflectsIsomorphisms
inst✝¹ : PreservesLimits (CategoryTheory.forget C)
inst✝ : PreservesFilteredColimits (CategoryTheory.forget C)
X Y : SheafedSpace C
f : X ⟶ Y
hf : OpenEmbedding ⇑f.base
H : ∀ (x : ↑↑X.toPresheafedSpace), IsIso (PresheafedSpace.Hom.stalkMap f x)
U : Opens ↑↑X.toPresheafedSpace
y : ↑↑X.toPresheafedSpace
hy : y ∈ ↑U
⊢ IsIso
    ((TopCat.Presheaf.stalkFunctor C ↑⟨f.base y, ⋯⟩).map
      (let_fun this := { val := f.c };
        this).val)
tactic: rintro ⟨_, y, hy, rfl⟩
state_before: case inst.mk.intro.intro
C : Type u
inst✝⁶ : Category.{v, u} C
inst✝⁵ : HasLimits C
inst✝⁴ : HasColimits C
inst✝³ : ConcreteCategory C
inst✝² : (CategoryTheory.forget C).ReflectsIsomorphisms
inst✝¹ : PreservesLimits (CategoryTheory.forget C)
inst✝ : PreservesFilteredColimits (CategoryTheory.forget C)
X Y : SheafedSpace C
f : X ⟶ Y
hf : OpenEmbedding ⇑f.base
H : ∀ (x : ↑↑X.toPresheafedSpace), IsIso (PresheafedSpace.Hom.stalkMap f x)
U : Opens ↑↑X.toPresheafedSpace
y : ↑↑X.toPresheafedSpace
hy : y ∈ ↑U
⊢ IsIso
    ((TopCat.Presheaf.stalkFunctor C ↑⟨f.base y, ⋯⟩).map
      (let_fun this := { val := f.c };
        this).val)
state_after: case inst.mk.intro.intro
C : Type u
inst✝⁶ : Category.{v, u} C
inst✝⁵ : HasLimits C
inst✝⁴ : HasColimits C
inst✝³ : ConcreteCategory C
inst✝² : (CategoryTheory.forget C).ReflectsIsomorphisms
inst✝¹ : PreservesLimits (CategoryTheory.forget C)
inst✝ : PreservesFilteredColimits (CategoryTheory.forget C)
X Y : SheafedSpace C
f : X ⟶ Y
hf : OpenEmbedding ⇑f.base
U : Opens ↑↑X.toPresheafedSpace
y : ↑↑X.toPresheafedSpace
hy : y ∈ ↑U
H : IsIso (PresheafedSpace.Hom.stalkMap f y)
⊢ IsIso
    ((TopCat.Presheaf.stalkFunctor C ↑⟨f.base y, ⋯⟩).map
      (let_fun this := { val := f.c };
        this).val)
tactic: specialize H y
state_before: case inst.mk.intro.intro
C : Type u
inst✝⁶ : Category.{v, u} C
inst✝⁵ : HasLimits C
inst✝⁴ : HasColimits C
inst✝³ : ConcreteCategory C
inst✝² : (CategoryTheory.forget C).ReflectsIsomorphisms
inst✝¹ : PreservesLimits (CategoryTheory.forget C)
inst✝ : PreservesFilteredColimits (CategoryTheory.forget C)
X Y : SheafedSpace C
f : X ⟶ Y
hf : OpenEmbedding ⇑f.base
U : Opens ↑↑X.toPresheafedSpace
y : ↑↑X.toPresheafedSpace
hy : y ∈ ↑U
H : IsIso (PresheafedSpace.Hom.stalkMap f y)
⊢ IsIso
    ((TopCat.Presheaf.stalkFunctor C ↑⟨f.base y, ⋯⟩).map
      (let_fun this := { val := f.c };
        this).val)
state_after: case inst.mk.intro.intro
C : Type u
inst✝⁶ : Category.{v, u} C
inst✝⁵ : HasLimits C
inst✝⁴ : HasColimits C
inst✝³ : ConcreteCategory C
inst✝² : (CategoryTheory.forget C).ReflectsIsomorphisms
inst✝¹ : PreservesLimits (CategoryTheory.forget C)
inst✝ : PreservesFilteredColimits (CategoryTheory.forget C)
X Y : SheafedSpace C
f : X ⟶ Y
hf : OpenEmbedding ⇑f.base
U : Opens ↑↑X.toPresheafedSpace
y : ↑↑X.toPresheafedSpace
hy : y ∈ ↑U
H : IsIso ((TopCat.Presheaf.stalkFunctor C (f.base y)).map f.c ≫ TopCat.Presheaf.stalkPushforward C f.base X.presheaf y)
⊢ IsIso
    ((TopCat.Presheaf.stalkFunctor C ↑⟨f.base y, ⋯⟩).map
      (let_fun this := { val := f.c };
        this).val)
tactic: delta PresheafedSpace.Hom.stalkMap at H
state_before: case inst.mk.intro.intro
C : Type u
inst✝⁶ : Category.{v, u} C
inst✝⁵ : HasLimits C
inst✝⁴ : HasColimits C
inst✝³ : ConcreteCategory C
inst✝² : (CategoryTheory.forget C).ReflectsIsomorphisms
inst✝¹ : PreservesLimits (CategoryTheory.forget C)
inst✝ : PreservesFilteredColimits (CategoryTheory.forget C)
X Y : SheafedSpace C
f : X ⟶ Y
hf : OpenEmbedding ⇑f.base
U : Opens ↑↑X.toPresheafedSpace
y : ↑↑X.toPresheafedSpace
hy : y ∈ ↑U
H : IsIso ((TopCat.Presheaf.stalkFunctor C (f.base y)).map f.c ≫ TopCat.Presheaf.stalkPushforward C f.base X.presheaf y)
⊢ IsIso
    ((TopCat.Presheaf.stalkFunctor C ↑⟨f.base y, ⋯⟩).map
      (let_fun this := { val := f.c };
        this).val)
state_after: case inst.mk.intro.intro
C : Type u
inst✝⁶ : Category.{v, u} C
inst✝⁵ : HasLimits C
inst✝⁴ : HasColimits C
inst✝³ : ConcreteCategory C
inst✝² : (CategoryTheory.forget C).ReflectsIsomorphisms
inst✝¹ : PreservesLimits (CategoryTheory.forget C)
inst✝ : PreservesFilteredColimits (CategoryTheory.forget C)
X Y : SheafedSpace C
f : X ⟶ Y
hf : OpenEmbedding ⇑f.base
U : Opens ↑↑X.toPresheafedSpace
y : ↑↑X.toPresheafedSpace
hy : y ∈ ↑U
H : IsIso ((TopCat.Presheaf.stalkFunctor C (f.base y)).map f.c ≫ TopCat.Presheaf.stalkPushforward C f.base X.presheaf y)
H' : IsIso (TopCat.Presheaf.stalkPushforward C f.base X.presheaf y)
⊢ IsIso
    ((TopCat.Presheaf.stalkFunctor C ↑⟨f.base y, ⋯⟩).map
      (let_fun this := { val := f.c };
        this).val)
tactic: haveI H' :=
        TopCat.Presheaf.stalkPushforward.stalkPushforward_iso_of_openEmbedding C hf X.presheaf y
state_before: case inst.mk.intro.intro
C : Type u
inst✝⁶ : Category.{v, u} C
inst✝⁵ : HasLimits C
inst✝⁴ : HasColimits C
inst✝³ : ConcreteCategory C
inst✝² : (CategoryTheory.forget C).ReflectsIsomorphisms
inst✝¹ : PreservesLimits (CategoryTheory.forget C)
inst✝ : PreservesFilteredColimits (CategoryTheory.forget C)
X Y : SheafedSpace C
f : X ⟶ Y
hf : OpenEmbedding ⇑f.base
U : Opens ↑↑X.toPresheafedSpace
y : ↑↑X.toPresheafedSpace
hy : y ∈ ↑U
H : IsIso ((TopCat.Presheaf.stalkFunctor C (f.base y)).map f.c ≫ TopCat.Presheaf.stalkPushforward C f.base X.presheaf y)
H' : IsIso (TopCat.Presheaf.stalkPushforward C f.base X.presheaf y)
⊢ IsIso
    ((TopCat.Presheaf.stalkFunctor C ↑⟨f.base y, ⋯⟩).map
      (let_fun this := { val := f.c };
        this).val)
state_after: case inst.mk.intro.intro
C : Type u
inst✝⁶ : Category.{v, u} C
inst✝⁵ : HasLimits C
inst✝⁴ : HasColimits C
inst✝³ : ConcreteCategory C
inst✝² : (CategoryTheory.forget C).ReflectsIsomorphisms
inst✝¹ : PreservesLimits (CategoryTheory.forget C)
inst✝ : PreservesFilteredColimits (CategoryTheory.forget C)
X Y : SheafedSpace C
f : X ⟶ Y
hf : OpenEmbedding ⇑f.base
U : Opens ↑↑X.toPresheafedSpace
y : ↑↑X.toPresheafedSpace
hy : y ∈ ↑U
H : IsIso ((TopCat.Presheaf.stalkFunctor C (f.base y)).map f.c ≫ TopCat.Presheaf.stalkPushforward C f.base X.presheaf y)
H' : IsIso (TopCat.Presheaf.stalkPushforward C f.base X.presheaf y)
this :
  IsIso
    (((TopCat.Presheaf.stalkFunctor C (f.base y)).map f.c ≫ TopCat.Presheaf.stalkPushforward C f.base X.presheaf y) ≫
      inv (TopCat.Presheaf.stalkPushforward C f.base X.presheaf y))
⊢ IsIso
    ((TopCat.Presheaf.stalkFunctor C ↑⟨f.base y, ⋯⟩).map
      (let_fun this := { val := f.c };
        this).val)
tactic: have := @IsIso.comp_isIso _ _ _ _ _ _ _ H (@IsIso.inv_isIso _ _ _ _ _ H')
state_before: case inst.mk.intro.intro
C : Type u
inst✝⁶ : Category.{v, u} C
inst✝⁵ : HasLimits C
inst✝⁴ : HasColimits C
inst✝³ : ConcreteCategory C
inst✝² : (CategoryTheory.forget C).ReflectsIsomorphisms
inst✝¹ : PreservesLimits (CategoryTheory.forget C)
inst✝ : PreservesFilteredColimits (CategoryTheory.forget C)
X Y : SheafedSpace C
f : X ⟶ Y
hf : OpenEmbedding ⇑f.base
U : Opens ↑↑X.toPresheafedSpace
y : ↑↑X.toPresheafedSpace
hy : y ∈ ↑U
H : IsIso ((TopCat.Presheaf.stalkFunctor C (f.base y)).map f.c ≫ TopCat.Presheaf.stalkPushforward C f.base X.presheaf y)
H' : IsIso (TopCat.Presheaf.stalkPushforward C f.base X.presheaf y)
this :
  IsIso
    (((TopCat.Presheaf.stalkFunctor C (f.base y)).map f.c ≫ TopCat.Presheaf.stalkPushforward C f.base X.presheaf y) ≫
      inv (TopCat.Presheaf.stalkPushforward C f.base X.presheaf y))
⊢ IsIso
    ((TopCat.Presheaf.stalkFunctor C ↑⟨f.base y, ⋯⟩).map
      (let_fun this := { val := f.c };
        this).val)
state_after: no goals
tactic: rwa [Category.assoc, IsIso.hom_inv_id, Category.comp_id] at this