Theorem: AlgebraicGeometry.AffineTargetMorphismProperty.diagonal_of_targetAffineLocally
File: Mathlib/AlgebraicGeometry/Morphisms/Constructors.lean

tactic: rintro U V f₁ f₂ hU hV hf₁ hf₂
state_before: P : AffineTargetMorphismProperty
hP : P.IsLocal
X Y U : Scheme
f : X ⟶ Y
g : U ⟶ Y
inst✝¹ : IsAffine U
inst✝ : IsOpenImmersion g
H : (targetAffineLocally P).diagonal f
⊢ P.diagonal pullback.snd
state_after: P : AffineTargetMorphismProperty
hP : P.IsLocal
X Y U✝ : Scheme
f : X ⟶ Y
g : U✝ ⟶ Y
inst✝¹ : IsAffine U✝
inst✝ : IsOpenImmersion g
H : (targetAffineLocally P).diagonal f
U V : Scheme
f₁ : U ⟶ pullback f g
f₂ : V ⟶ pullback f g
hU : IsAffine U
hV : IsAffine V
hf₁ : IsOpenImmersion f₁
hf₂ : IsOpenImmersion f₂
⊢ P (pullback.mapDesc f₁ f₂ pullback.snd)

tactic: replace H := ((hP.affine_openCover_TFAE (pullback.diagonal f)).out 0 3).mp H
state_before: P : AffineTargetMorphismProperty
hP : P.IsLocal
X Y U✝ : Scheme
f : X ⟶ Y
g : U✝ ⟶ Y
inst✝¹ : IsAffine U✝
inst✝ : IsOpenImmersion g
H : (targetAffineLocally P).diagonal f
U V : Scheme
f₁ : U ⟶ pullback f g
f₂ : V ⟶ pullback f g
hU : IsAffine U
hV : IsAffine V
hf₁ : IsOpenImmersion f₁
hf₂ : IsOpenImmersion f₂
⊢ P (pullback.mapDesc f₁ f₂ pullback.snd)
state_after: P : AffineTargetMorphismProperty
hP : P.IsLocal
X Y U✝ : Scheme
f : X ⟶ Y
g : U✝ ⟶ Y
inst✝¹ : IsAffine U✝
inst✝ : IsOpenImmersion g
U V : Scheme
f₁ : U ⟶ pullback f g
f₂ : V ⟶ pullback f g
hU : IsAffine U
hV : IsAffine V
hf₁ : IsOpenImmersion f₁
hf₂ : IsOpenImmersion f₂
H : ∀ {U : Scheme} (g : U ⟶ pullback.diagonalObj f) [inst : IsAffine U] [inst_1 : IsOpenImmersion g], P pullback.snd
⊢ P (pullback.mapDesc f₁ f₂ pullback.snd)

tactic: let g₁ := pullback.map (f₁ ≫ pullback.snd) (f₂ ≫ pullback.snd) f f
  (f₁ ≫ pullback.fst) (f₂ ≫ pullback.fst) g
  (by rw [Category.assoc, Category.assoc, pullback.condition])
  (by rw [Category.assoc, Category.assoc, pullback.condition])
state_before: P : AffineTargetMorphismProperty
hP : P.IsLocal
X Y U✝ : Scheme
f : X ⟶ Y
g : U✝ ⟶ Y
inst✝¹ : IsAffine U✝
inst✝ : IsOpenImmersion g
U V : Scheme
f₁ : U ⟶ pullback f g
f₂ : V ⟶ pullback f g
hU : IsAffine U
hV : IsAffine V
hf₁ : IsOpenImmersion f₁
hf₂ : IsOpenImmersion f₂
H : ∀ {U : Scheme} (g : U ⟶ pullback.diagonalObj f) [inst : IsAffine U] [inst_1 : IsOpenImmersion g], P pullback.snd
⊢ P (pullback.mapDesc f₁ f₂ pullback.snd)
state_after: P : AffineTargetMorphismProperty
hP : P.IsLocal
X Y U✝ : Scheme
f : X ⟶ Y
g : U✝ ⟶ Y
inst✝¹ : IsAffine U✝
inst✝ : IsOpenImmersion g
U V : Scheme
f₁ : U ⟶ pullback f g
f₂ : V ⟶ pullback f g
hU : IsAffine U
hV : IsAffine V
hf₁ : IsOpenImmersion f₁
hf₂ : IsOpenImmersion f₂
H : ∀ {U : Scheme} (g : U ⟶ pullback.diagonalObj f) [inst : IsAffine U] [inst_1 : IsOpenImmersion g], P pullback.snd
g₁ : pullback (f₁ ≫ pullback.snd) (f₂ ≫ pullback.snd) ⟶ pullback f f :=
  pullback.map (f₁ ≫ pullback.snd) (f₂ ≫ pullback.snd) f f (f₁ ≫ pullback.fst) (f₂ ≫ pullback.fst) g ⋯ ⋯
