Theorem: AlgebraicGeometry.isOpenImmersionCat_comp_of_sourceAffineLocally
File: Mathlib/AlgebraicGeometry/Morphisms/RingHomProperties.lean

tactic: rw [← h₁.cancel_right_isIso _
  (Scheme.Γ.map (IsOpenImmersion.isoOfRangeEq (Y.ofRestrict _) f _).hom.op),
  ← Functor.map_comp, ← op_comp]
state_before: P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : RingHom.PropertyIsLocal P
h₁ : RingHom.RespectsIso P
X Y Z : Scheme
inst✝² : IsAffine X
inst✝¹ : IsAffine Z
f : X ⟶ Y
inst✝ : IsOpenImmersion f
g : Y ⟶ Z
h₂ : sourceAffineLocally P g
⊢ P (Scheme.Γ.map (f ≫ g).op)
state_after: P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : RingHom.PropertyIsLocal P
h₁ : RingHom.RespectsIso P
X Y Z : Scheme
inst✝² : IsAffine X
inst✝¹ : IsAffine Z
f : X ⟶ Y
inst✝ : IsOpenImmersion f
g : Y ⟶ Z
h₂ : sourceAffineLocally P g
⊢ P (Scheme.Γ.map ((IsOpenImmersion.isoOfRangeEq (Y.ofRestrict ?m.88916) f ?m.88923).hom ≫ f ≫ g).op)

P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : RingHom.PropertyIsLocal P
h₁ : RingHom.RespectsIso P
X Y Z : Scheme
inst✝² : IsAffine X
inst✝¹ : IsAffine Z
f : X ⟶ Y
inst✝ : IsOpenImmersion f
g : Y ⟶ Z
h₂ : sourceAffineLocally P g
⊢ TopCat

P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : RingHom.PropertyIsLocal P
h₁ : RingHom.RespectsIso P
X Y Z : Scheme
inst✝² : IsAffine X
inst✝¹ : IsAffine Z
f : X ⟶ Y
inst✝ : IsOpenImmersion f
g : Y ⟶ Z
h₂ : sourceAffineLocally P g
⊢ ?m.88914 ⟶ TopCat.of ↑↑Y.toPresheafedSpace

P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : RingHom.PropertyIsLocal P
h₁ : RingHom.RespectsIso P
X Y Z : Scheme
inst✝² : IsAffine X
inst✝¹ : IsAffine Z
f : X ⟶ Y
inst✝ : IsOpenImmersion f
g : Y ⟶ Z
h₂ : sourceAffineLocally P g
⊢ OpenEmbedding ⇑?m.88915

P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : RingHom.PropertyIsLocal P
h₁ : RingHom.RespectsIso P
X Y Z : Scheme
inst✝² : IsAffine X
inst✝¹ : IsAffine Z
f : X ⟶ Y
inst✝ : IsOpenImmersion f
g : Y ⟶ Z
h₂ : sourceAffineLocally P g
⊢ Set.range ⇑(Y.ofRestrict ?m.88916).val.base = Set.range ⇑f.val.base

P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : RingHom.PropertyIsLocal P
h₁ : RingHom.RespectsIso P
X Y Z : Scheme
inst✝² : IsAffine X
inst✝¹ : IsAffine Z
f : X ⟶ Y
inst✝ : IsOpenImmersion f
g : Y ⟶ Z
h₂ : sourceAffineLocally P g
⊢ TopCat

P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : RingHom.PropertyIsLocal P
h₁ : RingHom.RespectsIso P
X Y Z : Scheme
inst✝² : IsAffine X
inst✝¹ : IsAffine Z
f : X ⟶ Y
inst✝ : IsOpenImmersion f
g : Y ⟶ Z
h₂ : sourceAffineLocally P g
⊢ ?m.88914 ⟶ TopCat.of ↑↑Y.toPresheafedSpace

