Theorem: RingHom.PropertyIsLocal.openCover_TFAE
File: Mathlib/AlgebraicGeometry/Morphisms/RingHomProperties.lean

tactic: tfae_have 1 → 4
state_before: P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
⊢ [sourceAffineLocally P f, ∃ 𝒰, ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f),
      ∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f),
      ∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)].TFAE
state_after: case tfae_1_to_4
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
⊢ sourceAffineLocally P f → ∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)

P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
tfae_1_to_4 :
  sourceAffineLocally P f → ∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)
⊢ [sourceAffineLocally P f, ∃ 𝒰, ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f),
      ∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f),
      ∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)].TFAE

tactic: tfae_have 4 → 3
state_before: P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
tfae_1_to_4 :
  sourceAffineLocally P f → ∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)
⊢ [sourceAffineLocally P f, ∃ 𝒰, ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f),
      ∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f),
      ∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)].TFAE
state_after: case tfae_4_to_3
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
tfae_1_to_4 :
  sourceAffineLocally P f → ∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)
⊢ (∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)) →
    ∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)

P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
tfae_1_to_4 :
  sourceAffineLocally P f → ∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)
tfae_4_to_3 :
  (∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)) →
    ∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
⊢ [sourceAffineLocally P f, ∃ 𝒰, ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f),
      ∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f),
      ∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)].TFAE

tactic: tfae_have 3 → 2
state_before: P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
tfae_1_to_4 :
  sourceAffineLocally P f → ∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)
tfae_4_to_3 :
  (∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)) →
    ∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
⊢ [sourceAffineLocally P f, ∃ 𝒰, ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f),
      ∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f),
      ∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)].TFAE
state_after: case tfae_3_to_2
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
tfae_1_to_4 :
  sourceAffineLocally P f → ∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)
tfae_4_to_3 :
  (∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)) →
    ∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
⊢ (∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)) →
    ∃ 𝒰, ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)

P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
tfae_1_to_4 :
  sourceAffineLocally P f → ∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)
tfae_4_to_3 :
  (∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)) →
    ∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
tfae_3_to_2 :
  (∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)) →
    ∃ 𝒰, ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
⊢ [sourceAffineLocally P f, ∃ 𝒰, ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f),
      ∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f),
      ∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)].TFAE

tactic: tfae_have 2 → 1
state_before: P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
tfae_1_to_4 :
  sourceAffineLocally P f → ∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)
tfae_4_to_3 :
  (∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)) →
    ∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
tfae_3_to_2 :
  (∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)) →
    ∃ 𝒰, ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
⊢ [sourceAffineLocally P f, ∃ 𝒰, ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f),
      ∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f),
      ∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)].TFAE
state_after: case tfae_2_to_1
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
tfae_1_to_4 :
  sourceAffineLocally P f → ∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)
tfae_4_to_3 :
  (∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)) →
    ∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
tfae_3_to_2 :
  (∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)) →
    ∃ 𝒰, ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
⊢ (∃ 𝒰, ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)) → sourceAffineLocally P f

P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
tfae_1_to_4 :
  sourceAffineLocally P f → ∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)
tfae_4_to_3 :
  (∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)) →
    ∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
tfae_3_to_2 :
  (∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)) →
    ∃ 𝒰, ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
tfae_2_to_1 : (∃ 𝒰, ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)) → sourceAffineLocally P f
⊢ [sourceAffineLocally P f, ∃ 𝒰, ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f),
      ∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f),
      ∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)].TFAE

tactic: tfae_finish
state_before: P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
tfae_1_to_4 :
  sourceAffineLocally P f → ∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)
tfae_4_to_3 :
  (∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)) →
    ∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
tfae_3_to_2 :
  (∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)) →
    ∃ 𝒰, ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
tfae_2_to_1 : (∃ 𝒰, ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)) → sourceAffineLocally P f
⊢ [sourceAffineLocally P f, ∃ 𝒰, ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f),
      ∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f),
      ∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)].TFAE
state_after: no goals

tactic: intro H U g hg V
state_before: case tfae_1_to_4
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
⊢ sourceAffineLocally P f → ∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)
state_after: case tfae_1_to_4
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
H : sourceAffineLocally P f
U : Scheme
g : U ⟶ X
hg : IsOpenImmersion g
V : ↑U.affineOpens
⊢ P (Scheme.Γ.map (U.ofRestrict ⋯ ≫ g ≫ f).op)

tactic: have := (hP.affine_openCover_TFAE f).out 0 3
state_before: case tfae_1_to_4
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
H : sourceAffineLocally P f
U : Scheme
g : U ⟶ X
hg : IsOpenImmersion g
V : ↑U.affineOpens
⊢ P (Scheme.Γ.map (U.ofRestrict ⋯ ≫ g ≫ f).op)
state_after: case tfae_1_to_4
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
H : sourceAffineLocally P f
U : Scheme
g : U ⟶ X
hg : IsOpenImmersion g
V : ↑U.affineOpens
this :
  sourceAffineLocally P f ↔
    ∀ {U : Scheme} (g : U ⟶ X) [inst : IsAffine U] [inst : IsOpenImmersion g], P (Scheme.Γ.map (g ≫ f).op)
⊢ P (Scheme.Γ.map (U.ofRestrict ⋯ ≫ g ≫ f).op)