⊢ P (pullback.mapDesc f₁ f₂ pullback.snd)

tactic: specialize H g₁
state_before: P : AffineTargetMorphismProperty
hP : P.IsLocal
X Y U✝ : Scheme
f : X ⟶ Y
g : U✝ ⟶ Y
inst✝¹ : IsAffine U✝
inst✝ : IsOpenImmersion g
U V : Scheme
f₁ : U ⟶ pullback f g
f₂ : V ⟶ pullback f g
hU : IsAffine U
hV : IsAffine V
hf₁ : IsOpenImmersion f₁
hf₂ : IsOpenImmersion f₂
H : ∀ {U : Scheme} (g : U ⟶ pullback.diagonalObj f) [inst : IsAffine U] [inst_1 : IsOpenImmersion g], P pullback.snd
g₁ : pullback (f₁ ≫ pullback.snd) (f₂ ≫ pullback.snd) ⟶ pullback f f :=
  pullback.map (f₁ ≫ pullback.snd) (f₂ ≫ pullback.snd) f f (f₁ ≫ pullback.fst) (f₂ ≫ pullback.fst) g ⋯ ⋯
⊢ P (pullback.mapDesc f₁ f₂ pullback.snd)
state_after: P : AffineTargetMorphismProperty
hP : P.IsLocal
X Y U✝ : Scheme
f : X ⟶ Y
g : U✝ ⟶ Y
inst✝¹ : IsAffine U✝
inst✝ : IsOpenImmersion g
U V : Scheme
f₁ : U ⟶ pullback f g
f₂ : V ⟶ pullback f g
hU : IsAffine U
hV : IsAffine V
hf₁ : IsOpenImmersion f₁
hf₂ : IsOpenImmersion f₂
g₁ : pullback (f₁ ≫ pullback.snd) (f₂ ≫ pullback.snd) ⟶ pullback f f :=
  pullback.map (f₁ ≫ pullback.snd) (f₂ ≫ pullback.snd) f f (f₁ ≫ pullback.fst) (f₂ ≫ pullback.fst) g ⋯ ⋯
H : P pullback.snd
⊢ P (pullback.mapDesc f₁ f₂ pullback.snd)

tactic: rw [← affine_cancel_left_isIso hP.1 (pullbackDiagonalMapIso f _ f₁ f₂).hom]
state_before: P : AffineTargetMorphismProperty
hP : P.IsLocal
X Y U✝ : Scheme
f : X ⟶ Y
g : U✝ ⟶ Y
inst✝¹ : IsAffine U✝
inst✝ : IsOpenImmersion g
U V : Scheme
f₁ : U ⟶ pullback f g
f₂ : V ⟶ pullback f g
hU : IsAffine U
hV : IsAffine V
hf₁ : IsOpenImmersion f₁
hf₂ : IsOpenImmersion f₂
g₁ : pullback (f₁ ≫ pullback.snd) (f₂ ≫ pullback.snd) ⟶ pullback f f :=
  pullback.map (f₁ ≫ pullback.snd) (f₂ ≫ pullback.snd) f f (f₁ ≫ pullback.fst) (f₂ ≫ pullback.fst) g ⋯ ⋯
H : P pullback.snd
⊢ P (pullback.mapDesc f₁ f₂ pullback.snd)
state_after: P : AffineTargetMorphismProperty
hP : P.IsLocal
X Y U✝ : Scheme
f : X ⟶ Y
g : U✝ ⟶ Y
inst✝¹ : IsAffine U✝
inst✝ : IsOpenImmersion g
U V : Scheme
f₁ : U ⟶ pullback f g
f₂ : V ⟶ pullback f g
hU : IsAffine U
hV : IsAffine V
hf₁ : IsOpenImmersion f₁
hf₂ : IsOpenImmersion f₂
g₁ : pullback (f₁ ≫ pullback.snd) (f₂ ≫ pullback.snd) ⟶ pullback f f :=
  pullback.map (f₁ ≫ pullback.snd) (f₂ ≫ pullback.snd) f f (f₁ ≫ pullback.fst) (f₂ ≫ pullback.fst) g ⋯ ⋯
H : P pullback.snd
⊢ P ((pullbackDiagonalMapIso f g f₁ f₂).hom ≫ pullback.mapDesc f₁ f₂ pullback.snd)

tactic: convert H
state_before: P : AffineTargetMorphismProperty
hP : P.IsLocal
X Y U✝ : Scheme
f : X ⟶ Y
g : U✝ ⟶ Y
inst✝¹ : IsAffine U✝
inst✝ : IsOpenImmersion g
U V : Scheme
f₁ : U ⟶ pullback f g
f₂ : V ⟶ pullback f g
hU : IsAffine U
hV : IsAffine V
hf₁ : IsOpenImmersion f₁
hf₂ : IsOpenImmersion f₂
g₁ : pullback (f₁ ≫ pullback.snd) (f₂ ≫ pullback.snd) ⟶ pullback f f :=
  pullback.map (f₁ ≫ pullback.snd) (f₂ ≫ pullback.snd) f f (f₁ ≫ pullback.fst) (f₂ ≫ pullback.fst) g ⋯ ⋯
