-- Mathlib/AlgebraicGeometry/Morphisms/Basic.lean
lemma isLocalAtSource
    (H : ∀ {X Y : Scheme.{u}} (f : X ⟶ Y) [IsAffine Y] (𝒰 : Scheme.OpenCover.{u} X),
        Q f ↔ ∀ i, Q (𝒰.map i ≫ f)) : IsLocalAtSource P where
  iff_of_openCover' {X Y} f 𝒰

Proof state:
P : MorphismProperty Scheme
Q : AffineTargetMorphismProperty
inst✝ : HasAffineProperty P Q
H : ∀ {X Y : Scheme} (f : X ⟶ Y) [inst : IsAffine Y] (𝒰 : X.OpenCover), Q f ↔ ∀ (i : 𝒰.J), Q (𝒰.map i ≫ f)
X Y : Scheme
f : X ⟶ Y
𝒰 : X.OpenCover
U : ↑Y.affineOpens
⊢ P (f ∣_ ↑U) ↔ ∀ (a : 𝒰.J), P ((𝒰.map a ≫ f) ∣_ ↑U)

Tactic:
simp_rw [HasAffineProperty.iff_of_isAffine, morphismRestrict_comp]

Result:
P : MorphismProperty Scheme
Q : AffineTargetMorphismProperty
inst✝ : HasAffineProperty P Q
H : ∀ {X Y : Scheme} (f : X ⟶ Y) [inst : IsAffine Y] (𝒰 : X.OpenCover), Q f ↔ ∀ (i : 𝒰.J), Q (𝒰.map i ≫ f)
X Y : Scheme
f : X ⟶ Y
𝒰 : X.OpenCover
U : ↑Y.affineOpens
⊢ Q (f ∣_ ↑U) ↔ ∀ (a : 𝒰.J), Q (𝒰.map a ∣_ f ⁻¹ᵁ ↑U ≫ f ∣_ ↑U)

Proof state:
P : MorphismProperty Scheme
Q : AffineTargetMorphismProperty
inst✝ : HasAffineProperty P Q
H : ∀ {X Y : Scheme} (f : X ⟶ Y) [inst : IsAffine Y] (𝒰 : X.OpenCover), Q f ↔ ∀ (i : 𝒰.J), Q (𝒰.map i ≫ f)
X Y : Scheme
f : X ⟶ Y
𝒰 : X.OpenCover
U : ↑Y.affineOpens
⊢ Q (f ∣_ ↑U) ↔ ∀ (a : 𝒰.J), Q (𝒰.map a ∣_ f ⁻¹ᵁ ↑U ≫ f ∣_ ↑U)

Tactic:
exact @H _ _ (f ∣_ U.1) U.2 (𝒰.restrict (f ⁻¹ᵁ U.1))

Result:
no goals

Proof state:
P : MorphismProperty Scheme
Q : AffineTargetMorphismProperty
inst✝ : HasAffineProperty P Q
H : ∀ {X Y : Scheme} (f : X ⟶ Y) [inst : IsAffine Y] (𝒰 : X.OpenCover), Q f ↔ ∀ (i : 𝒰.J), Q (𝒰.map i ≫ f)
X Y : Scheme
f : X ⟶ Y
𝒰 : X.OpenCover
⊢ (∀ (i : ↑Y.affineOpens), P (f ∣_ ↑i)) ↔ ∀ (i : 𝒰.J) (i_1 : ↑Y.affineOpens), P ((𝒰.map i ≫ f) ∣_ ↑i_1)

Tactic:
rw [forall_comm]

Result:
P : MorphismProperty Scheme
Q : AffineTargetMorphismProperty
inst✝ : HasAffineProperty P Q
H : ∀ {X Y : Scheme} (f : X ⟶ Y) [inst : IsAffine Y] (𝒰 : X.OpenCover), Q f ↔ ∀ (i : 𝒰.J), Q (𝒰.map i ≫ f)
X Y : Scheme
f : X ⟶ Y
𝒰 : X.OpenCover
⊢ (∀ (i : ↑Y.affineOpens), P (f ∣_ ↑i)) ↔ ∀ (b : ↑Y.affineOpens) (a : 𝒰.J), P ((𝒰.map a ≫ f) ∣_ ↑b)

Proof state:
P : MorphismProperty Scheme
Q : AffineTargetMorphismProperty
inst✝ : HasAffineProperty P Q
H : ∀ {X Y : Scheme} (f : X ⟶ Y) [inst : IsAffine Y] (𝒰 : X.OpenCover), Q f ↔ ∀ (i : 𝒰.J), Q (𝒰.map i ≫ f)
X Y : Scheme
f : X ⟶ Y
𝒰 : X.OpenCover
⊢ P f ↔ ∀ (i : 𝒰.J), P (𝒰.map i ≫ f)

Tactic:
simp_rw [IsLocalAtTarget.iff_of_iSup_eq_top _ (iSup_affineOpens_eq_top Y)]

Result:
P : MorphismProperty Scheme
Q : AffineTargetMorphismProperty
inst✝ : HasAffineProperty P Q
H : ∀ {X Y : Scheme} (f : X ⟶ Y) [inst : IsAffine Y] (𝒰 : X.OpenCover), Q f ↔ ∀ (i : 𝒰.J), Q (𝒰.map i ≫ f)
X Y : Scheme
f : X ⟶ Y
𝒰 : X.OpenCover
⊢ (∀ (i : ↑Y.affineOpens), P (f ∣_ ↑i)) ↔ ∀ (i : 𝒰.J) (i_1 : ↑Y.affineOpens), P ((𝒰.map i ≫ f) ∣_ ↑i_1)

Proof state:
P : MorphismProperty Scheme
Q : AffineTargetMorphismProperty
inst✝ : HasAffineProperty P Q
H : ∀ {X Y : Scheme} (f : X ⟶ Y) [inst : IsAffine Y] (𝒰 : X.OpenCover), Q f ↔ ∀ (i : 𝒰.J), Q (𝒰.map i ≫ f)
X Y : Scheme
f : X ⟶ Y
𝒰 : X.OpenCover
⊢ (∀ (i : ↑Y.affineOpens), P (f ∣_ ↑i)) ↔ ∀ (b : ↑Y.affineOpens) (a : 𝒰.J), P ((𝒰.map a ≫ f) ∣_ ↑b)

Tactic:
refine forall_congr' fun U ↦ ?_

Result:
P : MorphismProperty Scheme
Q : AffineTargetMorphismProperty
inst✝ : HasAffineProperty P Q
H : ∀ {X Y : Scheme} (f : X ⟶ Y) [inst : IsAffine Y] (𝒰 : X.OpenCover), Q f ↔ ∀ (i : 𝒰.J), Q (𝒰.map i ≫ f)
X Y : Scheme
f : X ⟶ Y
𝒰 : X.OpenCover
U : ↑Y.affineOpens
⊢ P (f ∣_ ↑U) ↔ ∀ (a : 𝒰.J), P ((𝒰.map a ≫ f) ∣_ ↑U)