tactic: rw [this] at H
state_before: case tfae_1_to_4
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
H : sourceAffineLocally P f
U : Scheme
g : U ⟶ X
hg : IsOpenImmersion g
V : ↑U.affineOpens
this :
  sourceAffineLocally P f ↔
    ∀ {U : Scheme} (g : U ⟶ X) [inst : IsAffine U] [inst : IsOpenImmersion g], P (Scheme.Γ.map (g ≫ f).op)
⊢ P (Scheme.Γ.map (U.ofRestrict ⋯ ≫ g ≫ f).op)
state_after: case tfae_1_to_4
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
H : ∀ {U : Scheme} (g : U ⟶ X) [inst : IsAffine U] [inst : IsOpenImmersion g], P (Scheme.Γ.map (g ≫ f).op)
U : Scheme
g : U ⟶ X
hg : IsOpenImmersion g
V : ↑U.affineOpens
this :
  sourceAffineLocally P f ↔
    ∀ {U : Scheme} (g : U ⟶ X) [inst : IsAffine U] [inst : IsOpenImmersion g], P (Scheme.Γ.map (g ≫ f).op)
⊢ P (Scheme.Γ.map (U.ofRestrict ⋯ ≫ g ≫ f).op)

tactic: haveI : IsAffine _ := V.2
state_before: case tfae_1_to_4
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
H : ∀ {U : Scheme} (g : U ⟶ X) [inst : IsAffine U] [inst : IsOpenImmersion g], P (Scheme.Γ.map (g ≫ f).op)
U : Scheme
g : U ⟶ X
hg : IsOpenImmersion g
V : ↑U.affineOpens
this :
  sourceAffineLocally P f ↔
    ∀ {U : Scheme} (g : U ⟶ X) [inst : IsAffine U] [inst : IsOpenImmersion g], P (Scheme.Γ.map (g ≫ f).op)
⊢ P (Scheme.Γ.map (U.ofRestrict ⋯ ≫ g ≫ f).op)
state_after: case tfae_1_to_4
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
H : ∀ {U : Scheme} (g : U ⟶ X) [inst : IsAffine U] [inst : IsOpenImmersion g], P (Scheme.Γ.map (g ≫ f).op)
U : Scheme
g : U ⟶ X
hg : IsOpenImmersion g
V : ↑U.affineOpens
this✝ :
  sourceAffineLocally P f ↔
    ∀ {U : Scheme} (g : U ⟶ X) [inst : IsAffine U] [inst : IsOpenImmersion g], P (Scheme.Γ.map (g ≫ f).op)
this : IsAffine (U.restrict ⋯)
⊢ P (Scheme.Γ.map (U.ofRestrict ⋯ ≫ g ≫ f).op)

tactic: rw [← Category.assoc]
state_before: case tfae_1_to_4
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
H : ∀ {U : Scheme} (g : U ⟶ X) [inst : IsAffine U] [inst : IsOpenImmersion g], P (Scheme.Γ.map (g ≫ f).op)
U : Scheme
g : U ⟶ X
hg : IsOpenImmersion g
V : ↑U.affineOpens
this✝ :
  sourceAffineLocally P f ↔
    ∀ {U : Scheme} (g : U ⟶ X) [inst : IsAffine U] [inst : IsOpenImmersion g], P (Scheme.Γ.map (g ≫ f).op)
this : IsAffine (U.restrict ⋯)
⊢ P (Scheme.Γ.map (U.ofRestrict ⋯ ≫ g ≫ f).op)
state_after: case tfae_1_to_4
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
H : ∀ {U : Scheme} (g : U ⟶ X) [inst : IsAffine U] [inst : IsOpenImmersion g], P (Scheme.Γ.map (g ≫ f).op)
U : Scheme
g : U ⟶ X
hg : IsOpenImmersion g
V : ↑U.affineOpens
this✝ :
  sourceAffineLocally P f ↔
    ∀ {U : Scheme} (g : U ⟶ X) [inst : IsAffine U] [inst : IsOpenImmersion g], P (Scheme.Γ.map (g ≫ f).op)
this : IsAffine (U.restrict ⋯)
⊢ P (Scheme.Γ.map ((U.ofRestrict ⋯ ≫ g) ≫ f).op)

tactic: have : IsOpenImmersion <| (Scheme.ofRestrict U (Opens.openEmbedding V.val)) ≫ g :=
  LocallyRingedSpace.IsOpenImmersion.comp _ _
state_before: case tfae_1_to_4
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
H : ∀ {U : Scheme} (g : U ⟶ X) [inst : IsAffine U] [inst : IsOpenImmersion g], P (Scheme.Γ.map (g ≫ f).op)
U : Scheme
g : U ⟶ X
hg : IsOpenImmersion g
V : ↑U.affineOpens
this✝ :
  sourceAffineLocally P f ↔
    ∀ {U : Scheme} (g : U ⟶ X) [inst : IsAffine U] [inst : IsOpenImmersion g], P (Scheme.Γ.map (g ≫ f).op)
