Theorem: IsLocalization.localization_localization_surj
File: Mathlib/RingTheory/Localization/LocalizationLocalization.lean

tactic: rcases IsLocalization.surj N x with ⟨⟨y, s⟩, eq₁⟩
state_before: R : Type u_3
inst✝⁹ : CommRing R
M : Submonoid R
S : Type u_1
inst✝⁸ : CommRing S
inst✝⁷ : Algebra R S
P : Type ?u.84572
inst✝⁶ : CommRing P
N : Submonoid S
T : Type u_2
inst✝⁵ : CommRing T
inst✝⁴ : Algebra R T
inst✝³ : Algebra S T
inst✝² : IsScalarTower R S T
inst✝¹ : IsLocalization M S
inst✝ : IsLocalization N T
x : T
⊢ ∃ y, x * ↑(algebraMap R T) ↑y.snd = ↑(algebraMap R T) y.fst

tactic: rcases IsLocalization.surj M y with ⟨⟨z, t⟩, eq₂⟩
state_before: case intro.mk
R : Type u_3
inst✝⁹ : CommRing R
M : Submonoid R
S : Type u_1
inst✝⁸ : CommRing S
inst✝⁷ : Algebra R S
P : Type ?u.84572
inst✝⁶ : CommRing P
N : Submonoid S
T : Type u_2
inst✝⁵ : CommRing T
inst✝⁴ : Algebra R T
inst✝³ : Algebra S T
inst✝² : IsScalarTower R S T
inst✝¹ : IsLocalization M S
inst✝ : IsLocalization N T
x : T
y : S
s : { x // x ∈ N }
eq₁ : x * ↑(algebraMap S T) ↑(y, s).snd = ↑(algebraMap S T) (y, s).fst
⊢ ∃ y, x * ↑(algebraMap R T) ↑y.snd = ↑(algebraMap R T) y.fst

tactic: rcases IsLocalization.surj M (s : S) with ⟨⟨z', t'⟩, eq₃⟩
state_before: case intro.mk.intro.mk
R : Type u_3
inst✝⁹ : CommRing R
M : Submonoid R
S : Type u_1
inst✝⁸ : CommRing S
inst✝⁷ : Algebra R S
P : Type ?u.84572
inst✝⁶ : CommRing P
N : Submonoid S
T : Type u_2
inst✝⁵ : CommRing T
inst✝⁴ : Algebra R T
inst✝³ : Algebra S T
inst✝² : IsScalarTower R S T
inst✝¹ : IsLocalization M S
inst✝ : IsLocalization N T
x : T
y : S
s : { x // x ∈ N }
eq₁ : x * ↑(algebraMap S T) ↑(y, s).snd = ↑(algebraMap S T) (y, s).fst
z : R
t : { x // x ∈ M }
eq₂ : y * ↑(algebraMap R S) ↑(z, t).snd = ↑(algebraMap R S) (z, t).fst
⊢ ∃ y, x * ↑(algebraMap R T) ↑y.snd = ↑(algebraMap R T) y.fst

tactic: dsimp only at eq₁ eq₂ eq₃
state_before: case intro.mk.intro.mk.intro.mk
R : Type u_3
inst✝⁹ : CommRing R
M : Submonoid R
S : Type u_1
inst✝⁸ : CommRing S
inst✝⁷ : Algebra R S
P : Type ?u.84572
inst✝⁶ : CommRing P
N : Submonoid S
T : Type u_2
inst✝⁵ : CommRing T
inst✝⁴ : Algebra R T
inst✝³ : Algebra S T
inst✝² : IsScalarTower R S T
inst✝¹ : IsLocalization M S
inst✝ : IsLocalization N T
x : T
y : S
s : { x // x ∈ N }
eq₁ : x * ↑(algebraMap S T) ↑(y, s).snd = ↑(algebraMap S T) (y, s).fst
z : R
t : { x // x ∈ M }
eq₂ : y * ↑(algebraMap R S) ↑(z, t).snd = ↑(algebraMap R S) (z, t).fst
z' : R
t' : { x // x ∈ M }
eq₃ : ↑s * ↑(algebraMap R S) ↑(z', t').snd = ↑(algebraMap R S) (z', t').fst
⊢ ∃ y, x * ↑(algebraMap R T) ↑y.snd = ↑(algebraMap R T) y.fst

tactic: refine ⟨⟨z * t', z' * t, ?_⟩, ?_⟩
state_before: case intro.mk.intro.mk.intro.mk
R : Type u_3
inst✝⁹ : CommRing R
M : Submonoid R
S : Type u_1
inst✝⁸ : CommRing S
inst✝⁷ : Algebra R S
P : Type ?u.84572
inst✝⁶ : CommRing P
N : Submonoid S
T : Type u_2
inst✝⁵ : CommRing T
inst✝⁴ : Algebra R T
inst✝³ : Algebra S T
inst✝² : IsScalarTower R S T
inst✝¹ : IsLocalization M S
inst✝ : IsLocalization N T
x : T
y : S
s : { x // x ∈ N }
eq₁ : x * ↑(algebraMap S T) ↑s = ↑(algebraMap S T) y
z : R
t : { x // x ∈ M }
eq₂ : y * ↑(algebraMap R S) ↑t = ↑(algebraMap R S) z
z' : R
t' : { x // x ∈ M }
eq₃ : ↑s * ↑(algebraMap R S) ↑t' = ↑(algebraMap R S) z'
⊢ ∃ y, x * ↑(algebraMap R T) ↑y.snd = ↑(algebraMap R T) y.fst

tactic: rw [mem_localizationLocalizationSubmodule]
state_before: case intro.mk.intro.mk.intro.mk.refine_1
R : Type u_3
inst✝⁹ : CommRing R
M : Submonoid R
S : Type u_1
inst✝⁸ : CommRing S
inst✝⁷ : Algebra R S
P : Type ?u.84572
inst✝⁶ : CommRing P
N : Submonoid S
T : Type u_2
inst✝⁵ : CommRing T
inst✝⁴ : Algebra R T
inst✝³ : Algebra S T
inst✝² : IsScalarTower R S T
inst✝¹ : IsLocalization M S
inst✝ : IsLocalization N T
x : T
y : S
s : { x // x ∈ N }
eq₁ : x * ↑(algebraMap S T) ↑s = ↑(algebraMap S T) y
z : R
t : { x // x ∈ M }
eq₂ : y * ↑(algebraMap R S) ↑t = ↑(algebraMap R S) z
z' : R
t' : { x // x ∈ M }
eq₃ : ↑s * ↑(algebraMap R S) ↑t' = ↑(algebraMap R S) z'
⊢ z' * ↑t ∈ localizationLocalizationSubmodule M N

tactic: refine' ⟨s, t * t', _⟩
state_before: case intro.mk.intro.mk.intro.mk.refine_1
R : Type u_3
inst✝⁹ : CommRing R
M : Submonoid R
S : Type u_1
inst✝⁸ : CommRing S
inst✝⁷ : Algebra R S
P : Type ?u.84572
inst✝⁶ : CommRing P
N : Submonoid S
T : Type u_2
inst✝⁵ : CommRing T
inst✝⁴ : Algebra R T
inst✝³ : Algebra S T
inst✝² : IsScalarTower R S T
inst✝¹ : IsLocalization M S
inst✝ : IsLocalization N T
x : T
y : S
s : { x // x ∈ N }
eq₁ : x * ↑(algebraMap S T) ↑s = ↑(algebraMap S T) y
z : R
t : { x // x ∈ M }
eq₂ : y * ↑(algebraMap R S) ↑t = ↑(algebraMap R S) z
z' : R
t' : { x // x ∈ M }
eq₃ : ↑s * ↑(algebraMap R S) ↑t' = ↑(algebraMap R S) z'
⊢ ∃ y z, ↑(algebraMap R S) (z' * ↑t) = ↑y * ↑(algebraMap R S) ↑z

tactic: rw [RingHom.map_mul, ← eq₃, mul_assoc, ← RingHom.map_mul, mul_comm t, Submonoid.coe_mul]
state_before: case intro.mk.intro.mk.intro.mk.refine_1
R : Type u_3
inst✝⁹ : CommRing R
M : Submonoid R
S : Type u_1
inst✝⁸ : CommRing S
inst✝⁷ : Algebra R S
P : Type ?u.84572
inst✝⁶ : CommRing P
N : Submonoid S
T : Type u_2
inst✝⁵ : CommRing T
inst✝⁴ : Algebra R T
inst✝³ : Algebra S T
inst✝² : IsScalarTower R S T
inst✝¹ : IsLocalization M S
inst✝ : IsLocalization N T
x : T
y : S
s : { x // x ∈ N }
eq₁ : x * ↑(algebraMap S T) ↑s = ↑(algebraMap S T) y
z : R
t : { x // x ∈ M }
eq₂ : y * ↑(algebraMap R S) ↑t = ↑(algebraMap R S) z
z' : R
t' : { x // x ∈ M }
eq₃ : ↑s * ↑(algebraMap R S) ↑t' = ↑(algebraMap R S) z'
⊢ ↑(algebraMap R S) (z' * ↑t) = ↑s * ↑(algebraMap R S) ↑(t * t')

tactic: simp only [Subtype.coe_mk, RingHom.map_mul, IsScalarTower.algebraMap_apply R S T, ← eq₃, ← eq₂,
  ← eq₁]
state_before: case intro.mk.intro.mk.intro.mk.refine_2
R : Type u_3
inst✝⁹ : CommRing R
M : Submonoid R
S : Type u_1
inst✝⁸ : CommRing S
inst✝⁷ : Algebra R S
P : Type ?u.84572
inst✝⁶ : CommRing P
N : Submonoid S
T : Type u_2
inst✝⁵ : CommRing T
inst✝⁴ : Algebra R T
inst✝³ : Algebra S T
inst✝² : IsScalarTower R S T
inst✝¹ : IsLocalization M S
inst✝ : IsLocalization N T
x : T
y : S
s : { x // x ∈ N }
eq₁ : x * ↑(algebraMap S T) ↑s = ↑(algebraMap S T) y
z : R
t : { x // x ∈ M }
eq₂ : y * ↑(algebraMap R S) ↑t = ↑(algebraMap R S) z
z' : R
t' : { x // x ∈ M }
eq₃ : ↑s * ↑(algebraMap R S) ↑t' = ↑(algebraMap R S) z'
⊢ x *
      ↑(algebraMap R T)
        ↑(z * ↑t', { val := z' * ↑t, property := (_ : z' * ↑t ∈ localizationLocalizationSubmodule M N) }).snd =
    ↑(algebraMap R T)
      (z * ↑t', { val := z' * ↑t, property := (_ : z' * ↑t ∈ localizationLocalizationSubmodule M N) }).fst

tactic: ring
state_before: case intro.mk.intro.mk.intro.mk.refine_2
R : Type u_3
inst✝⁹ : CommRing R
M : Submonoid R
S : Type u_1
inst✝⁸ : CommRing S
inst✝⁷ : Algebra R S
P : Type ?u.84572
inst✝⁶ : CommRing P
N : Submonoid S
T : Type u_2
inst✝⁵ : CommRing T
inst✝⁴ : Algebra R T
inst✝³ : Algebra S T
inst✝² : IsScalarTower R S T
inst✝¹ : IsLocalization M S
inst✝ : IsLocalization N T
x : T
y : S
s : { x // x ∈ N }
eq₁ : x * ↑(algebraMap S T) ↑s = ↑(algebraMap S T) y
z : R
t : { x // x ∈ M }
eq₂ : y * ↑(algebraMap R S) ↑t = ↑(algebraMap R S) z
z' : R
t' : { x // x ∈ M }
eq₃ : ↑s * ↑(algebraMap R S) ↑t' = ↑(algebraMap R S) z'
⊢ x * (↑(algebraMap S T) ↑s * ↑(algebraMap S T) (↑(algebraMap R S) ↑t') * ↑(algebraMap S T) (↑(algebraMap R S) ↑t)) =
    x * ↑(algebraMap S T) ↑s * ↑(algebraMap S T) (↑(algebraMap R S) ↑t) * ↑(algebraMap S T) (↑(algebraMap R S) ↑t')