Theorem: AlgebraicGeometry.universally_isLocalAtTarget
File: Mathlib/AlgebraicGeometry/Morphisms/Constructors.lean

tactic: refine ⟨P.universally_respectsIso, fun {X Y} f U =>
  P.universally_stableUnderBaseChange (isPullback_morphismRestrict f U).flip, ?_⟩
state_before: P : MorphismProperty Scheme
hP : ∀ {X Y : Scheme} (f : X ⟶ Y) (𝒰 : Y.OpenCover), (∀ (i : 𝒰.J), P pullback.snd) → P f
⊢ PropertyIsLocalAtTarget P.universally
state_after: P : MorphismProperty Scheme
hP : ∀ {X Y : Scheme} (f : X ⟶ Y) (𝒰 : Y.OpenCover), (∀ (i : 𝒰.J), P pullback.snd) → P f
⊢ ∀ {X Y : Scheme} (f : X ⟶ Y) (𝒰 : Y.OpenCover), (∀ (i : 𝒰.J), P.universally pullback.snd) → P.universally f

tactic: intro X Y f 𝒰 h X' Y' i₁ i₂ f' H
state_before: P : MorphismProperty Scheme
hP : ∀ {X Y : Scheme} (f : X ⟶ Y) (𝒰 : Y.OpenCover), (∀ (i : 𝒰.J), P pullback.snd) → P f
⊢ ∀ {X Y : Scheme} (f : X ⟶ Y) (𝒰 : Y.OpenCover), (∀ (i : 𝒰.J), P.universally pullback.snd) → P.universally f
state_after: P : MorphismProperty Scheme
hP : ∀ {X Y : Scheme} (f : X ⟶ Y) (𝒰 : Y.OpenCover), (∀ (i : 𝒰.J), P pullback.snd) → P f
X Y : Scheme
f : X ⟶ Y
𝒰 : Y.OpenCover
h : ∀ (i : 𝒰.J), P.universally pullback.snd
X' Y' : Scheme
i₁ : X' ⟶ X
i₂ : Y' ⟶ Y
f' : X' ⟶ Y'
H : IsPullback f' i₁ i₂ f
⊢ P f'

tactic: apply hP _ (𝒰.pullbackCover i₂)
state_before: P : MorphismProperty Scheme
hP : ∀ {X Y : Scheme} (f : X ⟶ Y) (𝒰 : Y.OpenCover), (∀ (i : 𝒰.J), P pullback.snd) → P f
X Y : Scheme
f : X ⟶ Y
𝒰 : Y.OpenCover
h : ∀ (i : 𝒰.J), P.universally pullback.snd
X' Y' : Scheme
i₁ : X' ⟶ X
i₂ : Y' ⟶ Y
f' : X' ⟶ Y'
H : IsPullback f' i₁ i₂ f
⊢ P f'
state_after: P : MorphismProperty Scheme
hP : ∀ {X Y : Scheme} (f : X ⟶ Y) (𝒰 : Y.OpenCover), (∀ (i : 𝒰.J), P pullback.snd) → P f
X Y : Scheme
f : X ⟶ Y
𝒰 : Y.OpenCover
h : ∀ (i : 𝒰.J), P.universally pullback.snd
X' Y' : Scheme
i₁ : X' ⟶ X
i₂ : Y' ⟶ Y
f' : X' ⟶ Y'
H : IsPullback f' i₁ i₂ f
⊢ ∀ (i : (𝒰.pullbackCover i₂).J), P pullback.snd