this : IsAffine (U.restrict ⋯)
⊢ P (Scheme.Γ.map ((U.ofRestrict ⋯ ≫ g) ≫ f).op)
state_after: case tfae_1_to_4
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
H : ∀ {U : Scheme} (g : U ⟶ X) [inst : IsAffine U] [inst : IsOpenImmersion g], P (Scheme.Γ.map (g ≫ f).op)
U : Scheme
g : U ⟶ X
hg : IsOpenImmersion g
V : ↑U.affineOpens
this✝¹ :
  sourceAffineLocally P f ↔
    ∀ {U : Scheme} (g : U ⟶ X) [inst : IsAffine U] [inst : IsOpenImmersion g], P (Scheme.Γ.map (g ≫ f).op)
this✝ : IsAffine (U.restrict ⋯)
this : IsOpenImmersion (U.ofRestrict ⋯ ≫ g)
⊢ P (Scheme.Γ.map ((U.ofRestrict ⋯ ≫ g) ≫ f).op)

tactic: apply H
state_before: case tfae_1_to_4
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
H : ∀ {U : Scheme} (g : U ⟶ X) [inst : IsAffine U] [inst : IsOpenImmersion g], P (Scheme.Γ.map (g ≫ f).op)
U : Scheme
g : U ⟶ X
hg : IsOpenImmersion g
V : ↑U.affineOpens
this✝¹ :
  sourceAffineLocally P f ↔
    ∀ {U : Scheme} (g : U ⟶ X) [inst : IsAffine U] [inst : IsOpenImmersion g], P (Scheme.Γ.map (g ≫ f).op)
this✝ : IsAffine (U.restrict ⋯)
this : IsOpenImmersion (U.ofRestrict ⋯ ≫ g)
⊢ P (Scheme.Γ.map ((U.ofRestrict ⋯ ≫ g) ≫ f).op)
state_after: no goals

tactic: intro H 𝒰 _ i
state_before: case tfae_4_to_3
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
tfae_1_to_4 :
  sourceAffineLocally P f → ∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)
⊢ (∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)) →
    ∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
state_after: case tfae_4_to_3
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
tfae_1_to_4 :
  sourceAffineLocally P f → ∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)
H : ∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)
𝒰 : X.OpenCover
i✝ : 𝒰.J
i : ↑(𝒰.obj i✝).affineOpens
⊢ P (Scheme.Γ.map ((𝒰.obj i✝).ofRestrict ⋯ ≫ 𝒰.map i✝ ≫ f).op)

tactic: apply H
state_before: case tfae_4_to_3
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
tfae_1_to_4 :
  sourceAffineLocally P f → ∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)
H : ∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)
𝒰 : X.OpenCover
i✝ : 𝒰.J
i : ↑(𝒰.obj i✝).affineOpens
⊢ P (Scheme.Γ.map ((𝒰.obj i✝).ofRestrict ⋯ ≫ 𝒰.map i✝ ≫ f).op)
state_after: no goals

tactic: intro H
state_before: case tfae_3_to_2
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
tfae_1_to_4 :
  sourceAffineLocally P f → ∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)
tfae_4_to_3 :
  (∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)) →
    ∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
⊢ (∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)) →
    ∃ 𝒰, ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
state_after: case tfae_3_to_2
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
tfae_1_to_4 :
  sourceAffineLocally P f → ∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)
tfae_4_to_3 :
  (∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)) →
    ∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
H : ∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
⊢ ∃ 𝒰, ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)

tactic: exact ⟨X.affineCover, H _⟩
state_before: case tfae_3_to_2
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
tfae_1_to_4 :
  sourceAffineLocally P f → ∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)
tfae_4_to_3 :
  (∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)) →
    ∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
H : ∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
⊢ ∃ 𝒰, ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
state_after: no goals

tactic: rintro ⟨𝒰, h𝒰⟩
state_before: case tfae_2_to_1
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
tfae_1_to_4 :
  sourceAffineLocally P f → ∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)
tfae_4_to_3 :
  (∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)) →
    ∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
tfae_3_to_2 :
  (∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)) →
    ∃ 𝒰, ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
⊢ (∃ 𝒰, ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)) → sourceAffineLocally P f
state_after: case tfae_2_to_1.intro
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
tfae_1_to_4 :
  sourceAffineLocally P f → ∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)
tfae_4_to_3 :
  (∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)) →
    ∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
tfae_3_to_2 :
  (∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)) →
    ∃ 𝒰, ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
𝒰 : X.OpenCover
h𝒰 : ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
⊢ sourceAffineLocally P f

tactic: have := (hP.affine_openCover_TFAE f).out 0 1
state_before: case tfae_2_to_1.intro
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
tfae_1_to_4 :
  sourceAffineLocally P f → ∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)
tfae_4_to_3 :
  (∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)) →
    ∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
tfae_3_to_2 :
  (∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)) →
    ∃ 𝒰, ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
𝒰 : X.OpenCover
h𝒰 : ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
⊢ sourceAffineLocally P f
state_after: case tfae_2_to_1.intro
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
tfae_1_to_4 :
  sourceAffineLocally P f → ∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)
tfae_4_to_3 :
  (∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)) →
    ∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
tfae_3_to_2 :
  (∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)) →
    ∃ 𝒰, ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
𝒰 : X.OpenCover
h𝒰 : ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
this :
  sourceAffineLocally P f ↔ ∃ 𝒰, ∃ (_ : ∀ (i : 𝒰.J), IsAffine (𝒰.obj i)), ∀ (i : 𝒰.J), P (Scheme.Γ.map (𝒰.map i ≫ f).op)