P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : RingHom.PropertyIsLocal P
h₁ : RingHom.RespectsIso P
X Y Z : Scheme
inst✝² : IsAffine X
inst✝¹ : IsAffine Z
f : X ⟶ Y
inst✝ : IsOpenImmersion f
g : Y ⟶ Z
h₂ : sourceAffineLocally P g
⊢ OpenEmbedding ⇑?m.88915

P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : RingHom.PropertyIsLocal P
h₁ : RingHom.RespectsIso P
X Y Z : Scheme
inst✝² : IsAffine X
inst✝¹ : IsAffine Z
f : X ⟶ Y
inst✝ : IsOpenImmersion f
g : Y ⟶ Z
h₂ : sourceAffineLocally P g
⊢ Set.range ⇑(Y.ofRestrict ?m.88916).val.base = Set.range ⇑f.val.base

tactic: convert h₂ ⟨_, isAffineOpen_opensRange f⟩ using 3
state_before: P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : RingHom.PropertyIsLocal P
h₁ : RingHom.RespectsIso P
X Y Z : Scheme
inst✝² : IsAffine X
inst✝¹ : IsAffine Z
f : X ⟶ Y
inst✝ : IsOpenImmersion f
g : Y ⟶ Z
h₂ : sourceAffineLocally P g
⊢ P (Scheme.Γ.map ((IsOpenImmersion.isoOfRangeEq (Y.ofRestrict ?m.88916) f ?m.88923).hom ≫ f ≫ g).op)
state_after: case h.e'_5.h.h.e'_8.h.e'_5
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : RingHom.PropertyIsLocal P
h₁ : RingHom.RespectsIso P
X Y Z : Scheme
inst✝² : IsAffine X
inst✝¹ : IsAffine Z
f : X ⟶ Y
inst✝ : IsOpenImmersion f
g : Y ⟶ Z
h₂ : sourceAffineLocally P g
⊢ (IsOpenImmersion.isoOfRangeEq (Y.ofRestrict ⋯) f ?m.88923).hom ≫ f ≫ g = Y.ofRestrict ⋯ ≫ g

tactic: rw [IsOpenImmersion.isoOfRangeEq_hom_fac_assoc]
state_before: case h.e'_5.h.h.e'_8.h.e'_5
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : RingHom.PropertyIsLocal P
h₁ : RingHom.RespectsIso P
X Y Z : Scheme
inst✝² : IsAffine X
inst✝¹ : IsAffine Z
f : X ⟶ Y
inst✝ : IsOpenImmersion f
g : Y ⟶ Z
h₂ : sourceAffineLocally P g
⊢ (IsOpenImmersion.isoOfRangeEq (Y.ofRestrict ⋯) f ?m.88923).hom ≫ f ≫ g = Y.ofRestrict ⋯ ≫ g
state_after: case h.e'_5.h.h.e'_8.h.e'_5.e
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : RingHom.PropertyIsLocal P
h₁ : RingHom.RespectsIso P
X Y Z : Scheme
inst✝² : IsAffine X
inst✝¹ : IsAffine Z
f : X ⟶ Y
inst✝ : IsOpenImmersion f
g : Y ⟶ Z
h₂ : sourceAffineLocally P g
⊢ Set.range ⇑(Y.ofRestrict ⋯).val.base = Set.range ⇑f.val.base

tactic: exact Subtype.range_coe
state_before: case h.e'_5.h.h.e'_8.h.e'_5.e
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : RingHom.PropertyIsLocal P
h₁ : RingHom.RespectsIso P
X Y Z : Scheme
inst✝² : IsAffine X
inst✝¹ : IsAffine Z
f : X ⟶ Y
inst✝ : IsOpenImmersion f
g : Y ⟶ Z
h₂ : sourceAffineLocally P g
⊢ Set.range ⇑(Y.ofRestrict ⋯).val.base = Set.range ⇑f.val.base
state_after: no goals