tactic: intro i
state_before: P : MorphismProperty Scheme
hP : ∀ {X Y : Scheme} (f : X ⟶ Y) (𝒰 : Y.OpenCover), (∀ (i : 𝒰.J), P pullback.snd) → P f
X Y : Scheme
f : X ⟶ Y
𝒰 : Y.OpenCover
h : ∀ (i : 𝒰.J), P.universally pullback.snd
X' Y' : Scheme
i₁ : X' ⟶ X
i₂ : Y' ⟶ Y
f' : X' ⟶ Y'
H : IsPullback f' i₁ i₂ f
⊢ ∀ (i : (𝒰.pullbackCover i₂).J), P pullback.snd
state_after: P : MorphismProperty Scheme
hP : ∀ {X Y : Scheme} (f : X ⟶ Y) (𝒰 : Y.OpenCover), (∀ (i : 𝒰.J), P pullback.snd) → P f
X Y : Scheme
f : X ⟶ Y
𝒰 : Y.OpenCover
h : ∀ (i : 𝒰.J), P.universally pullback.snd
X' Y' : Scheme
i₁ : X' ⟶ X
i₂ : Y' ⟶ Y
f' : X' ⟶ Y'
H : IsPullback f' i₁ i₂ f
i : (𝒰.pullbackCover i₂).J
⊢ P pullback.snd

tactic: apply h i (pullback.lift (pullback.fst ≫ i₁) (pullback.snd ≫ pullback.snd) _) pullback.snd
state_before: P : MorphismProperty Scheme
hP : ∀ {X Y : Scheme} (f : X ⟶ Y) (𝒰 : Y.OpenCover), (∀ (i : 𝒰.J), P pullback.snd) → P f
X Y : Scheme
f : X ⟶ Y
𝒰 : Y.OpenCover
h : ∀ (i : 𝒰.J), P.universally pullback.snd
X' Y' : Scheme
i₁ : X' ⟶ X
i₂ : Y' ⟶ Y
f' : X' ⟶ Y'
H : IsPullback f' i₁ i₂ f
i : (𝒰.pullbackCover i₂).J
⊢ P pullback.snd
state_after: case x
P : MorphismProperty Scheme
hP : ∀ {X Y : Scheme} (f : X ⟶ Y) (𝒰 : Y.OpenCover), (∀ (i : 𝒰.J), P pullback.snd) → P f
X Y : Scheme
f : X ⟶ Y
𝒰 : Y.OpenCover
h : ∀ (i : 𝒰.J), P.universally pullback.snd
X' Y' : Scheme
i₁ : X' ⟶ X
i₂ : Y' ⟶ Y
f' : X' ⟶ Y'
H : IsPullback f' i₁ i₂ f
i : (𝒰.pullbackCover i₂).J
⊢ IsPullback pullback.snd (pullback.lift (pullback.fst ≫ i₁) (pullback.snd ≫ pullback.snd) ?m.67474) pullback.snd
    pullback.snd

P : MorphismProperty Scheme
hP : ∀ {X Y : Scheme} (f : X ⟶ Y) (𝒰 : Y.OpenCover), (∀ (i : 𝒰.J), P pullback.snd) → P f
X Y : Scheme
f : X ⟶ Y
𝒰 : Y.OpenCover
h : ∀ (i : 𝒰.J), P.universally pullback.snd
X' Y' : Scheme
i₁ : X' ⟶ X
i₂ : Y' ⟶ Y
f' : X' ⟶ Y'
H : IsPullback f' i₁ i₂ f
i : (𝒰.pullbackCover i₂).J
⊢ (pullback.fst ≫ i₁) ≫ f = (pullback.snd ≫ pullback.snd) ≫ 𝒰.map i

tactic: swap
state_before: case x
P : MorphismProperty Scheme
hP : ∀ {X Y : Scheme} (f : X ⟶ Y) (𝒰 : Y.OpenCover), (∀ (i : 𝒰.J), P pullback.snd) → P f
X Y : Scheme
f : X ⟶ Y
𝒰 : Y.OpenCover
h : ∀ (i : 𝒰.J), P.universally pullback.snd
X' Y' : Scheme
i₁ : X' ⟶ X
i₂ : Y' ⟶ Y
f' : X' ⟶ Y'
H : IsPullback f' i₁ i₂ f
i : (𝒰.pullbackCover i₂).J
⊢ IsPullback pullback.snd (pullback.lift (pullback.fst ≫ i₁) (pullback.snd ≫ pullback.snd) ?m.67474) pullback.snd
    pullback.snd