⊢ sourceAffineLocally P f

tactic: rw [this]
state_before: case tfae_2_to_1.intro
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
tfae_1_to_4 :
  sourceAffineLocally P f → ∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)
tfae_4_to_3 :
  (∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)) →
    ∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
tfae_3_to_2 :
  (∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)) →
    ∃ 𝒰, ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
𝒰 : X.OpenCover
h𝒰 : ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
this :
  sourceAffineLocally P f ↔ ∃ 𝒰, ∃ (_ : ∀ (i : 𝒰.J), IsAffine (𝒰.obj i)), ∀ (i : 𝒰.J), P (Scheme.Γ.map (𝒰.map i ≫ f).op)
⊢ sourceAffineLocally P f
state_after: case tfae_2_to_1.intro
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
tfae_1_to_4 :
  sourceAffineLocally P f → ∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)
tfae_4_to_3 :
  (∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)) →
    ∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
tfae_3_to_2 :
  (∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)) →
    ∃ 𝒰, ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
𝒰 : X.OpenCover
h𝒰 : ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
this :
  sourceAffineLocally P f ↔ ∃ 𝒰, ∃ (_ : ∀ (i : 𝒰.J), IsAffine (𝒰.obj i)), ∀ (i : 𝒰.J), P (Scheme.Γ.map (𝒰.map i ≫ f).op)
⊢ ∃ 𝒰, ∃ (_ : ∀ (i : 𝒰.J), IsAffine (𝒰.obj i)), ∀ (i : 𝒰.J), P (Scheme.Γ.map (𝒰.map i ≫ f).op)

tactic: refine ⟨𝒰.bind fun _ => Scheme.affineCover _, ?_, ?_⟩
state_before: case tfae_2_to_1.intro
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
tfae_1_to_4 :
  sourceAffineLocally P f → ∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)
tfae_4_to_3 :
  (∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)) →
    ∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
tfae_3_to_2 :
  (∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)) →
    ∃ 𝒰, ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
𝒰 : X.OpenCover
h𝒰 : ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
this :
  sourceAffineLocally P f ↔ ∃ 𝒰, ∃ (_ : ∀ (i : 𝒰.J), IsAffine (𝒰.obj i)), ∀ (i : 𝒰.J), P (Scheme.Γ.map (𝒰.map i ≫ f).op)
⊢ ∃ 𝒰, ∃ (_ : ∀ (i : 𝒰.J), IsAffine (𝒰.obj i)), ∀ (i : 𝒰.J), P (Scheme.Γ.map (𝒰.map i ≫ f).op)
state_after: case tfae_2_to_1.intro.refine_1
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
tfae_1_to_4 :
  sourceAffineLocally P f → ∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)
tfae_4_to_3 :
  (∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)) →
    ∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
tfae_3_to_2 :
  (∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)) →
    ∃ 𝒰, ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
𝒰 : X.OpenCover
h𝒰 : ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
this :
  sourceAffineLocally P f ↔ ∃ 𝒰, ∃ (_ : ∀ (i : 𝒰.J), IsAffine (𝒰.obj i)), ∀ (i : 𝒰.J), P (Scheme.Γ.map (𝒰.map i ≫ f).op)
⊢ ∀ (i : (𝒰.bind fun x => (𝒰.obj x).affineCover).J), IsAffine ((𝒰.bind fun x => (𝒰.obj x).affineCover).obj i)

case tfae_2_to_1.intro.refine_2
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
tfae_1_to_4 :
  sourceAffineLocally P f → ∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)
tfae_4_to_3 :
  (∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)) →
    ∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
tfae_3_to_2 :
  (∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)) →
    ∃ 𝒰, ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
𝒰 : X.OpenCover
h𝒰 : ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
this :
  sourceAffineLocally P f ↔ ∃ 𝒰, ∃ (_ : ∀ (i : 𝒰.J), IsAffine (𝒰.obj i)), ∀ (i : 𝒰.J), P (Scheme.Γ.map (𝒰.map i ≫ f).op)
⊢ ∀ (i : (𝒰.bind fun x => (𝒰.obj x).affineCover).J),
    P (Scheme.Γ.map ((𝒰.bind fun x => (𝒰.obj x).affineCover).map i ≫ f).op)

tactic: intro i
state_before: case tfae_2_to_1.intro.refine_1
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
tfae_1_to_4 :
  sourceAffineLocally P f → ∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)
tfae_4_to_3 :
  (∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)) →
    ∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
tfae_3_to_2 :
  (∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)) →
    ∃ 𝒰, ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
𝒰 : X.OpenCover
h𝒰 : ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
this :
  sourceAffineLocally P f ↔ ∃ 𝒰, ∃ (_ : ∀ (i : 𝒰.J), IsAffine (𝒰.obj i)), ∀ (i : 𝒰.J), P (Scheme.Γ.map (𝒰.map i ≫ f).op)
⊢ ∀ (i : (𝒰.bind fun x => (𝒰.obj x).affineCover).J), IsAffine ((𝒰.bind fun x => (𝒰.obj x).affineCover).obj i)
state_after: case tfae_2_to_1.intro.refine_1
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
tfae_1_to_4 :
  sourceAffineLocally P f → ∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)
