[GOAL]
R S : Type u
inst✝⁵ : CommRing R
inst✝⁴ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝³ : CommRing R'
inst✝² : CommRing S'
f : R →+* S
inst✝¹ : Algebra R R'
inst✝ : Algebra S S'
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
⊢ OfLocalizationSpan P ↔ OfLocalizationFiniteSpan P
[PROOFSTEP]
delta RingHom.OfLocalizationSpan RingHom.OfLocalizationFiniteSpan
[GOAL]
R S : Type u
inst✝⁵ : CommRing R
inst✝⁴ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝³ : CommRing R'
inst✝² : CommRing S'
f : R →+* S
inst✝¹ : Algebra R R'
inst✝ : Algebra S S'
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
⊢ (∀ ⦃R S : Type u⦄ [inst : CommRing R] [inst_1 : CommRing S] (f : R →+* S) (s : Set R),
      Ideal.span s = ⊤ → (∀ (r : ↑s), P (Localization.awayMap f ↑r)) → P f) ↔
    ∀ ⦃R S : Type u⦄ [inst : CommRing R] [inst_1 : CommRing S] (f : R →+* S) (s : Finset R),
      Ideal.span ↑s = ⊤ → (∀ (r : { x // x ∈ s }), P (Localization.awayMap f ↑r)) → P f
[PROOFSTEP]
apply forall₅_congr
[GOAL]
case h
R S : Type u
inst✝⁵ : CommRing R
inst✝⁴ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝³ : CommRing R'
inst✝² : CommRing S'
f : R →+* S
inst✝¹ : Algebra R R'
inst✝ : Algebra S S'
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
⊢ ∀ (a b : Type u) (c : CommRing a) (d : CommRing b) (e : a →+* b),
    (∀ (s : Set a), Ideal.span s = ⊤ → (∀ (r : ↑s), P (Localization.awayMap e ↑r)) → P e) ↔
      ∀ (s : Finset a), Ideal.span ↑s = ⊤ → (∀ (r : { x // x ∈ s }), P (Localization.awayMap e ↑r)) → P e
[PROOFSTEP]
intros
[GOAL]
case h
R S : Type u
inst✝⁵ : CommRing R
inst✝⁴ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝³ : CommRing R'
inst✝² : CommRing S'
f : R →+* S
inst✝¹ : Algebra R R'
inst✝ : Algebra S S'
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
a✝ b✝ : Type u
c✝ : CommRing a✝
d✝ : CommRing b✝
e✝ : a✝ →+* b✝
⊢ (∀ (s : Set a✝), Ideal.span s = ⊤ → (∀ (r : ↑s), P (Localization.awayMap e✝ ↑r)) → P e✝) ↔
    ∀ (s : Finset a✝), Ideal.span ↑s = ⊤ → (∀ (r : { x // x ∈ s }), P (Localization.awayMap e✝ ↑r)) → P e✝
[PROOFSTEP]
constructor
[GOAL]
case h.mp
R S : Type u
inst✝⁵ : CommRing R
inst✝⁴ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝³ : CommRing R'
inst✝² : CommRing S'
f : R →+* S
inst✝¹ : Algebra R R'
inst✝ : Algebra S S'
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
a✝ b✝ : Type u
c✝ : CommRing a✝
d✝ : CommRing b✝
e✝ : a✝ →+* b✝
⊢ (∀ (s : Set a✝), Ideal.span s = ⊤ → (∀ (r : ↑s), P (Localization.awayMap e✝ ↑r)) → P e✝) →
    ∀ (s : Finset a✝), Ideal.span ↑s = ⊤ → (∀ (r : { x // x ∈ s }), P (Localization.awayMap e✝ ↑r)) → P e✝
[PROOFSTEP]
intro h s
[GOAL]
case h.mp
R S : Type u
inst✝⁵ : CommRing R
inst✝⁴ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝³ : CommRing R'
inst✝² : CommRing S'
f : R →+* S
inst✝¹ : Algebra R R'
inst✝ : Algebra S S'
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
a✝ b✝ : Type u
c✝ : CommRing a✝
d✝ : CommRing b✝
e✝ : a✝ →+* b✝
h : ∀ (s : Set a✝), Ideal.span s = ⊤ → (∀ (r : ↑s), P (Localization.awayMap e✝ ↑r)) → P e✝
s : Finset a✝
⊢ Ideal.span ↑s = ⊤ → (∀ (r : { x // x ∈ s }), P (Localization.awayMap e✝ ↑r)) → P e✝
[PROOFSTEP]
exact h s
[GOAL]
case h.mpr
R S : Type u
inst✝⁵ : CommRing R
inst✝⁴ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝³ : CommRing R'
inst✝² : CommRing S'
f : R →+* S
inst✝¹ : Algebra R R'
inst✝ : Algebra S S'
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
a✝ b✝ : Type u
c✝ : CommRing a✝
d✝ : CommRing b✝
e✝ : a✝ →+* b✝
⊢ (∀ (s : Finset a✝), Ideal.span ↑s = ⊤ → (∀ (r : { x // x ∈ s }), P (Localization.awayMap e✝ ↑r)) → P e✝) →
    ∀ (s : Set a✝), Ideal.span s = ⊤ → (∀ (r : ↑s), P (Localization.awayMap e✝ ↑r)) → P e✝
[PROOFSTEP]
intro h s hs hs'
[GOAL]
case h.mpr
R S : Type u
inst✝⁵ : CommRing R
inst✝⁴ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝³ : CommRing R'
inst✝² : CommRing S'
f : R →+* S
inst✝¹ : Algebra R R'
inst✝ : Algebra S S'
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
a✝ b✝ : Type u
c✝ : CommRing a✝
d✝ : CommRing b✝
e✝ : a✝ →+* b✝
h : ∀ (s : Finset a✝), Ideal.span ↑s = ⊤ → (∀ (r : { x // x ∈ s }), P (Localization.awayMap e✝ ↑r)) → P e✝
s : Set a✝
hs : Ideal.span s = ⊤
hs' : ∀ (r : ↑s), P (Localization.awayMap e✝ ↑r)
⊢ P e✝
[PROOFSTEP]
obtain ⟨s', h₁, h₂⟩ := (Ideal.span_eq_top_iff_finite s).mp hs
[GOAL]
case h.mpr.intro.intro
R S : Type u
inst✝⁵ : CommRing R
inst✝⁴ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝³ : CommRing R'
inst✝² : CommRing S'
f : R →+* S
inst✝¹ : Algebra R R'
inst✝ : Algebra S S'
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
a✝ b✝ : Type u
c✝ : CommRing a✝
d✝ : CommRing b✝
e✝ : a✝ →+* b✝
h : ∀ (s : Finset a✝), Ideal.span ↑s = ⊤ → (∀ (r : { x // x ∈ s }), P (Localization.awayMap e✝ ↑r)) → P e✝
s : Set a✝
hs : Ideal.span s = ⊤
hs' : ∀ (r : ↑s), P (Localization.awayMap e✝ ↑r)
s' : Finset a✝
h₁ : ↑s' ⊆ s
h₂ : Ideal.span ↑s' = ⊤
⊢ P e✝
[PROOFSTEP]
exact h s' h₂ fun x => hs' ⟨_, h₁ x.prop⟩
[GOAL]
R S : Type u
inst✝⁵ : CommRing R
inst✝⁴ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝³ : CommRing R'
inst✝² : CommRing S'
f : R →+* S
inst✝¹ : Algebra R R'
inst✝ : Algebra S S'
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
⊢ OfLocalizationSpanTarget P ↔ OfLocalizationFiniteSpanTarget P
[PROOFSTEP]
delta RingHom.OfLocalizationSpanTarget RingHom.OfLocalizationFiniteSpanTarget
[GOAL]
R S : Type u
inst✝⁵ : CommRing R
inst✝⁴ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝³ : CommRing R'
inst✝² : CommRing S'
f : R →+* S
inst✝¹ : Algebra R R'
inst✝ : Algebra S S'
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
⊢ (∀ ⦃R S : Type u⦄ [inst : CommRing R] [inst_1 : CommRing S] (f : R →+* S) (s : Set S),
      Ideal.span s = ⊤ → (∀ (r : ↑s), P (comp (algebraMap S (Localization.Away ↑r)) f)) → P f) ↔
    ∀ ⦃R S : Type u⦄ [inst : CommRing R] [inst_1 : CommRing S] (f : R →+* S) (s : Finset S),
      Ideal.span ↑s = ⊤ → (∀ (r : { x // x ∈ s }), P (comp (algebraMap S (Localization.Away ↑r)) f)) → P f
[PROOFSTEP]
apply forall₅_congr
[GOAL]
case h
R S : Type u
inst✝⁵ : CommRing R
inst✝⁴ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝³ : CommRing R'
inst✝² : CommRing S'
f : R →+* S
inst✝¹ : Algebra R R'
inst✝ : Algebra S S'
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
⊢ ∀ (a b : Type u) (c : CommRing a) (d : CommRing b) (e : a →+* b),
    (∀ (s : Set b), Ideal.span s = ⊤ → (∀ (r : ↑s), P (comp (algebraMap b (Localization.Away ↑r)) e)) → P e) ↔
      ∀ (s : Finset b),
        Ideal.span ↑s = ⊤ → (∀ (r : { x // x ∈ s }), P (comp (algebraMap b (Localization.Away ↑r)) e)) → P e
[PROOFSTEP]
intros
[GOAL]
case h
R S : Type u
inst✝⁵ : CommRing R
inst✝⁴ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝³ : CommRing R'
inst✝² : CommRing S'
f : R →+* S
inst✝¹ : Algebra R R'
inst✝ : Algebra S S'
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
a✝ b✝ : Type u
c✝ : CommRing a✝
d✝ : CommRing b✝
e✝ : a✝ →+* b✝
⊢ (∀ (s : Set b✝), Ideal.span s = ⊤ → (∀ (r : ↑s), P (comp (algebraMap b✝ (Localization.Away ↑r)) e✝)) → P e✝) ↔
    ∀ (s : Finset b✝),
      Ideal.span ↑s = ⊤ → (∀ (r : { x // x ∈ s }), P (comp (algebraMap b✝ (Localization.Away ↑r)) e✝)) → P e✝
[PROOFSTEP]
constructor
[GOAL]
case h.mp
R S : Type u
inst✝⁵ : CommRing R
inst✝⁴ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝³ : CommRing R'
inst✝² : CommRing S'
f : R →+* S
inst✝¹ : Algebra R R'
inst✝ : Algebra S S'
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
a✝ b✝ : Type u
c✝ : CommRing a✝
d✝ : CommRing b✝
e✝ : a✝ →+* b✝
⊢ (∀ (s : Set b✝), Ideal.span s = ⊤ → (∀ (r : ↑s), P (comp (algebraMap b✝ (Localization.Away ↑r)) e✝)) → P e✝) →
    ∀ (s : Finset b✝),
      Ideal.span ↑s = ⊤ → (∀ (r : { x // x ∈ s }), P (comp (algebraMap b✝ (Localization.Away ↑r)) e✝)) → P e✝
[PROOFSTEP]
intro h s
[GOAL]
case h.mp
R S : Type u
inst✝⁵ : CommRing R
inst✝⁴ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝³ : CommRing R'
inst✝² : CommRing S'
f : R →+* S
inst✝¹ : Algebra R R'
inst✝ : Algebra S S'
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
a✝ b✝ : Type u
c✝ : CommRing a✝
d✝ : CommRing b✝
e✝ : a✝ →+* b✝
h : ∀ (s : Set b✝), Ideal.span s = ⊤ → (∀ (r : ↑s), P (comp (algebraMap b✝ (Localization.Away ↑r)) e✝)) → P e✝
s : Finset b✝
⊢ Ideal.span ↑s = ⊤ → (∀ (r : { x // x ∈ s }), P (comp (algebraMap b✝ (Localization.Away ↑r)) e✝)) → P e✝
[PROOFSTEP]
exact h s
[GOAL]
case h.mpr
R S : Type u
inst✝⁵ : CommRing R
inst✝⁴ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝³ : CommRing R'
inst✝² : CommRing S'
f : R →+* S
inst✝¹ : Algebra R R'
inst✝ : Algebra S S'
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
a✝ b✝ : Type u
c✝ : CommRing a✝
d✝ : CommRing b✝
e✝ : a✝ →+* b✝
⊢ (∀ (s : Finset b✝),
      Ideal.span ↑s = ⊤ → (∀ (r : { x // x ∈ s }), P (comp (algebraMap b✝ (Localization.Away ↑r)) e✝)) → P e✝) →
    ∀ (s : Set b✝), Ideal.span s = ⊤ → (∀ (r : ↑s), P (comp (algebraMap b✝ (Localization.Away ↑r)) e✝)) → P e✝
[PROOFSTEP]
intro h s hs hs'
[GOAL]
case h.mpr
R S : Type u
inst✝⁵ : CommRing R
inst✝⁴ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝³ : CommRing R'
inst✝² : CommRing S'
f : R →+* S
inst✝¹ : Algebra R R'
inst✝ : Algebra S S'
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
a✝ b✝ : Type u
c✝ : CommRing a✝
d✝ : CommRing b✝
e✝ : a✝ →+* b✝
h :
  ∀ (s : Finset b✝),
    Ideal.span ↑s = ⊤ → (∀ (r : { x // x ∈ s }), P (comp (algebraMap b✝ (Localization.Away ↑r)) e✝)) → P e✝
s : Set b✝
hs : Ideal.span s = ⊤
hs' : ∀ (r : ↑s), P (comp (algebraMap b✝ (Localization.Away ↑r)) e✝)
⊢ P e✝
[PROOFSTEP]
obtain ⟨s', h₁, h₂⟩ := (Ideal.span_eq_top_iff_finite s).mp hs
[GOAL]
case h.mpr.intro.intro
R S : Type u
inst✝⁵ : CommRing R
inst✝⁴ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝³ : CommRing R'
inst✝² : CommRing S'
f : R →+* S
inst✝¹ : Algebra R R'
inst✝ : Algebra S S'
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
a✝ b✝ : Type u
c✝ : CommRing a✝
d✝ : CommRing b✝
e✝ : a✝ →+* b✝
h :
  ∀ (s : Finset b✝),
    Ideal.span ↑s = ⊤ → (∀ (r : { x // x ∈ s }), P (comp (algebraMap b✝ (Localization.Away ↑r)) e✝)) → P e✝
s : Set b✝
hs : Ideal.span s = ⊤
hs' : ∀ (r : ↑s), P (comp (algebraMap b✝ (Localization.Away ↑r)) e✝)
s' : Finset b✝
h₁ : ↑s' ⊆ s
h₂ : Ideal.span ↑s' = ⊤
⊢ P e✝
[PROOFSTEP]
exact h s' h₂ fun x => hs' ⟨_, h₁ x.prop⟩
[GOAL]
R S : Type u
inst✝⁵ : CommRing R
inst✝⁴ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝³ : CommRing R'
inst✝² : CommRing S'
f : R →+* S
inst✝¹ : Algebra R R'
inst✝ : Algebra S S'
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
⊢ RespectsIso P
[PROOFSTEP]
apply hP.StableUnderComposition.respectsIso
[GOAL]
R S : Type u
inst✝⁵ : CommRing R
inst✝⁴ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝³ : CommRing R'
inst✝² : CommRing S'
f : R →+* S
inst✝¹ : Algebra R R'
inst✝ : Algebra S S'
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
⊢ ∀ {R S : Type u} [inst : CommRing R] [inst_1 : CommRing S] (e : R ≃+* S), P (RingEquiv.toRingHom e)
[PROOFSTEP]
introv
[GOAL]
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
R S : Type u
inst✝¹ : CommRing R
inst✝ : CommRing S
e : R ≃+* S
⊢ P (RingEquiv.toRingHom e)
[PROOFSTEP]
letI := e.toRingHom.toAlgebra
[GOAL]
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
R S : Type u
inst✝¹ : CommRing R
inst✝ : CommRing S
e : R ≃+* S
this : Algebra R S := toAlgebra (RingEquiv.toRingHom e)
⊢ P (RingEquiv.toRingHom e)
[PROOFSTEP]
have : IsLocalization.Away (1 : R) S := by apply IsLocalization.away_of_isUnit_of_bijective _ isUnit_one e.bijective
[GOAL]
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
R S : Type u
inst✝¹ : CommRing R
inst✝ : CommRing S
e : R ≃+* S
this : Algebra R S := toAlgebra (RingEquiv.toRingHom e)
⊢ IsLocalization.Away 1 S
[PROOFSTEP]
apply IsLocalization.away_of_isUnit_of_bijective _ isUnit_one e.bijective
[GOAL]
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
R S : Type u
inst✝¹ : CommRing R
inst✝ : CommRing S
e : R ≃+* S
this✝ : Algebra R S := toAlgebra (RingEquiv.toRingHom e)
this : IsLocalization.Away 1 S
⊢ P (RingEquiv.toRingHom e)
[PROOFSTEP]
exact RingHom.PropertyIsLocal.HoldsForLocalizationAway hP S (1 : R)
[GOAL]
R S : Type u
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f : R →+* S
inst✝³ : Algebra R R'
inst✝² : Algebra S S'
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
H : LocalizationPreserves P
r : R
inst✝¹ : IsLocalization.Away r R'
inst✝ : IsLocalization.Away (↑f r) S'
hf : P f
⊢ P (IsLocalization.Away.map R' S' f r)
[PROOFSTEP]
have : IsLocalization ((Submonoid.powers r).map f) S' := by rw [Submonoid.map_powers]; assumption
[GOAL]
R S : Type u
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f : R →+* S
inst✝³ : Algebra R R'
inst✝² : Algebra S S'
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
H : LocalizationPreserves P
r : R
inst✝¹ : IsLocalization.Away r R'
inst✝ : IsLocalization.Away (↑f r) S'
hf : P f
⊢ IsLocalization (Submonoid.map f (Submonoid.powers r)) S'
[PROOFSTEP]
rw [Submonoid.map_powers]
[GOAL]
R S : Type u
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f : R →+* S
inst✝³ : Algebra R R'
inst✝² : Algebra S S'
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
H : LocalizationPreserves P
r : R
inst✝¹ : IsLocalization.Away r R'
inst✝ : IsLocalization.Away (↑f r) S'
hf : P f
⊢ IsLocalization (Submonoid.powers (↑f r)) S'
[PROOFSTEP]
assumption
[GOAL]
R S : Type u
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f : R →+* S
inst✝³ : Algebra R R'
inst✝² : Algebra S S'
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
H : LocalizationPreserves P
r : R
inst✝¹ : IsLocalization.Away r R'
inst✝ : IsLocalization.Away (↑f r) S'
hf : P f
this : IsLocalization (Submonoid.map f (Submonoid.powers r)) S'
⊢ P (IsLocalization.Away.map R' S' f r)
[PROOFSTEP]
exact H f (Submonoid.powers r) R' S' hf
[GOAL]
R S : Type u
inst✝⁵ : CommRing R
inst✝⁴ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝³ : CommRing R'
inst✝² : CommRing S'
f : R →+* S
inst✝¹ : Algebra R R'
inst✝ : Algebra S S'
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
⊢ OfLocalizationSpan P
[PROOFSTEP]
introv R hs hs'
[GOAL]
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
R S : Type u
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Set R
hs : Ideal.span s = ⊤
hs' : ∀ (r : ↑s), P (Localization.awayMap f ↑r)
⊢ P f
[PROOFSTEP]
apply_fun Ideal.map f at hs
[GOAL]
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
R S : Type u
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Set R
hs' : ∀ (r : ↑s), P (Localization.awayMap f ↑r)
hs : Ideal.map f (Ideal.span s) = Ideal.map f ⊤
⊢ P f
[PROOFSTEP]
rw [Ideal.map_span, Ideal.map_top] at hs
[GOAL]
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
R S : Type u
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Set R
hs' : ∀ (r : ↑s), P (Localization.awayMap f ↑r)
hs : Ideal.span (↑f '' s) = ⊤
⊢ P f
[PROOFSTEP]
apply hP.OfLocalizationSpanTarget _ _ hs
[GOAL]
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
R S : Type u
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Set R
hs' : ∀ (r : ↑s), P (Localization.awayMap f ↑r)
hs : Ideal.span (↑f '' s) = ⊤
⊢ ∀ (r : ↑(↑f '' s)), P (comp (algebraMap S (Localization.Away ↑r)) f)
[PROOFSTEP]
rintro ⟨_, r, hr, rfl⟩
[GOAL]
case mk.intro.intro
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
R S : Type u
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Set R
hs' : ∀ (r : ↑s), P (Localization.awayMap f ↑r)
hs : Ideal.span (↑f '' s) = ⊤
r : R
hr : r ∈ s
⊢ P (comp (algebraMap S (Localization.Away ↑{ val := ↑f r, property := (_ : ∃ a, a ∈ s ∧ ↑f a = ↑f r) })) f)
[PROOFSTEP]
convert hP.StableUnderComposition _ _ (hP.HoldsForLocalizationAway (Localization.Away r) r) (hs' ⟨r, hr⟩) using 1
[GOAL]
case h.e'_5
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
P : {R S : Type u} → [inst : CommRing R] → [inst_1 : CommRing S] → (R →+* S) → Prop
hP : PropertyIsLocal P
R S : Type u
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Set R
hs' : ∀ (r : ↑s), P (Localization.awayMap f ↑r)
hs : Ideal.span (↑f '' s) = ⊤
r : R
hr : r ∈ s
⊢ comp (algebraMap S (Localization.Away ↑{ val := ↑f r, property := (_ : ∃ a, a ∈ s ∧ ↑f a = ↑f r) })) f =
    comp (Localization.awayMap f ↑{ val := r, property := hr }) (algebraMap R (Localization.Away r))
[PROOFSTEP]
exact (IsLocalization.map_comp _).symm
[GOAL]
R S : Type u
inst✝⁵ : CommRing R
inst✝⁴ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝³ : CommRing R'
inst✝² : CommRing S'
f : R →+* S
inst✝¹ : Algebra R R'
inst✝ : Algebra S S'
I J : Ideal R
h :
  ∀ (P : Ideal R) (hP : IsMaximal P),
    map (algebraMap R (Localization.AtPrime P)) I ≤ map (algebraMap R (Localization.AtPrime P)) J
⊢ I ≤ J
[PROOFSTEP]
intro x hx
[GOAL]
R S : Type u
inst✝⁵ : CommRing R
inst✝⁴ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝³ : CommRing R'
inst✝² : CommRing S'
f : R →+* S
inst✝¹ : Algebra R R'
inst✝ : Algebra S S'
I J : Ideal R
h :
  ∀ (P : Ideal R) (hP : IsMaximal P),
    map (algebraMap R (Localization.AtPrime P)) I ≤ map (algebraMap R (Localization.AtPrime P)) J
x : R
hx : x ∈ I
⊢ x ∈ J
[PROOFSTEP]
suffices J.colon (Ideal.span { x }) = ⊤ by
  simpa using
    Submodule.mem_colon.mp (show (1 : R) ∈ J.colon (Ideal.span { x }) from this.symm ▸ Submodule.mem_top) x
      (Ideal.mem_span_singleton_self x)
[GOAL]
R S : Type u
inst✝⁵ : CommRing R
inst✝⁴ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝³ : CommRing R'
inst✝² : CommRing S'
f : R →+* S
inst✝¹ : Algebra R R'
inst✝ : Algebra S S'
I J : Ideal R
h :
  ∀ (P : Ideal R) (hP : IsMaximal P),
    map (algebraMap R (Localization.AtPrime P)) I ≤ map (algebraMap R (Localization.AtPrime P)) J
x : R
hx : x ∈ I
this : Submodule.colon J (span {x}) = ⊤
⊢ x ∈ J
[PROOFSTEP]
simpa using
  Submodule.mem_colon.mp (show (1 : R) ∈ J.colon (Ideal.span { x }) from this.symm ▸ Submodule.mem_top) x
    (Ideal.mem_span_singleton_self x)
[GOAL]
R S : Type u
inst✝⁵ : CommRing R
inst✝⁴ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝³ : CommRing R'
inst✝² : CommRing S'
f : R →+* S
inst✝¹ : Algebra R R'
inst✝ : Algebra S S'
I J : Ideal R
h :
  ∀ (P : Ideal R) (hP : IsMaximal P),
    map (algebraMap R (Localization.AtPrime P)) I ≤ map (algebraMap R (Localization.AtPrime P)) J
x : R
hx : x ∈ I
⊢ Submodule.colon J (span {x}) = ⊤
[PROOFSTEP]
refine' Not.imp_symm (J.colon (Ideal.span { x })).exists_le_maximal _
[GOAL]
R S : Type u
inst✝⁵ : CommRing R
inst✝⁴ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝³ : CommRing R'
inst✝² : CommRing S'
f : R →+* S
inst✝¹ : Algebra R R'
inst✝ : Algebra S S'
I J : Ideal R
h :
  ∀ (P : Ideal R) (hP : IsMaximal P),
    map (algebraMap R (Localization.AtPrime P)) I ≤ map (algebraMap R (Localization.AtPrime P)) J
x : R
hx : x ∈ I
⊢ ¬∃ M, IsMaximal M ∧ Submodule.colon J (span {x}) ≤ M
[PROOFSTEP]
push_neg
[GOAL]
R S : Type u
inst✝⁵ : CommRing R
inst✝⁴ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝³ : CommRing R'
inst✝² : CommRing S'
f : R →+* S
inst✝¹ : Algebra R R'
inst✝ : Algebra S S'
I J : Ideal R
h :
  ∀ (P : Ideal R) (hP : IsMaximal P),
    map (algebraMap R (Localization.AtPrime P)) I ≤ map (algebraMap R (Localization.AtPrime P)) J
x : R
hx : x ∈ I
⊢ ∀ (M : Ideal R), IsMaximal M → ¬Submodule.colon J (span {x}) ≤ M
[PROOFSTEP]
intro P hP le
[GOAL]
R S : Type u
inst✝⁵ : CommRing R
inst✝⁴ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝³ : CommRing R'
inst✝² : CommRing S'
f : R →+* S
inst✝¹ : Algebra R R'
inst✝ : Algebra S S'
I J : Ideal R
h :
  ∀ (P : Ideal R) (hP : IsMaximal P),
    map (algebraMap R (Localization.AtPrime P)) I ≤ map (algebraMap R (Localization.AtPrime P)) J
x : R
hx : x ∈ I
P : Ideal R
hP : IsMaximal P
le : Submodule.colon J (span {x}) ≤ P
⊢ False
[PROOFSTEP]
obtain ⟨⟨⟨a, ha⟩, ⟨s, hs⟩⟩, eq⟩ :=
  (IsLocalization.mem_map_algebraMap_iff P.primeCompl _).mp (h P hP (Ideal.mem_map_of_mem _ hx))
[GOAL]
case intro.mk.mk.mk
R S : Type u
inst✝⁵ : CommRing R
inst✝⁴ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝³ : CommRing R'
inst✝² : CommRing S'
f : R →+* S
inst✝¹ : Algebra R R'
inst✝ : Algebra S S'
I J : Ideal R
h :
  ∀ (P : Ideal R) (hP : IsMaximal P),
    map (algebraMap R (Localization.AtPrime P)) I ≤ map (algebraMap R (Localization.AtPrime P)) J
x : R
hx : x ∈ I
P : Ideal R
hP : IsMaximal P
le : Submodule.colon J (span {x}) ≤ P
a : R
ha : a ∈ J
s : R
hs : s ∈ primeCompl P
eq :
  ↑(algebraMap R (Localization.AtPrime P)) x *
      ↑(algebraMap R (Localization.AtPrime P)) ↑({ val := a, property := ha }, { val := s, property := hs }).snd =
    ↑(algebraMap R (Localization.AtPrime P)) ↑({ val := a, property := ha }, { val := s, property := hs }).fst
⊢ False
[PROOFSTEP]
rw [← _root_.map_mul, ← sub_eq_zero, ← map_sub] at eq
[GOAL]
case intro.mk.mk.mk
R S : Type u
inst✝⁵ : CommRing R
inst✝⁴ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝³ : CommRing R'
inst✝² : CommRing S'
f : R →+* S
inst✝¹ : Algebra R R'
inst✝ : Algebra S S'
I J : Ideal R
h :
  ∀ (P : Ideal R) (hP : IsMaximal P),
    map (algebraMap R (Localization.AtPrime P)) I ≤ map (algebraMap R (Localization.AtPrime P)) J
x : R
hx : x ∈ I
P : Ideal R
hP : IsMaximal P
le : Submodule.colon J (span {x}) ≤ P
a : R
ha : a ∈ J
s : R
hs : s ∈ primeCompl P
eq✝ :
  ↑(algebraMap R (Localization.AtPrime P)) (x * ↑({ val := a, property := ha }, { val := s, property := hs }).snd) =
    ↑(algebraMap R (Localization.AtPrime P)) ↑({ val := a, property := ha }, { val := s, property := hs }).fst
eq :
  ↑(algebraMap R (Localization.AtPrime P))
      (x * ↑({ val := a, property := ha }, { val := s, property := hs }).snd -
        ↑({ val := a, property := ha }, { val := s, property := hs }).fst) =
    0
⊢ False
[PROOFSTEP]
obtain ⟨⟨m, hm⟩, eq⟩ := (IsLocalization.map_eq_zero_iff P.primeCompl _ _).mp eq
[GOAL]
case intro.mk.mk.mk.intro.mk
R S : Type u
inst✝⁵ : CommRing R
inst✝⁴ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝³ : CommRing R'
inst✝² : CommRing S'
f : R →+* S
inst✝¹ : Algebra R R'
inst✝ : Algebra S S'
I J : Ideal R
h :
  ∀ (P : Ideal R) (hP : IsMaximal P),
    map (algebraMap R (Localization.AtPrime P)) I ≤ map (algebraMap R (Localization.AtPrime P)) J
x : R
hx : x ∈ I
P : Ideal R
hP : IsMaximal P
le : Submodule.colon J (span {x}) ≤ P
a : R
ha : a ∈ J
s : R
hs : s ∈ primeCompl P
eq✝¹ :
  ↑(algebraMap R (Localization.AtPrime P)) (x * ↑({ val := a, property := ha }, { val := s, property := hs }).snd) =
    ↑(algebraMap R (Localization.AtPrime P)) ↑({ val := a, property := ha }, { val := s, property := hs }).fst
eq✝ :
  ↑(algebraMap R (Localization.AtPrime P))
      (x * ↑({ val := a, property := ha }, { val := s, property := hs }).snd -
        ↑({ val := a, property := ha }, { val := s, property := hs }).fst) =
    0
m : R
hm : m ∈ primeCompl P
eq :
  ↑{ val := m, property := hm } *
      (x * ↑({ val := a, property := ha }, { val := s, property := hs }).snd -
        ↑({ val := a, property := ha }, { val := s, property := hs }).fst) =
    0
⊢ False
[PROOFSTEP]
refine' hs ((hP.isPrime.mem_or_mem (le (Ideal.mem_colon_singleton.mpr _))).resolve_right hm)
[GOAL]
case intro.mk.mk.mk.intro.mk
R S : Type u
inst✝⁵ : CommRing R
inst✝⁴ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝³ : CommRing R'
inst✝² : CommRing S'
f : R →+* S
inst✝¹ : Algebra R R'
inst✝ : Algebra S S'
I J : Ideal R
h :
  ∀ (P : Ideal R) (hP : IsMaximal P),
    map (algebraMap R (Localization.AtPrime P)) I ≤ map (algebraMap R (Localization.AtPrime P)) J
x : R
hx : x ∈ I
P : Ideal R
hP : IsMaximal P
le : Submodule.colon J (span {x}) ≤ P
a : R
ha : a ∈ J
s : R
hs : s ∈ primeCompl P
eq✝¹ :
  ↑(algebraMap R (Localization.AtPrime P)) (x * ↑({ val := a, property := ha }, { val := s, property := hs }).snd) =
    ↑(algebraMap R (Localization.AtPrime P)) ↑({ val := a, property := ha }, { val := s, property := hs }).fst
eq✝ :
  ↑(algebraMap R (Localization.AtPrime P))
      (x * ↑({ val := a, property := ha }, { val := s, property := hs }).snd -
        ↑({ val := a, property := ha }, { val := s, property := hs }).fst) =
    0
m : R
hm : m ∈ primeCompl P
eq :
  ↑{ val := m, property := hm } *
      (x * ↑({ val := a, property := ha }, { val := s, property := hs }).snd -
        ↑({ val := a, property := ha }, { val := s, property := hs }).fst) =
    0
⊢ s * m * x ∈ J
[PROOFSTEP]
simp only [Subtype.coe_mk, mul_sub, sub_eq_zero, mul_comm x s, mul_left_comm] at eq
[GOAL]
case intro.mk.mk.mk.intro.mk
R S : Type u
inst✝⁵ : CommRing R
inst✝⁴ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝³ : CommRing R'
inst✝² : CommRing S'
f : R →+* S
inst✝¹ : Algebra R R'
inst✝ : Algebra S S'
I J : Ideal R
h :
  ∀ (P : Ideal R) (hP : IsMaximal P),
    map (algebraMap R (Localization.AtPrime P)) I ≤ map (algebraMap R (Localization.AtPrime P)) J
x : R
hx : x ∈ I
P : Ideal R
hP : IsMaximal P
le : Submodule.colon J (span {x}) ≤ P
a : R
ha : a ∈ J
s : R
hs : s ∈ primeCompl P
eq✝¹ :
  ↑(algebraMap R (Localization.AtPrime P)) (x * ↑({ val := a, property := ha }, { val := s, property := hs }).snd) =
    ↑(algebraMap R (Localization.AtPrime P)) ↑({ val := a, property := ha }, { val := s, property := hs }).fst
eq✝ :
  ↑(algebraMap R (Localization.AtPrime P))
      (x * ↑({ val := a, property := ha }, { val := s, property := hs }).snd -
        ↑({ val := a, property := ha }, { val := s, property := hs }).fst) =
    0
m : R
hm : m ∈ primeCompl P
eq : s * (m * x) = m * a
⊢ s * m * x ∈ J
[PROOFSTEP]
simpa only [mul_assoc, eq] using J.mul_mem_left m ha
[GOAL]
R S : Type u
inst✝⁵ : CommRing R
inst✝⁴ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝³ : CommRing R'
inst✝² : CommRing S'
f : R →+* S
inst✝¹ : Algebra R R'
inst✝ : Algebra S S'
I : Ideal R
h : ∀ (J : Ideal R) (hJ : Ideal.IsMaximal J), Ideal.map (algebraMap R (Localization.AtPrime J)) I = ⊥
P : Ideal R
hP : Ideal.IsMaximal P
⊢ Ideal.map (algebraMap R (Localization.AtPrime P)) I = Ideal.map (algebraMap R (Localization.AtPrime P)) ⊥
[PROOFSTEP]
simpa using h P hP
[GOAL]
R S : Type u
inst✝⁵ : CommRing R
inst✝⁴ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝³ : CommRing R'
inst✝² : CommRing S'
f : R →+* S
inst✝¹ : Algebra R R'
inst✝ : Algebra S S'
I : Ideal R
h : ∀ (J : Ideal R) (hJ : Ideal.IsMaximal J), IsLocalization.coeSubmodule (Localization.AtPrime J) I = ⊥
P : Ideal R
hP : Ideal.IsMaximal P
x : R
hx : x ∈ I
⊢ x ∈ RingHom.ker (algebraMap R (Localization.AtPrime P))
[PROOFSTEP]
rw [RingHom.mem_ker, ← Submodule.mem_bot R, ← h P hP, IsLocalization.mem_coeSubmodule]
[GOAL]
R S : Type u
inst✝⁵ : CommRing R
inst✝⁴ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝³ : CommRing R'
inst✝² : CommRing S'
f : R →+* S
inst✝¹ : Algebra R R'
inst✝ : Algebra S S'
I : Ideal R
h : ∀ (J : Ideal R) (hJ : Ideal.IsMaximal J), IsLocalization.coeSubmodule (Localization.AtPrime J) I = ⊥
P : Ideal R
hP : Ideal.IsMaximal P
x : R
hx : x ∈ I
⊢ ∃ y, y ∈ I ∧ ↑(algebraMap R ((fun x => Localization.AtPrime P) x)) y = ↑(algebraMap R (Localization.AtPrime P)) x
[PROOFSTEP]
exact ⟨x, hx, rfl⟩
[GOAL]
R S : Type u
inst✝⁵ : CommRing R
inst✝⁴ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝³ : CommRing R'
inst✝² : CommRing S'
f : R →+* S
inst✝¹ : Algebra R R'
inst✝ : Algebra S S'
r : R
h : ∀ (J : Ideal R) (hJ : Ideal.IsMaximal J), ↑(algebraMap R (Localization.AtPrime J)) r = 0
⊢ r = 0
[PROOFSTEP]
rw [← Ideal.span_singleton_eq_bot]
[GOAL]
R S : Type u
inst✝⁵ : CommRing R
inst✝⁴ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝³ : CommRing R'
inst✝² : CommRing S'
f : R →+* S
inst✝¹ : Algebra R R'
inst✝ : Algebra S S'
r : R
h : ∀ (J : Ideal R) (hJ : Ideal.IsMaximal J), ↑(algebraMap R (Localization.AtPrime J)) r = 0
⊢ Ideal.span {r} = ⊥
[PROOFSTEP]
apply ideal_eq_bot_of_localization
[GOAL]
case h
R S : Type u
inst✝⁵ : CommRing R
inst✝⁴ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝³ : CommRing R'
inst✝² : CommRing S'
f : R →+* S
inst✝¹ : Algebra R R'
inst✝ : Algebra S S'
r : R
h : ∀ (J : Ideal R) (hJ : Ideal.IsMaximal J), ↑(algebraMap R (Localization.AtPrime J)) r = 0
⊢ ∀ (J : Ideal R) (hJ : Ideal.IsMaximal J), IsLocalization.coeSubmodule (Localization.AtPrime J) (Ideal.span {r}) = ⊥
[PROOFSTEP]
intro J hJ
[GOAL]
case h
R S : Type u
inst✝⁵ : CommRing R
inst✝⁴ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝³ : CommRing R'
inst✝² : CommRing S'
f : R →+* S
inst✝¹ : Algebra R R'
inst✝ : Algebra S S'
r : R
h : ∀ (J : Ideal R) (hJ : Ideal.IsMaximal J), ↑(algebraMap R (Localization.AtPrime J)) r = 0
J : Ideal R
hJ : Ideal.IsMaximal J
⊢ IsLocalization.coeSubmodule (Localization.AtPrime J) (Ideal.span {r}) = ⊥
[PROOFSTEP]
delta IsLocalization.coeSubmodule
[GOAL]
case h
R S : Type u
inst✝⁵ : CommRing R
inst✝⁴ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝³ : CommRing R'
inst✝² : CommRing S'
f : R →+* S
inst✝¹ : Algebra R R'
inst✝ : Algebra S S'
r : R
h : ∀ (J : Ideal R) (hJ : Ideal.IsMaximal J), ↑(algebraMap R (Localization.AtPrime J)) r = 0
J : Ideal R
hJ : Ideal.IsMaximal J
⊢ Submodule.map (Algebra.linearMap R (Localization.AtPrime J)) (Ideal.span {r}) = ⊥
[PROOFSTEP]
erw [Submodule.map_span, Submodule.span_eq_bot]
[GOAL]
case h
R S : Type u
inst✝⁵ : CommRing R
inst✝⁴ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝³ : CommRing R'
inst✝² : CommRing S'
f : R →+* S
inst✝¹ : Algebra R R'
inst✝ : Algebra S S'
r : R
h : ∀ (J : Ideal R) (hJ : Ideal.IsMaximal J), ↑(algebraMap R (Localization.AtPrime J)) r = 0
J : Ideal R
hJ : Ideal.IsMaximal J
⊢ ∀ (x : Localization.AtPrime J), x ∈ ↑(Algebra.linearMap R (Localization.AtPrime J)) '' {r} → x = 0
[PROOFSTEP]
rintro _ ⟨_, h', rfl⟩
[GOAL]
case h.intro.intro
R S : Type u
inst✝⁵ : CommRing R
inst✝⁴ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝³ : CommRing R'
inst✝² : CommRing S'
f : R →+* S
inst✝¹ : Algebra R R'
inst✝ : Algebra S S'
r : R
h : ∀ (J : Ideal R) (hJ : Ideal.IsMaximal J), ↑(algebraMap R (Localization.AtPrime J)) r = 0
J : Ideal R
hJ : Ideal.IsMaximal J
w✝ : R
h' : w✝ ∈ {r}
⊢ ↑(Algebra.linearMap R (Localization.AtPrime J)) w✝ = 0
[PROOFSTEP]
cases Set.mem_singleton_iff.mpr h'
[GOAL]
case h.intro.intro.refl
R S : Type u
inst✝⁵ : CommRing R
inst✝⁴ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝³ : CommRing R'
inst✝² : CommRing S'
f : R →+* S
inst✝¹ : Algebra R R'
inst✝ : Algebra S S'
r : R
h : ∀ (J : Ideal R) (hJ : Ideal.IsMaximal J), ↑(algebraMap R (Localization.AtPrime J)) r = 0
J : Ideal R
hJ : Ideal.IsMaximal J
h' : r ∈ {r}
⊢ ↑(Algebra.linearMap R (Localization.AtPrime J)) r = 0
[PROOFSTEP]
exact h J hJ
[GOAL]
R S : Type u
inst✝⁵ : CommRing R
inst✝⁴ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝³ : CommRing R'
inst✝² : CommRing S'
f : R →+* S
inst✝¹ : Algebra R R'
inst✝ : Algebra S S'
⊢ LocalizationPreserves fun R hR => IsReduced R
[PROOFSTEP]
introv R _ _
[GOAL]
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R : Type u_1
hR : CommRing R
M : Submonoid R
S : Type u_1
hS : CommRing S
inst✝¹ : Algebra R S
inst✝ : IsLocalization M S
a✝ : IsReduced R
⊢ IsReduced S
[PROOFSTEP]
constructor
[GOAL]
case eq_zero
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R : Type u_1
hR : CommRing R
M : Submonoid R
S : Type u_1
hS : CommRing S
inst✝¹ : Algebra R S
inst✝ : IsLocalization M S
a✝ : IsReduced R
⊢ ∀ (x : S), IsNilpotent x → x = 0
[PROOFSTEP]
rintro x ⟨_ | n, e⟩
[GOAL]
case eq_zero.intro.zero
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R : Type u_1
hR : CommRing R
M : Submonoid R
S : Type u_1
hS : CommRing S
inst✝¹ : Algebra R S
inst✝ : IsLocalization M S
a✝ : IsReduced R
x : S
e : x ^ Nat.zero = 0
⊢ x = 0
[PROOFSTEP]
simpa using congr_arg (· * x) e
[GOAL]
case eq_zero.intro.succ
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R : Type u_1
hR : CommRing R
M : Submonoid R
S : Type u_1
hS : CommRing S
inst✝¹ : Algebra R S
inst✝ : IsLocalization M S
a✝ : IsReduced R
x : S
n : ℕ
e : x ^ Nat.succ n = 0
⊢ x = 0
[PROOFSTEP]
obtain ⟨⟨y, m⟩, hx⟩ := IsLocalization.surj M x
[GOAL]
case eq_zero.intro.succ.intro.mk
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R : Type u_1
hR : CommRing R
M : Submonoid R
S : Type u_1
hS : CommRing S
inst✝¹ : Algebra R S
inst✝ : IsLocalization M S
a✝ : IsReduced R
x : S
n : ℕ
e : x ^ Nat.succ n = 0
y : R
m : { x // x ∈ M }
hx : x * ↑(algebraMap R S) ↑(y, m).snd = ↑(algebraMap R S) (y, m).fst
⊢ x = 0
[PROOFSTEP]
dsimp only at hx
[GOAL]
case eq_zero.intro.succ.intro.mk
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R : Type u_1
hR : CommRing R
M : Submonoid R
S : Type u_1
hS : CommRing S
inst✝¹ : Algebra R S
inst✝ : IsLocalization M S
a✝ : IsReduced R
x : S
n : ℕ
e : x ^ Nat.succ n = 0
y : R
m : { x // x ∈ M }
hx : x * ↑(algebraMap R S) ↑m = ↑(algebraMap R S) y
⊢ x = 0
[PROOFSTEP]
let hx' := congr_arg (· ^ n.succ) hx
[GOAL]
case eq_zero.intro.succ.intro.mk
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R : Type u_1
hR : CommRing R
M : Submonoid R
S : Type u_1
hS : CommRing S
inst✝¹ : Algebra R S
inst✝ : IsLocalization M S
a✝ : IsReduced R
x : S
n : ℕ
e : x ^ Nat.succ n = 0
y : R
m : { x // x ∈ M }
hx : x * ↑(algebraMap R S) ↑m = ↑(algebraMap R S) y
hx' : (fun x => x ^ Nat.succ n) (x * ↑(algebraMap R S) ↑m) = (fun x => x ^ Nat.succ n) (↑(algebraMap R S) y) :=
  congr_arg (fun x => x ^ Nat.succ n) hx
⊢ x = 0
[PROOFSTEP]
simp only [mul_pow, e, zero_mul, ← RingHom.map_pow] at hx'
[GOAL]
case eq_zero.intro.succ.intro.mk
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R : Type u_1
hR : CommRing R
M : Submonoid R
S : Type u_1
hS : CommRing S
inst✝¹ : Algebra R S
inst✝ : IsLocalization M S
a✝ : IsReduced R
x : S
n : ℕ
e : x ^ Nat.succ n = 0
y : R
m : { x // x ∈ M }
hx : x * ↑(algebraMap R S) ↑m = ↑(algebraMap R S) y
hx' : 0 = ↑(algebraMap R S) (y ^ Nat.succ n)
⊢ x = 0
[PROOFSTEP]
rw [← (algebraMap R S).map_zero] at hx'
[GOAL]
case eq_zero.intro.succ.intro.mk
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R : Type u_1
hR : CommRing R
M : Submonoid R
S : Type u_1
hS : CommRing S
inst✝¹ : Algebra R S
inst✝ : IsLocalization M S
a✝ : IsReduced R
x : S
n : ℕ
e : x ^ Nat.succ n = 0
y : R
m : { x // x ∈ M }
hx : x * ↑(algebraMap R S) ↑m = ↑(algebraMap R S) y
hx' : ↑(algebraMap R S) 0 = ↑(algebraMap R S) (y ^ Nat.succ n)
⊢ x = 0
[PROOFSTEP]
obtain ⟨m', hm'⟩ := (IsLocalization.eq_iff_exists M S).mp hx'
[GOAL]
case eq_zero.intro.succ.intro.mk.intro
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R : Type u_1
hR : CommRing R
M : Submonoid R
S : Type u_1
hS : CommRing S
inst✝¹ : Algebra R S
inst✝ : IsLocalization M S
a✝ : IsReduced R
x : S
n : ℕ
e : x ^ Nat.succ n = 0
y : R
m : { x // x ∈ M }
hx : x * ↑(algebraMap R S) ↑m = ↑(algebraMap R S) y
hx' : ↑(algebraMap R S) 0 = ↑(algebraMap R S) (y ^ Nat.succ n)
m' : { x // x ∈ M }
hm' : ↑m' * 0 = ↑m' * y ^ Nat.succ n
⊢ x = 0
[PROOFSTEP]
apply_fun (· * (m' : R) ^ n) at hm'
[GOAL]
case eq_zero.intro.succ.intro.mk.intro
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R : Type u_1
hR : CommRing R
M : Submonoid R
S : Type u_1
hS : CommRing S
inst✝¹ : Algebra R S
inst✝ : IsLocalization M S
a✝ : IsReduced R
x : S
n : ℕ
e : x ^ Nat.succ n = 0
y : R
m : { x // x ∈ M }
hx : x * ↑(algebraMap R S) ↑m = ↑(algebraMap R S) y
hx' : ↑(algebraMap R S) 0 = ↑(algebraMap R S) (y ^ Nat.succ n)
m' : { x // x ∈ M }
hm' : ↑m' * 0 * ↑m' ^ n = ↑m' * y ^ Nat.succ n * ↑m' ^ n
⊢ x = 0
[PROOFSTEP]
simp only [mul_assoc, zero_mul, mul_zero] at hm'
[GOAL]
case eq_zero.intro.succ.intro.mk.intro
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R : Type u_1
hR : CommRing R
M : Submonoid R
S : Type u_1
hS : CommRing S
inst✝¹ : Algebra R S
inst✝ : IsLocalization M S
a✝ : IsReduced R
x : S
n : ℕ
e : x ^ Nat.succ n = 0
y : R
m : { x // x ∈ M }
hx : x * ↑(algebraMap R S) ↑m = ↑(algebraMap R S) y
hx' : ↑(algebraMap R S) 0 = ↑(algebraMap R S) (y ^ Nat.succ n)
m' : { x // x ∈ M }
hm' : 0 = ↑m' * (y ^ Nat.succ n * ↑m' ^ n)
⊢ x = 0
[PROOFSTEP]
rw [← mul_left_comm, ← pow_succ, ← mul_pow] at hm'
[GOAL]
case eq_zero.intro.succ.intro.mk.intro
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R : Type u_1
hR : CommRing R
M : Submonoid R
S : Type u_1
hS : CommRing S
inst✝¹ : Algebra R S
inst✝ : IsLocalization M S
a✝ : IsReduced R
x : S
n : ℕ
e : x ^ Nat.succ n = 0
y : R
m : { x // x ∈ M }
hx : x * ↑(algebraMap R S) ↑m = ↑(algebraMap R S) y
hx' : ↑(algebraMap R S) 0 = ↑(algebraMap R S) (y ^ Nat.succ n)
m' : { x // x ∈ M }
hm' : 0 = (y * ↑m') ^ Nat.succ n
⊢ x = 0
[PROOFSTEP]
replace hm' := IsNilpotent.eq_zero ⟨_, hm'.symm⟩
[GOAL]
case eq_zero.intro.succ.intro.mk.intro
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R : Type u_1
hR : CommRing R
M : Submonoid R
S : Type u_1
hS : CommRing S
inst✝¹ : Algebra R S
inst✝ : IsLocalization M S
a✝ : IsReduced R
x : S
n : ℕ
e : x ^ Nat.succ n = 0
y : R
m : { x // x ∈ M }
hx : x * ↑(algebraMap R S) ↑m = ↑(algebraMap R S) y
hx' : ↑(algebraMap R S) 0 = ↑(algebraMap R S) (y ^ Nat.succ n)
m' : { x // x ∈ M }
hm' : y * ↑m' = 0
⊢ x = 0
[PROOFSTEP]
rw [← (IsLocalization.map_units S m).mul_left_inj, hx, zero_mul, IsLocalization.map_eq_zero_iff M]
[GOAL]
case eq_zero.intro.succ.intro.mk.intro
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R : Type u_1
hR : CommRing R
M : Submonoid R
S : Type u_1
hS : CommRing S
inst✝¹ : Algebra R S
inst✝ : IsLocalization M S
a✝ : IsReduced R
x : S
n : ℕ
e : x ^ Nat.succ n = 0
y : R
m : { x // x ∈ M }
hx : x * ↑(algebraMap R S) ↑m = ↑(algebraMap R S) y
hx' : ↑(algebraMap R S) 0 = ↑(algebraMap R S) (y ^ Nat.succ n)
m' : { x // x ∈ M }
hm' : y * ↑m' = 0
⊢ ∃ m, ↑m * y = 0
[PROOFSTEP]
exact ⟨m', by rw [← hm', mul_comm]⟩
[GOAL]
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R : Type u_1
hR : CommRing R
M : Submonoid R
S : Type u_1
hS : CommRing S
inst✝¹ : Algebra R S
inst✝ : IsLocalization M S
a✝ : IsReduced R
x : S
n : ℕ
e : x ^ Nat.succ n = 0
y : R
m : { x // x ∈ M }
hx : x * ↑(algebraMap R S) ↑m = ↑(algebraMap R S) y
hx' : ↑(algebraMap R S) 0 = ↑(algebraMap R S) (y ^ Nat.succ n)
m' : { x // x ∈ M }
hm' : y * ↑m' = 0
⊢ ↑m' * y = 0
[PROOFSTEP]
rw [← hm', mul_comm]
[GOAL]
R S : Type u
inst✝⁵ : CommRing R
inst✝⁴ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝³ : CommRing R'
inst✝² : CommRing S'
f : R →+* S
inst✝¹ : Algebra R R'
inst✝ : Algebra S S'
⊢ OfLocalizationMaximal fun R hR => IsReduced R
[PROOFSTEP]
introv R h
[GOAL]
R✝ S : Type u
inst✝⁶ : CommRing R✝
inst✝⁵ : CommRing S
M : Submonoid R✝
N : Submonoid S
R' S' : Type u
inst✝⁴ : CommRing R'
inst✝³ : CommRing S'
f : R✝ →+* S
inst✝² : Algebra R✝ R'
inst✝¹ : Algebra S S'
R : Type u_1
inst✝ : CommRing R
h :
  ∀ (J : Ideal R) (x : Ideal.IsMaximal J),
    (fun R hR => IsReduced R) (Localization.AtPrime J) Localization.instCommRingLocalizationToCommMonoid
⊢ IsReduced R
[PROOFSTEP]
constructor
[GOAL]
case eq_zero
R✝ S : Type u
inst✝⁶ : CommRing R✝
inst✝⁵ : CommRing S
M : Submonoid R✝
N : Submonoid S
R' S' : Type u
inst✝⁴ : CommRing R'
inst✝³ : CommRing S'
f : R✝ →+* S
inst✝² : Algebra R✝ R'
inst✝¹ : Algebra S S'
R : Type u_1
inst✝ : CommRing R
h :
  ∀ (J : Ideal R) (x : Ideal.IsMaximal J),
    (fun R hR => IsReduced R) (Localization.AtPrime J) Localization.instCommRingLocalizationToCommMonoid
⊢ ∀ (x : R), IsNilpotent x → x = 0
[PROOFSTEP]
intro x hx
[GOAL]
case eq_zero
R✝ S : Type u
inst✝⁶ : CommRing R✝
inst✝⁵ : CommRing S
M : Submonoid R✝
N : Submonoid S
R' S' : Type u
inst✝⁴ : CommRing R'
inst✝³ : CommRing S'
f : R✝ →+* S
inst✝² : Algebra R✝ R'
inst✝¹ : Algebra S S'
R : Type u_1
inst✝ : CommRing R
h :
  ∀ (J : Ideal R) (x : Ideal.IsMaximal J),
    (fun R hR => IsReduced R) (Localization.AtPrime J) Localization.instCommRingLocalizationToCommMonoid
x : R
hx : IsNilpotent x
⊢ x = 0
[PROOFSTEP]
apply eq_zero_of_localization
[GOAL]
case eq_zero.h
R✝ S : Type u
inst✝⁶ : CommRing R✝
inst✝⁵ : CommRing S
M : Submonoid R✝
N : Submonoid S
R' S' : Type u
inst✝⁴ : CommRing R'
inst✝³ : CommRing S'
f : R✝ →+* S
inst✝² : Algebra R✝ R'
inst✝¹ : Algebra S S'
R : Type u_1
inst✝ : CommRing R
h :
  ∀ (J : Ideal R) (x : Ideal.IsMaximal J),
    (fun R hR => IsReduced R) (Localization.AtPrime J) Localization.instCommRingLocalizationToCommMonoid
x : R
hx : IsNilpotent x
⊢ ∀ (J : Ideal R) (hJ : Ideal.IsMaximal J), ↑(algebraMap R (Localization.AtPrime J)) x = 0
[PROOFSTEP]
intro J hJ
[GOAL]
case eq_zero.h
R✝ S : Type u
inst✝⁶ : CommRing R✝
inst✝⁵ : CommRing S
M : Submonoid R✝
N : Submonoid S
R' S' : Type u
inst✝⁴ : CommRing R'
inst✝³ : CommRing S'
f : R✝ →+* S
inst✝² : Algebra R✝ R'
inst✝¹ : Algebra S S'
R : Type u_1
inst✝ : CommRing R
h :
  ∀ (J : Ideal R) (x : Ideal.IsMaximal J),
    (fun R hR => IsReduced R) (Localization.AtPrime J) Localization.instCommRingLocalizationToCommMonoid
x : R
hx : IsNilpotent x
J : Ideal R
hJ : Ideal.IsMaximal J
⊢ ↑(algebraMap R (Localization.AtPrime J)) x = 0
[PROOFSTEP]
specialize h J hJ
[GOAL]
case eq_zero.h
R✝ S : Type u
inst✝⁶ : CommRing R✝
inst✝⁵ : CommRing S
M : Submonoid R✝
N : Submonoid S
R' S' : Type u
inst✝⁴ : CommRing R'
inst✝³ : CommRing S'
f : R✝ →+* S
inst✝² : Algebra R✝ R'
inst✝¹ : Algebra S S'
R : Type u_1
inst✝ : CommRing R
x : R
hx : IsNilpotent x
J : Ideal R
hJ : Ideal.IsMaximal J
h : IsReduced (Localization.AtPrime J)
⊢ ↑(algebraMap R (Localization.AtPrime J)) x = 0
[PROOFSTEP]
exact (hx.map <| algebraMap R <| Localization.AtPrime J).eq_zero
[GOAL]
R S : Type u
inst✝⁵ : CommRing R
inst✝⁴ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝³ : CommRing R'
inst✝² : CommRing S'
f : R →+* S
inst✝¹ : Algebra R R'
inst✝ : Algebra S S'
⊢ RingHom.LocalizationPreserves fun {R S} x x_1 f => Function.Surjective ↑f
[PROOFSTEP]
introv R H x
[GOAL]
R✝ S✝ : Type u
inst✝¹³ : CommRing R✝
inst✝¹² : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R'✝ S'✝ : Type u
inst✝¹¹ : CommRing R'✝
inst✝¹⁰ : CommRing S'✝
f✝ : R✝ →+* S✝
inst✝⁹ : Algebra R✝ R'✝
inst✝⁸ : Algebra S✝ S'✝
R S : Type u_1
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
M : Submonoid R
R' S' : Type u_1
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
inst✝³ : Algebra R R'
inst✝² : Algebra S S'
inst✝¹ : IsLocalization M R'
inst✝ : IsLocalization (Submonoid.map f M) S'
H : Function.Surjective ↑f
x : S'
⊢ ∃ a, ↑(IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M))) a = x
[PROOFSTEP]
obtain ⟨x, ⟨_, s, hs, rfl⟩, rfl⟩ := IsLocalization.mk'_surjective (M.map f) x
[GOAL]
case intro.intro.mk.intro.intro
R✝ S✝ : Type u
inst✝¹³ : CommRing R✝
inst✝¹² : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R'✝ S'✝ : Type u
inst✝¹¹ : CommRing R'✝
inst✝¹⁰ : CommRing S'✝
f✝ : R✝ →+* S✝
inst✝⁹ : Algebra R✝ R'✝
inst✝⁸ : Algebra S✝ S'✝
R S : Type u_1
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
M : Submonoid R
R' S' : Type u_1
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
inst✝³ : Algebra R R'
inst✝² : Algebra S S'
inst✝¹ : IsLocalization M R'
inst✝ : IsLocalization (Submonoid.map f M) S'
H : Function.Surjective ↑f
x : S
s : R
hs : s ∈ ↑M
⊢ ∃ a,
    ↑(IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M))) a =
      IsLocalization.mk' S' x { val := ↑f s, property := (_ : ∃ a, a ∈ ↑M ∧ ↑f a = ↑f s) }
[PROOFSTEP]
obtain ⟨y, rfl⟩ := H x
[GOAL]
case intro.intro.mk.intro.intro.intro
R✝ S✝ : Type u
inst✝¹³ : CommRing R✝
inst✝¹² : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R'✝ S'✝ : Type u
inst✝¹¹ : CommRing R'✝
inst✝¹⁰ : CommRing S'✝
f✝ : R✝ →+* S✝
inst✝⁹ : Algebra R✝ R'✝
inst✝⁸ : Algebra S✝ S'✝
R S : Type u_1
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
M : Submonoid R
R' S' : Type u_1
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
inst✝³ : Algebra R R'
inst✝² : Algebra S S'
inst✝¹ : IsLocalization M R'
inst✝ : IsLocalization (Submonoid.map f M) S'
H : Function.Surjective ↑f
s : R
hs : s ∈ ↑M
y : R
⊢ ∃ a,
    ↑(IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M))) a =
      IsLocalization.mk' S' (↑f y) { val := ↑f s, property := (_ : ∃ a, a ∈ ↑M ∧ ↑f a = ↑f s) }
[PROOFSTEP]
use IsLocalization.mk' R' y ⟨s, hs⟩
[GOAL]
case h
R✝ S✝ : Type u
inst✝¹³ : CommRing R✝
inst✝¹² : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R'✝ S'✝ : Type u
inst✝¹¹ : CommRing R'✝
inst✝¹⁰ : CommRing S'✝
f✝ : R✝ →+* S✝
inst✝⁹ : Algebra R✝ R'✝
inst✝⁸ : Algebra S✝ S'✝
R S : Type u_1
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
M : Submonoid R
R' S' : Type u_1
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
inst✝³ : Algebra R R'
inst✝² : Algebra S S'
inst✝¹ : IsLocalization M R'
inst✝ : IsLocalization (Submonoid.map f M) S'
H : Function.Surjective ↑f
s : R
hs : s ∈ ↑M
y : R
⊢ ↑(IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M)))
      (IsLocalization.mk' R' y { val := s, property := hs }) =
    IsLocalization.mk' S' (↑f y) { val := ↑f s, property := (_ : ∃ a, a ∈ ↑M ∧ ↑f a = ↑f s) }
[PROOFSTEP]
rw [IsLocalization.map_mk']
[GOAL]
R S : Type u
inst✝⁵ : CommRing R
inst✝⁴ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝³ : CommRing R'
inst✝² : CommRing S'
f : R →+* S
inst✝¹ : Algebra R R'
inst✝ : Algebra S S'
⊢ RingHom.OfLocalizationSpan fun {R S} x x_1 f => Function.Surjective ↑f
[PROOFSTEP]
introv R e H
[GOAL]
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Set R
e : Ideal.span s = ⊤
H :
  ∀ (r : ↑s),
    (fun {R S} x x_1 f => Function.Surjective ↑f) Localization.instCommRingLocalizationToCommMonoid
      Localization.instCommRingLocalizationToCommMonoid (Localization.awayMap f ↑r)
⊢ Function.Surjective ↑f
[PROOFSTEP]
rw [← Set.range_iff_surjective, Set.eq_univ_iff_forall]
[GOAL]
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Set R
e : Ideal.span s = ⊤
H :
  ∀ (r : ↑s),
    (fun {R S} x x_1 f => Function.Surjective ↑f) Localization.instCommRingLocalizationToCommMonoid
      Localization.instCommRingLocalizationToCommMonoid (Localization.awayMap f ↑r)
⊢ ∀ (x : S), x ∈ Set.range ↑f
[PROOFSTEP]
letI := f.toAlgebra
[GOAL]
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Set R
e : Ideal.span s = ⊤
H :
  ∀ (r : ↑s),
    (fun {R S} x x_1 f => Function.Surjective ↑f) Localization.instCommRingLocalizationToCommMonoid
      Localization.instCommRingLocalizationToCommMonoid (Localization.awayMap f ↑r)
this : Algebra R S := RingHom.toAlgebra f
⊢ ∀ (x : S), x ∈ Set.range ↑f
[PROOFSTEP]
intro x
[GOAL]
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Set R
e : Ideal.span s = ⊤
H :
  ∀ (r : ↑s),
    (fun {R S} x x_1 f => Function.Surjective ↑f) Localization.instCommRingLocalizationToCommMonoid
      Localization.instCommRingLocalizationToCommMonoid (Localization.awayMap f ↑r)
this : Algebra R S := RingHom.toAlgebra f
x : S
⊢ x ∈ Set.range ↑f
[PROOFSTEP]
apply Submodule.mem_of_span_eq_top_of_smul_pow_mem (LinearMap.range (Algebra.linearMap R S)) s e
[GOAL]
case H
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Set R
e : Ideal.span s = ⊤
H :
  ∀ (r : ↑s),
    (fun {R S} x x_1 f => Function.Surjective ↑f) Localization.instCommRingLocalizationToCommMonoid
      Localization.instCommRingLocalizationToCommMonoid (Localization.awayMap f ↑r)
this : Algebra R S := RingHom.toAlgebra f
x : S
⊢ ∀ (r : ↑s), ∃ n, ↑r ^ n • x ∈ LinearMap.range (Algebra.linearMap R S)
[PROOFSTEP]
intro r
[GOAL]
case H
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Set R
e : Ideal.span s = ⊤
H :
  ∀ (r : ↑s),
    (fun {R S} x x_1 f => Function.Surjective ↑f) Localization.instCommRingLocalizationToCommMonoid
      Localization.instCommRingLocalizationToCommMonoid (Localization.awayMap f ↑r)
this : Algebra R S := RingHom.toAlgebra f
x : S
r : ↑s
⊢ ∃ n, ↑r ^ n • x ∈ LinearMap.range (Algebra.linearMap R S)
[PROOFSTEP]
obtain ⟨a, e'⟩ := H r (algebraMap _ _ x)
[GOAL]
case H.intro
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Set R
e : Ideal.span s = ⊤
H :
  ∀ (r : ↑s),
    (fun {R S} x x_1 f => Function.Surjective ↑f) Localization.instCommRingLocalizationToCommMonoid
      Localization.instCommRingLocalizationToCommMonoid (Localization.awayMap f ↑r)
this : Algebra R S := RingHom.toAlgebra f
x : S
r : ↑s
a : Localization.Away ↑r
e' : ↑(Localization.awayMap f ↑r) a = ↑(algebraMap S (Localization.Away (↑f ↑r))) x
⊢ ∃ n, ↑r ^ n • x ∈ LinearMap.range (Algebra.linearMap R S)
[PROOFSTEP]
obtain ⟨b, ⟨_, n, rfl⟩, rfl⟩ := IsLocalization.mk'_surjective (Submonoid.powers (r : R)) a
[GOAL]
case H.intro.intro.intro.mk.intro
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Set R
e : Ideal.span s = ⊤
H :
  ∀ (r : ↑s),
    (fun {R S} x x_1 f => Function.Surjective ↑f) Localization.instCommRingLocalizationToCommMonoid
      Localization.instCommRingLocalizationToCommMonoid (Localization.awayMap f ↑r)
this : Algebra R S := RingHom.toAlgebra f
x : S
r : ↑s
b : R
n : ℕ
e' :
  ↑(Localization.awayMap f ↑r)
      (IsLocalization.mk' (Localization.Away ↑r) b
        { val := (fun x x_1 => x ^ x_1) (↑r) n,
          property := (_ : ∃ y, (fun x x_1 => x ^ x_1) (↑r) y = (fun x x_1 => x ^ x_1) (↑r) n) }) =
    ↑(algebraMap S (Localization.Away (↑f ↑r))) x
⊢ ∃ n, ↑r ^ n • x ∈ LinearMap.range (Algebra.linearMap R S)
[PROOFSTEP]
erw [IsLocalization.map_mk'] at e'
[GOAL]
case H.intro.intro.intro.mk.intro
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Set R
e : Ideal.span s = ⊤
H :
  ∀ (r : ↑s),
    (fun {R S} x x_1 f => Function.Surjective ↑f) Localization.instCommRingLocalizationToCommMonoid
      Localization.instCommRingLocalizationToCommMonoid (Localization.awayMap f ↑r)
this : Algebra R S := RingHom.toAlgebra f
x : S
r : ↑s
b : R
n : ℕ
e' :
  IsLocalization.mk' (Localization.Away (↑f ↑r)) (↑f b)
      {
        val :=
          ↑f
            ↑{ val := (fun x x_1 => x ^ x_1) (↑r) n,
                property := (_ : ∃ y, (fun x x_1 => x ^ x_1) (↑r) y = (fun x x_1 => x ^ x_1) (↑r) n) },
        property :=
          (_ :
            ↑{ val := (fun x x_1 => x ^ x_1) (↑r) n,
                  property := (_ : ∃ y, (fun x x_1 => x ^ x_1) (↑r) y = (fun x x_1 => x ^ x_1) (↑r) n) } ∈
              Submonoid.comap f (Submonoid.powers (↑f ↑r))) } =
    ↑(algebraMap S (Localization.Away (↑f ↑r))) x
⊢ ∃ n, ↑r ^ n • x ∈ LinearMap.range (Algebra.linearMap R S)
[PROOFSTEP]
rw [eq_comm, IsLocalization.eq_mk'_iff_mul_eq, Subtype.coe_mk, Subtype.coe_mk, ← map_mul] at e'
[GOAL]
case H.intro.intro.intro.mk.intro
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Set R
e : Ideal.span s = ⊤
H :
  ∀ (r : ↑s),
    (fun {R S} x x_1 f => Function.Surjective ↑f) Localization.instCommRingLocalizationToCommMonoid
      Localization.instCommRingLocalizationToCommMonoid (Localization.awayMap f ↑r)
this : Algebra R S := RingHom.toAlgebra f
x : S
r : ↑s
b : R
n : ℕ
e' :
  ↑(algebraMap S (Localization.Away (↑f ↑r)))
      (x *
        ↑{
            val :=
              ↑f
                ↑{ val := (fun x x_1 => x ^ x_1) (↑r) n,
                    property := (_ : ∃ y, (fun x x_1 => x ^ x_1) (↑r) y = (fun x x_1 => x ^ x_1) (↑r) n) },
            property :=
              (_ :
                ↑{ val := (fun x x_1 => x ^ x_1) (↑r) n,
                      property := (_ : ∃ y, (fun x x_1 => x ^ x_1) (↑r) y = (fun x x_1 => x ^ x_1) (↑r) n) } ∈
                  Submonoid.comap f (Submonoid.powers (↑f ↑r))) }) =
    ↑(algebraMap ((fun x => S) b) (Localization.Away (↑f ↑r))) (↑f b)
⊢ ∃ n, ↑r ^ n • x ∈ LinearMap.range (Algebra.linearMap R S)
[PROOFSTEP]
obtain ⟨⟨_, n', rfl⟩, e''⟩ := (IsLocalization.eq_iff_exists (Submonoid.powers (f r)) _).mp e'
[GOAL]
case H.intro.intro.intro.mk.intro.intro.mk.intro
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Set R
e : Ideal.span s = ⊤
H :
  ∀ (r : ↑s),
    (fun {R S} x x_1 f => Function.Surjective ↑f) Localization.instCommRingLocalizationToCommMonoid
      Localization.instCommRingLocalizationToCommMonoid (Localization.awayMap f ↑r)
this : Algebra R S := RingHom.toAlgebra f
x : S
r : ↑s
b : R
n : ℕ
e' :
  ↑(algebraMap S (Localization.Away (↑f ↑r)))
      (x *
        ↑{
            val :=
              ↑f
                ↑{ val := (fun x x_1 => x ^ x_1) (↑r) n,
                    property := (_ : ∃ y, (fun x x_1 => x ^ x_1) (↑r) y = (fun x x_1 => x ^ x_1) (↑r) n) },
            property :=
              (_ :
                ↑{ val := (fun x x_1 => x ^ x_1) (↑r) n,
                      property := (_ : ∃ y, (fun x x_1 => x ^ x_1) (↑r) y = (fun x x_1 => x ^ x_1) (↑r) n) } ∈
                  Submonoid.comap f (Submonoid.powers (↑f ↑r))) }) =
    ↑(algebraMap ((fun x => S) b) (Localization.Away (↑f ↑r))) (↑f b)
n' : ℕ
e'' :
  ↑{ val := (fun x x_1 => x ^ x_1) (↑f ↑r) n',
          property := (_ : ∃ y, (fun x x_1 => x ^ x_1) (↑f ↑r) y = (fun x x_1 => x ^ x_1) (↑f ↑r) n') } *
      (x *
        ↑{
            val :=
              ↑f
                ↑{ val := (fun x x_1 => x ^ x_1) (↑r) n,
                    property := (_ : ∃ y, (fun x x_1 => x ^ x_1) (↑r) y = (fun x x_1 => x ^ x_1) (↑r) n) },
            property :=
              (_ :
                ↑{ val := (fun x x_1 => x ^ x_1) (↑r) n,
                      property := (_ : ∃ y, (fun x x_1 => x ^ x_1) (↑r) y = (fun x x_1 => x ^ x_1) (↑r) n) } ∈
                  Submonoid.comap f (Submonoid.powers (↑f ↑r))) }) =
    ↑{ val := (fun x x_1 => x ^ x_1) (↑f ↑r) n',
          property := (_ : ∃ y, (fun x x_1 => x ^ x_1) (↑f ↑r) y = (fun x x_1 => x ^ x_1) (↑f ↑r) n') } *
      ↑f b
⊢ ∃ n, ↑r ^ n • x ∈ LinearMap.range (Algebra.linearMap R S)
[PROOFSTEP]
dsimp only at e''
[GOAL]
case H.intro.intro.intro.mk.intro.intro.mk.intro
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Set R
e : Ideal.span s = ⊤
H :
  ∀ (r : ↑s),
    (fun {R S} x x_1 f => Function.Surjective ↑f) Localization.instCommRingLocalizationToCommMonoid
      Localization.instCommRingLocalizationToCommMonoid (Localization.awayMap f ↑r)
this : Algebra R S := RingHom.toAlgebra f
x : S
r : ↑s
b : R
n : ℕ
e' :
  ↑(algebraMap S (Localization.Away (↑f ↑r)))
      (x *
        ↑{
            val :=
              ↑f
                ↑{ val := (fun x x_1 => x ^ x_1) (↑r) n,
                    property := (_ : ∃ y, (fun x x_1 => x ^ x_1) (↑r) y = (fun x x_1 => x ^ x_1) (↑r) n) },
            property :=
              (_ :
                ↑{ val := (fun x x_1 => x ^ x_1) (↑r) n,
                      property := (_ : ∃ y, (fun x x_1 => x ^ x_1) (↑r) y = (fun x x_1 => x ^ x_1) (↑r) n) } ∈
                  Submonoid.comap f (Submonoid.powers (↑f ↑r))) }) =
    ↑(algebraMap ((fun x => S) b) (Localization.Away (↑f ↑r))) (↑f b)
n' : ℕ
e'' : ↑f ↑r ^ n' * (x * ↑f (↑r ^ n)) = ↑f ↑r ^ n' * ↑f b
⊢ ∃ n, ↑r ^ n • x ∈ LinearMap.range (Algebra.linearMap R S)
[PROOFSTEP]
rw [mul_comm x, ← mul_assoc, ← map_pow, ← map_mul, ← map_mul, ← pow_add] at e''
[GOAL]
case H.intro.intro.intro.mk.intro.intro.mk.intro
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Set R
e : Ideal.span s = ⊤
H :
  ∀ (r : ↑s),
    (fun {R S} x x_1 f => Function.Surjective ↑f) Localization.instCommRingLocalizationToCommMonoid
      Localization.instCommRingLocalizationToCommMonoid (Localization.awayMap f ↑r)
this : Algebra R S := RingHom.toAlgebra f
x : S
r : ↑s
b : R
n : ℕ
e' :
  ↑(algebraMap S (Localization.Away (↑f ↑r)))
      (x *
        ↑{
            val :=
              ↑f
                ↑{ val := (fun x x_1 => x ^ x_1) (↑r) n,
                    property := (_ : ∃ y, (fun x x_1 => x ^ x_1) (↑r) y = (fun x x_1 => x ^ x_1) (↑r) n) },
            property :=
              (_ :
                ↑{ val := (fun x x_1 => x ^ x_1) (↑r) n,
                      property := (_ : ∃ y, (fun x x_1 => x ^ x_1) (↑r) y = (fun x x_1 => x ^ x_1) (↑r) n) } ∈
                  Submonoid.comap f (Submonoid.powers (↑f ↑r))) }) =
    ↑(algebraMap ((fun x => S) b) (Localization.Away (↑f ↑r))) (↑f b)
n' : ℕ
e'' : ↑f (↑r ^ (n' + n)) * x = ↑f (↑r ^ n' * b)
⊢ ∃ n, ↑r ^ n • x ∈ LinearMap.range (Algebra.linearMap R S)
[PROOFSTEP]
exact ⟨n' + n, _, e''.symm⟩
[GOAL]
R S : Type u
inst✝⁵ : CommRing R
inst✝⁴ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝³ : CommRing R'
inst✝² : CommRing S'
f : R →+* S
inst✝¹ : Algebra R R'
inst✝ : Algebra S S'
⊢ RingHom.LocalizationPreserves @RingHom.Finite
[PROOFSTEP]
introv R hf
[GOAL]
R✝ S✝ : Type u
inst✝¹³ : CommRing R✝
inst✝¹² : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R'✝ S'✝ : Type u
inst✝¹¹ : CommRing R'✝
inst✝¹⁰ : CommRing S'✝
f✝ : R✝ →+* S✝
inst✝⁹ : Algebra R✝ R'✝
inst✝⁸ : Algebra S✝ S'✝
R S : Type u_1
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
M : Submonoid R
R' S' : Type u_1
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
inst✝³ : Algebra R R'
inst✝² : Algebra S S'
inst✝¹ : IsLocalization M R'
inst✝ : IsLocalization (Submonoid.map f M) S'
hf : RingHom.Finite f
⊢ RingHom.Finite (IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M)))
[PROOFSTEP]
letI := f.toAlgebra
[GOAL]
R✝ S✝ : Type u
inst✝¹³ : CommRing R✝
inst✝¹² : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R'✝ S'✝ : Type u
inst✝¹¹ : CommRing R'✝
inst✝¹⁰ : CommRing S'✝
f✝ : R✝ →+* S✝
inst✝⁹ : Algebra R✝ R'✝
inst✝⁸ : Algebra S✝ S'✝
R S : Type u_1
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
M : Submonoid R
R' S' : Type u_1
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
inst✝³ : Algebra R R'
inst✝² : Algebra S S'
inst✝¹ : IsLocalization M R'
inst✝ : IsLocalization (Submonoid.map f M) S'
hf : RingHom.Finite f
this : Algebra R S := RingHom.toAlgebra f
⊢ RingHom.Finite (IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M)))
[PROOFSTEP]
letI := ((algebraMap S S').comp f).toAlgebra
[GOAL]
R✝ S✝ : Type u
inst✝¹³ : CommRing R✝
inst✝¹² : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R'✝ S'✝ : Type u
inst✝¹¹ : CommRing R'✝
inst✝¹⁰ : CommRing S'✝
f✝ : R✝ →+* S✝
inst✝⁹ : Algebra R✝ R'✝
inst✝⁸ : Algebra S✝ S'✝
R S : Type u_1
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
M : Submonoid R
R' S' : Type u_1
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
inst✝³ : Algebra R R'
inst✝² : Algebra S S'
inst✝¹ : IsLocalization M R'
inst✝ : IsLocalization (Submonoid.map f M) S'
hf : RingHom.Finite f
this✝ : Algebra R S := RingHom.toAlgebra f
this : Algebra R S' := RingHom.toAlgebra (RingHom.comp (algebraMap S S') f)
⊢ RingHom.Finite (IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M)))
[PROOFSTEP]
let f' : R' →+* S' := IsLocalization.map S' f (Submonoid.le_comap_map M)
[GOAL]
R✝ S✝ : Type u
inst✝¹³ : CommRing R✝
inst✝¹² : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R'✝ S'✝ : Type u
inst✝¹¹ : CommRing R'✝
inst✝¹⁰ : CommRing S'✝
f✝ : R✝ →+* S✝
inst✝⁹ : Algebra R✝ R'✝
inst✝⁸ : Algebra S✝ S'✝
R S : Type u_1
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
M : Submonoid R
R' S' : Type u_1
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
inst✝³ : Algebra R R'
inst✝² : Algebra S S'
inst✝¹ : IsLocalization M R'
inst✝ : IsLocalization (Submonoid.map f M) S'
hf : RingHom.Finite f
this✝ : Algebra R S := RingHom.toAlgebra f
this : Algebra R S' := RingHom.toAlgebra (RingHom.comp (algebraMap S S') f)
f' : R' →+* S' := IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M))
⊢ RingHom.Finite (IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M)))
[PROOFSTEP]
letI := f'.toAlgebra
[GOAL]
R✝ S✝ : Type u
inst✝¹³ : CommRing R✝
inst✝¹² : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R'✝ S'✝ : Type u
inst✝¹¹ : CommRing R'✝
inst✝¹⁰ : CommRing S'✝
f✝ : R✝ →+* S✝
inst✝⁹ : Algebra R✝ R'✝
inst✝⁸ : Algebra S✝ S'✝
R S : Type u_1
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
M : Submonoid R
R' S' : Type u_1
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
inst✝³ : Algebra R R'
inst✝² : Algebra S S'
inst✝¹ : IsLocalization M R'
inst✝ : IsLocalization (Submonoid.map f M) S'
hf : RingHom.Finite f
this✝¹ : Algebra R S := RingHom.toAlgebra f
this✝ : Algebra R S' := RingHom.toAlgebra (RingHom.comp (algebraMap S S') f)
f' : R' →+* S' := IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M))
this : Algebra R' S' := RingHom.toAlgebra f'
⊢ RingHom.Finite (IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M)))
[PROOFSTEP]
haveI : IsScalarTower R R' S' := IsScalarTower.of_algebraMap_eq' (IsLocalization.map_comp M.le_comap_map).symm
[GOAL]
R✝ S✝ : Type u
inst✝¹³ : CommRing R✝
inst✝¹² : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R'✝ S'✝ : Type u
inst✝¹¹ : CommRing R'✝
inst✝¹⁰ : CommRing S'✝
f✝ : R✝ →+* S✝
inst✝⁹ : Algebra R✝ R'✝
inst✝⁸ : Algebra S✝ S'✝
R S : Type u_1
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
M : Submonoid R
R' S' : Type u_1
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
inst✝³ : Algebra R R'
inst✝² : Algebra S S'
inst✝¹ : IsLocalization M R'
inst✝ : IsLocalization (Submonoid.map f M) S'
hf : RingHom.Finite f
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : Algebra R S' := RingHom.toAlgebra (RingHom.comp (algebraMap S S') f)
f' : R' →+* S' := IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M))
this✝ : Algebra R' S' := RingHom.toAlgebra f'
this : IsScalarTower R R' S'
⊢ RingHom.Finite (IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M)))
[PROOFSTEP]
let fₐ : S →ₐ[R] S' :=
  AlgHom.mk' (algebraMap S S') fun c x =>
    RingHom.map_mul _ _
      _
        -- We claim that if `S` is generated by `T` as an `R`-module,
          -- then `S'` is generated by `T` as an `R'`-module.
[GOAL]
R✝ S✝ : Type u
inst✝¹³ : CommRing R✝
inst✝¹² : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R'✝ S'✝ : Type u
inst✝¹¹ : CommRing R'✝
inst✝¹⁰ : CommRing S'✝
f✝ : R✝ →+* S✝
inst✝⁹ : Algebra R✝ R'✝
inst✝⁸ : Algebra S✝ S'✝
R S : Type u_1
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
M : Submonoid R
R' S' : Type u_1
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
inst✝³ : Algebra R R'
inst✝² : Algebra S S'
inst✝¹ : IsLocalization M R'
inst✝ : IsLocalization (Submonoid.map f M) S'
hf : RingHom.Finite f
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : Algebra R S' := RingHom.toAlgebra (RingHom.comp (algebraMap S S') f)
f' : R' →+* S' := IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M))
this✝ : Algebra R' S' := RingHom.toAlgebra f'
this : IsScalarTower R R' S'
fₐ : S →ₐ[R] S' :=
  AlgHom.mk' (algebraMap S S')
    (_ : ∀ (c : R) (x : S), ↑(algebraMap S S') (↑f c * x) = ↑(algebraMap S S') (↑f c) * ↑(algebraMap S S') x)
⊢ RingHom.Finite (IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M)))
[PROOFSTEP]
obtain ⟨T, hT⟩ := hf
[GOAL]
case mk.intro
R✝ S✝ : Type u
inst✝¹³ : CommRing R✝
inst✝¹² : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R'✝ S'✝ : Type u
inst✝¹¹ : CommRing R'✝
inst✝¹⁰ : CommRing S'✝
f✝ : R✝ →+* S✝
inst✝⁹ : Algebra R✝ R'✝
inst✝⁸ : Algebra S✝ S'✝
R S : Type u_1
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
M : Submonoid R
R' S' : Type u_1
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
inst✝³ : Algebra R R'
inst✝² : Algebra S S'
inst✝¹ : IsLocalization M R'
inst✝ : IsLocalization (Submonoid.map f M) S'
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : Algebra R S' := RingHom.toAlgebra (RingHom.comp (algebraMap S S') f)
f' : R' →+* S' := IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M))
this✝ : Algebra R' S' := RingHom.toAlgebra f'
this : IsScalarTower R R' S'
fₐ : S →ₐ[R] S' :=
  AlgHom.mk' (algebraMap S S')
    (_ : ∀ (c : R) (x : S), ↑(algebraMap S S') (↑f c * x) = ↑(algebraMap S S') (↑f c) * ↑(algebraMap S S') x)
T : Finset S
hT : Submodule.span R ↑T = ⊤
⊢ RingHom.Finite (IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M)))
[PROOFSTEP]
use T.image (algebraMap S S')
[GOAL]
case h
R✝ S✝ : Type u
inst✝¹³ : CommRing R✝
inst✝¹² : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R'✝ S'✝ : Type u
inst✝¹¹ : CommRing R'✝
inst✝¹⁰ : CommRing S'✝
f✝ : R✝ →+* S✝
inst✝⁹ : Algebra R✝ R'✝
inst✝⁸ : Algebra S✝ S'✝
R S : Type u_1
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
M : Submonoid R
R' S' : Type u_1
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
inst✝³ : Algebra R R'
inst✝² : Algebra S S'
inst✝¹ : IsLocalization M R'
inst✝ : IsLocalization (Submonoid.map f M) S'
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : Algebra R S' := RingHom.toAlgebra (RingHom.comp (algebraMap S S') f)
f' : R' →+* S' := IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M))
this✝ : Algebra R' S' := RingHom.toAlgebra f'
this : IsScalarTower R R' S'
fₐ : S →ₐ[R] S' :=
  AlgHom.mk' (algebraMap S S')
    (_ : ∀ (c : R) (x : S), ↑(algebraMap S S') (↑f c * x) = ↑(algebraMap S S') (↑f c) * ↑(algebraMap S S') x)
T : Finset S
hT : Submodule.span R ↑T = ⊤
⊢ Submodule.span R' ↑(Finset.image (↑(algebraMap S S')) T) = ⊤
[PROOFSTEP]
rw [eq_top_iff]
[GOAL]
case h
R✝ S✝ : Type u
inst✝¹³ : CommRing R✝
inst✝¹² : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R'✝ S'✝ : Type u
inst✝¹¹ : CommRing R'✝
inst✝¹⁰ : CommRing S'✝
f✝ : R✝ →+* S✝
inst✝⁹ : Algebra R✝ R'✝
inst✝⁸ : Algebra S✝ S'✝
R S : Type u_1
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
M : Submonoid R
R' S' : Type u_1
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
inst✝³ : Algebra R R'
inst✝² : Algebra S S'
inst✝¹ : IsLocalization M R'
inst✝ : IsLocalization (Submonoid.map f M) S'
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : Algebra R S' := RingHom.toAlgebra (RingHom.comp (algebraMap S S') f)
f' : R' →+* S' := IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M))
this✝ : Algebra R' S' := RingHom.toAlgebra f'
this : IsScalarTower R R' S'
fₐ : S →ₐ[R] S' :=
  AlgHom.mk' (algebraMap S S')
    (_ : ∀ (c : R) (x : S), ↑(algebraMap S S') (↑f c * x) = ↑(algebraMap S S') (↑f c) * ↑(algebraMap S S') x)
T : Finset S
hT : Submodule.span R ↑T = ⊤
⊢ ⊤ ≤ Submodule.span R' ↑(Finset.image (↑(algebraMap S S')) T)
[PROOFSTEP]
rintro x
  -
      -- By the hypotheses, for each `x : S'`, we have `x = y / (f r)` for some `y : S` and `r : M`.
        -- Since `S` is generated by `T`, the image of `y` should fall in the span of the image of `T`.
[GOAL]
case h
R✝ S✝ : Type u
inst✝¹³ : CommRing R✝
inst✝¹² : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R'✝ S'✝ : Type u
inst✝¹¹ : CommRing R'✝
inst✝¹⁰ : CommRing S'✝
f✝ : R✝ →+* S✝
inst✝⁹ : Algebra R✝ R'✝
inst✝⁸ : Algebra S✝ S'✝
R S : Type u_1
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
M : Submonoid R
R' S' : Type u_1
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
inst✝³ : Algebra R R'
inst✝² : Algebra S S'
inst✝¹ : IsLocalization M R'
inst✝ : IsLocalization (Submonoid.map f M) S'
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : Algebra R S' := RingHom.toAlgebra (RingHom.comp (algebraMap S S') f)
f' : R' →+* S' := IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M))
this✝ : Algebra R' S' := RingHom.toAlgebra f'
this : IsScalarTower R R' S'
fₐ : S →ₐ[R] S' :=
  AlgHom.mk' (algebraMap S S')
    (_ : ∀ (c : R) (x : S), ↑(algebraMap S S') (↑f c * x) = ↑(algebraMap S S') (↑f c) * ↑(algebraMap S S') x)
T : Finset S
hT : Submodule.span R ↑T = ⊤
x : S'
⊢ x ∈ Submodule.span R' ↑(Finset.image (↑(algebraMap S S')) T)
[PROOFSTEP]
obtain ⟨y, ⟨_, ⟨r, hr, rfl⟩⟩, rfl⟩ := IsLocalization.mk'_surjective (M.map f) x
[GOAL]
case h.intro.intro.mk.intro.intro
R✝ S✝ : Type u
inst✝¹³ : CommRing R✝
inst✝¹² : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R'✝ S'✝ : Type u
inst✝¹¹ : CommRing R'✝
inst✝¹⁰ : CommRing S'✝
f✝ : R✝ →+* S✝
inst✝⁹ : Algebra R✝ R'✝
inst✝⁸ : Algebra S✝ S'✝
R S : Type u_1
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
M : Submonoid R
R' S' : Type u_1
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
inst✝³ : Algebra R R'
inst✝² : Algebra S S'
inst✝¹ : IsLocalization M R'
inst✝ : IsLocalization (Submonoid.map f M) S'
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : Algebra R S' := RingHom.toAlgebra (RingHom.comp (algebraMap S S') f)
f' : R' →+* S' := IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M))
this✝ : Algebra R' S' := RingHom.toAlgebra f'
this : IsScalarTower R R' S'
fₐ : S →ₐ[R] S' :=
  AlgHom.mk' (algebraMap S S')
    (_ : ∀ (c : R) (x : S), ↑(algebraMap S S') (↑f c * x) = ↑(algebraMap S S') (↑f c) * ↑(algebraMap S S') x)
T : Finset S
hT : Submodule.span R ↑T = ⊤
y : S
r : R
hr : r ∈ ↑M
⊢ IsLocalization.mk' S' y { val := ↑f r, property := (_ : ∃ a, a ∈ ↑M ∧ ↑f a = ↑f r) } ∈
    Submodule.span R' ↑(Finset.image (↑(algebraMap S S')) T)
[PROOFSTEP]
rw [IsLocalization.mk'_eq_mul_mk'_one, mul_comm, Finset.coe_image]
[GOAL]
case h.intro.intro.mk.intro.intro
R✝ S✝ : Type u
inst✝¹³ : CommRing R✝
inst✝¹² : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R'✝ S'✝ : Type u
inst✝¹¹ : CommRing R'✝
inst✝¹⁰ : CommRing S'✝
f✝ : R✝ →+* S✝
inst✝⁹ : Algebra R✝ R'✝
inst✝⁸ : Algebra S✝ S'✝
R S : Type u_1
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
M : Submonoid R
R' S' : Type u_1
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
inst✝³ : Algebra R R'
inst✝² : Algebra S S'
inst✝¹ : IsLocalization M R'
inst✝ : IsLocalization (Submonoid.map f M) S'
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : Algebra R S' := RingHom.toAlgebra (RingHom.comp (algebraMap S S') f)
f' : R' →+* S' := IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M))
this✝ : Algebra R' S' := RingHom.toAlgebra f'
this : IsScalarTower R R' S'
fₐ : S →ₐ[R] S' :=
  AlgHom.mk' (algebraMap S S')
    (_ : ∀ (c : R) (x : S), ↑(algebraMap S S') (↑f c * x) = ↑(algebraMap S S') (↑f c) * ↑(algebraMap S S') x)
T : Finset S
hT : Submodule.span R ↑T = ⊤
y : S
r : R
hr : r ∈ ↑M
⊢ IsLocalization.mk' S' 1 { val := ↑f r, property := (_ : ∃ a, a ∈ ↑M ∧ ↑f a = ↑f r) } * ↑(algebraMap S S') y ∈
    Submodule.span R' (↑(algebraMap S S') '' ↑T)
[PROOFSTEP]
have hy : y ∈ Submodule.span R ↑T := by rw [hT]; trivial
[GOAL]
R✝ S✝ : Type u
inst✝¹³ : CommRing R✝
inst✝¹² : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R'✝ S'✝ : Type u
inst✝¹¹ : CommRing R'✝
inst✝¹⁰ : CommRing S'✝
f✝ : R✝ →+* S✝
inst✝⁹ : Algebra R✝ R'✝
inst✝⁸ : Algebra S✝ S'✝
R S : Type u_1
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
M : Submonoid R
R' S' : Type u_1
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
inst✝³ : Algebra R R'
inst✝² : Algebra S S'
inst✝¹ : IsLocalization M R'
inst✝ : IsLocalization (Submonoid.map f M) S'
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : Algebra R S' := RingHom.toAlgebra (RingHom.comp (algebraMap S S') f)
f' : R' →+* S' := IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M))
this✝ : Algebra R' S' := RingHom.toAlgebra f'
this : IsScalarTower R R' S'
fₐ : S →ₐ[R] S' :=
  AlgHom.mk' (algebraMap S S')
    (_ : ∀ (c : R) (x : S), ↑(algebraMap S S') (↑f c * x) = ↑(algebraMap S S') (↑f c) * ↑(algebraMap S S') x)
T : Finset S
hT : Submodule.span R ↑T = ⊤
y : S
r : R
hr : r ∈ ↑M
⊢ y ∈ Submodule.span R ↑T
[PROOFSTEP]
rw [hT]
[GOAL]
R✝ S✝ : Type u
inst✝¹³ : CommRing R✝
inst✝¹² : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R'✝ S'✝ : Type u
inst✝¹¹ : CommRing R'✝
inst✝¹⁰ : CommRing S'✝
f✝ : R✝ →+* S✝
inst✝⁹ : Algebra R✝ R'✝
inst✝⁸ : Algebra S✝ S'✝
R S : Type u_1
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
M : Submonoid R
R' S' : Type u_1
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
inst✝³ : Algebra R R'
inst✝² : Algebra S S'
inst✝¹ : IsLocalization M R'
inst✝ : IsLocalization (Submonoid.map f M) S'
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : Algebra R S' := RingHom.toAlgebra (RingHom.comp (algebraMap S S') f)
f' : R' →+* S' := IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M))
this✝ : Algebra R' S' := RingHom.toAlgebra f'
this : IsScalarTower R R' S'
fₐ : S →ₐ[R] S' :=
  AlgHom.mk' (algebraMap S S')
    (_ : ∀ (c : R) (x : S), ↑(algebraMap S S') (↑f c * x) = ↑(algebraMap S S') (↑f c) * ↑(algebraMap S S') x)
T : Finset S
hT : Submodule.span R ↑T = ⊤
y : S
r : R
hr : r ∈ ↑M
⊢ y ∈ ⊤
[PROOFSTEP]
trivial
[GOAL]
case h.intro.intro.mk.intro.intro
R✝ S✝ : Type u
inst✝¹³ : CommRing R✝
inst✝¹² : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R'✝ S'✝ : Type u
inst✝¹¹ : CommRing R'✝
inst✝¹⁰ : CommRing S'✝
f✝ : R✝ →+* S✝
inst✝⁹ : Algebra R✝ R'✝
inst✝⁸ : Algebra S✝ S'✝
R S : Type u_1
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
M : Submonoid R
R' S' : Type u_1
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
inst✝³ : Algebra R R'
inst✝² : Algebra S S'
inst✝¹ : IsLocalization M R'
inst✝ : IsLocalization (Submonoid.map f M) S'
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : Algebra R S' := RingHom.toAlgebra (RingHom.comp (algebraMap S S') f)
f' : R' →+* S' := IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M))
this✝ : Algebra R' S' := RingHom.toAlgebra f'
this : IsScalarTower R R' S'
fₐ : S →ₐ[R] S' :=
  AlgHom.mk' (algebraMap S S')
    (_ : ∀ (c : R) (x : S), ↑(algebraMap S S') (↑f c * x) = ↑(algebraMap S S') (↑f c) * ↑(algebraMap S S') x)
T : Finset S
hT : Submodule.span R ↑T = ⊤
y : S
r : R
hr : r ∈ ↑M
hy : y ∈ Submodule.span R ↑T
⊢ IsLocalization.mk' S' 1 { val := ↑f r, property := (_ : ∃ a, a ∈ ↑M ∧ ↑f a = ↑f r) } * ↑(algebraMap S S') y ∈
    Submodule.span R' (↑(algebraMap S S') '' ↑T)
[PROOFSTEP]
replace hy : algebraMap S S' y ∈ Submodule.map fₐ.toLinearMap (Submodule.span R (T : Set S)) :=
  Submodule.mem_map_of_mem hy
[GOAL]
case h.intro.intro.mk.intro.intro
R✝ S✝ : Type u
inst✝¹³ : CommRing R✝
inst✝¹² : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R'✝ S'✝ : Type u
inst✝¹¹ : CommRing R'✝
inst✝¹⁰ : CommRing S'✝
f✝ : R✝ →+* S✝
inst✝⁹ : Algebra R✝ R'✝
inst✝⁸ : Algebra S✝ S'✝
R S : Type u_1
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
M : Submonoid R
R' S' : Type u_1
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
inst✝³ : Algebra R R'
inst✝² : Algebra S S'
inst✝¹ : IsLocalization M R'
inst✝ : IsLocalization (Submonoid.map f M) S'
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : Algebra R S' := RingHom.toAlgebra (RingHom.comp (algebraMap S S') f)
f' : R' →+* S' := IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M))
this✝ : Algebra R' S' := RingHom.toAlgebra f'
this : IsScalarTower R R' S'
fₐ : S →ₐ[R] S' :=
  AlgHom.mk' (algebraMap S S')
    (_ : ∀ (c : R) (x : S), ↑(algebraMap S S') (↑f c * x) = ↑(algebraMap S S') (↑f c) * ↑(algebraMap S S') x)
T : Finset S
hT : Submodule.span R ↑T = ⊤
y : S
r : R
hr : r ∈ ↑M
hy : ↑(algebraMap S S') y ∈ Submodule.map (AlgHom.toLinearMap fₐ) (Submodule.span R ↑T)
⊢ IsLocalization.mk' S' 1 { val := ↑f r, property := (_ : ∃ a, a ∈ ↑M ∧ ↑f a = ↑f r) } * ↑(algebraMap S S') y ∈
    Submodule.span R' (↑(algebraMap S S') '' ↑T)
[PROOFSTEP]
rw [Submodule.map_span fₐ.toLinearMap T] at hy
[GOAL]
case h.intro.intro.mk.intro.intro
R✝ S✝ : Type u
inst✝¹³ : CommRing R✝
inst✝¹² : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R'✝ S'✝ : Type u
inst✝¹¹ : CommRing R'✝
inst✝¹⁰ : CommRing S'✝
f✝ : R✝ →+* S✝
inst✝⁹ : Algebra R✝ R'✝
inst✝⁸ : Algebra S✝ S'✝
R S : Type u_1
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
M : Submonoid R
R' S' : Type u_1
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
inst✝³ : Algebra R R'
inst✝² : Algebra S S'
inst✝¹ : IsLocalization M R'
inst✝ : IsLocalization (Submonoid.map f M) S'
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : Algebra R S' := RingHom.toAlgebra (RingHom.comp (algebraMap S S') f)
f' : R' →+* S' := IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M))
this✝ : Algebra R' S' := RingHom.toAlgebra f'
this : IsScalarTower R R' S'
fₐ : S →ₐ[R] S' :=
  AlgHom.mk' (algebraMap S S')
    (_ : ∀ (c : R) (x : S), ↑(algebraMap S S') (↑f c * x) = ↑(algebraMap S S') (↑f c) * ↑(algebraMap S S') x)
T : Finset S
hT : Submodule.span R ↑T = ⊤
y : S
r : R
hr : r ∈ ↑M
hy : ↑(algebraMap S S') y ∈ Submodule.span R (↑(AlgHom.toLinearMap fₐ) '' ↑T)
⊢ IsLocalization.mk' S' 1 { val := ↑f r, property := (_ : ∃ a, a ∈ ↑M ∧ ↑f a = ↑f r) } * ↑(algebraMap S S') y ∈
    Submodule.span R' (↑(algebraMap S S') '' ↑T)
[PROOFSTEP]
have H : Submodule.span R (algebraMap S S' '' T) ≤ (Submodule.span R' (algebraMap S S' '' T)).restrictScalars R := by
  rw [Submodule.span_le]; exact Submodule.subset_span
[GOAL]
R✝ S✝ : Type u
inst✝¹³ : CommRing R✝
inst✝¹² : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R'✝ S'✝ : Type u
inst✝¹¹ : CommRing R'✝
inst✝¹⁰ : CommRing S'✝
f✝ : R✝ →+* S✝
inst✝⁹ : Algebra R✝ R'✝
inst✝⁸ : Algebra S✝ S'✝
R S : Type u_1
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
M : Submonoid R
R' S' : Type u_1
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
inst✝³ : Algebra R R'
inst✝² : Algebra S S'
inst✝¹ : IsLocalization M R'
inst✝ : IsLocalization (Submonoid.map f M) S'
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : Algebra R S' := RingHom.toAlgebra (RingHom.comp (algebraMap S S') f)
f' : R' →+* S' := IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M))
this✝ : Algebra R' S' := RingHom.toAlgebra f'
this : IsScalarTower R R' S'
fₐ : S →ₐ[R] S' :=
  AlgHom.mk' (algebraMap S S')
    (_ : ∀ (c : R) (x : S), ↑(algebraMap S S') (↑f c * x) = ↑(algebraMap S S') (↑f c) * ↑(algebraMap S S') x)
T : Finset S
hT : Submodule.span R ↑T = ⊤
y : S
r : R
hr : r ∈ ↑M
hy : ↑(algebraMap S S') y ∈ Submodule.span R (↑(AlgHom.toLinearMap fₐ) '' ↑T)
⊢ Submodule.span R (↑(algebraMap S S') '' ↑T) ≤
    Submodule.restrictScalars R (Submodule.span R' (↑(algebraMap S S') '' ↑T))
[PROOFSTEP]
rw [Submodule.span_le]
[GOAL]
R✝ S✝ : Type u
inst✝¹³ : CommRing R✝
inst✝¹² : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R'✝ S'✝ : Type u
inst✝¹¹ : CommRing R'✝
inst✝¹⁰ : CommRing S'✝
f✝ : R✝ →+* S✝
inst✝⁹ : Algebra R✝ R'✝
inst✝⁸ : Algebra S✝ S'✝
R S : Type u_1
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
M : Submonoid R
R' S' : Type u_1
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
inst✝³ : Algebra R R'
inst✝² : Algebra S S'
inst✝¹ : IsLocalization M R'
inst✝ : IsLocalization (Submonoid.map f M) S'
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : Algebra R S' := RingHom.toAlgebra (RingHom.comp (algebraMap S S') f)
f' : R' →+* S' := IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M))
this✝ : Algebra R' S' := RingHom.toAlgebra f'
this : IsScalarTower R R' S'
fₐ : S →ₐ[R] S' :=
  AlgHom.mk' (algebraMap S S')
    (_ : ∀ (c : R) (x : S), ↑(algebraMap S S') (↑f c * x) = ↑(algebraMap S S') (↑f c) * ↑(algebraMap S S') x)
T : Finset S
hT : Submodule.span R ↑T = ⊤
y : S
r : R
hr : r ∈ ↑M
hy : ↑(algebraMap S S') y ∈ Submodule.span R (↑(AlgHom.toLinearMap fₐ) '' ↑T)
⊢ ↑(algebraMap S S') '' ↑T ⊆ ↑(Submodule.restrictScalars R (Submodule.span R' (↑(algebraMap S S') '' ↑T)))
[PROOFSTEP]
exact Submodule.subset_span
[GOAL]
case h.intro.intro.mk.intro.intro
R✝ S✝ : Type u
inst✝¹³ : CommRing R✝
inst✝¹² : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R'✝ S'✝ : Type u
inst✝¹¹ : CommRing R'✝
inst✝¹⁰ : CommRing S'✝
f✝ : R✝ →+* S✝
inst✝⁹ : Algebra R✝ R'✝
inst✝⁸ : Algebra S✝ S'✝
R S : Type u_1
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
M : Submonoid R
R' S' : Type u_1
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
inst✝³ : Algebra R R'
inst✝² : Algebra S S'
inst✝¹ : IsLocalization M R'
inst✝ : IsLocalization (Submonoid.map f M) S'
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : Algebra R S' := RingHom.toAlgebra (RingHom.comp (algebraMap S S') f)
f' : R' →+* S' := IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M))
this✝ : Algebra R' S' := RingHom.toAlgebra f'
this : IsScalarTower R R' S'
fₐ : S →ₐ[R] S' :=
  AlgHom.mk' (algebraMap S S')
    (_ : ∀ (c : R) (x : S), ↑(algebraMap S S') (↑f c * x) = ↑(algebraMap S S') (↑f c) * ↑(algebraMap S S') x)
T : Finset S
hT : Submodule.span R ↑T = ⊤
y : S
r : R
hr : r ∈ ↑M
hy : ↑(algebraMap S S') y ∈ Submodule.span R (↑(AlgHom.toLinearMap fₐ) '' ↑T)
H :
  Submodule.span R (↑(algebraMap S S') '' ↑T) ≤
    Submodule.restrictScalars R (Submodule.span R' (↑(algebraMap S S') '' ↑T))
⊢ IsLocalization.mk' S' 1 { val := ↑f r, property := (_ : ∃ a, a ∈ ↑M ∧ ↑f a = ↑f r) } * ↑(algebraMap S S') y ∈
    Submodule.span R' (↑(algebraMap S S') '' ↑T)
[PROOFSTEP]
convert (Submodule.span R' (algebraMap S S' '' T)).smul_mem (IsLocalization.mk' R' (1 : R) ⟨r, hr⟩) (H hy) using 1
[GOAL]
case h.e'_4
R✝ S✝ : Type u
inst✝¹³ : CommRing R✝
inst✝¹² : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R'✝ S'✝ : Type u
inst✝¹¹ : CommRing R'✝
inst✝¹⁰ : CommRing S'✝
f✝ : R✝ →+* S✝
inst✝⁹ : Algebra R✝ R'✝
inst✝⁸ : Algebra S✝ S'✝
R S : Type u_1
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
M : Submonoid R
R' S' : Type u_1
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
inst✝³ : Algebra R R'
inst✝² : Algebra S S'
inst✝¹ : IsLocalization M R'
inst✝ : IsLocalization (Submonoid.map f M) S'
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : Algebra R S' := RingHom.toAlgebra (RingHom.comp (algebraMap S S') f)
f' : R' →+* S' := IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M))
this✝ : Algebra R' S' := RingHom.toAlgebra f'
this : IsScalarTower R R' S'
fₐ : S →ₐ[R] S' :=
  AlgHom.mk' (algebraMap S S')
    (_ : ∀ (c : R) (x : S), ↑(algebraMap S S') (↑f c * x) = ↑(algebraMap S S') (↑f c) * ↑(algebraMap S S') x)
T : Finset S
hT : Submodule.span R ↑T = ⊤
y : S
r : R
hr : r ∈ ↑M
hy : ↑(algebraMap S S') y ∈ Submodule.span R (↑(AlgHom.toLinearMap fₐ) '' ↑T)
H :
  Submodule.span R (↑(algebraMap S S') '' ↑T) ≤
    Submodule.restrictScalars R (Submodule.span R' (↑(algebraMap S S') '' ↑T))
⊢ IsLocalization.mk' S' 1 { val := ↑f r, property := (_ : ∃ a, a ∈ ↑M ∧ ↑f a = ↑f r) } * ↑(algebraMap S S') y =
    IsLocalization.mk' R' 1 { val := r, property := hr } • ↑(algebraMap S S') y
[PROOFSTEP]
rw [Algebra.smul_def]
[GOAL]
case h.e'_4
R✝ S✝ : Type u
inst✝¹³ : CommRing R✝
inst✝¹² : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R'✝ S'✝ : Type u
inst✝¹¹ : CommRing R'✝
inst✝¹⁰ : CommRing S'✝
f✝ : R✝ →+* S✝
inst✝⁹ : Algebra R✝ R'✝
inst✝⁸ : Algebra S✝ S'✝
R S : Type u_1
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
M : Submonoid R
R' S' : Type u_1
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
inst✝³ : Algebra R R'
inst✝² : Algebra S S'
inst✝¹ : IsLocalization M R'
inst✝ : IsLocalization (Submonoid.map f M) S'
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : Algebra R S' := RingHom.toAlgebra (RingHom.comp (algebraMap S S') f)
f' : R' →+* S' := IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M))
this✝ : Algebra R' S' := RingHom.toAlgebra f'
this : IsScalarTower R R' S'
fₐ : S →ₐ[R] S' :=
  AlgHom.mk' (algebraMap S S')
    (_ : ∀ (c : R) (x : S), ↑(algebraMap S S') (↑f c * x) = ↑(algebraMap S S') (↑f c) * ↑(algebraMap S S') x)
T : Finset S
hT : Submodule.span R ↑T = ⊤
y : S
r : R
hr : r ∈ ↑M
hy : ↑(algebraMap S S') y ∈ Submodule.span R (↑(AlgHom.toLinearMap fₐ) '' ↑T)
H :
  Submodule.span R (↑(algebraMap S S') '' ↑T) ≤
    Submodule.restrictScalars R (Submodule.span R' (↑(algebraMap S S') '' ↑T))
⊢ IsLocalization.mk' S' 1 { val := ↑f r, property := (_ : ∃ a, a ∈ ↑M ∧ ↑f a = ↑f r) } * ↑(algebraMap S S') y =
    ↑(algebraMap R' S') (IsLocalization.mk' R' 1 { val := r, property := hr }) * ↑(algebraMap S S') y
[PROOFSTEP]
erw [IsLocalization.map_mk' M.le_comap_map]
[GOAL]
case h.e'_4
R✝ S✝ : Type u
inst✝¹³ : CommRing R✝
inst✝¹² : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R'✝ S'✝ : Type u
inst✝¹¹ : CommRing R'✝
inst✝¹⁰ : CommRing S'✝
f✝ : R✝ →+* S✝
inst✝⁹ : Algebra R✝ R'✝
inst✝⁸ : Algebra S✝ S'✝
R S : Type u_1
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
M : Submonoid R
R' S' : Type u_1
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
inst✝³ : Algebra R R'
inst✝² : Algebra S S'
inst✝¹ : IsLocalization M R'
inst✝ : IsLocalization (Submonoid.map f M) S'
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : Algebra R S' := RingHom.toAlgebra (RingHom.comp (algebraMap S S') f)
f' : R' →+* S' := IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M))
this✝ : Algebra R' S' := RingHom.toAlgebra f'
this : IsScalarTower R R' S'
fₐ : S →ₐ[R] S' :=
  AlgHom.mk' (algebraMap S S')
    (_ : ∀ (c : R) (x : S), ↑(algebraMap S S') (↑f c * x) = ↑(algebraMap S S') (↑f c) * ↑(algebraMap S S') x)
T : Finset S
hT : Submodule.span R ↑T = ⊤
y : S
r : R
hr : r ∈ ↑M
hy : ↑(algebraMap S S') y ∈ Submodule.span R (↑(AlgHom.toLinearMap fₐ) '' ↑T)
H :
  Submodule.span R (↑(algebraMap S S') '' ↑T) ≤
    Submodule.restrictScalars R (Submodule.span R' (↑(algebraMap S S') '' ↑T))
⊢ IsLocalization.mk' S' 1 { val := ↑f r, property := (_ : ∃ a, a ∈ ↑M ∧ ↑f a = ↑f r) } * ↑(algebraMap S S') y =
    IsLocalization.mk' S' (↑f 1)
        { val := ↑f ↑{ val := r, property := hr },
          property := (_ : ↑{ val := r, property := hr } ∈ Submonoid.comap f (Submonoid.map f M)) } *
      ↑(algebraMap S S') y
[PROOFSTEP]
rw [map_one]
[GOAL]
R S : Type u
inst✝⁹ : CommRing R
inst✝⁸ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
f : R →+* S
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R S
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R S S'
inst✝ : IsLocalization (Submonoid.map (algebraMap R S) M) S'
x : S
s : Finset S'
hx : ↑(algebraMap S S') x ∈ Submodule.span R ↑s
⊢ ∃ m, m • x ∈ Submodule.span R ↑(finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s)
[PROOFSTEP]
let g : S →ₐ[R] S' :=
  AlgHom.mk' (algebraMap S S') fun c x => by
    simp [Algebra.algebraMap_eq_smul_one]
      -- We first obtain the `y' ∈ M` such that `s' = y' • s` is falls in the image of `S` in `S'`.
[GOAL]
R S : Type u
inst✝⁹ : CommRing R
inst✝⁸ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
f : R →+* S
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R S
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R S S'
inst✝ : IsLocalization (Submonoid.map (algebraMap R S) M) S'
x✝ : S
s : Finset S'
hx : ↑(algebraMap S S') x✝ ∈ Submodule.span R ↑s
c : R
x : S
⊢ ↑(algebraMap S S') (c • x) = c • ↑(algebraMap S S') x
[PROOFSTEP]
simp [Algebra.algebraMap_eq_smul_one]
  -- We first obtain the `y' ∈ M` such that `s' = y' • s` is falls in the image of `S` in `S'`.
[GOAL]
R S : Type u
inst✝⁹ : CommRing R
inst✝⁸ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
f : R →+* S
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R S
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R S S'
inst✝ : IsLocalization (Submonoid.map (algebraMap R S) M) S'
x : S
s : Finset S'
hx : ↑(algebraMap S S') x ∈ Submodule.span R ↑s
g : S →ₐ[R] S' :=
  AlgHom.mk' (algebraMap S S') (_ : ∀ (c : R) (x : S), ↑(algebraMap S S') (c • x) = c • ↑(algebraMap S S') x)
⊢ ∃ m, m • x ∈ Submodule.span R ↑(finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s)
[PROOFSTEP]
let y := IsLocalization.commonDenomOfFinset (M.map (algebraMap R S)) s
[GOAL]
R S : Type u
inst✝⁹ : CommRing R
inst✝⁸ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
f : R →+* S
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R S
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R S S'
inst✝ : IsLocalization (Submonoid.map (algebraMap R S) M) S'
x : S
s : Finset S'
hx : ↑(algebraMap S S') x ∈ Submodule.span R ↑s
g : S →ₐ[R] S' :=
  AlgHom.mk' (algebraMap S S') (_ : ∀ (c : R) (x : S), ↑(algebraMap S S') (c • x) = c • ↑(algebraMap S S') x)
y : { x // x ∈ Submonoid.map (algebraMap R S) M } := commonDenomOfFinset (Submonoid.map (algebraMap R S) M) s
⊢ ∃ m, m • x ∈ Submodule.span R ↑(finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s)
[PROOFSTEP]
have hx₁ : (y : S) • (s : Set S') = g '' _ := (IsLocalization.finsetIntegerMultiple_image _ s).symm
[GOAL]
R S : Type u
inst✝⁹ : CommRing R
inst✝⁸ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
f : R →+* S
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R S
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R S S'
inst✝ : IsLocalization (Submonoid.map (algebraMap R S) M) S'
x : S
s : Finset S'
hx : ↑(algebraMap S S') x ∈ Submodule.span R ↑s
g : S →ₐ[R] S' :=
  AlgHom.mk' (algebraMap S S') (_ : ∀ (c : R) (x : S), ↑(algebraMap S S') (c • x) = c • ↑(algebraMap S S') x)
y : { x // x ∈ Submonoid.map (algebraMap R S) M } := commonDenomOfFinset (Submonoid.map (algebraMap R S) M) s
hx₁ : ↑y • ↑s = ↑g '' ↑(finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s)
⊢ ∃ m, m • x ∈ Submodule.span R ↑(finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s)
[PROOFSTEP]
obtain ⟨y', hy', e : algebraMap R S y' = y⟩ := y.prop
[GOAL]
case intro.intro
R S : Type u
inst✝⁹ : CommRing R
inst✝⁸ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
f : R →+* S
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R S
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R S S'
inst✝ : IsLocalization (Submonoid.map (algebraMap R S) M) S'
x : S
s : Finset S'
hx : ↑(algebraMap S S') x ∈ Submodule.span R ↑s
g : S →ₐ[R] S' :=
  AlgHom.mk' (algebraMap S S') (_ : ∀ (c : R) (x : S), ↑(algebraMap S S') (c • x) = c • ↑(algebraMap S S') x)
y : { x // x ∈ Submonoid.map (algebraMap R S) M } := commonDenomOfFinset (Submonoid.map (algebraMap R S) M) s
hx₁ : ↑y • ↑s = ↑g '' ↑(finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s)
y' : R
hy' : y' ∈ ↑M
e : ↑(algebraMap R S) y' = ↑y
⊢ ∃ m, m • x ∈ Submodule.span R ↑(finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s)
[PROOFSTEP]
have : algebraMap R S y' • (s : Set S') = y' • (s : Set S') := by
  simp_rw [Algebra.algebraMap_eq_smul_one, smul_assoc, one_smul]
[GOAL]
R S : Type u
inst✝⁹ : CommRing R
inst✝⁸ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
f : R →+* S
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R S
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R S S'
inst✝ : IsLocalization (Submonoid.map (algebraMap R S) M) S'
x : S
s : Finset S'
hx : ↑(algebraMap S S') x ∈ Submodule.span R ↑s
g : S →ₐ[R] S' :=
  AlgHom.mk' (algebraMap S S') (_ : ∀ (c : R) (x : S), ↑(algebraMap S S') (c • x) = c • ↑(algebraMap S S') x)
y : { x // x ∈ Submonoid.map (algebraMap R S) M } := commonDenomOfFinset (Submonoid.map (algebraMap R S) M) s
hx₁ : ↑y • ↑s = ↑g '' ↑(finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s)
y' : R
hy' : y' ∈ ↑M
e : ↑(algebraMap R S) y' = ↑y
⊢ ↑(algebraMap R S) y' • ↑s = y' • ↑s
[PROOFSTEP]
simp_rw [Algebra.algebraMap_eq_smul_one, smul_assoc, one_smul]
[GOAL]
case intro.intro
R S : Type u
inst✝⁹ : CommRing R
inst✝⁸ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
f : R →+* S
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R S
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R S S'
inst✝ : IsLocalization (Submonoid.map (algebraMap R S) M) S'
x : S
s : Finset S'
hx : ↑(algebraMap S S') x ∈ Submodule.span R ↑s
g : S →ₐ[R] S' :=
  AlgHom.mk' (algebraMap S S') (_ : ∀ (c : R) (x : S), ↑(algebraMap S S') (c • x) = c • ↑(algebraMap S S') x)
y : { x // x ∈ Submonoid.map (algebraMap R S) M } := commonDenomOfFinset (Submonoid.map (algebraMap R S) M) s
hx₁ : ↑y • ↑s = ↑g '' ↑(finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s)
y' : R
hy' : y' ∈ ↑M
e : ↑(algebraMap R S) y' = ↑y
this : ↑(algebraMap R S) y' • ↑s = y' • ↑s
⊢ ∃ m, m • x ∈ Submodule.span R ↑(finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s)
[PROOFSTEP]
rw [← e, this] at hx₁
[GOAL]
case intro.intro
R S : Type u
inst✝⁹ : CommRing R
inst✝⁸ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
f : R →+* S
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R S
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R S S'
inst✝ : IsLocalization (Submonoid.map (algebraMap R S) M) S'
x : S
s : Finset S'
hx : ↑(algebraMap S S') x ∈ Submodule.span R ↑s
g : S →ₐ[R] S' :=
  AlgHom.mk' (algebraMap S S') (_ : ∀ (c : R) (x : S), ↑(algebraMap S S') (c • x) = c • ↑(algebraMap S S') x)
y : { x // x ∈ Submonoid.map (algebraMap R S) M } := commonDenomOfFinset (Submonoid.map (algebraMap R S) M) s
y' : R
hx₁ : y' • ↑s = ↑g '' ↑(finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s)
hy' : y' ∈ ↑M
e : ↑(algebraMap R S) y' = ↑y
this : ↑(algebraMap R S) y' • ↑s = y' • ↑s
⊢ ∃ m, m • x ∈ Submodule.span R ↑(finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s)
[PROOFSTEP]
replace hx₁ := congr_arg (Submodule.span R) hx₁
[GOAL]
case intro.intro
R S : Type u
inst✝⁹ : CommRing R
inst✝⁸ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
f : R →+* S
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R S
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R S S'
inst✝ : IsLocalization (Submonoid.map (algebraMap R S) M) S'
x : S
s : Finset S'
hx : ↑(algebraMap S S') x ∈ Submodule.span R ↑s
g : S →ₐ[R] S' :=
  AlgHom.mk' (algebraMap S S') (_ : ∀ (c : R) (x : S), ↑(algebraMap S S') (c • x) = c • ↑(algebraMap S S') x)
y : { x // x ∈ Submonoid.map (algebraMap R S) M } := commonDenomOfFinset (Submonoid.map (algebraMap R S) M) s
y' : R
hy' : y' ∈ ↑M
e : ↑(algebraMap R S) y' = ↑y
this : ↑(algebraMap R S) y' • ↑s = y' • ↑s
hx₁ :
  Submodule.span R (y' • ↑s) = Submodule.span R (↑g '' ↑(finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s))
⊢ ∃ m, m • x ∈ Submodule.span R ↑(finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s)
[PROOFSTEP]
rw [Submodule.span_smul] at hx₁
[GOAL]
case intro.intro
R S : Type u
inst✝⁹ : CommRing R
inst✝⁸ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
f : R →+* S
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R S
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R S S'
inst✝ : IsLocalization (Submonoid.map (algebraMap R S) M) S'
x : S
s : Finset S'
hx : ↑(algebraMap S S') x ∈ Submodule.span R ↑s
g : S →ₐ[R] S' :=
  AlgHom.mk' (algebraMap S S') (_ : ∀ (c : R) (x : S), ↑(algebraMap S S') (c • x) = c • ↑(algebraMap S S') x)
y : { x // x ∈ Submonoid.map (algebraMap R S) M } := commonDenomOfFinset (Submonoid.map (algebraMap R S) M) s
y' : R
hy' : y' ∈ ↑M
e : ↑(algebraMap R S) y' = ↑y
this : ↑(algebraMap R S) y' • ↑s = y' • ↑s
hx₁✝ :
  Submodule.span R (y' • ↑s) = Submodule.span R (↑g '' ↑(finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s))
hx₁ : y' • Submodule.span R ↑s = Submodule.span R (↑g '' ↑(finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s))
⊢ ∃ m, m • x ∈ Submodule.span R ↑(finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s)
[PROOFSTEP]
replace hx : _ ∈ y' • Submodule.span R (s : Set S') := Set.smul_mem_smul_set hx
[GOAL]
case intro.intro
R S : Type u
inst✝⁹ : CommRing R
inst✝⁸ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
f : R →+* S
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R S
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R S S'
inst✝ : IsLocalization (Submonoid.map (algebraMap R S) M) S'
x : S
s : Finset S'
g : S →ₐ[R] S' :=
  AlgHom.mk' (algebraMap S S') (_ : ∀ (c : R) (x : S), ↑(algebraMap S S') (c • x) = c • ↑(algebraMap S S') x)
y : { x // x ∈ Submonoid.map (algebraMap R S) M } := commonDenomOfFinset (Submonoid.map (algebraMap R S) M) s
y' : R
hy' : y' ∈ ↑M
e : ↑(algebraMap R S) y' = ↑y
this : ↑(algebraMap R S) y' • ↑s = y' • ↑s
hx₁✝ :
  Submodule.span R (y' • ↑s) = Submodule.span R (↑g '' ↑(finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s))
hx₁ : y' • Submodule.span R ↑s = Submodule.span R (↑g '' ↑(finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s))
hx : y' • ↑(algebraMap S S') x ∈ y' • Submodule.span R ↑s
⊢ ∃ m, m • x ∈ Submodule.span R ↑(finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s)
[PROOFSTEP]
rw [hx₁] at hx
[GOAL]
case intro.intro
R S : Type u
inst✝⁹ : CommRing R
inst✝⁸ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
f : R →+* S
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R S
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R S S'
inst✝ : IsLocalization (Submonoid.map (algebraMap R S) M) S'
x : S
s : Finset S'
g : S →ₐ[R] S' :=
  AlgHom.mk' (algebraMap S S') (_ : ∀ (c : R) (x : S), ↑(algebraMap S S') (c • x) = c • ↑(algebraMap S S') x)
y : { x // x ∈ Submonoid.map (algebraMap R S) M } := commonDenomOfFinset (Submonoid.map (algebraMap R S) M) s
y' : R
hy' : y' ∈ ↑M
e : ↑(algebraMap R S) y' = ↑y
this : ↑(algebraMap R S) y' • ↑s = y' • ↑s
hx₁✝ :
  Submodule.span R (y' • ↑s) = Submodule.span R (↑g '' ↑(finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s))
hx₁ : y' • Submodule.span R ↑s = Submodule.span R (↑g '' ↑(finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s))
hx : y' • ↑(algebraMap S S') x ∈ Submodule.span R (↑g '' ↑(finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s))
⊢ ∃ m, m • x ∈ Submodule.span R ↑(finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s)
[PROOFSTEP]
erw [← g.map_smul, ← Submodule.map_span (g : S →ₗ[R] S')] at hx
[GOAL]
case intro.intro
R S : Type u
inst✝⁹ : CommRing R
inst✝⁸ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
f : R →+* S
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R S
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R S S'
inst✝ : IsLocalization (Submonoid.map (algebraMap R S) M) S'
x : S
s : Finset S'
g : S →ₐ[R] S' :=
  AlgHom.mk' (algebraMap S S') (_ : ∀ (c : R) (x : S), ↑(algebraMap S S') (c • x) = c • ↑(algebraMap S S') x)
y : { x // x ∈ Submonoid.map (algebraMap R S) M } := commonDenomOfFinset (Submonoid.map (algebraMap R S) M) s
y' : R
hy' : y' ∈ ↑M
e : ↑(algebraMap R S) y' = ↑y
this : ↑(algebraMap R S) y' • ↑s = y' • ↑s
hx₁✝ :
  Submodule.span R (y' • ↑s) = Submodule.span R (↑g '' ↑(finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s))
hx₁ : y' • Submodule.span R ↑s = Submodule.span R (↑g '' ↑(finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s))
hx : ↑g (y' • x) ∈ Submodule.map (↑↑g) (Submodule.span R ↑(finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s))
⊢ ∃ m, m • x ∈ Submodule.span R ↑(finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s)
[PROOFSTEP]
obtain ⟨x', hx', hx'' : algebraMap _ _ _ = _⟩ := hx
[GOAL]
case intro.intro.intro.intro
R S : Type u
inst✝⁹ : CommRing R
inst✝⁸ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
f : R →+* S
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R S
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R S S'
inst✝ : IsLocalization (Submonoid.map (algebraMap R S) M) S'
x : S
s : Finset S'
g : S →ₐ[R] S' :=
  AlgHom.mk' (algebraMap S S') (_ : ∀ (c : R) (x : S), ↑(algebraMap S S') (c • x) = c • ↑(algebraMap S S') x)
y : { x // x ∈ Submonoid.map (algebraMap R S) M } := commonDenomOfFinset (Submonoid.map (algebraMap R S) M) s
y' : R
hy' : y' ∈ ↑M
e : ↑(algebraMap R S) y' = ↑y
this : ↑(algebraMap R S) y' • ↑s = y' • ↑s
hx₁✝ :
  Submodule.span R (y' • ↑s) = Submodule.span R (↑g '' ↑(finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s))
hx₁ : y' • Submodule.span R ↑s = Submodule.span R (↑g '' ↑(finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s))
x' : S
hx' : x' ∈ ↑(Submodule.span R ↑(finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s))
hx'' : ↑(algebraMap S S') x' = ↑g (y' • x)
⊢ ∃ m, m • x ∈ Submodule.span R ↑(finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s)
[PROOFSTEP]
obtain ⟨⟨_, a, ha₁, rfl⟩, ha₂⟩ := (IsLocalization.eq_iff_exists (M.map (algebraMap R S)) S').mp hx''
[GOAL]
case intro.intro.intro.intro.intro.mk.intro.intro
R S : Type u
inst✝⁹ : CommRing R
inst✝⁸ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
f : R →+* S
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R S
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R S S'
inst✝ : IsLocalization (Submonoid.map (algebraMap R S) M) S'
x : S
s : Finset S'
g : S →ₐ[R] S' :=
  AlgHom.mk' (algebraMap S S') (_ : ∀ (c : R) (x : S), ↑(algebraMap S S') (c • x) = c • ↑(algebraMap S S') x)
y : { x // x ∈ Submonoid.map (algebraMap R S) M } := commonDenomOfFinset (Submonoid.map (algebraMap R S) M) s
y' : R
hy' : y' ∈ ↑M
e : ↑(algebraMap R S) y' = ↑y
this : ↑(algebraMap R S) y' • ↑s = y' • ↑s
hx₁✝ :
  Submodule.span R (y' • ↑s) = Submodule.span R (↑g '' ↑(finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s))
hx₁ : y' • Submodule.span R ↑s = Submodule.span R (↑g '' ↑(finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s))
x' : S
hx' : x' ∈ ↑(Submodule.span R ↑(finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s))
hx'' : ↑(algebraMap S S') x' = ↑g (y' • x)
a : R
ha₁ : a ∈ ↑M
ha₂ :
  ↑{ val := ↑(algebraMap R S) a, property := (_ : ∃ a_1, a_1 ∈ ↑M ∧ ↑(algebraMap R S) a_1 = ↑(algebraMap R S) a) } *
      x' =
    ↑{ val := ↑(algebraMap R S) a, property := (_ : ∃ a_1, a_1 ∈ ↑M ∧ ↑(algebraMap R S) a_1 = ↑(algebraMap R S) a) } *
      y' • x
⊢ ∃ m, m • x ∈ Submodule.span R ↑(finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s)
[PROOFSTEP]
use(⟨a, ha₁⟩ : M) * (⟨y', hy'⟩ : M)
[GOAL]
case h
R S : Type u
inst✝⁹ : CommRing R
inst✝⁸ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
f : R →+* S
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R S
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R S S'
inst✝ : IsLocalization (Submonoid.map (algebraMap R S) M) S'
x : S
s : Finset S'
g : S →ₐ[R] S' :=
  AlgHom.mk' (algebraMap S S') (_ : ∀ (c : R) (x : S), ↑(algebraMap S S') (c • x) = c • ↑(algebraMap S S') x)
y : { x // x ∈ Submonoid.map (algebraMap R S) M } := commonDenomOfFinset (Submonoid.map (algebraMap R S) M) s
y' : R
hy' : y' ∈ ↑M
e : ↑(algebraMap R S) y' = ↑y
this : ↑(algebraMap R S) y' • ↑s = y' • ↑s
hx₁✝ :
  Submodule.span R (y' • ↑s) = Submodule.span R (↑g '' ↑(finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s))
hx₁ : y' • Submodule.span R ↑s = Submodule.span R (↑g '' ↑(finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s))
x' : S
hx' : x' ∈ ↑(Submodule.span R ↑(finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s))
hx'' : ↑(algebraMap S S') x' = ↑g (y' • x)
a : R
ha₁ : a ∈ ↑M
ha₂ :
  ↑{ val := ↑(algebraMap R S) a, property := (_ : ∃ a_1, a_1 ∈ ↑M ∧ ↑(algebraMap R S) a_1 = ↑(algebraMap R S) a) } *
      x' =
    ↑{ val := ↑(algebraMap R S) a, property := (_ : ∃ a_1, a_1 ∈ ↑M ∧ ↑(algebraMap R S) a_1 = ↑(algebraMap R S) a) } *
      y' • x
⊢ ({ val := a, property := ha₁ } * { val := y', property := hy' }) • x ∈
    Submodule.span R ↑(finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s)
[PROOFSTEP]
convert
  (Submodule.span R (IsLocalization.finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s : Set S)).smul_mem a
    hx' using
  1
[GOAL]
case h.e'_4
R S : Type u
inst✝⁹ : CommRing R
inst✝⁸ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
f : R →+* S
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R S
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R S S'
inst✝ : IsLocalization (Submonoid.map (algebraMap R S) M) S'
x : S
s : Finset S'
g : S →ₐ[R] S' :=
  AlgHom.mk' (algebraMap S S') (_ : ∀ (c : R) (x : S), ↑(algebraMap S S') (c • x) = c • ↑(algebraMap S S') x)
y : { x // x ∈ Submonoid.map (algebraMap R S) M } := commonDenomOfFinset (Submonoid.map (algebraMap R S) M) s
y' : R
hy' : y' ∈ ↑M
e : ↑(algebraMap R S) y' = ↑y
this : ↑(algebraMap R S) y' • ↑s = y' • ↑s
hx₁✝ :
  Submodule.span R (y' • ↑s) = Submodule.span R (↑g '' ↑(finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s))
hx₁ : y' • Submodule.span R ↑s = Submodule.span R (↑g '' ↑(finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s))
x' : S
hx' : x' ∈ ↑(Submodule.span R ↑(finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s))
hx'' : ↑(algebraMap S S') x' = ↑g (y' • x)
a : R
ha₁ : a ∈ ↑M
ha₂ :
  ↑{ val := ↑(algebraMap R S) a, property := (_ : ∃ a_1, a_1 ∈ ↑M ∧ ↑(algebraMap R S) a_1 = ↑(algebraMap R S) a) } *
      x' =
    ↑{ val := ↑(algebraMap R S) a, property := (_ : ∃ a_1, a_1 ∈ ↑M ∧ ↑(algebraMap R S) a_1 = ↑(algebraMap R S) a) } *
      y' • x
⊢ ({ val := a, property := ha₁ } * { val := y', property := hy' }) • x = a • x'
[PROOFSTEP]
convert ha₂.symm using 1
[GOAL]
case h.e'_2
R S : Type u
inst✝⁹ : CommRing R
inst✝⁸ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
f : R →+* S
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R S
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R S S'
inst✝ : IsLocalization (Submonoid.map (algebraMap R S) M) S'
x : S
s : Finset S'
g : S →ₐ[R] S' :=
  AlgHom.mk' (algebraMap S S') (_ : ∀ (c : R) (x : S), ↑(algebraMap S S') (c • x) = c • ↑(algebraMap S S') x)
y : { x // x ∈ Submonoid.map (algebraMap R S) M } := commonDenomOfFinset (Submonoid.map (algebraMap R S) M) s
y' : R
hy' : y' ∈ ↑M
e : ↑(algebraMap R S) y' = ↑y
this : ↑(algebraMap R S) y' • ↑s = y' • ↑s
hx₁✝ :
  Submodule.span R (y' • ↑s) = Submodule.span R (↑g '' ↑(finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s))
hx₁ : y' • Submodule.span R ↑s = Submodule.span R (↑g '' ↑(finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s))
x' : S
hx' : x' ∈ ↑(Submodule.span R ↑(finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s))
hx'' : ↑(algebraMap S S') x' = ↑g (y' • x)
a : R
ha₁ : a ∈ ↑M
ha₂ :
  ↑{ val := ↑(algebraMap R S) a, property := (_ : ∃ a_1, a_1 ∈ ↑M ∧ ↑(algebraMap R S) a_1 = ↑(algebraMap R S) a) } *
      x' =
    ↑{ val := ↑(algebraMap R S) a, property := (_ : ∃ a_1, a_1 ∈ ↑M ∧ ↑(algebraMap R S) a_1 = ↑(algebraMap R S) a) } *
      y' • x
⊢ ({ val := a, property := ha₁ } * { val := y', property := hy' }) • x =
    ↑{ val := ↑(algebraMap R S) a, property := (_ : ∃ a_1, a_1 ∈ ↑M ∧ ↑(algebraMap R S) a_1 = ↑(algebraMap R S) a) } *
      y' • x
[PROOFSTEP]
rw [Subtype.coe_mk, Submonoid.smul_def, Submonoid.coe_mul, ← smul_smul]
[GOAL]
case h.e'_2
R S : Type u
inst✝⁹ : CommRing R
inst✝⁸ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
f : R →+* S
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R S
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R S S'
inst✝ : IsLocalization (Submonoid.map (algebraMap R S) M) S'
x : S
s : Finset S'
g : S →ₐ[R] S' :=
  AlgHom.mk' (algebraMap S S') (_ : ∀ (c : R) (x : S), ↑(algebraMap S S') (c • x) = c • ↑(algebraMap S S') x)
y : { x // x ∈ Submonoid.map (algebraMap R S) M } := commonDenomOfFinset (Submonoid.map (algebraMap R S) M) s
y' : R
hy' : y' ∈ ↑M
e : ↑(algebraMap R S) y' = ↑y
this : ↑(algebraMap R S) y' • ↑s = y' • ↑s
hx₁✝ :
  Submodule.span R (y' • ↑s) = Submodule.span R (↑g '' ↑(finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s))
hx₁ : y' • Submodule.span R ↑s = Submodule.span R (↑g '' ↑(finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s))
x' : S
hx' : x' ∈ ↑(Submodule.span R ↑(finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s))
hx'' : ↑(algebraMap S S') x' = ↑g (y' • x)
a : R
ha₁ : a ∈ ↑M
ha₂ :
  ↑{ val := ↑(algebraMap R S) a, property := (_ : ∃ a_1, a_1 ∈ ↑M ∧ ↑(algebraMap R S) a_1 = ↑(algebraMap R S) a) } *
      x' =
    ↑{ val := ↑(algebraMap R S) a, property := (_ : ∃ a_1, a_1 ∈ ↑M ∧ ↑(algebraMap R S) a_1 = ↑(algebraMap R S) a) } *
      y' • x
⊢ ↑{ val := a, property := ha₁ } • ↑{ val := y', property := hy' } • x = ↑(algebraMap R S) a * y' • x
[PROOFSTEP]
exact Algebra.smul_def _ _
[GOAL]
case h.e'_3
R S : Type u
inst✝⁹ : CommRing R
inst✝⁸ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
f : R →+* S
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R S
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R S S'
inst✝ : IsLocalization (Submonoid.map (algebraMap R S) M) S'
x : S
s : Finset S'
g : S →ₐ[R] S' :=
  AlgHom.mk' (algebraMap S S') (_ : ∀ (c : R) (x : S), ↑(algebraMap S S') (c • x) = c • ↑(algebraMap S S') x)
y : { x // x ∈ Submonoid.map (algebraMap R S) M } := commonDenomOfFinset (Submonoid.map (algebraMap R S) M) s
y' : R
hy' : y' ∈ ↑M
e : ↑(algebraMap R S) y' = ↑y
this : ↑(algebraMap R S) y' • ↑s = y' • ↑s
hx₁✝ :
  Submodule.span R (y' • ↑s) = Submodule.span R (↑g '' ↑(finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s))
hx₁ : y' • Submodule.span R ↑s = Submodule.span R (↑g '' ↑(finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s))
x' : S
hx' : x' ∈ ↑(Submodule.span R ↑(finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s))
hx'' : ↑(algebraMap S S') x' = ↑g (y' • x)
a : R
ha₁ : a ∈ ↑M
ha₂ :
  ↑{ val := ↑(algebraMap R S) a, property := (_ : ∃ a_1, a_1 ∈ ↑M ∧ ↑(algebraMap R S) a_1 = ↑(algebraMap R S) a) } *
      x' =
    ↑{ val := ↑(algebraMap R S) a, property := (_ : ∃ a_1, a_1 ∈ ↑M ∧ ↑(algebraMap R S) a_1 = ↑(algebraMap R S) a) } *
      y' • x
⊢ a • x' =
    ↑{ val := ↑(algebraMap R S) a, property := (_ : ∃ a_1, a_1 ∈ ↑M ∧ ↑(algebraMap R S) a_1 = ↑(algebraMap R S) a) } *
      x'
[PROOFSTEP]
exact Algebra.smul_def _ _
[GOAL]
R S : Type u
inst✝⁹ : CommRing R
inst✝⁸ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
f : R →+* S
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R' S
inst✝² : Algebra R S
inst✝¹ : IsScalarTower R R' S
inst✝ : IsLocalization M R'
s : Set S
x : S
hx : x ∈ Submodule.span R' s
⊢ ∃ t, t • x ∈ Submodule.span R s
[PROOFSTEP]
obtain ⟨s', hss', hs'⟩ := Submodule.mem_span_finite_of_mem_span hx
[GOAL]
case intro.intro
R S : Type u
inst✝⁹ : CommRing R
inst✝⁸ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
f : R →+* S
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R' S
inst✝² : Algebra R S
inst✝¹ : IsScalarTower R R' S
inst✝ : IsLocalization M R'
s : Set S
x : S
hx : x ∈ Submodule.span R' s
s' : Finset S
hss' : ↑s' ⊆ s
hs' : x ∈ Submodule.span R' ↑s'
⊢ ∃ t, t • x ∈ Submodule.span R s
[PROOFSTEP]
rsuffices ⟨t, ht⟩ : ∃ t : M, t • x ∈ Submodule.span R (s' : Set S)
[GOAL]
case intro.intro.intro
R S : Type u
inst✝⁹ : CommRing R
inst✝⁸ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
f : R →+* S
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R' S
inst✝² : Algebra R S
inst✝¹ : IsScalarTower R R' S
inst✝ : IsLocalization M R'
s : Set S
x : S
hx : x ∈ Submodule.span R' s
s' : Finset S
hss' : ↑s' ⊆ s
hs' : x ∈ Submodule.span R' ↑s'
t : { x // x ∈ M }
ht : t • x ∈ Submodule.span R ↑s'
⊢ ∃ t, t • x ∈ Submodule.span R s
[PROOFSTEP]
exact ⟨t, Submodule.span_mono hss' ht⟩
[GOAL]
R S : Type u
inst✝⁹ : CommRing R
inst✝⁸ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
f : R →+* S
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R' S
inst✝² : Algebra R S
inst✝¹ : IsScalarTower R R' S
inst✝ : IsLocalization M R'
s : Set S
x : S
hx : x ∈ Submodule.span R' s
s' : Finset S
hss' : ↑s' ⊆ s
hs' : x ∈ Submodule.span R' ↑s'
⊢ ∃ t, t • x ∈ Submodule.span R ↑s'
[PROOFSTEP]
clear hx hss' s
[GOAL]
R S : Type u
inst✝⁹ : CommRing R
inst✝⁸ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
f : R →+* S
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R' S
inst✝² : Algebra R S
inst✝¹ : IsScalarTower R R' S
inst✝ : IsLocalization M R'
x : S
s' : Finset S
hs' : x ∈ Submodule.span R' ↑s'
⊢ ∃ t, t • x ∈ Submodule.span R ↑s'
[PROOFSTEP]
induction s' using Finset.induction_on generalizing x
[GOAL]
case empty
R S : Type u
inst✝⁹ : CommRing R
inst✝⁸ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
f : R →+* S
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R' S
inst✝² : Algebra R S
inst✝¹ : IsScalarTower R R' S
inst✝ : IsLocalization M R'
x : S
hs' : x ∈ Submodule.span R' ↑∅
⊢ ∃ t, t • x ∈ Submodule.span R ↑∅
[PROOFSTEP]
use 1
[GOAL]
case h
R S : Type u
inst✝⁹ : CommRing R
inst✝⁸ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
f : R →+* S
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R' S
inst✝² : Algebra R S
inst✝¹ : IsScalarTower R R' S
inst✝ : IsLocalization M R'
x : S
hs' : x ∈ Submodule.span R' ↑∅
⊢ 1 • x ∈ Submodule.span R ↑∅
[PROOFSTEP]
simpa using hs'
[GOAL]
case insert
R S : Type u
inst✝⁹ : CommRing R
inst✝⁸ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
f : R →+* S
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R' S
inst✝² : Algebra R S
inst✝¹ : IsScalarTower R R' S
inst✝ : IsLocalization M R'
a✝² : S
s✝ : Finset S
a✝¹ : ¬a✝² ∈ s✝
a✝ : ∀ (x : S), x ∈ Submodule.span R' ↑s✝ → ∃ t, t • x ∈ Submodule.span R ↑s✝
x : S
hs' : x ∈ Submodule.span R' ↑(insert a✝² s✝)
⊢ ∃ t, t • x ∈ Submodule.span R ↑(insert a✝² s✝)
[PROOFSTEP]
rename_i a s _ hs
[GOAL]
case insert
R S : Type u
inst✝⁹ : CommRing R
inst✝⁸ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
f : R →+* S
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R' S
inst✝² : Algebra R S
inst✝¹ : IsScalarTower R R' S
inst✝ : IsLocalization M R'
a : S
s : Finset S
a✝ : ¬a ∈ s
hs : ∀ (x : S), x ∈ Submodule.span R' ↑s → ∃ t, t • x ∈ Submodule.span R ↑s
x : S
hs' : x ∈ Submodule.span R' ↑(insert a s)
⊢ ∃ t, t • x ∈ Submodule.span R ↑(insert a s)
[PROOFSTEP]
simp only [Finset.coe_insert, Finset.image_insert, Finset.coe_image, Subtype.coe_mk, Submodule.mem_span_insert] at hs' ⊢
[GOAL]
case insert
R S : Type u
inst✝⁹ : CommRing R
inst✝⁸ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
f : R →+* S
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R' S
inst✝² : Algebra R S
inst✝¹ : IsScalarTower R R' S
inst✝ : IsLocalization M R'
a : S
s : Finset S
a✝ : ¬a ∈ s
hs : ∀ (x : S), x ∈ Submodule.span R' ↑s → ∃ t, t • x ∈ Submodule.span R ↑s
x : S
hs' : ∃ a_1 z, z ∈ Submodule.span R' ↑s ∧ x = a_1 • a + z
⊢ ∃ t a_1 z, z ∈ Submodule.span R ↑s ∧ t • x = a_1 • a + z
[PROOFSTEP]
rcases hs' with ⟨y, z, hz, rfl⟩
[GOAL]
case insert.intro.intro.intro
R S : Type u
inst✝⁹ : CommRing R
inst✝⁸ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
f : R →+* S
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R' S
inst✝² : Algebra R S
inst✝¹ : IsScalarTower R R' S
inst✝ : IsLocalization M R'
a : S
s : Finset S
a✝ : ¬a ∈ s
hs : ∀ (x : S), x ∈ Submodule.span R' ↑s → ∃ t, t • x ∈ Submodule.span R ↑s
y : R'
z : S
hz : z ∈ Submodule.span R' ↑s
⊢ ∃ t a_1 z_1, z_1 ∈ Submodule.span R ↑s ∧ t • (y • a + z) = a_1 • a + z_1
[PROOFSTEP]
rcases IsLocalization.surj M y with ⟨⟨y', s'⟩, e⟩
[GOAL]
case insert.intro.intro.intro.intro.mk
R S : Type u
inst✝⁹ : CommRing R
inst✝⁸ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
f : R →+* S
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R' S
inst✝² : Algebra R S
inst✝¹ : IsScalarTower R R' S
inst✝ : IsLocalization M R'
a : S
s : Finset S
a✝ : ¬a ∈ s
hs : ∀ (x : S), x ∈ Submodule.span R' ↑s → ∃ t, t • x ∈ Submodule.span R ↑s
y : R'
z : S
hz : z ∈ Submodule.span R' ↑s
y' : R
s' : { x // x ∈ M }
e : y * ↑(algebraMap R R') ↑(y', s').snd = ↑(algebraMap R R') (y', s').fst
⊢ ∃ t a_1 z_1, z_1 ∈ Submodule.span R ↑s ∧ t • (y • a + z) = a_1 • a + z_1
[PROOFSTEP]
replace e : _ * a = _ * a := (congr_arg (fun x => algebraMap R' S x * a) e : _)
[GOAL]
case insert.intro.intro.intro.intro.mk
R S : Type u
inst✝⁹ : CommRing R
inst✝⁸ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
f : R →+* S
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R' S
inst✝² : Algebra R S
inst✝¹ : IsScalarTower R R' S
inst✝ : IsLocalization M R'
a : S
s : Finset S
a✝ : ¬a ∈ s
hs : ∀ (x : S), x ∈ Submodule.span R' ↑s → ∃ t, t • x ∈ Submodule.span R ↑s
y : R'
z : S
hz : z ∈ Submodule.span R' ↑s
y' : R
s' : { x // x ∈ M }
e :
  ↑(algebraMap R' S) (y * ↑(algebraMap R R') ↑(y', s').snd) * a =
    ↑(algebraMap R' S) (↑(algebraMap R R') (y', s').fst) * a
⊢ ∃ t a_1 z_1, z_1 ∈ Submodule.span R ↑s ∧ t • (y • a + z) = a_1 • a + z_1
[PROOFSTEP]
simp_rw [RingHom.map_mul, ← IsScalarTower.algebraMap_apply, mul_comm (algebraMap R' S y), mul_assoc, ←
  Algebra.smul_def] at e
[GOAL]
case insert.intro.intro.intro.intro.mk
R S : Type u
inst✝⁹ : CommRing R
inst✝⁸ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
f : R →+* S
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R' S
inst✝² : Algebra R S
inst✝¹ : IsScalarTower R R' S
inst✝ : IsLocalization M R'
a : S
s : Finset S
a✝ : ¬a ∈ s
hs : ∀ (x : S), x ∈ Submodule.span R' ↑s → ∃ t, t • x ∈ Submodule.span R ↑s
y : R'
z : S
hz : z ∈ Submodule.span R' ↑s
y' : R
s' : { x // x ∈ M }
e : ↑s' • y • a = y' • a
⊢ ∃ t a_1 z_1, z_1 ∈ Submodule.span R ↑s ∧ t • (y • a + z) = a_1 • a + z_1
[PROOFSTEP]
rcases hs _ hz with ⟨t, ht⟩
[GOAL]
case insert.intro.intro.intro.intro.mk.intro
R S : Type u
inst✝⁹ : CommRing R
inst✝⁸ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
f : R →+* S
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R' S
inst✝² : Algebra R S
inst✝¹ : IsScalarTower R R' S
inst✝ : IsLocalization M R'
a : S
s : Finset S
a✝ : ¬a ∈ s
hs : ∀ (x : S), x ∈ Submodule.span R' ↑s → ∃ t, t • x ∈ Submodule.span R ↑s
y : R'
z : S
hz : z ∈ Submodule.span R' ↑s
y' : R
s' : { x // x ∈ M }
e : ↑s' • y • a = y' • a
t : { x // x ∈ M }
ht : t • z ∈ Submodule.span R ↑s
⊢ ∃ t a_1 z_1, z_1 ∈ Submodule.span R ↑s ∧ t • (y • a + z) = a_1 • a + z_1
[PROOFSTEP]
refine' ⟨t * s', t * y', _, (Submodule.span R (s : Set S)).smul_mem s' ht, _⟩
[GOAL]
case insert.intro.intro.intro.intro.mk.intro
R S : Type u
inst✝⁹ : CommRing R
inst✝⁸ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
f : R →+* S
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R' S
inst✝² : Algebra R S
inst✝¹ : IsScalarTower R R' S
inst✝ : IsLocalization M R'
a : S
s : Finset S
a✝ : ¬a ∈ s
hs : ∀ (x : S), x ∈ Submodule.span R' ↑s → ∃ t, t • x ∈ Submodule.span R ↑s
y : R'
z : S
hz : z ∈ Submodule.span R' ↑s
y' : R
s' : { x // x ∈ M }
e : ↑s' • y • a = y' • a
t : { x // x ∈ M }
ht : t • z ∈ Submodule.span R ↑s
⊢ (t * s') • (y • a + z) = (↑t * y') • a + ↑s' • t • z
[PROOFSTEP]
rw [smul_add, ← smul_smul, mul_comm, ← smul_smul, ← smul_smul, ← e]
[GOAL]
case insert.intro.intro.intro.intro.mk.intro
R S : Type u
inst✝⁹ : CommRing R
inst✝⁸ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
f : R →+* S
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R' S
inst✝² : Algebra R S
inst✝¹ : IsScalarTower R R' S
inst✝ : IsLocalization M R'
a : S
s : Finset S
a✝ : ¬a ∈ s
hs : ∀ (x : S), x ∈ Submodule.span R' ↑s → ∃ t, t • x ∈ Submodule.span R ↑s
y : R'
z : S
hz : z ∈ Submodule.span R' ↑s
y' : R
s' : { x // x ∈ M }
e : ↑s' • y • a = y' • a
t : { x // x ∈ M }
ht : t • z ∈ Submodule.span R ↑s
⊢ t • s' • y • a + s' • t • z = ↑t • ↑s' • y • a + ↑s' • t • z
[PROOFSTEP]
rfl
[GOAL]
R S : Type u
inst✝⁹ : CommRing R
inst✝⁸ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
f : R →+* S
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R' S
inst✝² : Algebra R S
inst✝¹ : IsScalarTower R R' S
inst✝ : IsLocalization M R'
s : Set S
x : S
hx : x ∈ Algebra.adjoin R' s
⊢ ∃ t, t • x ∈ Algebra.adjoin R s
[PROOFSTEP]
change ∃ t : M, t • x ∈ Subalgebra.toSubmodule (Algebra.adjoin R s)
[GOAL]
R S : Type u
inst✝⁹ : CommRing R
inst✝⁸ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
f : R →+* S
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R' S
inst✝² : Algebra R S
inst✝¹ : IsScalarTower R R' S
inst✝ : IsLocalization M R'
s : Set S
x : S
hx : x ∈ Algebra.adjoin R' s
⊢ ∃ t, t • x ∈ ↑Subalgebra.toSubmodule (Algebra.adjoin R s)
[PROOFSTEP]
change x ∈ Subalgebra.toSubmodule (Algebra.adjoin R' s) at hx
[GOAL]
R S : Type u
inst✝⁹ : CommRing R
inst✝⁸ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
f : R →+* S
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R' S
inst✝² : Algebra R S
inst✝¹ : IsScalarTower R R' S
inst✝ : IsLocalization M R'
s : Set S
x : S
hx : x ∈ ↑Subalgebra.toSubmodule (Algebra.adjoin R' s)
⊢ ∃ t, t • x ∈ ↑Subalgebra.toSubmodule (Algebra.adjoin R s)
[PROOFSTEP]
simp_rw [Algebra.adjoin_eq_span] at hx ⊢
[GOAL]
R S : Type u
inst✝⁹ : CommRing R
inst✝⁸ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
f : R →+* S
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R' S
inst✝² : Algebra R S
inst✝¹ : IsScalarTower R R' S
inst✝ : IsLocalization M R'
s : Set S
x : S
hx : x ∈ Submodule.span R' ↑(Submonoid.closure s)
⊢ ∃ t, t • x ∈ Submodule.span R ↑(Submonoid.closure s)
[PROOFSTEP]
exact multiple_mem_span_of_mem_localization_span M R' _ _ hx
[GOAL]
R S : Type u
inst✝⁵ : CommRing R
inst✝⁴ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝³ : CommRing R'
inst✝² : CommRing S'
f : R →+* S
inst✝¹ : Algebra R R'
inst✝ : Algebra S S'
⊢ RingHom.OfLocalizationSpan @RingHom.Finite
[PROOFSTEP]
rw [RingHom.ofLocalizationSpan_iff_finite]
[GOAL]
R S : Type u
inst✝⁵ : CommRing R
inst✝⁴ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝³ : CommRing R'
inst✝² : CommRing S'
f : R →+* S
inst✝¹ : Algebra R R'
inst✝ : Algebra S S'
⊢ RingHom.OfLocalizationFiniteSpan @RingHom.Finite
[PROOFSTEP]
introv R hs H
[GOAL]
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Finset R
hs : Ideal.span ↑s = ⊤
H : ∀ (r : { x // x ∈ s }), RingHom.Finite (Localization.awayMap f ↑r)
⊢ RingHom.Finite f
[PROOFSTEP]
letI := f.toAlgebra
[GOAL]
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Finset R
hs : Ideal.span ↑s = ⊤
H : ∀ (r : { x // x ∈ s }), RingHom.Finite (Localization.awayMap f ↑r)
this : Algebra R S := RingHom.toAlgebra f
⊢ RingHom.Finite f
[PROOFSTEP]
letI := fun r : s => (Localization.awayMap f r).toAlgebra
[GOAL]
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Finset R
hs : Ideal.span ↑s = ⊤
H : ∀ (r : { x // x ∈ s }), RingHom.Finite (Localization.awayMap f ↑r)
this✝ : Algebra R S := RingHom.toAlgebra f
this : (r : { x // x ∈ s }) → Algebra (Localization.Away ↑r) (Localization.Away (↑f ↑r)) :=
  fun r => RingHom.toAlgebra (Localization.awayMap f ↑r)
⊢ RingHom.Finite f
[PROOFSTEP]
have : ∀ r : s, IsLocalization ((Submonoid.powers (r : R)).map (algebraMap R S)) (Localization.Away (f r)) := by
  intro r; rw [Submonoid.map_powers]; exact Localization.isLocalization
[GOAL]
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Finset R
hs : Ideal.span ↑s = ⊤
H : ∀ (r : { x // x ∈ s }), RingHom.Finite (Localization.awayMap f ↑r)
this✝ : Algebra R S := RingHom.toAlgebra f
this : (r : { x // x ∈ s }) → Algebra (Localization.Away ↑r) (Localization.Away (↑f ↑r)) :=
  fun r => RingHom.toAlgebra (Localization.awayMap f ↑r)
⊢ ∀ (r : { x // x ∈ s }),
    IsLocalization (Submonoid.map (algebraMap R S) (Submonoid.powers ↑r)) (Localization.Away (↑f ↑r))
[PROOFSTEP]
intro r
[GOAL]
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Finset R
hs : Ideal.span ↑s = ⊤
H : ∀ (r : { x // x ∈ s }), RingHom.Finite (Localization.awayMap f ↑r)
this✝ : Algebra R S := RingHom.toAlgebra f
this : (r : { x // x ∈ s }) → Algebra (Localization.Away ↑r) (Localization.Away (↑f ↑r)) :=
  fun r => RingHom.toAlgebra (Localization.awayMap f ↑r)
r : { x // x ∈ s }
⊢ IsLocalization (Submonoid.map (algebraMap R S) (Submonoid.powers ↑r)) (Localization.Away (↑f ↑r))
[PROOFSTEP]
rw [Submonoid.map_powers]
[GOAL]
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Finset R
hs : Ideal.span ↑s = ⊤
H : ∀ (r : { x // x ∈ s }), RingHom.Finite (Localization.awayMap f ↑r)
this✝ : Algebra R S := RingHom.toAlgebra f
this : (r : { x // x ∈ s }) → Algebra (Localization.Away ↑r) (Localization.Away (↑f ↑r)) :=
  fun r => RingHom.toAlgebra (Localization.awayMap f ↑r)
r : { x // x ∈ s }
⊢ IsLocalization (Submonoid.powers (↑(algebraMap R S) ↑r)) (Localization.Away (↑f ↑r))
[PROOFSTEP]
exact Localization.isLocalization
[GOAL]
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Finset R
hs : Ideal.span ↑s = ⊤
H : ∀ (r : { x // x ∈ s }), RingHom.Finite (Localization.awayMap f ↑r)
this✝¹ : Algebra R S := RingHom.toAlgebra f
this✝ : (r : { x // x ∈ s }) → Algebra (Localization.Away ↑r) (Localization.Away (↑f ↑r)) :=
  fun r => RingHom.toAlgebra (Localization.awayMap f ↑r)
this :
  ∀ (r : { x // x ∈ s }),
    IsLocalization (Submonoid.map (algebraMap R S) (Submonoid.powers ↑r)) (Localization.Away (↑f ↑r))
⊢ RingHom.Finite f
[PROOFSTEP]
haveI : ∀ r : s, IsScalarTower R (Localization.Away (r : R)) (Localization.Away (f r)) := fun r =>
  IsScalarTower.of_algebraMap_eq' (IsLocalization.map_comp (Submonoid.powers (r : R)).le_comap_map).symm
[GOAL]
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Finset R
hs : Ideal.span ↑s = ⊤
H : ∀ (r : { x // x ∈ s }), RingHom.Finite (Localization.awayMap f ↑r)
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : (r : { x // x ∈ s }) → Algebra (Localization.Away ↑r) (Localization.Away (↑f ↑r)) :=
  fun r => RingHom.toAlgebra (Localization.awayMap f ↑r)
this✝ :
  ∀ (r : { x // x ∈ s }),
    IsLocalization (Submonoid.map (algebraMap R S) (Submonoid.powers ↑r)) (Localization.Away (↑f ↑r))
this : ∀ (r : { x // x ∈ s }), IsScalarTower R (Localization.Away ↑r) (Localization.Away (↑f ↑r))
⊢ RingHom.Finite f
[PROOFSTEP]
constructor
[GOAL]
case out
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Finset R
hs : Ideal.span ↑s = ⊤
H : ∀ (r : { x // x ∈ s }), RingHom.Finite (Localization.awayMap f ↑r)
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : (r : { x // x ∈ s }) → Algebra (Localization.Away ↑r) (Localization.Away (↑f ↑r)) :=
  fun r => RingHom.toAlgebra (Localization.awayMap f ↑r)
this✝ :
  ∀ (r : { x // x ∈ s }),
    IsLocalization (Submonoid.map (algebraMap R S) (Submonoid.powers ↑r)) (Localization.Away (↑f ↑r))
this : ∀ (r : { x // x ∈ s }), IsScalarTower R (Localization.Away ↑r) (Localization.Away (↑f ↑r))
⊢ Submodule.FG ⊤
[PROOFSTEP]
replace H := fun r => (H r).1
[GOAL]
case out
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Finset R
hs : Ideal.span ↑s = ⊤
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : (r : { x // x ∈ s }) → Algebra (Localization.Away ↑r) (Localization.Away (↑f ↑r)) :=
  fun r => RingHom.toAlgebra (Localization.awayMap f ↑r)
this✝ :
  ∀ (r : { x // x ∈ s }),
    IsLocalization (Submonoid.map (algebraMap R S) (Submonoid.powers ↑r)) (Localization.Away (↑f ↑r))
this : ∀ (r : { x // x ∈ s }), IsScalarTower R (Localization.Away ↑r) (Localization.Away (↑f ↑r))
H : ∀ (r : { x // x ∈ s }), Submodule.FG ⊤
⊢ Submodule.FG ⊤
[PROOFSTEP]
choose s₁ s₂ using H
[GOAL]
case out
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Finset R
hs : Ideal.span ↑s = ⊤
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : (r : { x // x ∈ s }) → Algebra (Localization.Away ↑r) (Localization.Away (↑f ↑r)) :=
  fun r => RingHom.toAlgebra (Localization.awayMap f ↑r)
this✝ :
  ∀ (r : { x // x ∈ s }),
    IsLocalization (Submonoid.map (algebraMap R S) (Submonoid.powers ↑r)) (Localization.Away (↑f ↑r))
this : ∀ (r : { x // x ∈ s }), IsScalarTower R (Localization.Away ↑r) (Localization.Away (↑f ↑r))
s₁ : (r : { x // x ∈ s }) → Finset (Localization.Away (↑f ↑r))
s₂ : ∀ (r : { x // x ∈ s }), Submodule.span (Localization.Away ↑r) ↑(s₁ r) = ⊤
⊢ Submodule.FG ⊤
[PROOFSTEP]
let sf := fun x : s => IsLocalization.finsetIntegerMultiple (Submonoid.powers (f x)) (s₁ x)
[GOAL]
case out
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Finset R
hs : Ideal.span ↑s = ⊤
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : (r : { x // x ∈ s }) → Algebra (Localization.Away ↑r) (Localization.Away (↑f ↑r)) :=
  fun r => RingHom.toAlgebra (Localization.awayMap f ↑r)
this✝ :
  ∀ (r : { x // x ∈ s }),
    IsLocalization (Submonoid.map (algebraMap R S) (Submonoid.powers ↑r)) (Localization.Away (↑f ↑r))
this : ∀ (r : { x // x ∈ s }), IsScalarTower R (Localization.Away ↑r) (Localization.Away (↑f ↑r))
s₁ : (r : { x // x ∈ s }) → Finset (Localization.Away (↑f ↑r))
s₂ : ∀ (r : { x // x ∈ s }), Submodule.span (Localization.Away ↑r) ↑(s₁ r) = ⊤
sf : (x : { x // x ∈ s }) → Finset ((fun x => S) ↑x) :=
  fun x => IsLocalization.finsetIntegerMultiple (Submonoid.powers (↑f ↑x)) (s₁ x)
⊢ Submodule.FG ⊤
[PROOFSTEP]
use s.attach.biUnion sf
[GOAL]
case h
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Finset R
hs : Ideal.span ↑s = ⊤
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : (r : { x // x ∈ s }) → Algebra (Localization.Away ↑r) (Localization.Away (↑f ↑r)) :=
  fun r => RingHom.toAlgebra (Localization.awayMap f ↑r)
this✝ :
  ∀ (r : { x // x ∈ s }),
    IsLocalization (Submonoid.map (algebraMap R S) (Submonoid.powers ↑r)) (Localization.Away (↑f ↑r))
this : ∀ (r : { x // x ∈ s }), IsScalarTower R (Localization.Away ↑r) (Localization.Away (↑f ↑r))
s₁ : (r : { x // x ∈ s }) → Finset (Localization.Away (↑f ↑r))
s₂ : ∀ (r : { x // x ∈ s }), Submodule.span (Localization.Away ↑r) ↑(s₁ r) = ⊤
sf : (x : { x // x ∈ s }) → Finset ((fun x => S) ↑x) :=
  fun x => IsLocalization.finsetIntegerMultiple (Submonoid.powers (↑f ↑x)) (s₁ x)
⊢ Submodule.span R ↑(Finset.biUnion (Finset.attach s) sf) = ⊤
[PROOFSTEP]
rw [Submodule.span_attach_biUnion, eq_top_iff]
  -- It suffices to show that `r ^ n • x ∈ span T` for each `r : s`, since `{ r ^ n }` spans `R`.
    -- This then follows from the fact that each `x : R` is a linear combination of the generating set
    -- of `Sᵣ`. By multiplying a sufficiently large power of `r`, we can cancel out the `r`s in the
    -- denominators of both the generating set and the coefficients.
[GOAL]
case h
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Finset R
hs : Ideal.span ↑s = ⊤
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : (r : { x // x ∈ s }) → Algebra (Localization.Away ↑r) (Localization.Away (↑f ↑r)) :=
  fun r => RingHom.toAlgebra (Localization.awayMap f ↑r)
this✝ :
  ∀ (r : { x // x ∈ s }),
    IsLocalization (Submonoid.map (algebraMap R S) (Submonoid.powers ↑r)) (Localization.Away (↑f ↑r))
this : ∀ (r : { x // x ∈ s }), IsScalarTower R (Localization.Away ↑r) (Localization.Away (↑f ↑r))
s₁ : (r : { x // x ∈ s }) → Finset (Localization.Away (↑f ↑r))
s₂ : ∀ (r : { x // x ∈ s }), Submodule.span (Localization.Away ↑r) ↑(s₁ r) = ⊤
sf : (x : { x // x ∈ s }) → Finset ((fun x => S) ↑x) :=
  fun x => IsLocalization.finsetIntegerMultiple (Submonoid.powers (↑f ↑x)) (s₁ x)
⊢ ⊤ ≤ ⨆ (x : { x // x ∈ s }), Submodule.span R ↑(sf x)
[PROOFSTEP]
rintro x -
[GOAL]
case h
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Finset R
hs : Ideal.span ↑s = ⊤
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : (r : { x // x ∈ s }) → Algebra (Localization.Away ↑r) (Localization.Away (↑f ↑r)) :=
  fun r => RingHom.toAlgebra (Localization.awayMap f ↑r)
this✝ :
  ∀ (r : { x // x ∈ s }),
    IsLocalization (Submonoid.map (algebraMap R S) (Submonoid.powers ↑r)) (Localization.Away (↑f ↑r))
this : ∀ (r : { x // x ∈ s }), IsScalarTower R (Localization.Away ↑r) (Localization.Away (↑f ↑r))
s₁ : (r : { x // x ∈ s }) → Finset (Localization.Away (↑f ↑r))
s₂ : ∀ (r : { x // x ∈ s }), Submodule.span (Localization.Away ↑r) ↑(s₁ r) = ⊤
sf : (x : { x // x ∈ s }) → Finset ((fun x => S) ↑x) :=
  fun x => IsLocalization.finsetIntegerMultiple (Submonoid.powers (↑f ↑x)) (s₁ x)
x : S
⊢ x ∈ ⨆ (x : { x // x ∈ s }), Submodule.span R ↑(sf x)
[PROOFSTEP]
apply Submodule.mem_of_span_eq_top_of_smul_pow_mem _ (s : Set R) hs _ _
[GOAL]
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Finset R
hs : Ideal.span ↑s = ⊤
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : (r : { x // x ∈ s }) → Algebra (Localization.Away ↑r) (Localization.Away (↑f ↑r)) :=
  fun r => RingHom.toAlgebra (Localization.awayMap f ↑r)
this✝ :
  ∀ (r : { x // x ∈ s }),
    IsLocalization (Submonoid.map (algebraMap R S) (Submonoid.powers ↑r)) (Localization.Away (↑f ↑r))
this : ∀ (r : { x // x ∈ s }), IsScalarTower R (Localization.Away ↑r) (Localization.Away (↑f ↑r))
s₁ : (r : { x // x ∈ s }) → Finset (Localization.Away (↑f ↑r))
s₂ : ∀ (r : { x // x ∈ s }), Submodule.span (Localization.Away ↑r) ↑(s₁ r) = ⊤
sf : (x : { x // x ∈ s }) → Finset ((fun x => S) ↑x) :=
  fun x => IsLocalization.finsetIntegerMultiple (Submonoid.powers (↑f ↑x)) (s₁ x)
x : S
⊢ ∀ (r : ↑↑s), ∃ n, ↑r ^ n • x ∈ ⨆ (x : { x // x ∈ s }), Submodule.span R ↑(sf x)
[PROOFSTEP]
intro r
[GOAL]
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Finset R
hs : Ideal.span ↑s = ⊤
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : (r : { x // x ∈ s }) → Algebra (Localization.Away ↑r) (Localization.Away (↑f ↑r)) :=
  fun r => RingHom.toAlgebra (Localization.awayMap f ↑r)
this✝ :
  ∀ (r : { x // x ∈ s }),
    IsLocalization (Submonoid.map (algebraMap R S) (Submonoid.powers ↑r)) (Localization.Away (↑f ↑r))
this : ∀ (r : { x // x ∈ s }), IsScalarTower R (Localization.Away ↑r) (Localization.Away (↑f ↑r))
s₁ : (r : { x // x ∈ s }) → Finset (Localization.Away (↑f ↑r))
s₂ : ∀ (r : { x // x ∈ s }), Submodule.span (Localization.Away ↑r) ↑(s₁ r) = ⊤
sf : (x : { x // x ∈ s }) → Finset ((fun x => S) ↑x) :=
  fun x => IsLocalization.finsetIntegerMultiple (Submonoid.powers (↑f ↑x)) (s₁ x)
x : S
r : ↑↑s
⊢ ∃ n, ↑r ^ n • x ∈ ⨆ (x : { x // x ∈ s }), Submodule.span R ↑(sf x)
[PROOFSTEP]
obtain ⟨⟨_, n₁, rfl⟩, hn₁⟩ :=
  multiple_mem_span_of_mem_localization_span (Submonoid.powers (r : R)) (Localization.Away (r : R))
    (s₁ r : Set (Localization.Away (f r))) (algebraMap S _ x) (by rw [s₂ r]; trivial)
[GOAL]
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Finset R
hs : Ideal.span ↑s = ⊤
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : (r : { x // x ∈ s }) → Algebra (Localization.Away ↑r) (Localization.Away (↑f ↑r)) :=
  fun r => RingHom.toAlgebra (Localization.awayMap f ↑r)
this✝ :
  ∀ (r : { x // x ∈ s }),
    IsLocalization (Submonoid.map (algebraMap R S) (Submonoid.powers ↑r)) (Localization.Away (↑f ↑r))
this : ∀ (r : { x // x ∈ s }), IsScalarTower R (Localization.Away ↑r) (Localization.Away (↑f ↑r))
s₁ : (r : { x // x ∈ s }) → Finset (Localization.Away (↑f ↑r))
s₂ : ∀ (r : { x // x ∈ s }), Submodule.span (Localization.Away ↑r) ↑(s₁ r) = ⊤
sf : (x : { x // x ∈ s }) → Finset ((fun x => S) ↑x) :=
  fun x => IsLocalization.finsetIntegerMultiple (Submonoid.powers (↑f ↑x)) (s₁ x)
x : S
r : ↑↑s
⊢ ↑(algebraMap S (Localization.Away (↑f ↑r))) x ∈ Submodule.span (Localization.Away ↑r) ↑(s₁ r)
[PROOFSTEP]
rw [s₂ r]
[GOAL]
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Finset R
hs : Ideal.span ↑s = ⊤
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : (r : { x // x ∈ s }) → Algebra (Localization.Away ↑r) (Localization.Away (↑f ↑r)) :=
  fun r => RingHom.toAlgebra (Localization.awayMap f ↑r)
this✝ :
  ∀ (r : { x // x ∈ s }),
    IsLocalization (Submonoid.map (algebraMap R S) (Submonoid.powers ↑r)) (Localization.Away (↑f ↑r))
this : ∀ (r : { x // x ∈ s }), IsScalarTower R (Localization.Away ↑r) (Localization.Away (↑f ↑r))
s₁ : (r : { x // x ∈ s }) → Finset (Localization.Away (↑f ↑r))
s₂ : ∀ (r : { x // x ∈ s }), Submodule.span (Localization.Away ↑r) ↑(s₁ r) = ⊤
sf : (x : { x // x ∈ s }) → Finset ((fun x => S) ↑x) :=
  fun x => IsLocalization.finsetIntegerMultiple (Submonoid.powers (↑f ↑x)) (s₁ x)
x : S
r : ↑↑s
⊢ ↑(algebraMap S (Localization.Away (↑f ↑r))) x ∈ ⊤
[PROOFSTEP]
trivial
[GOAL]
case intro.mk.intro
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Finset R
hs : Ideal.span ↑s = ⊤
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : (r : { x // x ∈ s }) → Algebra (Localization.Away ↑r) (Localization.Away (↑f ↑r)) :=
  fun r => RingHom.toAlgebra (Localization.awayMap f ↑r)
this✝ :
  ∀ (r : { x // x ∈ s }),
    IsLocalization (Submonoid.map (algebraMap R S) (Submonoid.powers ↑r)) (Localization.Away (↑f ↑r))
this : ∀ (r : { x // x ∈ s }), IsScalarTower R (Localization.Away ↑r) (Localization.Away (↑f ↑r))
s₁ : (r : { x // x ∈ s }) → Finset (Localization.Away (↑f ↑r))
s₂ : ∀ (r : { x // x ∈ s }), Submodule.span (Localization.Away ↑r) ↑(s₁ r) = ⊤
sf : (x : { x // x ∈ s }) → Finset ((fun x => S) ↑x) :=
  fun x => IsLocalization.finsetIntegerMultiple (Submonoid.powers (↑f ↑x)) (s₁ x)
x : S
r : ↑↑s
n₁ : ℕ
hn₁ :
  { val := (fun x x_1 => x ^ x_1) (↑r) n₁,
        property := (_ : ∃ y, (fun x x_1 => x ^ x_1) (↑r) y = (fun x x_1 => x ^ x_1) (↑r) n₁) } •
      ↑(algebraMap S (Localization.Away (↑f ↑r))) x ∈
    Submodule.span R ↑(s₁ r)
⊢ ∃ n, ↑r ^ n • x ∈ ⨆ (x : { x // x ∈ s }), Submodule.span R ↑(sf x)
[PROOFSTEP]
dsimp only at hn₁
[GOAL]
case intro.mk.intro
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Finset R
hs : Ideal.span ↑s = ⊤
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : (r : { x // x ∈ s }) → Algebra (Localization.Away ↑r) (Localization.Away (↑f ↑r)) :=
  fun r => RingHom.toAlgebra (Localization.awayMap f ↑r)
this✝ :
  ∀ (r : { x // x ∈ s }),
    IsLocalization (Submonoid.map (algebraMap R S) (Submonoid.powers ↑r)) (Localization.Away (↑f ↑r))
this : ∀ (r : { x // x ∈ s }), IsScalarTower R (Localization.Away ↑r) (Localization.Away (↑f ↑r))
s₁ : (r : { x // x ∈ s }) → Finset (Localization.Away (↑f ↑r))
s₂ : ∀ (r : { x // x ∈ s }), Submodule.span (Localization.Away ↑r) ↑(s₁ r) = ⊤
sf : (x : { x // x ∈ s }) → Finset ((fun x => S) ↑x) :=
  fun x => IsLocalization.finsetIntegerMultiple (Submonoid.powers (↑f ↑x)) (s₁ x)
x : S
r : ↑↑s
n₁ : ℕ
hn₁ :
  { val := ↑r ^ n₁, property := (_ : ∃ y, ↑r ^ y = ↑r ^ n₁) } • ↑(algebraMap S (Localization.Away (↑f ↑r))) x ∈
    Submodule.span R ↑(s₁ r)
⊢ ∃ n, ↑r ^ n • x ∈ ⨆ (x : { x // x ∈ s }), Submodule.span R ↑(sf x)
[PROOFSTEP]
rw [Submonoid.smul_def, Algebra.smul_def, IsScalarTower.algebraMap_apply R S, ← map_mul] at hn₁
[GOAL]
case intro.mk.intro
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Finset R
hs : Ideal.span ↑s = ⊤
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : (r : { x // x ∈ s }) → Algebra (Localization.Away ↑r) (Localization.Away (↑f ↑r)) :=
  fun r => RingHom.toAlgebra (Localization.awayMap f ↑r)
this✝ :
  ∀ (r : { x // x ∈ s }),
    IsLocalization (Submonoid.map (algebraMap R S) (Submonoid.powers ↑r)) (Localization.Away (↑f ↑r))
this : ∀ (r : { x // x ∈ s }), IsScalarTower R (Localization.Away ↑r) (Localization.Away (↑f ↑r))
s₁ : (r : { x // x ∈ s }) → Finset (Localization.Away (↑f ↑r))
s₂ : ∀ (r : { x // x ∈ s }), Submodule.span (Localization.Away ↑r) ↑(s₁ r) = ⊤
sf : (x : { x // x ∈ s }) → Finset ((fun x => S) ↑x) :=
  fun x => IsLocalization.finsetIntegerMultiple (Submonoid.powers (↑f ↑x)) (s₁ x)
x : S
r : ↑↑s
n₁ : ℕ
hn₁ :
  ↑(algebraMap S (Localization.Away (↑f ↑r)))
      (↑(algebraMap R S) ↑{ val := ↑r ^ n₁, property := (_ : ∃ y, ↑r ^ y = ↑r ^ n₁) } * x) ∈
    Submodule.span R ↑(s₁ r)
⊢ ∃ n, ↑r ^ n • x ∈ ⨆ (x : { x // x ∈ s }), Submodule.span R ↑(sf x)
[PROOFSTEP]
obtain ⟨⟨_, n₂, rfl⟩, hn₂⟩ :=
  IsLocalization.smul_mem_finsetIntegerMultiple_span (Submonoid.powers (r : R)) (Localization.Away (f r)) _ (s₁ r) hn₁
[GOAL]
case intro.mk.intro.intro.mk.intro
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Finset R
hs : Ideal.span ↑s = ⊤
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : (r : { x // x ∈ s }) → Algebra (Localization.Away ↑r) (Localization.Away (↑f ↑r)) :=
  fun r => RingHom.toAlgebra (Localization.awayMap f ↑r)
this✝ :
  ∀ (r : { x // x ∈ s }),
    IsLocalization (Submonoid.map (algebraMap R S) (Submonoid.powers ↑r)) (Localization.Away (↑f ↑r))
this : ∀ (r : { x // x ∈ s }), IsScalarTower R (Localization.Away ↑r) (Localization.Away (↑f ↑r))
s₁ : (r : { x // x ∈ s }) → Finset (Localization.Away (↑f ↑r))
s₂ : ∀ (r : { x // x ∈ s }), Submodule.span (Localization.Away ↑r) ↑(s₁ r) = ⊤
sf : (x : { x // x ∈ s }) → Finset ((fun x => S) ↑x) :=
  fun x => IsLocalization.finsetIntegerMultiple (Submonoid.powers (↑f ↑x)) (s₁ x)
x : S
r : ↑↑s
n₁ : ℕ
hn₁ :
  ↑(algebraMap S (Localization.Away (↑f ↑r)))
      (↑(algebraMap R S) ↑{ val := ↑r ^ n₁, property := (_ : ∃ y, ↑r ^ y = ↑r ^ n₁) } * x) ∈
    Submodule.span R ↑(s₁ r)
n₂ : ℕ
hn₂ :
  { val := (fun x x_1 => x ^ x_1) (↑r) n₂,
        property := (_ : ∃ y, (fun x x_1 => x ^ x_1) (↑r) y = (fun x x_1 => x ^ x_1) (↑r) n₂) } •
      (↑(algebraMap R S) ↑{ val := ↑r ^ n₁, property := (_ : ∃ y, ↑r ^ y = ↑r ^ n₁) } * x) ∈
    Submodule.span R
      ↑(IsLocalization.finsetIntegerMultiple (Submonoid.map (algebraMap R S) (Submonoid.powers ↑r)) (s₁ r))
⊢ ∃ n, ↑r ^ n • x ∈ ⨆ (x : { x // x ∈ s }), Submodule.span R ↑(sf x)
[PROOFSTEP]
rw [Submonoid.smul_def, ← Algebra.smul_def, smul_smul, Subtype.coe_mk, ← pow_add] at hn₂
[GOAL]
case intro.mk.intro.intro.mk.intro
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Finset R
hs : Ideal.span ↑s = ⊤
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : (r : { x // x ∈ s }) → Algebra (Localization.Away ↑r) (Localization.Away (↑f ↑r)) :=
  fun r => RingHom.toAlgebra (Localization.awayMap f ↑r)
this✝ :
  ∀ (r : { x // x ∈ s }),
    IsLocalization (Submonoid.map (algebraMap R S) (Submonoid.powers ↑r)) (Localization.Away (↑f ↑r))
this : ∀ (r : { x // x ∈ s }), IsScalarTower R (Localization.Away ↑r) (Localization.Away (↑f ↑r))
s₁ : (r : { x // x ∈ s }) → Finset (Localization.Away (↑f ↑r))
s₂ : ∀ (r : { x // x ∈ s }), Submodule.span (Localization.Away ↑r) ↑(s₁ r) = ⊤
sf : (x : { x // x ∈ s }) → Finset ((fun x => S) ↑x) :=
  fun x => IsLocalization.finsetIntegerMultiple (Submonoid.powers (↑f ↑x)) (s₁ x)
x : S
r : ↑↑s
n₁ : ℕ
hn₁ :
  ↑(algebraMap S (Localization.Away (↑f ↑r)))
      (↑(algebraMap R S) ↑{ val := ↑r ^ n₁, property := (_ : ∃ y, ↑r ^ y = ↑r ^ n₁) } * x) ∈
    Submodule.span R ↑(s₁ r)
n₂ : ℕ
hn₂ :
  ↑r ^ (n₂ + n₁) • x ∈
    Submodule.span R
      ↑(IsLocalization.finsetIntegerMultiple (Submonoid.map (algebraMap R S) (Submonoid.powers ↑r)) (s₁ r))
⊢ ∃ n, ↑r ^ n • x ∈ ⨆ (x : { x // x ∈ s }), Submodule.span R ↑(sf x)
[PROOFSTEP]
simp_rw [Submonoid.map_powers] at hn₂
[GOAL]
case intro.mk.intro.intro.mk.intro
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Finset R
hs : Ideal.span ↑s = ⊤
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : (r : { x // x ∈ s }) → Algebra (Localization.Away ↑r) (Localization.Away (↑f ↑r)) :=
  fun r => RingHom.toAlgebra (Localization.awayMap f ↑r)
this✝ :
  ∀ (r : { x // x ∈ s }),
    IsLocalization (Submonoid.map (algebraMap R S) (Submonoid.powers ↑r)) (Localization.Away (↑f ↑r))
this : ∀ (r : { x // x ∈ s }), IsScalarTower R (Localization.Away ↑r) (Localization.Away (↑f ↑r))
s₁ : (r : { x // x ∈ s }) → Finset (Localization.Away (↑f ↑r))
s₂ : ∀ (r : { x // x ∈ s }), Submodule.span (Localization.Away ↑r) ↑(s₁ r) = ⊤
sf : (x : { x // x ∈ s }) → Finset ((fun x => S) ↑x) :=
  fun x => IsLocalization.finsetIntegerMultiple (Submonoid.powers (↑f ↑x)) (s₁ x)
x : S
r : ↑↑s
n₁ : ℕ
hn₁ :
  ↑(algebraMap S (Localization.Away (↑f ↑r)))
      (↑(algebraMap R S) ↑{ val := ↑r ^ n₁, property := (_ : ∃ y, ↑r ^ y = ↑r ^ n₁) } * x) ∈
    Submodule.span R ↑(s₁ r)
n₂ : ℕ
hn₂ :
  ↑r ^ (n₂ + n₁) • x ∈
    Submodule.span R ↑(IsLocalization.finsetIntegerMultiple (Submonoid.powers (↑(algebraMap R S) ↑r)) (s₁ r))
⊢ ∃ n, ↑r ^ n • x ∈ ⨆ (x : { x // x ∈ s }), Submodule.span R ↑(sf x)
[PROOFSTEP]
use n₂ + n₁
[GOAL]
case h
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Finset R
hs : Ideal.span ↑s = ⊤
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : (r : { x // x ∈ s }) → Algebra (Localization.Away ↑r) (Localization.Away (↑f ↑r)) :=
  fun r => RingHom.toAlgebra (Localization.awayMap f ↑r)
this✝ :
  ∀ (r : { x // x ∈ s }),
    IsLocalization (Submonoid.map (algebraMap R S) (Submonoid.powers ↑r)) (Localization.Away (↑f ↑r))
this : ∀ (r : { x // x ∈ s }), IsScalarTower R (Localization.Away ↑r) (Localization.Away (↑f ↑r))
s₁ : (r : { x // x ∈ s }) → Finset (Localization.Away (↑f ↑r))
s₂ : ∀ (r : { x // x ∈ s }), Submodule.span (Localization.Away ↑r) ↑(s₁ r) = ⊤
sf : (x : { x // x ∈ s }) → Finset ((fun x => S) ↑x) :=
  fun x => IsLocalization.finsetIntegerMultiple (Submonoid.powers (↑f ↑x)) (s₁ x)
x : S
r : ↑↑s
n₁ : ℕ
hn₁ :
  ↑(algebraMap S (Localization.Away (↑f ↑r)))
      (↑(algebraMap R S) ↑{ val := ↑r ^ n₁, property := (_ : ∃ y, ↑r ^ y = ↑r ^ n₁) } * x) ∈
    Submodule.span R ↑(s₁ r)
n₂ : ℕ
hn₂ :
  ↑r ^ (n₂ + n₁) • x ∈
    Submodule.span R ↑(IsLocalization.finsetIntegerMultiple (Submonoid.powers (↑(algebraMap R S) ↑r)) (s₁ r))
⊢ ↑r ^ (n₂ + n₁) • x ∈ ⨆ (x : { x // x ∈ s }), Submodule.span R ↑(sf x)
[PROOFSTEP]
exact le_iSup (fun x : s => Submodule.span R (sf x : Set S)) r hn₂
[GOAL]
R S : Type u
inst✝⁵ : CommRing R
inst✝⁴ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝³ : CommRing R'
inst✝² : CommRing S'
f : R →+* S
inst✝¹ : Algebra R R'
inst✝ : Algebra S S'
⊢ RingHom.LocalizationPreserves @RingHom.FiniteType
[PROOFSTEP]
introv R hf
[GOAL]
R✝ S✝ : Type u
inst✝¹³ : CommRing R✝
inst✝¹² : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R'✝ S'✝ : Type u
inst✝¹¹ : CommRing R'✝
inst✝¹⁰ : CommRing S'✝
f✝ : R✝ →+* S✝
inst✝⁹ : Algebra R✝ R'✝
inst✝⁸ : Algebra S✝ S'✝
R S : Type u_1
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
M : Submonoid R
R' S' : Type u_1
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
inst✝³ : Algebra R R'
inst✝² : Algebra S S'
inst✝¹ : IsLocalization M R'
inst✝ : IsLocalization (Submonoid.map f M) S'
hf : RingHom.FiniteType f
⊢ RingHom.FiniteType (IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M)))
[PROOFSTEP]
letI := f.toAlgebra
[GOAL]
R✝ S✝ : Type u
inst✝¹³ : CommRing R✝
inst✝¹² : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R'✝ S'✝ : Type u
inst✝¹¹ : CommRing R'✝
inst✝¹⁰ : CommRing S'✝
f✝ : R✝ →+* S✝
inst✝⁹ : Algebra R✝ R'✝
inst✝⁸ : Algebra S✝ S'✝
R S : Type u_1
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
M : Submonoid R
R' S' : Type u_1
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
inst✝³ : Algebra R R'
inst✝² : Algebra S S'
inst✝¹ : IsLocalization M R'
inst✝ : IsLocalization (Submonoid.map f M) S'
hf : RingHom.FiniteType f
this : Algebra R S := RingHom.toAlgebra f
⊢ RingHom.FiniteType (IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M)))
[PROOFSTEP]
letI := ((algebraMap S S').comp f).toAlgebra
[GOAL]
R✝ S✝ : Type u
inst✝¹³ : CommRing R✝
inst✝¹² : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R'✝ S'✝ : Type u
inst✝¹¹ : CommRing R'✝
inst✝¹⁰ : CommRing S'✝
f✝ : R✝ →+* S✝
inst✝⁹ : Algebra R✝ R'✝
inst✝⁸ : Algebra S✝ S'✝
R S : Type u_1
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
M : Submonoid R
R' S' : Type u_1
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
inst✝³ : Algebra R R'
inst✝² : Algebra S S'
inst✝¹ : IsLocalization M R'
inst✝ : IsLocalization (Submonoid.map f M) S'
hf : RingHom.FiniteType f
this✝ : Algebra R S := RingHom.toAlgebra f
this : Algebra R S' := RingHom.toAlgebra (RingHom.comp (algebraMap S S') f)
⊢ RingHom.FiniteType (IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M)))
[PROOFSTEP]
let f' : R' →+* S' := IsLocalization.map S' f (Submonoid.le_comap_map M)
[GOAL]
R✝ S✝ : Type u
inst✝¹³ : CommRing R✝
inst✝¹² : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R'✝ S'✝ : Type u
inst✝¹¹ : CommRing R'✝
inst✝¹⁰ : CommRing S'✝
f✝ : R✝ →+* S✝
inst✝⁹ : Algebra R✝ R'✝
inst✝⁸ : Algebra S✝ S'✝
R S : Type u_1
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
M : Submonoid R
R' S' : Type u_1
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
inst✝³ : Algebra R R'
inst✝² : Algebra S S'
inst✝¹ : IsLocalization M R'
inst✝ : IsLocalization (Submonoid.map f M) S'
hf : RingHom.FiniteType f
this✝ : Algebra R S := RingHom.toAlgebra f
this : Algebra R S' := RingHom.toAlgebra (RingHom.comp (algebraMap S S') f)
f' : R' →+* S' := IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M))
⊢ RingHom.FiniteType (IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M)))
[PROOFSTEP]
letI := f'.toAlgebra
[GOAL]
R✝ S✝ : Type u
inst✝¹³ : CommRing R✝
inst✝¹² : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R'✝ S'✝ : Type u
inst✝¹¹ : CommRing R'✝
inst✝¹⁰ : CommRing S'✝
f✝ : R✝ →+* S✝
inst✝⁹ : Algebra R✝ R'✝
inst✝⁸ : Algebra S✝ S'✝
R S : Type u_1
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
M : Submonoid R
R' S' : Type u_1
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
inst✝³ : Algebra R R'
inst✝² : Algebra S S'
inst✝¹ : IsLocalization M R'
inst✝ : IsLocalization (Submonoid.map f M) S'
hf : RingHom.FiniteType f
this✝¹ : Algebra R S := RingHom.toAlgebra f
this✝ : Algebra R S' := RingHom.toAlgebra (RingHom.comp (algebraMap S S') f)
f' : R' →+* S' := IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M))
this : Algebra R' S' := RingHom.toAlgebra f'
⊢ RingHom.FiniteType (IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M)))
[PROOFSTEP]
haveI : IsScalarTower R R' S' := IsScalarTower.of_algebraMap_eq' (IsLocalization.map_comp M.le_comap_map).symm
[GOAL]
R✝ S✝ : Type u
inst✝¹³ : CommRing R✝
inst✝¹² : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R'✝ S'✝ : Type u
inst✝¹¹ : CommRing R'✝
inst✝¹⁰ : CommRing S'✝
f✝ : R✝ →+* S✝
inst✝⁹ : Algebra R✝ R'✝
inst✝⁸ : Algebra S✝ S'✝
R S : Type u_1
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
M : Submonoid R
R' S' : Type u_1
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
inst✝³ : Algebra R R'
inst✝² : Algebra S S'
inst✝¹ : IsLocalization M R'
inst✝ : IsLocalization (Submonoid.map f M) S'
hf : RingHom.FiniteType f
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : Algebra R S' := RingHom.toAlgebra (RingHom.comp (algebraMap S S') f)
f' : R' →+* S' := IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M))
this✝ : Algebra R' S' := RingHom.toAlgebra f'
this : IsScalarTower R R' S'
⊢ RingHom.FiniteType (IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M)))
[PROOFSTEP]
let fₐ : S →ₐ[R] S' := AlgHom.mk' (algebraMap S S') fun c x => RingHom.map_mul _ _ _
[GOAL]
R✝ S✝ : Type u
inst✝¹³ : CommRing R✝
inst✝¹² : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R'✝ S'✝ : Type u
inst✝¹¹ : CommRing R'✝
inst✝¹⁰ : CommRing S'✝
f✝ : R✝ →+* S✝
inst✝⁹ : Algebra R✝ R'✝
inst✝⁸ : Algebra S✝ S'✝
R S : Type u_1
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
M : Submonoid R
R' S' : Type u_1
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
inst✝³ : Algebra R R'
inst✝² : Algebra S S'
inst✝¹ : IsLocalization M R'
inst✝ : IsLocalization (Submonoid.map f M) S'
hf : RingHom.FiniteType f
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : Algebra R S' := RingHom.toAlgebra (RingHom.comp (algebraMap S S') f)
f' : R' →+* S' := IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M))
this✝ : Algebra R' S' := RingHom.toAlgebra f'
this : IsScalarTower R R' S'
fₐ : S →ₐ[R] S' :=
  AlgHom.mk' (algebraMap S S')
    (_ : ∀ (c : R) (x : S), ↑(algebraMap S S') (↑f c * x) = ↑(algebraMap S S') (↑f c) * ↑(algebraMap S S') x)
⊢ RingHom.FiniteType (IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M)))
[PROOFSTEP]
obtain ⟨T, hT⟩ := id hf
[GOAL]
case mk.intro
R✝ S✝ : Type u
inst✝¹³ : CommRing R✝
inst✝¹² : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R'✝ S'✝ : Type u
inst✝¹¹ : CommRing R'✝
inst✝¹⁰ : CommRing S'✝
f✝ : R✝ →+* S✝
inst✝⁹ : Algebra R✝ R'✝
inst✝⁸ : Algebra S✝ S'✝
R S : Type u_1
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
M : Submonoid R
R' S' : Type u_1
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
inst✝³ : Algebra R R'
inst✝² : Algebra S S'
inst✝¹ : IsLocalization M R'
inst✝ : IsLocalization (Submonoid.map f M) S'
hf : RingHom.FiniteType f
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : Algebra R S' := RingHom.toAlgebra (RingHom.comp (algebraMap S S') f)
f' : R' →+* S' := IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M))
this✝ : Algebra R' S' := RingHom.toAlgebra f'
this : IsScalarTower R R' S'
fₐ : S →ₐ[R] S' :=
  AlgHom.mk' (algebraMap S S')
    (_ : ∀ (c : R) (x : S), ↑(algebraMap S S') (↑f c * x) = ↑(algebraMap S S') (↑f c) * ↑(algebraMap S S') x)
T : Finset S
hT : Algebra.adjoin R ↑T = ⊤
⊢ RingHom.FiniteType (IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M)))
[PROOFSTEP]
use T.image (algebraMap S S')
[GOAL]
case h
R✝ S✝ : Type u
inst✝¹³ : CommRing R✝
inst✝¹² : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R'✝ S'✝ : Type u
inst✝¹¹ : CommRing R'✝
inst✝¹⁰ : CommRing S'✝
f✝ : R✝ →+* S✝
inst✝⁹ : Algebra R✝ R'✝
inst✝⁸ : Algebra S✝ S'✝
R S : Type u_1
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
M : Submonoid R
R' S' : Type u_1
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
inst✝³ : Algebra R R'
inst✝² : Algebra S S'
inst✝¹ : IsLocalization M R'
inst✝ : IsLocalization (Submonoid.map f M) S'
hf : RingHom.FiniteType f
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : Algebra R S' := RingHom.toAlgebra (RingHom.comp (algebraMap S S') f)
f' : R' →+* S' := IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M))
this✝ : Algebra R' S' := RingHom.toAlgebra f'
this : IsScalarTower R R' S'
fₐ : S →ₐ[R] S' :=
  AlgHom.mk' (algebraMap S S')
    (_ : ∀ (c : R) (x : S), ↑(algebraMap S S') (↑f c * x) = ↑(algebraMap S S') (↑f c) * ↑(algebraMap S S') x)
T : Finset S
hT : Algebra.adjoin R ↑T = ⊤
⊢ Algebra.adjoin R' ↑(Finset.image (↑(algebraMap S S')) T) = ⊤
[PROOFSTEP]
rw [eq_top_iff]
[GOAL]
case h
R✝ S✝ : Type u
inst✝¹³ : CommRing R✝
inst✝¹² : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R'✝ S'✝ : Type u
inst✝¹¹ : CommRing R'✝
inst✝¹⁰ : CommRing S'✝
f✝ : R✝ →+* S✝
inst✝⁹ : Algebra R✝ R'✝
inst✝⁸ : Algebra S✝ S'✝
R S : Type u_1
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
M : Submonoid R
R' S' : Type u_1
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
inst✝³ : Algebra R R'
inst✝² : Algebra S S'
inst✝¹ : IsLocalization M R'
inst✝ : IsLocalization (Submonoid.map f M) S'
hf : RingHom.FiniteType f
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : Algebra R S' := RingHom.toAlgebra (RingHom.comp (algebraMap S S') f)
f' : R' →+* S' := IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M))
this✝ : Algebra R' S' := RingHom.toAlgebra f'
this : IsScalarTower R R' S'
fₐ : S →ₐ[R] S' :=
  AlgHom.mk' (algebraMap S S')
    (_ : ∀ (c : R) (x : S), ↑(algebraMap S S') (↑f c * x) = ↑(algebraMap S S') (↑f c) * ↑(algebraMap S S') x)
T : Finset S
hT : Algebra.adjoin R ↑T = ⊤
⊢ ⊤ ≤ Algebra.adjoin R' ↑(Finset.image (↑(algebraMap S S')) T)
[PROOFSTEP]
rintro x -
[GOAL]
case h
R✝ S✝ : Type u
inst✝¹³ : CommRing R✝
inst✝¹² : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R'✝ S'✝ : Type u
inst✝¹¹ : CommRing R'✝
inst✝¹⁰ : CommRing S'✝
f✝ : R✝ →+* S✝
inst✝⁹ : Algebra R✝ R'✝
inst✝⁸ : Algebra S✝ S'✝
R S : Type u_1
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
M : Submonoid R
R' S' : Type u_1
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
inst✝³ : Algebra R R'
inst✝² : Algebra S S'
inst✝¹ : IsLocalization M R'
inst✝ : IsLocalization (Submonoid.map f M) S'
hf : RingHom.FiniteType f
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : Algebra R S' := RingHom.toAlgebra (RingHom.comp (algebraMap S S') f)
f' : R' →+* S' := IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M))
this✝ : Algebra R' S' := RingHom.toAlgebra f'
this : IsScalarTower R R' S'
fₐ : S →ₐ[R] S' :=
  AlgHom.mk' (algebraMap S S')
    (_ : ∀ (c : R) (x : S), ↑(algebraMap S S') (↑f c * x) = ↑(algebraMap S S') (↑f c) * ↑(algebraMap S S') x)
T : Finset S
hT : Algebra.adjoin R ↑T = ⊤
x : S'
⊢ x ∈ Algebra.adjoin R' ↑(Finset.image (↑(algebraMap S S')) T)
[PROOFSTEP]
obtain ⟨y, ⟨_, ⟨r, hr, rfl⟩⟩, rfl⟩ := IsLocalization.mk'_surjective (M.map f) x
[GOAL]
case h.intro.intro.mk.intro.intro
R✝ S✝ : Type u
inst✝¹³ : CommRing R✝
inst✝¹² : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R'✝ S'✝ : Type u
inst✝¹¹ : CommRing R'✝
inst✝¹⁰ : CommRing S'✝
f✝ : R✝ →+* S✝
inst✝⁹ : Algebra R✝ R'✝
inst✝⁸ : Algebra S✝ S'✝
R S : Type u_1
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
M : Submonoid R
R' S' : Type u_1
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
inst✝³ : Algebra R R'
inst✝² : Algebra S S'
inst✝¹ : IsLocalization M R'
inst✝ : IsLocalization (Submonoid.map f M) S'
hf : RingHom.FiniteType f
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : Algebra R S' := RingHom.toAlgebra (RingHom.comp (algebraMap S S') f)
f' : R' →+* S' := IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M))
this✝ : Algebra R' S' := RingHom.toAlgebra f'
this : IsScalarTower R R' S'
fₐ : S →ₐ[R] S' :=
  AlgHom.mk' (algebraMap S S')
    (_ : ∀ (c : R) (x : S), ↑(algebraMap S S') (↑f c * x) = ↑(algebraMap S S') (↑f c) * ↑(algebraMap S S') x)
T : Finset S
hT : Algebra.adjoin R ↑T = ⊤
y : S
r : R
hr : r ∈ ↑M
⊢ IsLocalization.mk' S' y { val := ↑f r, property := (_ : ∃ a, a ∈ ↑M ∧ ↑f a = ↑f r) } ∈
    Algebra.adjoin R' ↑(Finset.image (↑(algebraMap S S')) T)
[PROOFSTEP]
rw [IsLocalization.mk'_eq_mul_mk'_one, mul_comm, Finset.coe_image]
[GOAL]
case h.intro.intro.mk.intro.intro
R✝ S✝ : Type u
inst✝¹³ : CommRing R✝
inst✝¹² : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R'✝ S'✝ : Type u
inst✝¹¹ : CommRing R'✝
inst✝¹⁰ : CommRing S'✝
f✝ : R✝ →+* S✝
inst✝⁹ : Algebra R✝ R'✝
inst✝⁸ : Algebra S✝ S'✝
R S : Type u_1
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
M : Submonoid R
R' S' : Type u_1
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
inst✝³ : Algebra R R'
inst✝² : Algebra S S'
inst✝¹ : IsLocalization M R'
inst✝ : IsLocalization (Submonoid.map f M) S'
hf : RingHom.FiniteType f
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : Algebra R S' := RingHom.toAlgebra (RingHom.comp (algebraMap S S') f)
f' : R' →+* S' := IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M))
this✝ : Algebra R' S' := RingHom.toAlgebra f'
this : IsScalarTower R R' S'
fₐ : S →ₐ[R] S' :=
  AlgHom.mk' (algebraMap S S')
    (_ : ∀ (c : R) (x : S), ↑(algebraMap S S') (↑f c * x) = ↑(algebraMap S S') (↑f c) * ↑(algebraMap S S') x)
T : Finset S
hT : Algebra.adjoin R ↑T = ⊤
y : S
r : R
hr : r ∈ ↑M
⊢ IsLocalization.mk' S' 1 { val := ↑f r, property := (_ : ∃ a, a ∈ ↑M ∧ ↑f a = ↑f r) } * ↑(algebraMap S S') y ∈
    Algebra.adjoin R' (↑(algebraMap S S') '' ↑T)
[PROOFSTEP]
have hy : y ∈ Algebra.adjoin R (T : Set S) := by rw [hT]; trivial
[GOAL]
R✝ S✝ : Type u
inst✝¹³ : CommRing R✝
inst✝¹² : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R'✝ S'✝ : Type u
inst✝¹¹ : CommRing R'✝
inst✝¹⁰ : CommRing S'✝
f✝ : R✝ →+* S✝
inst✝⁹ : Algebra R✝ R'✝
inst✝⁸ : Algebra S✝ S'✝
R S : Type u_1
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
M : Submonoid R
R' S' : Type u_1
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
inst✝³ : Algebra R R'
inst✝² : Algebra S S'
inst✝¹ : IsLocalization M R'
inst✝ : IsLocalization (Submonoid.map f M) S'
hf : RingHom.FiniteType f
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : Algebra R S' := RingHom.toAlgebra (RingHom.comp (algebraMap S S') f)
f' : R' →+* S' := IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M))
this✝ : Algebra R' S' := RingHom.toAlgebra f'
this : IsScalarTower R R' S'
fₐ : S →ₐ[R] S' :=
  AlgHom.mk' (algebraMap S S')
    (_ : ∀ (c : R) (x : S), ↑(algebraMap S S') (↑f c * x) = ↑(algebraMap S S') (↑f c) * ↑(algebraMap S S') x)
T : Finset S
hT : Algebra.adjoin R ↑T = ⊤
y : S
r : R
hr : r ∈ ↑M
⊢ y ∈ Algebra.adjoin R ↑T
[PROOFSTEP]
rw [hT]
[GOAL]
R✝ S✝ : Type u
inst✝¹³ : CommRing R✝
inst✝¹² : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R'✝ S'✝ : Type u
inst✝¹¹ : CommRing R'✝
inst✝¹⁰ : CommRing S'✝
f✝ : R✝ →+* S✝
inst✝⁹ : Algebra R✝ R'✝
inst✝⁸ : Algebra S✝ S'✝
R S : Type u_1
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
M : Submonoid R
R' S' : Type u_1
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
inst✝³ : Algebra R R'
inst✝² : Algebra S S'
inst✝¹ : IsLocalization M R'
inst✝ : IsLocalization (Submonoid.map f M) S'
hf : RingHom.FiniteType f
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : Algebra R S' := RingHom.toAlgebra (RingHom.comp (algebraMap S S') f)
f' : R' →+* S' := IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M))
this✝ : Algebra R' S' := RingHom.toAlgebra f'
this : IsScalarTower R R' S'
fₐ : S →ₐ[R] S' :=
  AlgHom.mk' (algebraMap S S')
    (_ : ∀ (c : R) (x : S), ↑(algebraMap S S') (↑f c * x) = ↑(algebraMap S S') (↑f c) * ↑(algebraMap S S') x)
T : Finset S
hT : Algebra.adjoin R ↑T = ⊤
y : S
r : R
hr : r ∈ ↑M
⊢ y ∈ ⊤
[PROOFSTEP]
trivial
[GOAL]
case h.intro.intro.mk.intro.intro
R✝ S✝ : Type u
inst✝¹³ : CommRing R✝
inst✝¹² : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R'✝ S'✝ : Type u
inst✝¹¹ : CommRing R'✝
inst✝¹⁰ : CommRing S'✝
f✝ : R✝ →+* S✝
inst✝⁹ : Algebra R✝ R'✝
inst✝⁸ : Algebra S✝ S'✝
R S : Type u_1
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
M : Submonoid R
R' S' : Type u_1
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
inst✝³ : Algebra R R'
inst✝² : Algebra S S'
inst✝¹ : IsLocalization M R'
inst✝ : IsLocalization (Submonoid.map f M) S'
hf : RingHom.FiniteType f
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : Algebra R S' := RingHom.toAlgebra (RingHom.comp (algebraMap S S') f)
f' : R' →+* S' := IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M))
this✝ : Algebra R' S' := RingHom.toAlgebra f'
this : IsScalarTower R R' S'
fₐ : S →ₐ[R] S' :=
  AlgHom.mk' (algebraMap S S')
    (_ : ∀ (c : R) (x : S), ↑(algebraMap S S') (↑f c * x) = ↑(algebraMap S S') (↑f c) * ↑(algebraMap S S') x)
T : Finset S
hT : Algebra.adjoin R ↑T = ⊤
y : S
r : R
hr : r ∈ ↑M
hy : y ∈ Algebra.adjoin R ↑T
⊢ IsLocalization.mk' S' 1 { val := ↑f r, property := (_ : ∃ a, a ∈ ↑M ∧ ↑f a = ↑f r) } * ↑(algebraMap S S') y ∈
    Algebra.adjoin R' (↑(algebraMap S S') '' ↑T)
[PROOFSTEP]
replace hy : algebraMap S S' y ∈ (Algebra.adjoin R (T : Set S)).map fₐ := Subalgebra.mem_map.mpr ⟨_, hy, rfl⟩
[GOAL]
case h.intro.intro.mk.intro.intro
R✝ S✝ : Type u
inst✝¹³ : CommRing R✝
inst✝¹² : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R'✝ S'✝ : Type u
inst✝¹¹ : CommRing R'✝
inst✝¹⁰ : CommRing S'✝
f✝ : R✝ →+* S✝
inst✝⁹ : Algebra R✝ R'✝
inst✝⁸ : Algebra S✝ S'✝
R S : Type u_1
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
M : Submonoid R
R' S' : Type u_1
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
inst✝³ : Algebra R R'
inst✝² : Algebra S S'
inst✝¹ : IsLocalization M R'
inst✝ : IsLocalization (Submonoid.map f M) S'
hf : RingHom.FiniteType f
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : Algebra R S' := RingHom.toAlgebra (RingHom.comp (algebraMap S S') f)
f' : R' →+* S' := IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M))
this✝ : Algebra R' S' := RingHom.toAlgebra f'
this : IsScalarTower R R' S'
fₐ : S →ₐ[R] S' :=
  AlgHom.mk' (algebraMap S S')
    (_ : ∀ (c : R) (x : S), ↑(algebraMap S S') (↑f c * x) = ↑(algebraMap S S') (↑f c) * ↑(algebraMap S S') x)
T : Finset S
hT : Algebra.adjoin R ↑T = ⊤
y : S
r : R
hr : r ∈ ↑M
hy : ↑(algebraMap S S') y ∈ Subalgebra.map fₐ (Algebra.adjoin R ↑T)
⊢ IsLocalization.mk' S' 1 { val := ↑f r, property := (_ : ∃ a, a ∈ ↑M ∧ ↑f a = ↑f r) } * ↑(algebraMap S S') y ∈
    Algebra.adjoin R' (↑(algebraMap S S') '' ↑T)
[PROOFSTEP]
rw [fₐ.map_adjoin T] at hy
[GOAL]
case h.intro.intro.mk.intro.intro
R✝ S✝ : Type u
inst✝¹³ : CommRing R✝
inst✝¹² : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R'✝ S'✝ : Type u
inst✝¹¹ : CommRing R'✝
inst✝¹⁰ : CommRing S'✝
f✝ : R✝ →+* S✝
inst✝⁹ : Algebra R✝ R'✝
inst✝⁸ : Algebra S✝ S'✝
R S : Type u_1
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
M : Submonoid R
R' S' : Type u_1
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
inst✝³ : Algebra R R'
inst✝² : Algebra S S'
inst✝¹ : IsLocalization M R'
inst✝ : IsLocalization (Submonoid.map f M) S'
hf : RingHom.FiniteType f
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : Algebra R S' := RingHom.toAlgebra (RingHom.comp (algebraMap S S') f)
f' : R' →+* S' := IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M))
this✝ : Algebra R' S' := RingHom.toAlgebra f'
this : IsScalarTower R R' S'
fₐ : S →ₐ[R] S' :=
  AlgHom.mk' (algebraMap S S')
    (_ : ∀ (c : R) (x : S), ↑(algebraMap S S') (↑f c * x) = ↑(algebraMap S S') (↑f c) * ↑(algebraMap S S') x)
T : Finset S
hT : Algebra.adjoin R ↑T = ⊤
y : S
r : R
hr : r ∈ ↑M
hy : ↑(algebraMap S S') y ∈ Algebra.adjoin R (↑fₐ '' ↑T)
⊢ IsLocalization.mk' S' 1 { val := ↑f r, property := (_ : ∃ a, a ∈ ↑M ∧ ↑f a = ↑f r) } * ↑(algebraMap S S') y ∈
    Algebra.adjoin R' (↑(algebraMap S S') '' ↑T)
[PROOFSTEP]
have H : Algebra.adjoin R (algebraMap S S' '' T) ≤ (Algebra.adjoin R' (algebraMap S S' '' T)).restrictScalars R := by
  rw [Algebra.adjoin_le_iff]; exact Algebra.subset_adjoin
[GOAL]
R✝ S✝ : Type u
inst✝¹³ : CommRing R✝
inst✝¹² : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R'✝ S'✝ : Type u
inst✝¹¹ : CommRing R'✝
inst✝¹⁰ : CommRing S'✝
f✝ : R✝ →+* S✝
inst✝⁹ : Algebra R✝ R'✝
inst✝⁸ : Algebra S✝ S'✝
R S : Type u_1
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
M : Submonoid R
R' S' : Type u_1
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
inst✝³ : Algebra R R'
inst✝² : Algebra S S'
inst✝¹ : IsLocalization M R'
inst✝ : IsLocalization (Submonoid.map f M) S'
hf : RingHom.FiniteType f
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : Algebra R S' := RingHom.toAlgebra (RingHom.comp (algebraMap S S') f)
f' : R' →+* S' := IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M))
this✝ : Algebra R' S' := RingHom.toAlgebra f'
this : IsScalarTower R R' S'
fₐ : S →ₐ[R] S' :=
  AlgHom.mk' (algebraMap S S')
    (_ : ∀ (c : R) (x : S), ↑(algebraMap S S') (↑f c * x) = ↑(algebraMap S S') (↑f c) * ↑(algebraMap S S') x)
T : Finset S
hT : Algebra.adjoin R ↑T = ⊤
y : S
r : R
hr : r ∈ ↑M
hy : ↑(algebraMap S S') y ∈ Algebra.adjoin R (↑fₐ '' ↑T)
⊢ Algebra.adjoin R (↑(algebraMap S S') '' ↑T) ≤
    Subalgebra.restrictScalars R (Algebra.adjoin R' (↑(algebraMap S S') '' ↑T))
[PROOFSTEP]
rw [Algebra.adjoin_le_iff]
[GOAL]
R✝ S✝ : Type u
inst✝¹³ : CommRing R✝
inst✝¹² : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R'✝ S'✝ : Type u
inst✝¹¹ : CommRing R'✝
inst✝¹⁰ : CommRing S'✝
f✝ : R✝ →+* S✝
inst✝⁹ : Algebra R✝ R'✝
inst✝⁸ : Algebra S✝ S'✝
R S : Type u_1
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
M : Submonoid R
R' S' : Type u_1
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
inst✝³ : Algebra R R'
inst✝² : Algebra S S'
inst✝¹ : IsLocalization M R'
inst✝ : IsLocalization (Submonoid.map f M) S'
hf : RingHom.FiniteType f
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : Algebra R S' := RingHom.toAlgebra (RingHom.comp (algebraMap S S') f)
f' : R' →+* S' := IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M))
this✝ : Algebra R' S' := RingHom.toAlgebra f'
this : IsScalarTower R R' S'
fₐ : S →ₐ[R] S' :=
  AlgHom.mk' (algebraMap S S')
    (_ : ∀ (c : R) (x : S), ↑(algebraMap S S') (↑f c * x) = ↑(algebraMap S S') (↑f c) * ↑(algebraMap S S') x)
T : Finset S
hT : Algebra.adjoin R ↑T = ⊤
y : S
r : R
hr : r ∈ ↑M
hy : ↑(algebraMap S S') y ∈ Algebra.adjoin R (↑fₐ '' ↑T)
⊢ ↑(algebraMap S S') '' ↑T ⊆ ↑(Subalgebra.restrictScalars R (Algebra.adjoin R' (↑(algebraMap S S') '' ↑T)))
[PROOFSTEP]
exact Algebra.subset_adjoin
[GOAL]
case h.intro.intro.mk.intro.intro
R✝ S✝ : Type u
inst✝¹³ : CommRing R✝
inst✝¹² : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R'✝ S'✝ : Type u
inst✝¹¹ : CommRing R'✝
inst✝¹⁰ : CommRing S'✝
f✝ : R✝ →+* S✝
inst✝⁹ : Algebra R✝ R'✝
inst✝⁸ : Algebra S✝ S'✝
R S : Type u_1
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
M : Submonoid R
R' S' : Type u_1
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
inst✝³ : Algebra R R'
inst✝² : Algebra S S'
inst✝¹ : IsLocalization M R'
inst✝ : IsLocalization (Submonoid.map f M) S'
hf : RingHom.FiniteType f
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : Algebra R S' := RingHom.toAlgebra (RingHom.comp (algebraMap S S') f)
f' : R' →+* S' := IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M))
this✝ : Algebra R' S' := RingHom.toAlgebra f'
this : IsScalarTower R R' S'
fₐ : S →ₐ[R] S' :=
  AlgHom.mk' (algebraMap S S')
    (_ : ∀ (c : R) (x : S), ↑(algebraMap S S') (↑f c * x) = ↑(algebraMap S S') (↑f c) * ↑(algebraMap S S') x)
T : Finset S
hT : Algebra.adjoin R ↑T = ⊤
y : S
r : R
hr : r ∈ ↑M
hy : ↑(algebraMap S S') y ∈ Algebra.adjoin R (↑fₐ '' ↑T)
H :
  Algebra.adjoin R (↑(algebraMap S S') '' ↑T) ≤
    Subalgebra.restrictScalars R (Algebra.adjoin R' (↑(algebraMap S S') '' ↑T))
⊢ IsLocalization.mk' S' 1 { val := ↑f r, property := (_ : ∃ a, a ∈ ↑M ∧ ↑f a = ↑f r) } * ↑(algebraMap S S') y ∈
    Algebra.adjoin R' (↑(algebraMap S S') '' ↑T)
[PROOFSTEP]
convert (Algebra.adjoin R' (algebraMap S S' '' T)).smul_mem (H hy) (IsLocalization.mk' R' (1 : R) ⟨r, hr⟩) using 1
[GOAL]
case h.e'_4
R✝ S✝ : Type u
inst✝¹³ : CommRing R✝
inst✝¹² : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R'✝ S'✝ : Type u
inst✝¹¹ : CommRing R'✝
inst✝¹⁰ : CommRing S'✝
f✝ : R✝ →+* S✝
inst✝⁹ : Algebra R✝ R'✝
inst✝⁸ : Algebra S✝ S'✝
R S : Type u_1
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
M : Submonoid R
R' S' : Type u_1
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
inst✝³ : Algebra R R'
inst✝² : Algebra S S'
inst✝¹ : IsLocalization M R'
inst✝ : IsLocalization (Submonoid.map f M) S'
hf : RingHom.FiniteType f
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : Algebra R S' := RingHom.toAlgebra (RingHom.comp (algebraMap S S') f)
f' : R' →+* S' := IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M))
this✝ : Algebra R' S' := RingHom.toAlgebra f'
this : IsScalarTower R R' S'
fₐ : S →ₐ[R] S' :=
  AlgHom.mk' (algebraMap S S')
    (_ : ∀ (c : R) (x : S), ↑(algebraMap S S') (↑f c * x) = ↑(algebraMap S S') (↑f c) * ↑(algebraMap S S') x)
T : Finset S
hT : Algebra.adjoin R ↑T = ⊤
y : S
r : R
hr : r ∈ ↑M
hy : ↑(algebraMap S S') y ∈ Algebra.adjoin R (↑fₐ '' ↑T)
H :
  Algebra.adjoin R (↑(algebraMap S S') '' ↑T) ≤
    Subalgebra.restrictScalars R (Algebra.adjoin R' (↑(algebraMap S S') '' ↑T))
⊢ IsLocalization.mk' S' 1 { val := ↑f r, property := (_ : ∃ a, a ∈ ↑M ∧ ↑f a = ↑f r) } * ↑(algebraMap S S') y =
    IsLocalization.mk' R' 1 { val := r, property := hr } • ↑(algebraMap S S') y
[PROOFSTEP]
rw [Algebra.smul_def]
[GOAL]
case h.e'_4
R✝ S✝ : Type u
inst✝¹³ : CommRing R✝
inst✝¹² : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R'✝ S'✝ : Type u
inst✝¹¹ : CommRing R'✝
inst✝¹⁰ : CommRing S'✝
f✝ : R✝ →+* S✝
inst✝⁹ : Algebra R✝ R'✝
inst✝⁸ : Algebra S✝ S'✝
R S : Type u_1
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
M : Submonoid R
R' S' : Type u_1
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
inst✝³ : Algebra R R'
inst✝² : Algebra S S'
inst✝¹ : IsLocalization M R'
inst✝ : IsLocalization (Submonoid.map f M) S'
hf : RingHom.FiniteType f
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : Algebra R S' := RingHom.toAlgebra (RingHom.comp (algebraMap S S') f)
f' : R' →+* S' := IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M))
this✝ : Algebra R' S' := RingHom.toAlgebra f'
this : IsScalarTower R R' S'
fₐ : S →ₐ[R] S' :=
  AlgHom.mk' (algebraMap S S')
    (_ : ∀ (c : R) (x : S), ↑(algebraMap S S') (↑f c * x) = ↑(algebraMap S S') (↑f c) * ↑(algebraMap S S') x)
T : Finset S
hT : Algebra.adjoin R ↑T = ⊤
y : S
r : R
hr : r ∈ ↑M
hy : ↑(algebraMap S S') y ∈ Algebra.adjoin R (↑fₐ '' ↑T)
H :
  Algebra.adjoin R (↑(algebraMap S S') '' ↑T) ≤
    Subalgebra.restrictScalars R (Algebra.adjoin R' (↑(algebraMap S S') '' ↑T))
⊢ IsLocalization.mk' S' 1 { val := ↑f r, property := (_ : ∃ a, a ∈ ↑M ∧ ↑f a = ↑f r) } * ↑(algebraMap S S') y =
    ↑(algebraMap R' S') (IsLocalization.mk' R' 1 { val := r, property := hr }) * ↑(algebraMap S S') y
[PROOFSTEP]
erw [IsLocalization.map_mk' M.le_comap_map]
[GOAL]
case h.e'_4
R✝ S✝ : Type u
inst✝¹³ : CommRing R✝
inst✝¹² : CommRing S✝
M✝ : Submonoid R✝
N : Submonoid S✝
R'✝ S'✝ : Type u
inst✝¹¹ : CommRing R'✝
inst✝¹⁰ : CommRing S'✝
f✝ : R✝ →+* S✝
inst✝⁹ : Algebra R✝ R'✝
inst✝⁸ : Algebra S✝ S'✝
R S : Type u_1
inst✝⁷ : CommRing R
inst✝⁶ : CommRing S
f : R →+* S
M : Submonoid R
R' S' : Type u_1
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
inst✝³ : Algebra R R'
inst✝² : Algebra S S'
inst✝¹ : IsLocalization M R'
inst✝ : IsLocalization (Submonoid.map f M) S'
hf : RingHom.FiniteType f
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : Algebra R S' := RingHom.toAlgebra (RingHom.comp (algebraMap S S') f)
f' : R' →+* S' := IsLocalization.map S' f (_ : M ≤ Submonoid.comap f (Submonoid.map f M))
this✝ : Algebra R' S' := RingHom.toAlgebra f'
this : IsScalarTower R R' S'
fₐ : S →ₐ[R] S' :=
  AlgHom.mk' (algebraMap S S')
    (_ : ∀ (c : R) (x : S), ↑(algebraMap S S') (↑f c * x) = ↑(algebraMap S S') (↑f c) * ↑(algebraMap S S') x)
T : Finset S
hT : Algebra.adjoin R ↑T = ⊤
y : S
r : R
hr : r ∈ ↑M
hy : ↑(algebraMap S S') y ∈ Algebra.adjoin R (↑fₐ '' ↑T)
H :
  Algebra.adjoin R (↑(algebraMap S S') '' ↑T) ≤
    Subalgebra.restrictScalars R (Algebra.adjoin R' (↑(algebraMap S S') '' ↑T))
⊢ IsLocalization.mk' S' 1 { val := ↑f r, property := (_ : ∃ a, a ∈ ↑M ∧ ↑f a = ↑f r) } * ↑(algebraMap S S') y =
    IsLocalization.mk' S' (↑f 1)
        { val := ↑f ↑{ val := r, property := hr },
          property := (_ : ↑{ val := r, property := hr } ∈ Submonoid.comap f (Submonoid.map f M)) } *
      ↑(algebraMap S S') y
[PROOFSTEP]
rw [map_one]
[GOAL]
R S : Type u
inst✝⁹ : CommRing R
inst✝⁸ : CommRing S
M✝ : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
f : R →+* S
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R S
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R S S'
M : Submonoid S
inst✝ : IsLocalization M S'
x : S
s : Finset S'
A : Subalgebra R S
hA₁ : ↑(finsetIntegerMultiple M s) ⊆ ↑A
hA₂ : M ≤ A.toSubmonoid
hx : ↑(algebraMap S S') x ∈ Algebra.adjoin R ↑s
⊢ ∃ m, m • x ∈ A
[PROOFSTEP]
let g : S →ₐ[R] S' := IsScalarTower.toAlgHom R S S'
[GOAL]
R S : Type u
inst✝⁹ : CommRing R
inst✝⁸ : CommRing S
M✝ : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
f : R →+* S
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R S
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R S S'
M : Submonoid S
inst✝ : IsLocalization M S'
x : S
s : Finset S'
A : Subalgebra R S
hA₁ : ↑(finsetIntegerMultiple M s) ⊆ ↑A
hA₂ : M ≤ A.toSubmonoid
hx : ↑(algebraMap S S') x ∈ Algebra.adjoin R ↑s
g : S →ₐ[R] S' := IsScalarTower.toAlgHom R S S'
⊢ ∃ m, m • x ∈ A
[PROOFSTEP]
let y := IsLocalization.commonDenomOfFinset M s
[GOAL]
R S : Type u
inst✝⁹ : CommRing R
inst✝⁸ : CommRing S
M✝ : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
f : R →+* S
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R S
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R S S'
M : Submonoid S
inst✝ : IsLocalization M S'
x : S
s : Finset S'
A : Subalgebra R S
hA₁ : ↑(finsetIntegerMultiple M s) ⊆ ↑A
hA₂ : M ≤ A.toSubmonoid
hx : ↑(algebraMap S S') x ∈ Algebra.adjoin R ↑s
g : S →ₐ[R] S' := IsScalarTower.toAlgHom R S S'
y : { x // x ∈ M } := commonDenomOfFinset M s
⊢ ∃ m, m • x ∈ A
[PROOFSTEP]
have hx₁ : (y : S) • (s : Set S') = g '' _ := (IsLocalization.finsetIntegerMultiple_image _ s).symm
[GOAL]
R S : Type u
inst✝⁹ : CommRing R
inst✝⁸ : CommRing S
M✝ : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
f : R →+* S
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R S
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R S S'
M : Submonoid S
inst✝ : IsLocalization M S'
x : S
s : Finset S'
A : Subalgebra R S
hA₁ : ↑(finsetIntegerMultiple M s) ⊆ ↑A
hA₂ : M ≤ A.toSubmonoid
hx : ↑(algebraMap S S') x ∈ Algebra.adjoin R ↑s
g : S →ₐ[R] S' := IsScalarTower.toAlgHom R S S'
y : { x // x ∈ M } := commonDenomOfFinset M s
hx₁ : ↑y • ↑s = ↑g '' ↑(finsetIntegerMultiple M s)
⊢ ∃ m, m • x ∈ A
[PROOFSTEP]
obtain ⟨n, hn⟩ :=
  Algebra.pow_smul_mem_of_smul_subset_of_mem_adjoin (y : S) (s : Set S') (A.map g)
    (by rw [hx₁]; exact Set.image_subset _ hA₁) hx (Set.mem_image_of_mem _ (hA₂ y.2))
[GOAL]
R S : Type u
inst✝⁹ : CommRing R
inst✝⁸ : CommRing S
M✝ : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
f : R →+* S
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R S
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R S S'
M : Submonoid S
inst✝ : IsLocalization M S'
x : S
s : Finset S'
A : Subalgebra R S
hA₁ : ↑(finsetIntegerMultiple M s) ⊆ ↑A
hA₂ : M ≤ A.toSubmonoid
hx : ↑(algebraMap S S') x ∈ Algebra.adjoin R ↑s
g : S →ₐ[R] S' := IsScalarTower.toAlgHom R S S'
y : { x // x ∈ M } := commonDenomOfFinset M s
hx₁ : ↑y • ↑s = ↑g '' ↑(finsetIntegerMultiple M s)
⊢ ↑y • ↑s ⊆ ↑(Subalgebra.map g A)
[PROOFSTEP]
rw [hx₁]
[GOAL]
R S : Type u
inst✝⁹ : CommRing R
inst✝⁸ : CommRing S
M✝ : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
f : R →+* S
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R S
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R S S'
M : Submonoid S
inst✝ : IsLocalization M S'
x : S
s : Finset S'
A : Subalgebra R S
hA₁ : ↑(finsetIntegerMultiple M s) ⊆ ↑A
hA₂ : M ≤ A.toSubmonoid
hx : ↑(algebraMap S S') x ∈ Algebra.adjoin R ↑s
g : S →ₐ[R] S' := IsScalarTower.toAlgHom R S S'
y : { x // x ∈ M } := commonDenomOfFinset M s
hx₁ : ↑y • ↑s = ↑g '' ↑(finsetIntegerMultiple M s)
⊢ ↑g '' ↑(finsetIntegerMultiple M s) ⊆ ↑(Subalgebra.map g A)
[PROOFSTEP]
exact Set.image_subset _ hA₁
[GOAL]
case intro
R S : Type u
inst✝⁹ : CommRing R
inst✝⁸ : CommRing S
M✝ : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
f : R →+* S
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R S
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R S S'
M : Submonoid S
inst✝ : IsLocalization M S'
x : S
s : Finset S'
A : Subalgebra R S
hA₁ : ↑(finsetIntegerMultiple M s) ⊆ ↑A
hA₂ : M ≤ A.toSubmonoid
hx : ↑(algebraMap S S') x ∈ Algebra.adjoin R ↑s
g : S →ₐ[R] S' := IsScalarTower.toAlgHom R S S'
y : { x // x ∈ M } := commonDenomOfFinset M s
hx₁ : ↑y • ↑s = ↑g '' ↑(finsetIntegerMultiple M s)
n : ℕ
hn : ∀ (n_1 : ℕ), n_1 ≥ n → ↑y ^ n_1 • ↑(algebraMap S S') x ∈ Subalgebra.map g A
⊢ ∃ m, m • x ∈ A
[PROOFSTEP]
obtain ⟨x', hx', hx''⟩ := hn n (le_of_eq rfl)
[GOAL]
case intro.intro.intro
R S : Type u
inst✝⁹ : CommRing R
inst✝⁸ : CommRing S
M✝ : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
f : R →+* S
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R S
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R S S'
M : Submonoid S
inst✝ : IsLocalization M S'
x : S
s : Finset S'
A : Subalgebra R S
hA₁ : ↑(finsetIntegerMultiple M s) ⊆ ↑A
hA₂ : M ≤ A.toSubmonoid
hx : ↑(algebraMap S S') x ∈ Algebra.adjoin R ↑s
g : S →ₐ[R] S' := IsScalarTower.toAlgHom R S S'
y : { x // x ∈ M } := commonDenomOfFinset M s
hx₁ : ↑y • ↑s = ↑g '' ↑(finsetIntegerMultiple M s)
n : ℕ
hn : ∀ (n_1 : ℕ), n_1 ≥ n → ↑y ^ n_1 • ↑(algebraMap S S') x ∈ Subalgebra.map g A
x' : S
hx' : x' ∈ ↑A.toSubsemiring
hx'' : ↑↑g x' = ↑y ^ n • ↑(algebraMap S S') x
⊢ ∃ m, m • x ∈ A
[PROOFSTEP]
rw [Algebra.smul_def, ← _root_.map_mul] at hx''
[GOAL]
case intro.intro.intro
R S : Type u
inst✝⁹ : CommRing R
inst✝⁸ : CommRing S
M✝ : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
f : R →+* S
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R S
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R S S'
M : Submonoid S
inst✝ : IsLocalization M S'
x : S
s : Finset S'
A : Subalgebra R S
hA₁ : ↑(finsetIntegerMultiple M s) ⊆ ↑A
hA₂ : M ≤ A.toSubmonoid
hx : ↑(algebraMap S S') x ∈ Algebra.adjoin R ↑s
g : S →ₐ[R] S' := IsScalarTower.toAlgHom R S S'
y : { x // x ∈ M } := commonDenomOfFinset M s
hx₁ : ↑y • ↑s = ↑g '' ↑(finsetIntegerMultiple M s)
n : ℕ
hn : ∀ (n_1 : ℕ), n_1 ≥ n → ↑y ^ n_1 • ↑(algebraMap S S') x ∈ Subalgebra.map g A
x' : S
hx' : x' ∈ ↑A.toSubsemiring
hx'' : ↑↑g x' = ↑(algebraMap S S') (↑y ^ n * x)
⊢ ∃ m, m • x ∈ A
[PROOFSTEP]
obtain ⟨a, ha₂⟩ := (IsLocalization.eq_iff_exists M S').mp hx''
[GOAL]
case intro.intro.intro.intro
R S : Type u
inst✝⁹ : CommRing R
inst✝⁸ : CommRing S
M✝ : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
f : R →+* S
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R S
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R S S'
M : Submonoid S
inst✝ : IsLocalization M S'
x : S
s : Finset S'
A : Subalgebra R S
hA₁ : ↑(finsetIntegerMultiple M s) ⊆ ↑A
hA₂ : M ≤ A.toSubmonoid
hx : ↑(algebraMap S S') x ∈ Algebra.adjoin R ↑s
g : S →ₐ[R] S' := IsScalarTower.toAlgHom R S S'
y : { x // x ∈ M } := commonDenomOfFinset M s
hx₁ : ↑y • ↑s = ↑g '' ↑(finsetIntegerMultiple M s)
n : ℕ
hn : ∀ (n_1 : ℕ), n_1 ≥ n → ↑y ^ n_1 • ↑(algebraMap S S') x ∈ Subalgebra.map g A
x' : S
hx' : x' ∈ ↑A.toSubsemiring
hx'' : ↑↑g x' = ↑(algebraMap S S') (↑y ^ n * x)
a : { x // x ∈ M }
ha₂ : ↑a * x' = ↑a * (↑y ^ n * x)
⊢ ∃ m, m • x ∈ A
[PROOFSTEP]
use a * y ^ n
[GOAL]
case h
R S : Type u
inst✝⁹ : CommRing R
inst✝⁸ : CommRing S
M✝ : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
f : R →+* S
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R S
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R S S'
M : Submonoid S
inst✝ : IsLocalization M S'
x : S
s : Finset S'
A : Subalgebra R S
hA₁ : ↑(finsetIntegerMultiple M s) ⊆ ↑A
hA₂ : M ≤ A.toSubmonoid
hx : ↑(algebraMap S S') x ∈ Algebra.adjoin R ↑s
g : S →ₐ[R] S' := IsScalarTower.toAlgHom R S S'
y : { x // x ∈ M } := commonDenomOfFinset M s
hx₁ : ↑y • ↑s = ↑g '' ↑(finsetIntegerMultiple M s)
n : ℕ
hn : ∀ (n_1 : ℕ), n_1 ≥ n → ↑y ^ n_1 • ↑(algebraMap S S') x ∈ Subalgebra.map g A
x' : S
hx' : x' ∈ ↑A.toSubsemiring
hx'' : ↑↑g x' = ↑(algebraMap S S') (↑y ^ n * x)
a : { x // x ∈ M }
ha₂ : ↑a * x' = ↑a * (↑y ^ n * x)
⊢ (a * y ^ n) • x ∈ A
[PROOFSTEP]
convert A.mul_mem hx' (hA₂ a.prop) using 1
[GOAL]
case h.e'_4
R S : Type u
inst✝⁹ : CommRing R
inst✝⁸ : CommRing S
M✝ : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
f : R →+* S
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R S
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R S S'
M : Submonoid S
inst✝ : IsLocalization M S'
x : S
s : Finset S'
A : Subalgebra R S
hA₁ : ↑(finsetIntegerMultiple M s) ⊆ ↑A
hA₂ : M ≤ A.toSubmonoid
hx : ↑(algebraMap S S') x ∈ Algebra.adjoin R ↑s
g : S →ₐ[R] S' := IsScalarTower.toAlgHom R S S'
y : { x // x ∈ M } := commonDenomOfFinset M s
hx₁ : ↑y • ↑s = ↑g '' ↑(finsetIntegerMultiple M s)
n : ℕ
hn : ∀ (n_1 : ℕ), n_1 ≥ n → ↑y ^ n_1 • ↑(algebraMap S S') x ∈ Subalgebra.map g A
x' : S
hx' : x' ∈ ↑A.toSubsemiring
hx'' : ↑↑g x' = ↑(algebraMap S S') (↑y ^ n * x)
a : { x // x ∈ M }
ha₂ : ↑a * x' = ↑a * (↑y ^ n * x)
⊢ (a * y ^ n) • x = x' * ↑a
[PROOFSTEP]
rw [Submonoid.smul_def, smul_eq_mul, Submonoid.coe_mul, SubmonoidClass.coe_pow, mul_assoc, ← ha₂, mul_comm]
[GOAL]
R S : Type u
inst✝⁹ : CommRing R
inst✝⁸ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
f : R →+* S
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R S
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R S S'
inst✝ : IsLocalization (Submonoid.map (algebraMap R S) M) S'
x : S
s : Finset S'
hx : ↑(algebraMap S S') x ∈ Algebra.adjoin R ↑s
⊢ ∃ m, m • x ∈ Algebra.adjoin R ↑(finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s)
[PROOFSTEP]
obtain ⟨⟨_, a, ha, rfl⟩, e⟩ :=
  IsLocalization.exists_smul_mem_of_mem_adjoin (M.map (algebraMap R S)) x s (Algebra.adjoin R _) Algebra.subset_adjoin
    (by rintro _ ⟨a, _, rfl⟩; exact Subalgebra.algebraMap_mem _ a) hx
[GOAL]
R S : Type u
inst✝⁹ : CommRing R
inst✝⁸ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
f : R →+* S
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R S
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R S S'
inst✝ : IsLocalization (Submonoid.map (algebraMap R S) M) S'
x : S
s : Finset S'
hx : ↑(algebraMap S S') x ∈ Algebra.adjoin R ↑s
⊢ Submonoid.map (algebraMap R S) M ≤
    (Algebra.adjoin R ↑(finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s)).toSubsemiring.toSubmonoid
[PROOFSTEP]
rintro _ ⟨a, _, rfl⟩
[GOAL]
case intro.intro
R S : Type u
inst✝⁹ : CommRing R
inst✝⁸ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
f : R →+* S
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R S
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R S S'
inst✝ : IsLocalization (Submonoid.map (algebraMap R S) M) S'
x : S
s : Finset S'
hx : ↑(algebraMap S S') x ∈ Algebra.adjoin R ↑s
a : R
left✝ : a ∈ ↑M
⊢ ↑(algebraMap R S) a ∈
    (Algebra.adjoin R ↑(finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s)).toSubsemiring.toSubmonoid
[PROOFSTEP]
exact Subalgebra.algebraMap_mem _ a
[GOAL]
case intro.mk.intro.intro
R S : Type u
inst✝⁹ : CommRing R
inst✝⁸ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
f : R →+* S
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R S
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R S S'
inst✝ : IsLocalization (Submonoid.map (algebraMap R S) M) S'
x : S
s : Finset S'
hx : ↑(algebraMap S S') x ∈ Algebra.adjoin R ↑s
a : R
ha : a ∈ ↑M
e :
  { val := ↑(algebraMap R S) a, property := (_ : ∃ a_1, a_1 ∈ ↑M ∧ ↑(algebraMap R S) a_1 = ↑(algebraMap R S) a) } • x ∈
    Algebra.adjoin R ↑(finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s)
⊢ ∃ m, m • x ∈ Algebra.adjoin R ↑(finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s)
[PROOFSTEP]
refine' ⟨⟨a, ha⟩, _⟩
[GOAL]
case intro.mk.intro.intro
R S : Type u
inst✝⁹ : CommRing R
inst✝⁸ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝⁷ : CommRing R'
inst✝⁶ : CommRing S'
f : R →+* S
inst✝⁵ : Algebra R R'
inst✝⁴ : Algebra S S'
inst✝³ : Algebra R S
inst✝² : Algebra R S'
inst✝¹ : IsScalarTower R S S'
inst✝ : IsLocalization (Submonoid.map (algebraMap R S) M) S'
x : S
s : Finset S'
hx : ↑(algebraMap S S') x ∈ Algebra.adjoin R ↑s
a : R
ha : a ∈ ↑M
e :
  { val := ↑(algebraMap R S) a, property := (_ : ∃ a_1, a_1 ∈ ↑M ∧ ↑(algebraMap R S) a_1 = ↑(algebraMap R S) a) } • x ∈
    Algebra.adjoin R ↑(finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s)
⊢ { val := a, property := ha } • x ∈ Algebra.adjoin R ↑(finsetIntegerMultiple (Submonoid.map (algebraMap R S) M) s)
[PROOFSTEP]
simpa only [Submonoid.smul_def, algebraMap_smul] using e
[GOAL]
R S : Type u
inst✝⁵ : CommRing R
inst✝⁴ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝³ : CommRing R'
inst✝² : CommRing S'
f : R →+* S
inst✝¹ : Algebra R R'
inst✝ : Algebra S S'
⊢ RingHom.OfLocalizationSpan @RingHom.FiniteType
[PROOFSTEP]
rw [RingHom.ofLocalizationSpan_iff_finite]
[GOAL]
R S : Type u
inst✝⁵ : CommRing R
inst✝⁴ : CommRing S
M : Submonoid R
N : Submonoid S
R' S' : Type u
inst✝³ : CommRing R'
inst✝² : CommRing S'
f : R →+* S
inst✝¹ : Algebra R R'
inst✝ : Algebra S S'
⊢ RingHom.OfLocalizationFiniteSpan @RingHom.FiniteType
[PROOFSTEP]
introv R hs H
[GOAL]
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Finset R
hs : Ideal.span ↑s = ⊤
H : ∀ (r : { x // x ∈ s }), RingHom.FiniteType (Localization.awayMap f ↑r)
⊢ RingHom.FiniteType f
[PROOFSTEP]
letI := f.toAlgebra
[GOAL]
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Finset R
hs : Ideal.span ↑s = ⊤
H : ∀ (r : { x // x ∈ s }), RingHom.FiniteType (Localization.awayMap f ↑r)
this : Algebra R S := RingHom.toAlgebra f
⊢ RingHom.FiniteType f
[PROOFSTEP]
letI := fun r : s => (Localization.awayMap f r).toAlgebra
[GOAL]
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Finset R
hs : Ideal.span ↑s = ⊤
H : ∀ (r : { x // x ∈ s }), RingHom.FiniteType (Localization.awayMap f ↑r)
this✝ : Algebra R S := RingHom.toAlgebra f
this : (r : { x // x ∈ s }) → Algebra (Localization.Away ↑r) (Localization.Away (↑f ↑r)) :=
  fun r => RingHom.toAlgebra (Localization.awayMap f ↑r)
⊢ RingHom.FiniteType f
[PROOFSTEP]
have : ∀ r : s, IsLocalization ((Submonoid.powers (r : R)).map (algebraMap R S)) (Localization.Away (f r)) := by
  intro r; rw [Submonoid.map_powers]; exact Localization.isLocalization
[GOAL]
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Finset R
hs : Ideal.span ↑s = ⊤
H : ∀ (r : { x // x ∈ s }), RingHom.FiniteType (Localization.awayMap f ↑r)
this✝ : Algebra R S := RingHom.toAlgebra f
this : (r : { x // x ∈ s }) → Algebra (Localization.Away ↑r) (Localization.Away (↑f ↑r)) :=
  fun r => RingHom.toAlgebra (Localization.awayMap f ↑r)
⊢ ∀ (r : { x // x ∈ s }),
    IsLocalization (Submonoid.map (algebraMap R S) (Submonoid.powers ↑r)) (Localization.Away (↑f ↑r))
[PROOFSTEP]
intro r
[GOAL]
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Finset R
hs : Ideal.span ↑s = ⊤
H : ∀ (r : { x // x ∈ s }), RingHom.FiniteType (Localization.awayMap f ↑r)
this✝ : Algebra R S := RingHom.toAlgebra f
this : (r : { x // x ∈ s }) → Algebra (Localization.Away ↑r) (Localization.Away (↑f ↑r)) :=
  fun r => RingHom.toAlgebra (Localization.awayMap f ↑r)
r : { x // x ∈ s }
⊢ IsLocalization (Submonoid.map (algebraMap R S) (Submonoid.powers ↑r)) (Localization.Away (↑f ↑r))
[PROOFSTEP]
rw [Submonoid.map_powers]
[GOAL]
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Finset R
hs : Ideal.span ↑s = ⊤
H : ∀ (r : { x // x ∈ s }), RingHom.FiniteType (Localization.awayMap f ↑r)
this✝ : Algebra R S := RingHom.toAlgebra f
this : (r : { x // x ∈ s }) → Algebra (Localization.Away ↑r) (Localization.Away (↑f ↑r)) :=
  fun r => RingHom.toAlgebra (Localization.awayMap f ↑r)
r : { x // x ∈ s }
⊢ IsLocalization (Submonoid.powers (↑(algebraMap R S) ↑r)) (Localization.Away (↑f ↑r))
[PROOFSTEP]
exact Localization.isLocalization
[GOAL]
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Finset R
hs : Ideal.span ↑s = ⊤
H : ∀ (r : { x // x ∈ s }), RingHom.FiniteType (Localization.awayMap f ↑r)
this✝¹ : Algebra R S := RingHom.toAlgebra f
this✝ : (r : { x // x ∈ s }) → Algebra (Localization.Away ↑r) (Localization.Away (↑f ↑r)) :=
  fun r => RingHom.toAlgebra (Localization.awayMap f ↑r)
this :
  ∀ (r : { x // x ∈ s }),
    IsLocalization (Submonoid.map (algebraMap R S) (Submonoid.powers ↑r)) (Localization.Away (↑f ↑r))
⊢ RingHom.FiniteType f
[PROOFSTEP]
haveI : ∀ r : s, IsScalarTower R (Localization.Away (r : R)) (Localization.Away (f r)) := fun r =>
  IsScalarTower.of_algebraMap_eq' (IsLocalization.map_comp (Submonoid.powers (r : R)).le_comap_map).symm
[GOAL]
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Finset R
hs : Ideal.span ↑s = ⊤
H : ∀ (r : { x // x ∈ s }), RingHom.FiniteType (Localization.awayMap f ↑r)
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : (r : { x // x ∈ s }) → Algebra (Localization.Away ↑r) (Localization.Away (↑f ↑r)) :=
  fun r => RingHom.toAlgebra (Localization.awayMap f ↑r)
this✝ :
  ∀ (r : { x // x ∈ s }),
    IsLocalization (Submonoid.map (algebraMap R S) (Submonoid.powers ↑r)) (Localization.Away (↑f ↑r))
this : ∀ (r : { x // x ∈ s }), IsScalarTower R (Localization.Away ↑r) (Localization.Away (↑f ↑r))
⊢ RingHom.FiniteType f
[PROOFSTEP]
constructor
[GOAL]
case out
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Finset R
hs : Ideal.span ↑s = ⊤
H : ∀ (r : { x // x ∈ s }), RingHom.FiniteType (Localization.awayMap f ↑r)
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : (r : { x // x ∈ s }) → Algebra (Localization.Away ↑r) (Localization.Away (↑f ↑r)) :=
  fun r => RingHom.toAlgebra (Localization.awayMap f ↑r)
this✝ :
  ∀ (r : { x // x ∈ s }),
    IsLocalization (Submonoid.map (algebraMap R S) (Submonoid.powers ↑r)) (Localization.Away (↑f ↑r))
this : ∀ (r : { x // x ∈ s }), IsScalarTower R (Localization.Away ↑r) (Localization.Away (↑f ↑r))
⊢ Subalgebra.FG ⊤
[PROOFSTEP]
replace H := fun r => (H r).1
[GOAL]
case out
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Finset R
hs : Ideal.span ↑s = ⊤
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : (r : { x // x ∈ s }) → Algebra (Localization.Away ↑r) (Localization.Away (↑f ↑r)) :=
  fun r => RingHom.toAlgebra (Localization.awayMap f ↑r)
this✝ :
  ∀ (r : { x // x ∈ s }),
    IsLocalization (Submonoid.map (algebraMap R S) (Submonoid.powers ↑r)) (Localization.Away (↑f ↑r))
this : ∀ (r : { x // x ∈ s }), IsScalarTower R (Localization.Away ↑r) (Localization.Away (↑f ↑r))
H : ∀ (r : { x // x ∈ s }), Subalgebra.FG ⊤
⊢ Subalgebra.FG ⊤
[PROOFSTEP]
choose s₁ s₂ using H
[GOAL]
case out
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Finset R
hs : Ideal.span ↑s = ⊤
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : (r : { x // x ∈ s }) → Algebra (Localization.Away ↑r) (Localization.Away (↑f ↑r)) :=
  fun r => RingHom.toAlgebra (Localization.awayMap f ↑r)
this✝ :
  ∀ (r : { x // x ∈ s }),
    IsLocalization (Submonoid.map (algebraMap R S) (Submonoid.powers ↑r)) (Localization.Away (↑f ↑r))
this : ∀ (r : { x // x ∈ s }), IsScalarTower R (Localization.Away ↑r) (Localization.Away (↑f ↑r))
s₁ : (r : { x // x ∈ s }) → Finset (Localization.Away (↑f ↑r))
s₂ : ∀ (r : { x // x ∈ s }), Algebra.adjoin (Localization.Away ↑r) ↑(s₁ r) = ⊤
⊢ Subalgebra.FG ⊤
[PROOFSTEP]
let sf := fun x : s => IsLocalization.finsetIntegerMultiple (Submonoid.powers (f x)) (s₁ x)
[GOAL]
case out
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Finset R
hs : Ideal.span ↑s = ⊤
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : (r : { x // x ∈ s }) → Algebra (Localization.Away ↑r) (Localization.Away (↑f ↑r)) :=
  fun r => RingHom.toAlgebra (Localization.awayMap f ↑r)
this✝ :
  ∀ (r : { x // x ∈ s }),
    IsLocalization (Submonoid.map (algebraMap R S) (Submonoid.powers ↑r)) (Localization.Away (↑f ↑r))
this : ∀ (r : { x // x ∈ s }), IsScalarTower R (Localization.Away ↑r) (Localization.Away (↑f ↑r))
s₁ : (r : { x // x ∈ s }) → Finset (Localization.Away (↑f ↑r))
s₂ : ∀ (r : { x // x ∈ s }), Algebra.adjoin (Localization.Away ↑r) ↑(s₁ r) = ⊤
sf : (x : { x // x ∈ s }) → Finset ((fun x => S) ↑x) :=
  fun x => IsLocalization.finsetIntegerMultiple (Submonoid.powers (↑f ↑x)) (s₁ x)
⊢ Subalgebra.FG ⊤
[PROOFSTEP]
use s.attach.biUnion sf
[GOAL]
case h
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Finset R
hs : Ideal.span ↑s = ⊤
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : (r : { x // x ∈ s }) → Algebra (Localization.Away ↑r) (Localization.Away (↑f ↑r)) :=
  fun r => RingHom.toAlgebra (Localization.awayMap f ↑r)
this✝ :
  ∀ (r : { x // x ∈ s }),
    IsLocalization (Submonoid.map (algebraMap R S) (Submonoid.powers ↑r)) (Localization.Away (↑f ↑r))
this : ∀ (r : { x // x ∈ s }), IsScalarTower R (Localization.Away ↑r) (Localization.Away (↑f ↑r))
s₁ : (r : { x // x ∈ s }) → Finset (Localization.Away (↑f ↑r))
s₂ : ∀ (r : { x // x ∈ s }), Algebra.adjoin (Localization.Away ↑r) ↑(s₁ r) = ⊤
sf : (x : { x // x ∈ s }) → Finset ((fun x => S) ↑x) :=
  fun x => IsLocalization.finsetIntegerMultiple (Submonoid.powers (↑f ↑x)) (s₁ x)
⊢ Algebra.adjoin R ↑(Finset.biUnion (Finset.attach s) sf) = ⊤
[PROOFSTEP]
convert (Algebra.adjoin_attach_biUnion (R := R) sf).trans _
[GOAL]
case h.convert_2
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Finset R
hs : Ideal.span ↑s = ⊤
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : (r : { x // x ∈ s }) → Algebra (Localization.Away ↑r) (Localization.Away (↑f ↑r)) :=
  fun r => RingHom.toAlgebra (Localization.awayMap f ↑r)
this✝ :
  ∀ (r : { x // x ∈ s }),
    IsLocalization (Submonoid.map (algebraMap R S) (Submonoid.powers ↑r)) (Localization.Away (↑f ↑r))
this : ∀ (r : { x // x ∈ s }), IsScalarTower R (Localization.Away ↑r) (Localization.Away (↑f ↑r))
s₁ : (r : { x // x ∈ s }) → Finset (Localization.Away (↑f ↑r))
s₂ : ∀ (r : { x // x ∈ s }), Algebra.adjoin (Localization.Away ↑r) ↑(s₁ r) = ⊤
sf : (x : { x // x ∈ s }) → Finset ((fun x => S) ↑x) :=
  fun x => IsLocalization.finsetIntegerMultiple (Submonoid.powers (↑f ↑x)) (s₁ x)
⊢ ⨆ (x : { x // x ∈ s }), Algebra.adjoin R ↑(sf x) = ⊤
[PROOFSTEP]
rw [eq_top_iff]
[GOAL]
case h.convert_2
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Finset R
hs : Ideal.span ↑s = ⊤
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : (r : { x // x ∈ s }) → Algebra (Localization.Away ↑r) (Localization.Away (↑f ↑r)) :=
  fun r => RingHom.toAlgebra (Localization.awayMap f ↑r)
this✝ :
  ∀ (r : { x // x ∈ s }),
    IsLocalization (Submonoid.map (algebraMap R S) (Submonoid.powers ↑r)) (Localization.Away (↑f ↑r))
this : ∀ (r : { x // x ∈ s }), IsScalarTower R (Localization.Away ↑r) (Localization.Away (↑f ↑r))
s₁ : (r : { x // x ∈ s }) → Finset (Localization.Away (↑f ↑r))
s₂ : ∀ (r : { x // x ∈ s }), Algebra.adjoin (Localization.Away ↑r) ↑(s₁ r) = ⊤
sf : (x : { x // x ∈ s }) → Finset ((fun x => S) ↑x) :=
  fun x => IsLocalization.finsetIntegerMultiple (Submonoid.powers (↑f ↑x)) (s₁ x)
⊢ ⊤ ≤ ⨆ (x : { x // x ∈ s }), Algebra.adjoin R ↑(sf x)
[PROOFSTEP]
rintro x -
[GOAL]
case h.convert_2
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Finset R
hs : Ideal.span ↑s = ⊤
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : (r : { x // x ∈ s }) → Algebra (Localization.Away ↑r) (Localization.Away (↑f ↑r)) :=
  fun r => RingHom.toAlgebra (Localization.awayMap f ↑r)
this✝ :
  ∀ (r : { x // x ∈ s }),
    IsLocalization (Submonoid.map (algebraMap R S) (Submonoid.powers ↑r)) (Localization.Away (↑f ↑r))
this : ∀ (r : { x // x ∈ s }), IsScalarTower R (Localization.Away ↑r) (Localization.Away (↑f ↑r))
s₁ : (r : { x // x ∈ s }) → Finset (Localization.Away (↑f ↑r))
s₂ : ∀ (r : { x // x ∈ s }), Algebra.adjoin (Localization.Away ↑r) ↑(s₁ r) = ⊤
sf : (x : { x // x ∈ s }) → Finset ((fun x => S) ↑x) :=
  fun x => IsLocalization.finsetIntegerMultiple (Submonoid.powers (↑f ↑x)) (s₁ x)
x : S
⊢ x ∈ ⨆ (x : { x // x ∈ s }), Algebra.adjoin R ↑(sf x)
[PROOFSTEP]
apply (⨆ x : s, Algebra.adjoin R (sf x : Set S)).toSubmodule.mem_of_span_eq_top_of_smul_pow_mem _ hs _ _
[GOAL]
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Finset R
hs : Ideal.span ↑s = ⊤
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : (r : { x // x ∈ s }) → Algebra (Localization.Away ↑r) (Localization.Away (↑f ↑r)) :=
  fun r => RingHom.toAlgebra (Localization.awayMap f ↑r)
this✝ :
  ∀ (r : { x // x ∈ s }),
    IsLocalization (Submonoid.map (algebraMap R S) (Submonoid.powers ↑r)) (Localization.Away (↑f ↑r))
this : ∀ (r : { x // x ∈ s }), IsScalarTower R (Localization.Away ↑r) (Localization.Away (↑f ↑r))
s₁ : (r : { x // x ∈ s }) → Finset (Localization.Away (↑f ↑r))
s₂ : ∀ (r : { x // x ∈ s }), Algebra.adjoin (Localization.Away ↑r) ↑(s₁ r) = ⊤
sf : (x : { x // x ∈ s }) → Finset ((fun x => S) ↑x) :=
  fun x => IsLocalization.finsetIntegerMultiple (Submonoid.powers (↑f ↑x)) (s₁ x)
x : S
⊢ ∀ (r : ↑↑s), ∃ n, ↑r ^ n • x ∈ ↑Subalgebra.toSubmodule (⨆ (x : { x // x ∈ s }), Algebra.adjoin R ↑(sf x))
[PROOFSTEP]
intro r
[GOAL]
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Finset R
hs : Ideal.span ↑s = ⊤
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : (r : { x // x ∈ s }) → Algebra (Localization.Away ↑r) (Localization.Away (↑f ↑r)) :=
  fun r => RingHom.toAlgebra (Localization.awayMap f ↑r)
this✝ :
  ∀ (r : { x // x ∈ s }),
    IsLocalization (Submonoid.map (algebraMap R S) (Submonoid.powers ↑r)) (Localization.Away (↑f ↑r))
this : ∀ (r : { x // x ∈ s }), IsScalarTower R (Localization.Away ↑r) (Localization.Away (↑f ↑r))
s₁ : (r : { x // x ∈ s }) → Finset (Localization.Away (↑f ↑r))
s₂ : ∀ (r : { x // x ∈ s }), Algebra.adjoin (Localization.Away ↑r) ↑(s₁ r) = ⊤
sf : (x : { x // x ∈ s }) → Finset ((fun x => S) ↑x) :=
  fun x => IsLocalization.finsetIntegerMultiple (Submonoid.powers (↑f ↑x)) (s₁ x)
x : S
r : ↑↑s
⊢ ∃ n, ↑r ^ n • x ∈ ↑Subalgebra.toSubmodule (⨆ (x : { x // x ∈ s }), Algebra.adjoin R ↑(sf x))
[PROOFSTEP]
obtain ⟨⟨_, n₁, rfl⟩, hn₁⟩ :=
  multiple_mem_adjoin_of_mem_localization_adjoin (Submonoid.powers (r : R)) (Localization.Away (r : R))
    (s₁ r : Set (Localization.Away (f r))) (algebraMap S (Localization.Away (f r)) x) (by rw [s₂ r]; trivial)
[GOAL]
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Finset R
hs : Ideal.span ↑s = ⊤
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : (r : { x // x ∈ s }) → Algebra (Localization.Away ↑r) (Localization.Away (↑f ↑r)) :=
  fun r => RingHom.toAlgebra (Localization.awayMap f ↑r)
this✝ :
  ∀ (r : { x // x ∈ s }),
    IsLocalization (Submonoid.map (algebraMap R S) (Submonoid.powers ↑r)) (Localization.Away (↑f ↑r))
this : ∀ (r : { x // x ∈ s }), IsScalarTower R (Localization.Away ↑r) (Localization.Away (↑f ↑r))
s₁ : (r : { x // x ∈ s }) → Finset (Localization.Away (↑f ↑r))
s₂ : ∀ (r : { x // x ∈ s }), Algebra.adjoin (Localization.Away ↑r) ↑(s₁ r) = ⊤
sf : (x : { x // x ∈ s }) → Finset ((fun x => S) ↑x) :=
  fun x => IsLocalization.finsetIntegerMultiple (Submonoid.powers (↑f ↑x)) (s₁ x)
x : S
r : ↑↑s
⊢ ↑(algebraMap S (Localization.Away (↑f ↑r))) x ∈ Algebra.adjoin (Localization.Away ↑r) ↑(s₁ r)
[PROOFSTEP]
rw [s₂ r]
[GOAL]
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Finset R
hs : Ideal.span ↑s = ⊤
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : (r : { x // x ∈ s }) → Algebra (Localization.Away ↑r) (Localization.Away (↑f ↑r)) :=
  fun r => RingHom.toAlgebra (Localization.awayMap f ↑r)
this✝ :
  ∀ (r : { x // x ∈ s }),
    IsLocalization (Submonoid.map (algebraMap R S) (Submonoid.powers ↑r)) (Localization.Away (↑f ↑r))
this : ∀ (r : { x // x ∈ s }), IsScalarTower R (Localization.Away ↑r) (Localization.Away (↑f ↑r))
s₁ : (r : { x // x ∈ s }) → Finset (Localization.Away (↑f ↑r))
s₂ : ∀ (r : { x // x ∈ s }), Algebra.adjoin (Localization.Away ↑r) ↑(s₁ r) = ⊤
sf : (x : { x // x ∈ s }) → Finset ((fun x => S) ↑x) :=
  fun x => IsLocalization.finsetIntegerMultiple (Submonoid.powers (↑f ↑x)) (s₁ x)
x : S
r : ↑↑s
⊢ ↑(algebraMap S (Localization.Away (↑f ↑r))) x ∈ ⊤
[PROOFSTEP]
trivial
[GOAL]
case intro.mk.intro
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Finset R
hs : Ideal.span ↑s = ⊤
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : (r : { x // x ∈ s }) → Algebra (Localization.Away ↑r) (Localization.Away (↑f ↑r)) :=
  fun r => RingHom.toAlgebra (Localization.awayMap f ↑r)
this✝ :
  ∀ (r : { x // x ∈ s }),
    IsLocalization (Submonoid.map (algebraMap R S) (Submonoid.powers ↑r)) (Localization.Away (↑f ↑r))
this : ∀ (r : { x // x ∈ s }), IsScalarTower R (Localization.Away ↑r) (Localization.Away (↑f ↑r))
s₁ : (r : { x // x ∈ s }) → Finset (Localization.Away (↑f ↑r))
s₂ : ∀ (r : { x // x ∈ s }), Algebra.adjoin (Localization.Away ↑r) ↑(s₁ r) = ⊤
sf : (x : { x // x ∈ s }) → Finset ((fun x => S) ↑x) :=
  fun x => IsLocalization.finsetIntegerMultiple (Submonoid.powers (↑f ↑x)) (s₁ x)
x : S
r : ↑↑s
n₁ : ℕ
hn₁ :
  { val := (fun x x_1 => x ^ x_1) (↑r) n₁,
        property := (_ : ∃ y, (fun x x_1 => x ^ x_1) (↑r) y = (fun x x_1 => x ^ x_1) (↑r) n₁) } •
      ↑(algebraMap S (Localization.Away (↑f ↑r))) x ∈
    Algebra.adjoin R ↑(s₁ r)
⊢ ∃ n, ↑r ^ n • x ∈ ↑Subalgebra.toSubmodule (⨆ (x : { x // x ∈ s }), Algebra.adjoin R ↑(sf x))
[PROOFSTEP]
rw [Submonoid.smul_def, Algebra.smul_def, IsScalarTower.algebraMap_apply R S, ← map_mul] at hn₁
[GOAL]
case intro.mk.intro
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Finset R
hs : Ideal.span ↑s = ⊤
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : (r : { x // x ∈ s }) → Algebra (Localization.Away ↑r) (Localization.Away (↑f ↑r)) :=
  fun r => RingHom.toAlgebra (Localization.awayMap f ↑r)
this✝ :
  ∀ (r : { x // x ∈ s }),
    IsLocalization (Submonoid.map (algebraMap R S) (Submonoid.powers ↑r)) (Localization.Away (↑f ↑r))
this : ∀ (r : { x // x ∈ s }), IsScalarTower R (Localization.Away ↑r) (Localization.Away (↑f ↑r))
s₁ : (r : { x // x ∈ s }) → Finset (Localization.Away (↑f ↑r))
s₂ : ∀ (r : { x // x ∈ s }), Algebra.adjoin (Localization.Away ↑r) ↑(s₁ r) = ⊤
sf : (x : { x // x ∈ s }) → Finset ((fun x => S) ↑x) :=
  fun x => IsLocalization.finsetIntegerMultiple (Submonoid.powers (↑f ↑x)) (s₁ x)
x : S
r : ↑↑s
n₁ : ℕ
hn₁ :
  ↑(algebraMap S (Localization.Away (↑f ↑r)))
      (↑(algebraMap R S)
          ↑{ val := (fun x x_1 => x ^ x_1) (↑r) n₁,
              property := (_ : ∃ y, (fun x x_1 => x ^ x_1) (↑r) y = (fun x x_1 => x ^ x_1) (↑r) n₁) } *
        x) ∈
    Algebra.adjoin R ↑(s₁ r)
⊢ ∃ n, ↑r ^ n • x ∈ ↑Subalgebra.toSubmodule (⨆ (x : { x // x ∈ s }), Algebra.adjoin R ↑(sf x))
[PROOFSTEP]
obtain ⟨⟨_, n₂, rfl⟩, hn₂⟩ :=
  IsLocalization.lift_mem_adjoin_finsetIntegerMultiple (Submonoid.powers (r : R)) _ (s₁ r) hn₁
[GOAL]
case intro.mk.intro.intro.mk.intro
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Finset R
hs : Ideal.span ↑s = ⊤
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : (r : { x // x ∈ s }) → Algebra (Localization.Away ↑r) (Localization.Away (↑f ↑r)) :=
  fun r => RingHom.toAlgebra (Localization.awayMap f ↑r)
this✝ :
  ∀ (r : { x // x ∈ s }),
    IsLocalization (Submonoid.map (algebraMap R S) (Submonoid.powers ↑r)) (Localization.Away (↑f ↑r))
this : ∀ (r : { x // x ∈ s }), IsScalarTower R (Localization.Away ↑r) (Localization.Away (↑f ↑r))
s₁ : (r : { x // x ∈ s }) → Finset (Localization.Away (↑f ↑r))
s₂ : ∀ (r : { x // x ∈ s }), Algebra.adjoin (Localization.Away ↑r) ↑(s₁ r) = ⊤
sf : (x : { x // x ∈ s }) → Finset ((fun x => S) ↑x) :=
  fun x => IsLocalization.finsetIntegerMultiple (Submonoid.powers (↑f ↑x)) (s₁ x)
x : S
r : ↑↑s
n₁ : ℕ
hn₁ :
  ↑(algebraMap S (Localization.Away (↑f ↑r)))
      (↑(algebraMap R S)
          ↑{ val := (fun x x_1 => x ^ x_1) (↑r) n₁,
              property := (_ : ∃ y, (fun x x_1 => x ^ x_1) (↑r) y = (fun x x_1 => x ^ x_1) (↑r) n₁) } *
        x) ∈
    Algebra.adjoin R ↑(s₁ r)
n₂ : ℕ
hn₂ :
  { val := (fun x x_1 => x ^ x_1) (↑r) n₂,
        property := (_ : ∃ y, (fun x x_1 => x ^ x_1) (↑r) y = (fun x x_1 => x ^ x_1) (↑r) n₂) } •
      (↑(algebraMap R S)
          ↑{ val := (fun x x_1 => x ^ x_1) (↑r) n₁,
              property := (_ : ∃ y, (fun x x_1 => x ^ x_1) (↑r) y = (fun x x_1 => x ^ x_1) (↑r) n₁) } *
        x) ∈
    Algebra.adjoin R
      ↑(IsLocalization.finsetIntegerMultiple (Submonoid.map (algebraMap R S) (Submonoid.powers ↑r)) (s₁ r))
⊢ ∃ n, ↑r ^ n • x ∈ ↑Subalgebra.toSubmodule (⨆ (x : { x // x ∈ s }), Algebra.adjoin R ↑(sf x))
[PROOFSTEP]
rw [Submonoid.smul_def, ← Algebra.smul_def, smul_smul, Subtype.coe_mk, ← pow_add] at hn₂
[GOAL]
case intro.mk.intro.intro.mk.intro
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Finset R
hs : Ideal.span ↑s = ⊤
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : (r : { x // x ∈ s }) → Algebra (Localization.Away ↑r) (Localization.Away (↑f ↑r)) :=
  fun r => RingHom.toAlgebra (Localization.awayMap f ↑r)
this✝ :
  ∀ (r : { x // x ∈ s }),
    IsLocalization (Submonoid.map (algebraMap R S) (Submonoid.powers ↑r)) (Localization.Away (↑f ↑r))
this : ∀ (r : { x // x ∈ s }), IsScalarTower R (Localization.Away ↑r) (Localization.Away (↑f ↑r))
s₁ : (r : { x // x ∈ s }) → Finset (Localization.Away (↑f ↑r))
s₂ : ∀ (r : { x // x ∈ s }), Algebra.adjoin (Localization.Away ↑r) ↑(s₁ r) = ⊤
sf : (x : { x // x ∈ s }) → Finset ((fun x => S) ↑x) :=
  fun x => IsLocalization.finsetIntegerMultiple (Submonoid.powers (↑f ↑x)) (s₁ x)
x : S
r : ↑↑s
n₁ : ℕ
hn₁ :
  ↑(algebraMap S (Localization.Away (↑f ↑r)))
      (↑(algebraMap R S)
          ↑{ val := (fun x x_1 => x ^ x_1) (↑r) n₁,
              property := (_ : ∃ y, (fun x x_1 => x ^ x_1) (↑r) y = (fun x x_1 => x ^ x_1) (↑r) n₁) } *
        x) ∈
    Algebra.adjoin R ↑(s₁ r)
n₂ : ℕ
hn₂ :
  ↑r ^ (n₂ + n₁) • x ∈
    Algebra.adjoin R
      ↑(IsLocalization.finsetIntegerMultiple (Submonoid.map (algebraMap R S) (Submonoid.powers ↑r)) (s₁ r))
⊢ ∃ n, ↑r ^ n • x ∈ ↑Subalgebra.toSubmodule (⨆ (x : { x // x ∈ s }), Algebra.adjoin R ↑(sf x))
[PROOFSTEP]
simp_rw [Submonoid.map_powers] at hn₂
[GOAL]
case intro.mk.intro.intro.mk.intro
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Finset R
hs : Ideal.span ↑s = ⊤
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : (r : { x // x ∈ s }) → Algebra (Localization.Away ↑r) (Localization.Away (↑f ↑r)) :=
  fun r => RingHom.toAlgebra (Localization.awayMap f ↑r)
this✝ :
  ∀ (r : { x // x ∈ s }),
    IsLocalization (Submonoid.map (algebraMap R S) (Submonoid.powers ↑r)) (Localization.Away (↑f ↑r))
this : ∀ (r : { x // x ∈ s }), IsScalarTower R (Localization.Away ↑r) (Localization.Away (↑f ↑r))
s₁ : (r : { x // x ∈ s }) → Finset (Localization.Away (↑f ↑r))
s₂ : ∀ (r : { x // x ∈ s }), Algebra.adjoin (Localization.Away ↑r) ↑(s₁ r) = ⊤
sf : (x : { x // x ∈ s }) → Finset ((fun x => S) ↑x) :=
  fun x => IsLocalization.finsetIntegerMultiple (Submonoid.powers (↑f ↑x)) (s₁ x)
x : S
r : ↑↑s
n₁ : ℕ
hn₁ :
  ↑(algebraMap S (Localization.Away (↑f ↑r)))
      (↑(algebraMap R S)
          ↑{ val := (fun x x_1 => x ^ x_1) (↑r) n₁,
              property := (_ : ∃ y, (fun x x_1 => x ^ x_1) (↑r) y = (fun x x_1 => x ^ x_1) (↑r) n₁) } *
        x) ∈
    Algebra.adjoin R ↑(s₁ r)
n₂ : ℕ
hn₂ :
  ↑r ^ (n₂ + n₁) • x ∈
    Algebra.adjoin R ↑(IsLocalization.finsetIntegerMultiple (Submonoid.powers (↑(algebraMap R S) ↑r)) (s₁ r))
⊢ ∃ n, ↑r ^ n • x ∈ ↑Subalgebra.toSubmodule (⨆ (x : { x // x ∈ s }), Algebra.adjoin R ↑(sf x))
[PROOFSTEP]
use n₂ + n₁
[GOAL]
case h
R✝ S✝ : Type u
inst✝⁷ : CommRing R✝
inst✝⁶ : CommRing S✝
M : Submonoid R✝
N : Submonoid S✝
R' S' : Type u
inst✝⁵ : CommRing R'
inst✝⁴ : CommRing S'
f✝ : R✝ →+* S✝
inst✝³ : Algebra R✝ R'
inst✝² : Algebra S✝ S'
R S : Type u_1
inst✝¹ : CommRing R
inst✝ : CommRing S
f : R →+* S
s : Finset R
hs : Ideal.span ↑s = ⊤
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : (r : { x // x ∈ s }) → Algebra (Localization.Away ↑r) (Localization.Away (↑f ↑r)) :=
  fun r => RingHom.toAlgebra (Localization.awayMap f ↑r)
this✝ :
  ∀ (r : { x // x ∈ s }),
    IsLocalization (Submonoid.map (algebraMap R S) (Submonoid.powers ↑r)) (Localization.Away (↑f ↑r))
this : ∀ (r : { x // x ∈ s }), IsScalarTower R (Localization.Away ↑r) (Localization.Away (↑f ↑r))
s₁ : (r : { x // x ∈ s }) → Finset (Localization.Away (↑f ↑r))
s₂ : ∀ (r : { x // x ∈ s }), Algebra.adjoin (Localization.Away ↑r) ↑(s₁ r) = ⊤
sf : (x : { x // x ∈ s }) → Finset ((fun x => S) ↑x) :=
  fun x => IsLocalization.finsetIntegerMultiple (Submonoid.powers (↑f ↑x)) (s₁ x)
x : S
r : ↑↑s
n₁ : ℕ
hn₁ :
  ↑(algebraMap S (Localization.Away (↑f ↑r)))
      (↑(algebraMap R S)
          ↑{ val := (fun x x_1 => x ^ x_1) (↑r) n₁,
              property := (_ : ∃ y, (fun x x_1 => x ^ x_1) (↑r) y = (fun x x_1 => x ^ x_1) (↑r) n₁) } *
        x) ∈
    Algebra.adjoin R ↑(s₁ r)
n₂ : ℕ
hn₂ :
  ↑r ^ (n₂ + n₁) • x ∈
    Algebra.adjoin R ↑(IsLocalization.finsetIntegerMultiple (Submonoid.powers (↑(algebraMap R S) ↑r)) (s₁ r))
⊢ ↑r ^ (n₂ + n₁) • x ∈ ↑Subalgebra.toSubmodule (⨆ (x : { x // x ∈ s }), Algebra.adjoin R ↑(sf x))
[PROOFSTEP]
exact le_iSup (fun x : s => Algebra.adjoin R (sf x : Set S)) r hn₂