H : P pullback.snd
⊢ P ((pullbackDiagonalMapIso f g f₁ f₂).hom ≫ pullback.mapDesc f₁ f₂ pullback.snd)
state_after: case h.e'_3
P : AffineTargetMorphismProperty
hP : P.IsLocal
X Y U✝ : Scheme
f : X ⟶ Y
g : U✝ ⟶ Y
inst✝¹ : IsAffine U✝
inst✝ : IsOpenImmersion g
U V : Scheme
f₁ : U ⟶ pullback f g
f₂ : V ⟶ pullback f g
hU : IsAffine U
hV : IsAffine V
hf₁ : IsOpenImmersion f₁
hf₂ : IsOpenImmersion f₂
g₁ : pullback (f₁ ≫ pullback.snd) (f₂ ≫ pullback.snd) ⟶ pullback f f :=
  pullback.map (f₁ ≫ pullback.snd) (f₂ ≫ pullback.snd) f f (f₁ ≫ pullback.fst) (f₂ ≫ pullback.fst) g ⋯ ⋯
H : P pullback.snd
⊢ (pullbackDiagonalMapIso f g f₁ f₂).hom ≫ pullback.mapDesc f₁ f₂ pullback.snd = pullback.snd

tactic: apply pullback.hom_ext <;>
  simp only [Category.assoc, pullback.lift_fst, pullback.lift_snd, pullback.lift_fst_assoc,
    pullback.lift_snd_assoc, Category.comp_id, pullbackDiagonalMapIso_hom_fst,
    pullbackDiagonalMapIso_hom_snd]
state_before: case h.e'_3
P : AffineTargetMorphismProperty
hP : P.IsLocal
X Y U✝ : Scheme
f : X ⟶ Y
g : U✝ ⟶ Y
inst✝¹ : IsAffine U✝
inst✝ : IsOpenImmersion g
U V : Scheme
f₁ : U ⟶ pullback f g
f₂ : V ⟶ pullback f g
hU : IsAffine U
hV : IsAffine V
hf₁ : IsOpenImmersion f₁
hf₂ : IsOpenImmersion f₂
g₁ : pullback (f₁ ≫ pullback.snd) (f₂ ≫ pullback.snd) ⟶ pullback f f :=
  pullback.map (f₁ ≫ pullback.snd) (f₂ ≫ pullback.snd) f f (f₁ ≫ pullback.fst) (f₂ ≫ pullback.fst) g ⋯ ⋯
H : P pullback.snd
⊢ (pullbackDiagonalMapIso f g f₁ f₂).hom ≫ pullback.mapDesc f₁ f₂ pullback.snd = pullback.snd
state_after: no goals

tactic: rw [Category.assoc, Category.assoc, pullback.condition]
state_before: P : AffineTargetMorphismProperty
hP : P.IsLocal
X Y U✝ : Scheme
f : X ⟶ Y
g : U✝ ⟶ Y
inst✝¹ : IsAffine U✝
inst✝ : IsOpenImmersion g
U V : Scheme
f₁ : U ⟶ pullback f g
f₂ : V ⟶ pullback f g
hU : IsAffine U
hV : IsAffine V
hf₁ : IsOpenImmersion f₁
hf₂ : IsOpenImmersion f₂
H : ∀ {U : Scheme} (g : U ⟶ pullback.diagonalObj f) [inst : IsAffine U] [inst_1 : IsOpenImmersion g], P pullback.snd
⊢ (f₁ ≫ pullback.snd) ≫ g = (f₁ ≫ pullback.fst) ≫ f
state_after: no goals

tactic: rw [Category.assoc, Category.assoc, pullback.condition]
state_before: P : AffineTargetMorphismProperty
hP : P.IsLocal
X Y U✝ : Scheme
f : X ⟶ Y
g : U✝ ⟶ Y
inst✝¹ : IsAffine U✝
inst✝ : IsOpenImmersion g
U V : Scheme
f₁ : U ⟶ pullback f g
f₂ : V ⟶ pullback f g
hU : IsAffine U
hV : IsAffine V
hf₁ : IsOpenImmersion f₁
hf₂ : IsOpenImmersion f₂
H : ∀ {U : Scheme} (g : U ⟶ pullback.diagonalObj f) [inst : IsAffine U] [inst_1 : IsOpenImmersion g], P pullback.snd
⊢ (f₂ ≫ pullback.snd) ≫ g = (f₂ ≫ pullback.fst) ≫ f
state_after: no goals