tfae_4_to_3 :
  (∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)) →
    ∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
tfae_3_to_2 :
  (∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)) →
    ∃ 𝒰, ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
𝒰 : X.OpenCover
h𝒰 : ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
this :
  sourceAffineLocally P f ↔ ∃ 𝒰, ∃ (_ : ∀ (i : 𝒰.J), IsAffine (𝒰.obj i)), ∀ (i : 𝒰.J), P (Scheme.Γ.map (𝒰.map i ≫ f).op)
i : (𝒰.bind fun x => (𝒰.obj x).affineCover).J
⊢ IsAffine ((𝒰.bind fun x => (𝒰.obj x).affineCover).obj i)

tactic: dsimp
state_before: case tfae_2_to_1.intro.refine_1
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
tfae_1_to_4 :
  sourceAffineLocally P f → ∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)
tfae_4_to_3 :
  (∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)) →
    ∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
tfae_3_to_2 :
  (∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)) →
    ∃ 𝒰, ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
𝒰 : X.OpenCover
h𝒰 : ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
this :
  sourceAffineLocally P f ↔ ∃ 𝒰, ∃ (_ : ∀ (i : 𝒰.J), IsAffine (𝒰.obj i)), ∀ (i : 𝒰.J), P (Scheme.Γ.map (𝒰.map i ≫ f).op)
i : (𝒰.bind fun x => (𝒰.obj x).affineCover).J
⊢ IsAffine ((𝒰.bind fun x => (𝒰.obj x).affineCover).obj i)
state_after: case tfae_2_to_1.intro.refine_1
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
tfae_1_to_4 :
  sourceAffineLocally P f → ∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)
tfae_4_to_3 :
  (∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)) →
    ∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
tfae_3_to_2 :
  (∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)) →
    ∃ 𝒰, ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
𝒰 : X.OpenCover
h𝒰 : ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
this :
  sourceAffineLocally P f ↔ ∃ 𝒰, ∃ (_ : ∀ (i : 𝒰.J), IsAffine (𝒰.obj i)), ∀ (i : 𝒰.J), P (Scheme.Γ.map (𝒰.map i ≫ f).op)
i : (𝒰.bind fun x => (𝒰.obj x).affineCover).J
⊢ IsAffine ((𝒰.obj i.fst).affineCover.obj i.snd)

tactic: infer_instance
state_before: case tfae_2_to_1.intro.refine_1
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
tfae_1_to_4 :
  sourceAffineLocally P f → ∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)
tfae_4_to_3 :
  (∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)) →
    ∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
tfae_3_to_2 :
  (∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)) →
    ∃ 𝒰, ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
𝒰 : X.OpenCover
h𝒰 : ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
this :
  sourceAffineLocally P f ↔ ∃ 𝒰, ∃ (_ : ∀ (i : 𝒰.J), IsAffine (𝒰.obj i)), ∀ (i : 𝒰.J), P (Scheme.Γ.map (𝒰.map i ≫ f).op)
i : (𝒰.bind fun x => (𝒰.obj x).affineCover).J
⊢ IsAffine ((𝒰.obj i.fst).affineCover.obj i.snd)
state_after: no goals

tactic: intro i
state_before: case tfae_2_to_1.intro.refine_2
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
tfae_1_to_4 :
  sourceAffineLocally P f → ∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)
tfae_4_to_3 :
  (∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)) →
    ∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
tfae_3_to_2 :
  (∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)) →
    ∃ 𝒰, ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
𝒰 : X.OpenCover
h𝒰 : ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
this :
  sourceAffineLocally P f ↔ ∃ 𝒰, ∃ (_ : ∀ (i : 𝒰.J), IsAffine (𝒰.obj i)), ∀ (i : 𝒰.J), P (Scheme.Γ.map (𝒰.map i ≫ f).op)
⊢ ∀ (i : (𝒰.bind fun x => (𝒰.obj x).affineCover).J),
    P (Scheme.Γ.map ((𝒰.bind fun x => (𝒰.obj x).affineCover).map i ≫ f).op)
state_after: case tfae_2_to_1.intro.refine_2
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
tfae_1_to_4 :
  sourceAffineLocally P f → ∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)
tfae_4_to_3 :
  (∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)) →
    ∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
tfae_3_to_2 :
  (∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)) →
    ∃ 𝒰, ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
𝒰 : X.OpenCover
h𝒰 : ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
this :
  sourceAffineLocally P f ↔ ∃ 𝒰, ∃ (_ : ∀ (i : 𝒰.J), IsAffine (𝒰.obj i)), ∀ (i : 𝒰.J), P (Scheme.Γ.map (𝒰.map i ≫ f).op)
i : (𝒰.bind fun x => (𝒰.obj x).affineCover).J
⊢ P (Scheme.Γ.map ((𝒰.bind fun x => (𝒰.obj x).affineCover).map i ≫ f).op)

tactic: specialize h𝒰 i.1
state_before: case tfae_2_to_1.intro.refine_2
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
tfae_1_to_4 :
  sourceAffineLocally P f → ∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)
tfae_4_to_3 :
  (∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)) →
    ∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
tfae_3_to_2 :
  (∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)) →
    ∃ 𝒰, ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
