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

tactic: refine ⟨fun H => ?_, fun H => ?_⟩
state_before: P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
f : X ⟶ Y
inst✝¹ : IsAffine Y
𝒰 : X.OpenCover
inst✝ : ∀ (i : 𝒰.J), IsAffine (𝒰.obj i)
⊢ sourceAffineLocally P f ↔ ∀ (i : 𝒰.J), P (Scheme.Γ.map (𝒰.map i ≫ f).op)
state_after: case refine_1
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
f : X ⟶ Y
inst✝¹ : IsAffine Y
𝒰 : X.OpenCover
inst✝ : ∀ (i : 𝒰.J), IsAffine (𝒰.obj i)
H : sourceAffineLocally P f
⊢ ∀ (i : 𝒰.J), P (Scheme.Γ.map (𝒰.map i ≫ f).op)

case refine_2
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
f : X ⟶ Y
inst✝¹ : IsAffine Y
𝒰 : X.OpenCover
inst✝ : ∀ (i : 𝒰.J), IsAffine (𝒰.obj i)
H : ∀ (i : 𝒰.J), P (Scheme.Γ.map (𝒰.map i ≫ f).op)
⊢ sourceAffineLocally P f

tactic: have h := (hP.affine_openCover_TFAE f).out 0 2
state_before: case refine_1
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
f : X ⟶ Y
inst✝¹ : IsAffine Y
𝒰 : X.OpenCover
inst✝ : ∀ (i : 𝒰.J), IsAffine (𝒰.obj i)
H : sourceAffineLocally P f
⊢ ∀ (i : 𝒰.J), P (Scheme.Γ.map (𝒰.map i ≫ f).op)
state_after: case refine_1
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
f : X ⟶ Y
inst✝¹ : IsAffine Y
𝒰 : X.OpenCover
inst✝ : ∀ (i : 𝒰.J), IsAffine (𝒰.obj i)
H : sourceAffineLocally P f
h :
  sourceAffineLocally P f ↔
    ∀ (𝒰 : X.OpenCover) [inst : ∀ (i : 𝒰.J), IsAffine (𝒰.obj i)] (i : 𝒰.J), P (Scheme.Γ.map (𝒰.map i ≫ f).op)
⊢ ∀ (i : 𝒰.J), P (Scheme.Γ.map (𝒰.map i ≫ f).op)

tactic: apply h.mp
state_before: case refine_1
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
f : X ⟶ Y
inst✝¹ : IsAffine Y
𝒰 : X.OpenCover
inst✝ : ∀ (i : 𝒰.J), IsAffine (𝒰.obj i)
H : sourceAffineLocally P f
h :
  sourceAffineLocally P f ↔
    ∀ (𝒰 : X.OpenCover) [inst : ∀ (i : 𝒰.J), IsAffine (𝒰.obj i)] (i : 𝒰.J), P (Scheme.Γ.map (𝒰.map i ≫ f).op)
⊢ ∀ (i : 𝒰.J), P (Scheme.Γ.map (𝒰.map i ≫ f).op)
state_after: case refine_1.a
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
f : X ⟶ Y
inst✝¹ : IsAffine Y
𝒰 : X.OpenCover
inst✝ : ∀ (i : 𝒰.J), IsAffine (𝒰.obj i)
H : sourceAffineLocally P f
h :
  sourceAffineLocally P f ↔
    ∀ (𝒰 : X.OpenCover) [inst : ∀ (i : 𝒰.J), IsAffine (𝒰.obj i)] (i : 𝒰.J), P (Scheme.Γ.map (𝒰.map i ≫ f).op)
⊢ sourceAffineLocally P f

tactic: exact H
state_before: case refine_1.a
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
f : X ⟶ Y
inst✝¹ : IsAffine Y
𝒰 : X.OpenCover
inst✝ : ∀ (i : 𝒰.J), IsAffine (𝒰.obj i)
H : sourceAffineLocally P f
h :
  sourceAffineLocally P f ↔
    ∀ (𝒰 : X.OpenCover) [inst : ∀ (i : 𝒰.J), IsAffine (𝒰.obj i)] (i : 𝒰.J), P (Scheme.Γ.map (𝒰.map i ≫ f).op)
⊢ sourceAffineLocally P f
state_after: no goals

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

tactic: apply h.mp
state_before: case refine_2
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
f : X ⟶ Y
inst✝¹ : IsAffine Y
𝒰 : X.OpenCover
inst✝ : ∀ (i : 𝒰.J), IsAffine (𝒰.obj i)
H : ∀ (i : 𝒰.J), P (Scheme.Γ.map (𝒰.map i ≫ f).op)
h :
  (∃ 𝒰, ∃ (_ : ∀ (i : 𝒰.J), IsAffine (𝒰.obj i)), ∀ (i : 𝒰.J), P (Scheme.Γ.map (𝒰.map i ≫ f).op)) ↔
    sourceAffineLocally P f
⊢ sourceAffineLocally P f
state_after: case refine_2
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
f : X ⟶ Y
inst✝¹ : IsAffine Y
𝒰 : X.OpenCover
inst✝ : ∀ (i : 𝒰.J), IsAffine (𝒰.obj i)
H : ∀ (i : 𝒰.J), P (Scheme.Γ.map (𝒰.map i ≫ f).op)
h :
  (∃ 𝒰, ∃ (_ : ∀ (i : 𝒰.J), IsAffine (𝒰.obj i)), ∀ (i : 𝒰.J), P (Scheme.Γ.map (𝒰.map i ≫ f).op)) ↔
    sourceAffineLocally P f
⊢ ∃ 𝒰, ∃ (_ : ∀ (i : 𝒰.J), IsAffine (𝒰.obj i)), ∀ (i : 𝒰.J), P (Scheme.Γ.map (𝒰.map i ≫ f).op)

tactic: use 𝒰
state_before: case refine_2
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
X Y : Scheme
f : X ⟶ Y
inst✝¹ : IsAffine Y
𝒰 : X.OpenCover
inst✝ : ∀ (i : 𝒰.J), IsAffine (𝒰.obj i)
H : ∀ (i : 𝒰.J), P (Scheme.Γ.map (𝒰.map i ≫ f).op)
h :
  (∃ 𝒰, ∃ (_ : ∀ (i : 𝒰.J), IsAffine (𝒰.obj i)), ∀ (i : 𝒰.J), P (Scheme.Γ.map (𝒰.map i ≫ f).op)) ↔
    sourceAffineLocally P f
⊢ ∃ 𝒰, ∃ (_ : ∀ (i : 𝒰.J), IsAffine (𝒰.obj i)), ∀ (i : 𝒰.J), P (Scheme.Γ.map (𝒰.map i ≫ f).op)
state_after: no goals