P : MorphismProperty Scheme
hP : ∀ {X Y : Scheme} (f : X ⟶ Y) (𝒰 : Y.OpenCover), (∀ (i : 𝒰.J), P pullback.snd) → P f
X Y : Scheme
f : X ⟶ Y
𝒰 : Y.OpenCover
h : ∀ (i : 𝒰.J), P.universally pullback.snd
X' Y' : Scheme
i₁ : X' ⟶ X
i₂ : Y' ⟶ Y
f' : X' ⟶ Y'
H : IsPullback f' i₁ i₂ f
i : (𝒰.pullbackCover i₂).J
⊢ (pullback.fst ≫ i₁) ≫ f = (pullback.snd ≫ pullback.snd) ≫ 𝒰.map i
state_after: P : MorphismProperty Scheme
hP : ∀ {X Y : Scheme} (f : X ⟶ Y) (𝒰 : Y.OpenCover), (∀ (i : 𝒰.J), P pullback.snd) → P f
X Y : Scheme
f : X ⟶ Y
𝒰 : Y.OpenCover
h : ∀ (i : 𝒰.J), P.universally pullback.snd
X' Y' : Scheme
i₁ : X' ⟶ X
i₂ : Y' ⟶ Y
f' : X' ⟶ Y'
H : IsPullback f' i₁ i₂ f
i : (𝒰.pullbackCover i₂).J
⊢ (pullback.fst ≫ i₁) ≫ f = (pullback.snd ≫ pullback.snd) ≫ 𝒰.map i

case x
P : MorphismProperty Scheme
hP : ∀ {X Y : Scheme} (f : X ⟶ Y) (𝒰 : Y.OpenCover), (∀ (i : 𝒰.J), P pullback.snd) → P f
X Y : Scheme
f : X ⟶ Y
𝒰 : Y.OpenCover
h : ∀ (i : 𝒰.J), P.universally pullback.snd
X' Y' : Scheme
i₁ : X' ⟶ X
i₂ : Y' ⟶ Y
f' : X' ⟶ Y'
H : IsPullback f' i₁ i₂ f
i : (𝒰.pullbackCover i₂).J
⊢ IsPullback pullback.snd (pullback.lift (pullback.fst ≫ i₁) (pullback.snd ≫ pullback.snd) ?m.67474) pullback.snd
    pullback.snd

tactic: refine (IsPullback.of_right ?_ (pullback.lift_snd _ _ _) (IsPullback.of_hasPullback _ _)).flip
state_before: case x
P : MorphismProperty Scheme
hP : ∀ {X Y : Scheme} (f : X ⟶ Y) (𝒰 : Y.OpenCover), (∀ (i : 𝒰.J), P pullback.snd) → P f
X Y : Scheme
f : X ⟶ Y
𝒰 : Y.OpenCover
h : ∀ (i : 𝒰.J), P.universally pullback.snd
X' Y' : Scheme
i₁ : X' ⟶ X
i₂ : Y' ⟶ Y
f' : X' ⟶ Y'
H : IsPullback f' i₁ i₂ f
i : (𝒰.pullbackCover i₂).J
⊢ IsPullback pullback.snd (pullback.lift (pullback.fst ≫ i₁) (pullback.snd ≫ pullback.snd) ⋯) pullback.snd pullback.snd
state_after: case x
P : MorphismProperty Scheme
hP : ∀ {X Y : Scheme} (f : X ⟶ Y) (𝒰 : Y.OpenCover), (∀ (i : 𝒰.J), P pullback.snd) → P f
X Y : Scheme
f : X ⟶ Y
𝒰 : Y.OpenCover
h : ∀ (i : 𝒰.J), P.universally pullback.snd
X' Y' : Scheme
i₁ : X' ⟶ X
i₂ : Y' ⟶ Y
f' : X' ⟶ Y'
H : IsPullback f' i₁ i₂ f
i : (𝒰.pullbackCover i₂).J
⊢ IsPullback (pullback.lift (pullback.fst ≫ i₁) (pullback.snd ≫ pullback.snd) ⋯ ≫ pullback.fst) pullback.snd f
    (pullback.snd ≫ 𝒰.map i)