𝒰 : X.OpenCover
h𝒰 : ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
this :
  sourceAffineLocally P f ↔ ∃ 𝒰, ∃ (_ : ∀ (i : 𝒰.J), IsAffine (𝒰.obj i)), ∀ (i : 𝒰.J), P (Scheme.Γ.map (𝒰.map i ≫ f).op)
i : (𝒰.bind fun x => (𝒰.obj x).affineCover).J
⊢ P (Scheme.Γ.map ((𝒰.bind fun x => (𝒰.obj x).affineCover).map i ≫ f).op)
state_after: case tfae_2_to_1.intro.refine_2
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
tfae_1_to_4 :
  sourceAffineLocally P f → ∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)
tfae_4_to_3 :
  (∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)) →
    ∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
tfae_3_to_2 :
  (∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)) →
    ∃ 𝒰, ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
𝒰 : X.OpenCover
this :
  sourceAffineLocally P f ↔ ∃ 𝒰, ∃ (_ : ∀ (i : 𝒰.J), IsAffine (𝒰.obj i)), ∀ (i : 𝒰.J), P (Scheme.Γ.map (𝒰.map i ≫ f).op)
i : (𝒰.bind fun x => (𝒰.obj x).affineCover).J
h𝒰 : sourceAffineLocally P (𝒰.map i.fst ≫ f)
⊢ P (Scheme.Γ.map ((𝒰.bind fun x => (𝒰.obj x).affineCover).map i ≫ f).op)

tactic: have := (hP.affine_openCover_TFAE (𝒰.map i.fst ≫ f)).out 0 3
state_before: case tfae_2_to_1.intro.refine_2
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
tfae_1_to_4 :
  sourceAffineLocally P f → ∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)
tfae_4_to_3 :
  (∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)) →
    ∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
tfae_3_to_2 :
  (∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)) →
    ∃ 𝒰, ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
𝒰 : X.OpenCover
this :
  sourceAffineLocally P f ↔ ∃ 𝒰, ∃ (_ : ∀ (i : 𝒰.J), IsAffine (𝒰.obj i)), ∀ (i : 𝒰.J), P (Scheme.Γ.map (𝒰.map i ≫ f).op)
i : (𝒰.bind fun x => (𝒰.obj x).affineCover).J
h𝒰 : sourceAffineLocally P (𝒰.map i.fst ≫ f)
⊢ P (Scheme.Γ.map ((𝒰.bind fun x => (𝒰.obj x).affineCover).map i ≫ f).op)
state_after: case tfae_2_to_1.intro.refine_2
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
tfae_1_to_4 :
  sourceAffineLocally P f → ∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)
tfae_4_to_3 :
  (∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)) →
    ∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
tfae_3_to_2 :
  (∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)) →
    ∃ 𝒰, ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
𝒰 : X.OpenCover
this✝ :
  sourceAffineLocally P f ↔ ∃ 𝒰, ∃ (_ : ∀ (i : 𝒰.J), IsAffine (𝒰.obj i)), ∀ (i : 𝒰.J), P (Scheme.Γ.map (𝒰.map i ≫ f).op)
i : (𝒰.bind fun x => (𝒰.obj x).affineCover).J
h𝒰 : sourceAffineLocally P (𝒰.map i.fst ≫ f)
this :
  sourceAffineLocally P (𝒰.map i.fst ≫ f) ↔
    ∀ {U : Scheme} (g : U ⟶ 𝒰.obj i.fst) [inst : IsAffine U] [inst : IsOpenImmersion g],
      P (Scheme.Γ.map (g ≫ 𝒰.map i.fst ≫ f).op)
⊢ P (Scheme.Γ.map ((𝒰.bind fun x => (𝒰.obj x).affineCover).map i ≫ f).op)

tactic: rw [this] at h𝒰
state_before: case tfae_2_to_1.intro.refine_2
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
tfae_1_to_4 :
  sourceAffineLocally P f → ∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)
tfae_4_to_3 :
  (∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)) →
    ∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
tfae_3_to_2 :
  (∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)) →
    ∃ 𝒰, ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
𝒰 : X.OpenCover
this✝ :
  sourceAffineLocally P f ↔ ∃ 𝒰, ∃ (_ : ∀ (i : 𝒰.J), IsAffine (𝒰.obj i)), ∀ (i : 𝒰.J), P (Scheme.Γ.map (𝒰.map i ≫ f).op)
i : (𝒰.bind fun x => (𝒰.obj x).affineCover).J
h𝒰 : sourceAffineLocally P (𝒰.map i.fst ≫ f)
this :
  sourceAffineLocally P (𝒰.map i.fst ≫ f) ↔
    ∀ {U : Scheme} (g : U ⟶ 𝒰.obj i.fst) [inst : IsAffine U] [inst : IsOpenImmersion g],
      P (Scheme.Γ.map (g ≫ 𝒰.map i.fst ≫ f).op)
⊢ P (Scheme.Γ.map ((𝒰.bind fun x => (𝒰.obj x).affineCover).map i ≫ f).op)
state_after: case tfae_2_to_1.intro.refine_2
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
tfae_1_to_4 :
  sourceAffineLocally P f → ∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)
tfae_4_to_3 :
  (∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)) →
    ∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
tfae_3_to_2 :
  (∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)) →
    ∃ 𝒰, ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
𝒰 : X.OpenCover
this✝ :
  sourceAffineLocally P f ↔ ∃ 𝒰, ∃ (_ : ∀ (i : 𝒰.J), IsAffine (𝒰.obj i)), ∀ (i : 𝒰.J), P (Scheme.Γ.map (𝒰.map i ≫ f).op)
i : (𝒰.bind fun x => (𝒰.obj x).affineCover).J
h𝒰 :
  ∀ {U : Scheme} (g : U ⟶ 𝒰.obj i.fst) [inst : IsAffine U] [inst : IsOpenImmersion g],
    P (Scheme.Γ.map (g ≫ 𝒰.map i.fst ≫ f).op)
this :
  sourceAffineLocally P (𝒰.map i.fst ≫ f) ↔
    ∀ {U : Scheme} (g : U ⟶ 𝒰.obj i.fst) [inst : IsAffine U] [inst : IsOpenImmersion g],
      P (Scheme.Γ.map (g ≫ 𝒰.map i.fst ≫ f).op)
⊢ P (Scheme.Γ.map ((𝒰.bind fun x => (𝒰.obj x).affineCover).map i ≫ f).op)

tactic: have : IsAffine (Scheme.OpenCover.obj
  (Scheme.OpenCover.bind 𝒰 fun x ↦ Scheme.affineCover (Scheme.OpenCover.obj 𝒰 x)) i) := by
    dsimp; infer_instance
state_before: case tfae_2_to_1.intro.refine_2
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
tfae_1_to_4 :
  sourceAffineLocally P f → ∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)
tfae_4_to_3 :
  (∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)) →
    ∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
tfae_3_to_2 :
  (∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)) →
    ∃ 𝒰, ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
𝒰 : X.OpenCover
this✝ :
  sourceAffineLocally P f ↔ ∃ 𝒰, ∃ (_ : ∀ (i : 𝒰.J), IsAffine (𝒰.obj i)), ∀ (i : 𝒰.J), P (Scheme.Γ.map (𝒰.map i ≫ f).op)
i : (𝒰.bind fun x => (𝒰.obj x).affineCover).J
h𝒰 :
  ∀ {U : Scheme} (g : U ⟶ 𝒰.obj i.fst) [inst : IsAffine U] [inst : IsOpenImmersion g],
    P (Scheme.Γ.map (g ≫ 𝒰.map i.fst ≫ f).op)
this :
  sourceAffineLocally P (𝒰.map i.fst ≫ f) ↔
    ∀ {U : Scheme} (g : U ⟶ 𝒰.obj i.fst) [inst : IsAffine U] [inst : IsOpenImmersion g],
      P (Scheme.Γ.map (g ≫ 𝒰.map i.fst ≫ f).op)
⊢ P (Scheme.Γ.map ((𝒰.bind fun x => (𝒰.obj x).affineCover).map i ≫ f).op)
state_after: case tfae_2_to_1.intro.refine_2
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
tfae_1_to_4 :
  sourceAffineLocally P f → ∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)
tfae_4_to_3 :
  (∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)) →
    ∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
tfae_3_to_2 :
  (∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)) →
    ∃ 𝒰, ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
𝒰 : X.OpenCover
this✝¹ :
  sourceAffineLocally P f ↔ ∃ 𝒰, ∃ (_ : ∀ (i : 𝒰.J), IsAffine (𝒰.obj i)), ∀ (i : 𝒰.J), P (Scheme.Γ.map (𝒰.map i ≫ f).op)
i : (𝒰.bind fun x => (𝒰.obj x).affineCover).J
h𝒰 :
  ∀ {U : Scheme} (g : U ⟶ 𝒰.obj i.fst) [inst : IsAffine U] [inst : IsOpenImmersion g],
    P (Scheme.Γ.map (g ≫ 𝒰.map i.fst ≫ f).op)
this✝ :
  sourceAffineLocally P (𝒰.map i.fst ≫ f) ↔
    ∀ {U : Scheme} (g : U ⟶ 𝒰.obj i.fst) [inst : IsAffine U] [inst : IsOpenImmersion g],
      P (Scheme.Γ.map (g ≫ 𝒰.map i.fst ≫ f).op)
this : IsAffine ((𝒰.bind fun x => (𝒰.obj x).affineCover).obj i)
⊢ P (Scheme.Γ.map ((𝒰.bind fun x => (𝒰.obj x).affineCover).map i ≫ f).op)

tactic: apply @h𝒰 _ (show _ from _)
state_before: case tfae_2_to_1.intro.refine_2
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
tfae_1_to_4 :
  sourceAffineLocally P f → ∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)
tfae_4_to_3 :
  (∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)) →
    ∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
tfae_3_to_2 :
  (∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)) →
    ∃ 𝒰, ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
𝒰 : X.OpenCover
this✝¹ :
  sourceAffineLocally P f ↔ ∃ 𝒰, ∃ (_ : ∀ (i : 𝒰.J), IsAffine (𝒰.obj i)), ∀ (i : 𝒰.J), P (Scheme.Γ.map (𝒰.map i ≫ f).op)