tactic: rw [pullback.lift_fst, ← pullback.condition]
state_before: case x
P : MorphismProperty Scheme
hP : ∀ {X Y : Scheme} (f : X ⟶ Y) (𝒰 : Y.OpenCover), (∀ (i : 𝒰.J), P pullback.snd) → P f
X Y : Scheme
f : X ⟶ Y
𝒰 : Y.OpenCover
h : ∀ (i : 𝒰.J), P.universally pullback.snd
X' Y' : Scheme
i₁ : X' ⟶ X
i₂ : Y' ⟶ Y
f' : X' ⟶ Y'
H : IsPullback f' i₁ i₂ f
i : (𝒰.pullbackCover i₂).J
⊢ IsPullback (pullback.lift (pullback.fst ≫ i₁) (pullback.snd ≫ pullback.snd) ⋯ ≫ pullback.fst) pullback.snd f
    (pullback.snd ≫ 𝒰.map i)
state_after: case x
P : MorphismProperty Scheme
hP : ∀ {X Y : Scheme} (f : X ⟶ Y) (𝒰 : Y.OpenCover), (∀ (i : 𝒰.J), P pullback.snd) → P f
X Y : Scheme
f : X ⟶ Y
𝒰 : Y.OpenCover
h : ∀ (i : 𝒰.J), P.universally pullback.snd
X' Y' : Scheme
i₁ : X' ⟶ X
i₂ : Y' ⟶ Y
f' : X' ⟶ Y'
H : IsPullback f' i₁ i₂ f
i : (𝒰.pullbackCover i₂).J
⊢ IsPullback (pullback.fst ≫ i₁) pullback.snd f (pullback.fst ≫ i₂)

tactic: exact (IsPullback.of_hasPullback _ _).paste_horiz H.flip
state_before: case x
P : MorphismProperty Scheme
hP : ∀ {X Y : Scheme} (f : X ⟶ Y) (𝒰 : Y.OpenCover), (∀ (i : 𝒰.J), P pullback.snd) → P f
X Y : Scheme
f : X ⟶ Y
𝒰 : Y.OpenCover
h : ∀ (i : 𝒰.J), P.universally pullback.snd
X' Y' : Scheme
i₁ : X' ⟶ X
i₂ : Y' ⟶ Y
f' : X' ⟶ Y'
H : IsPullback f' i₁ i₂ f
i : (𝒰.pullbackCover i₂).J
⊢ IsPullback (pullback.fst ≫ i₁) pullback.snd f (pullback.fst ≫ i₂)
state_after: no goals

tactic: rw [Category.assoc, Category.assoc, ← pullback.condition, ← pullback.condition_assoc, H.w]
state_before: P : MorphismProperty Scheme
hP : ∀ {X Y : Scheme} (f : X ⟶ Y) (𝒰 : Y.OpenCover), (∀ (i : 𝒰.J), P pullback.snd) → P f
X Y : Scheme
f : X ⟶ Y
𝒰 : Y.OpenCover
h : ∀ (i : 𝒰.J), P.universally pullback.snd
X' Y' : Scheme
i₁ : X' ⟶ X
i₂ : Y' ⟶ Y
f' : X' ⟶ Y'
H : IsPullback f' i₁ i₂ f
i : (𝒰.pullbackCover i₂).J
⊢ (pullback.fst ≫ i₁) ≫ f = (pullback.snd ≫ pullback.snd) ≫ 𝒰.map i
state_after: no goals