i : (𝒰.bind fun x => (𝒰.obj x).affineCover).J
h𝒰 :
  ∀ {U : Scheme} (g : U ⟶ 𝒰.obj i.fst) [inst : IsAffine U] [inst : IsOpenImmersion g],
    P (Scheme.Γ.map (g ≫ 𝒰.map i.fst ≫ f).op)
this✝ :
  sourceAffineLocally P (𝒰.map i.fst ≫ f) ↔
    ∀ {U : Scheme} (g : U ⟶ 𝒰.obj i.fst) [inst : IsAffine U] [inst : IsOpenImmersion g],
      P (Scheme.Γ.map (g ≫ 𝒰.map i.fst ≫ f).op)
this : IsAffine ((𝒰.bind fun x => (𝒰.obj x).affineCover).obj i)
⊢ P (Scheme.Γ.map ((𝒰.bind fun x => (𝒰.obj x).affineCover).map i ≫ f).op)
state_after: no goals

tactic: dsimp
state_before: P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
tfae_1_to_4 :
  sourceAffineLocally P f → ∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)
tfae_4_to_3 :
  (∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)) →
    ∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
tfae_3_to_2 :
  (∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)) →
    ∃ 𝒰, ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
𝒰 : X.OpenCover
this✝ :
  sourceAffineLocally P f ↔ ∃ 𝒰, ∃ (_ : ∀ (i : 𝒰.J), IsAffine (𝒰.obj i)), ∀ (i : 𝒰.J), P (Scheme.Γ.map (𝒰.map i ≫ f).op)
i : (𝒰.bind fun x => (𝒰.obj x).affineCover).J
h𝒰 :
  ∀ {U : Scheme} (g : U ⟶ 𝒰.obj i.fst) [inst : IsAffine U] [inst : IsOpenImmersion g],
    P (Scheme.Γ.map (g ≫ 𝒰.map i.fst ≫ f).op)
this :
  sourceAffineLocally P (𝒰.map i.fst ≫ f) ↔
    ∀ {U : Scheme} (g : U ⟶ 𝒰.obj i.fst) [inst : IsAffine U] [inst : IsOpenImmersion g],
      P (Scheme.Γ.map (g ≫ 𝒰.map i.fst ≫ f).op)
⊢ IsAffine ((𝒰.bind fun x => (𝒰.obj x).affineCover).obj i)
state_after: P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
tfae_1_to_4 :
  sourceAffineLocally P f → ∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)
tfae_4_to_3 :
  (∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)) →
    ∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
tfae_3_to_2 :
  (∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)) →
    ∃ 𝒰, ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
𝒰 : X.OpenCover
this✝ :
  sourceAffineLocally P f ↔ ∃ 𝒰, ∃ (_ : ∀ (i : 𝒰.J), IsAffine (𝒰.obj i)), ∀ (i : 𝒰.J), P (Scheme.Γ.map (𝒰.map i ≫ f).op)
i : (𝒰.bind fun x => (𝒰.obj x).affineCover).J
h𝒰 :
  ∀ {U : Scheme} (g : U ⟶ 𝒰.obj i.fst) [inst : IsAffine U] [inst : IsOpenImmersion g],
    P (Scheme.Γ.map (g ≫ 𝒰.map i.fst ≫ f).op)
this :
  sourceAffineLocally P (𝒰.map i.fst ≫ f) ↔
    ∀ {U : Scheme} (g : U ⟶ 𝒰.obj i.fst) [inst : IsAffine U] [inst : IsOpenImmersion g],
      P (Scheme.Γ.map (g ≫ 𝒰.map i.fst ≫ f).op)
⊢ IsAffine ((𝒰.obj i.fst).affineCover.obj i.snd)

tactic: infer_instance
state_before: P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
inst✝ : IsAffine Y
f : X ⟶ Y
tfae_1_to_4 :
  sourceAffineLocally P f → ∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)
tfae_4_to_3 :
  (∀ {U : Scheme} (g : U ⟶ X) [inst : IsOpenImmersion g], sourceAffineLocally P (g ≫ f)) →
    ∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
tfae_3_to_2 :
  (∀ (𝒰 : X.OpenCover) (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)) →
    ∃ 𝒰, ∀ (i : 𝒰.J), sourceAffineLocally P (𝒰.map i ≫ f)
𝒰 : X.OpenCover
this✝ :
  sourceAffineLocally P f ↔ ∃ 𝒰, ∃ (_ : ∀ (i : 𝒰.J), IsAffine (𝒰.obj i)), ∀ (i : 𝒰.J), P (Scheme.Γ.map (𝒰.map i ≫ f).op)
i : (𝒰.bind fun x => (𝒰.obj x).affineCover).J
h𝒰 :
  ∀ {U : Scheme} (g : U ⟶ 𝒰.obj i.fst) [inst : IsAffine U] [inst : IsOpenImmersion g],
    P (Scheme.Γ.map (g ≫ 𝒰.map i.fst ≫ f).op)
this :
  sourceAffineLocally P (𝒰.map i.fst ≫ f) ↔
    ∀ {U : Scheme} (g : U ⟶ 𝒰.obj i.fst) [inst : IsAffine U] [inst : IsOpenImmersion g],
      P (Scheme.Γ.map (g ≫ 𝒰.map i.fst ≫ f).op)
⊢ IsAffine ((𝒰.obj i.fst).affineCover.obj i.snd)
state_after: no goals