Theorem: IsLocalization.mem_span_iff
File: Mathlib/RingTheory/Localization/Submodule.lean

tactic: constructor
state_before: R : Type u_2
inst✝¹¹ : CommRing R
M : Submonoid R
S : Type u_3
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra R S
P : Type ?u.169815
inst✝⁸ : CommRing P
g : R →+* P
T : Submonoid P
hy : M ≤ Submonoid.comap g T
Q : Type ?u.170647
inst✝⁷ : CommRing Q
inst✝⁶ : Algebra P Q
inst✝⁵ : IsLocalization T Q
inst✝⁴ : IsLocalization M S
N : Type u_1
inst✝³ : AddCommGroup N
inst✝² : Module R N
inst✝¹ : Module S N
inst✝ : IsScalarTower R S N
x : N
a : Set N
⊢ x ∈ Submodule.span S a ↔ ∃ y, y ∈ Submodule.span R a ∧ ∃ z, x = mk' S 1 z • y

tactic: intro h
state_before: case mp
R : Type u_2
inst✝¹¹ : CommRing R
M : Submonoid R
S : Type u_3
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra R S
P : Type ?u.169815
inst✝⁸ : CommRing P
g : R →+* P
T : Submonoid P
hy : M ≤ Submonoid.comap g T
Q : Type ?u.170647
inst✝⁷ : CommRing Q
inst✝⁶ : Algebra P Q
inst✝⁵ : IsLocalization T Q
inst✝⁴ : IsLocalization M S
N : Type u_1
inst✝³ : AddCommGroup N
inst✝² : Module R N
inst✝¹ : Module S N
inst✝ : IsScalarTower R S N
x : N
a : Set N
⊢ x ∈ Submodule.span S a → ∃ y, y ∈ Submodule.span R a ∧ ∃ z, x = mk' S 1 z • y

case mpr
R : Type u_2
inst✝¹¹ : CommRing R
M : Submonoid R
S : Type u_3
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra R S
P : Type ?u.169815
inst✝⁸ : CommRing P
g : R →+* P
T : Submonoid P
hy : M ≤ Submonoid.comap g T
Q : Type ?u.170647
inst✝⁷ : CommRing Q
inst✝⁶ : Algebra P Q
inst✝⁵ : IsLocalization T Q
inst✝⁴ : IsLocalization M S
N : Type u_1
inst✝³ : AddCommGroup N
inst✝² : Module R N
inst✝¹ : Module S N
inst✝ : IsScalarTower R S N
x : N
a : Set N
⊢ (∃ y, y ∈ Submodule.span R a ∧ ∃ z, x = mk' S 1 z • y) → x ∈ Submodule.span S a

tactic: refine' Submodule.span_induction h _ _ _ _
state_before: case mp
R : Type u_2
inst✝¹¹ : CommRing R
M : Submonoid R
S : Type u_3
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra R S
P : Type ?u.169815
inst✝⁸ : CommRing P
g : R →+* P
T : Submonoid P
hy : M ≤ Submonoid.comap g T
Q : Type ?u.170647
inst✝⁷ : CommRing Q
inst✝⁶ : Algebra P Q
inst✝⁵ : IsLocalization T Q
inst✝⁴ : IsLocalization M S
N : Type u_1
inst✝³ : AddCommGroup N
inst✝² : Module R N
inst✝¹ : Module S N
inst✝ : IsScalarTower R S N
x : N
a : Set N
h : x ∈ Submodule.span S a
⊢ ∃ y, y ∈ Submodule.span R a ∧ ∃ z, x = mk' S 1 z • y

tactic: rintro x hx
state_before: case mp.refine'_1
R : Type u_2
inst✝¹¹ : CommRing R
M : Submonoid R
S : Type u_3
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra R S
P : Type ?u.169815
inst✝⁸ : CommRing P
g : R →+* P
T : Submonoid P
hy : M ≤ Submonoid.comap g T
Q : Type ?u.170647
inst✝⁷ : CommRing Q
inst✝⁶ : Algebra P Q
inst✝⁵ : IsLocalization T Q
inst✝⁴ : IsLocalization M S
N : Type u_1
inst✝³ : AddCommGroup N
inst✝² : Module R N
inst✝¹ : Module S N
inst✝ : IsScalarTower R S N
x : N
a : Set N
h : x ∈ Submodule.span S a
⊢ ∀ (x : N), x ∈ a → ∃ y, y ∈ Submodule.span R a ∧ ∃ z, x = mk' S 1 z • y

tactic: exact ⟨x, Submodule.subset_span hx, 1, by rw [mk'_one, _root_.map_one, one_smul]⟩
state_before: case mp.refine'_1
R : Type u_2
inst✝¹¹ : CommRing R
M : Submonoid R
S : Type u_3
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra R S
P : Type ?u.169815
inst✝⁸ : CommRing P
g : R →+* P
T : Submonoid P
hy : M ≤ Submonoid.comap g T
Q : Type ?u.170647
inst✝⁷ : CommRing Q
inst✝⁶ : Algebra P Q
inst✝⁵ : IsLocalization T Q
inst✝⁴ : IsLocalization M S
N : Type u_1
inst✝³ : AddCommGroup N
inst✝² : Module R N
inst✝¹ : Module S N
inst✝ : IsScalarTower R S N
x✝ : N
a : Set N
h : x✝ ∈ Submodule.span S a
x : N
hx : x ∈ a
⊢ ∃ y, y ∈ Submodule.span R a ∧ ∃ z, x = mk' S 1 z • y

tactic: rw [mk'_one, _root_.map_one, one_smul]
state_before: R : Type u_2
inst✝¹¹ : CommRing R
M : Submonoid R
S : Type u_3
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra R S
P : Type ?u.169815
inst✝⁸ : CommRing P
g : R →+* P
T : Submonoid P
hy : M ≤ Submonoid.comap g T
Q : Type ?u.170647
inst✝⁷ : CommRing Q
inst✝⁶ : Algebra P Q
inst✝⁵ : IsLocalization T Q
inst✝⁴ : IsLocalization M S
N : Type u_1
inst✝³ : AddCommGroup N
inst✝² : Module R N
inst✝¹ : Module S N
inst✝ : IsScalarTower R S N
x✝ : N
a : Set N
h : x✝ ∈ Submodule.span S a
x : N
hx : x ∈ a
⊢ x = mk' S 1 1 • x

tactic: exact ⟨0, Submodule.zero_mem _, 1, by rw [mk'_one, _root_.map_one, one_smul]⟩
state_before: case mp.refine'_2
R : Type u_2
inst✝¹¹ : CommRing R
M : Submonoid R
S : Type u_3
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra R S
P : Type ?u.169815
inst✝⁸ : CommRing P
g : R →+* P
T : Submonoid P
hy : M ≤ Submonoid.comap g T
Q : Type ?u.170647
inst✝⁷ : CommRing Q
inst✝⁶ : Algebra P Q
inst✝⁵ : IsLocalization T Q
inst✝⁴ : IsLocalization M S
N : Type u_1
inst✝³ : AddCommGroup N
inst✝² : Module R N
inst✝¹ : Module S N
inst✝ : IsScalarTower R S N
x : N
a : Set N
h : x ∈ Submodule.span S a
⊢ ∃ y, y ∈ Submodule.span R a ∧ ∃ z, 0 = mk' S 1 z • y

tactic: rw [mk'_one, _root_.map_one, one_smul]
state_before: R : Type u_2
inst✝¹¹ : CommRing R
M : Submonoid R
S : Type u_3
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra R S
P : Type ?u.169815
inst✝⁸ : CommRing P
g : R →+* P
T : Submonoid P
hy : M ≤ Submonoid.comap g T
Q : Type ?u.170647
inst✝⁷ : CommRing Q
inst✝⁶ : Algebra P Q
inst✝⁵ : IsLocalization T Q
inst✝⁴ : IsLocalization M S
N : Type u_1
inst✝³ : AddCommGroup N
inst✝² : Module R N
inst✝¹ : Module S N
inst✝ : IsScalarTower R S N
x : N
a : Set N
h : x ∈ Submodule.span S a
⊢ 0 = mk' S 1 1 • 0

tactic: rintro _ _ ⟨y, hy, z, rfl⟩ ⟨y', hy', z', rfl⟩
state_before: case mp.refine'_3
R : Type u_2
inst✝¹¹ : CommRing R
M : Submonoid R
S : Type u_3
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra R S
P : Type ?u.169815
inst✝⁸ : CommRing P
g : R →+* P
T : Submonoid P
hy : M ≤ Submonoid.comap g T
Q : Type ?u.170647
inst✝⁷ : CommRing Q
inst✝⁶ : Algebra P Q
inst✝⁵ : IsLocalization T Q
inst✝⁴ : IsLocalization M S
N : Type u_1
inst✝³ : AddCommGroup N
inst✝² : Module R N
inst✝¹ : Module S N
inst✝ : IsScalarTower R S N
x : N
a : Set N
h : x ∈ Submodule.span S a
⊢ ∀ (x y : N),
    (∃ y, y ∈ Submodule.span R a ∧ ∃ z, x = mk' S 1 z • y) →
      (∃ y_1, y_1 ∈ Submodule.span R a ∧ ∃ z, y = mk' S 1 z • y_1) →
        ∃ y_1, y_1 ∈ Submodule.span R a ∧ ∃ z, x + y = mk' S 1 z • y_1

tactic: refine'
  ⟨(z' : R) • y + (z : R) • y',
    Submodule.add_mem _ (Submodule.smul_mem _ _ hy) (Submodule.smul_mem _ _ hy'), z * z', _⟩
state_before: case mp.refine'_3.intro.intro.intro.intro.intro.intro
R : Type u_2
inst✝¹¹ : CommRing R
M : Submonoid R
S : Type u_3
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra R S
P : Type ?u.169815
inst✝⁸ : CommRing P
g : R →+* P
T : Submonoid P
hy✝ : M ≤ Submonoid.comap g T
Q : Type ?u.170647
inst✝⁷ : CommRing Q
inst✝⁶ : Algebra P Q
inst✝⁵ : IsLocalization T Q
inst✝⁴ : IsLocalization M S
N : Type u_1
inst✝³ : AddCommGroup N
inst✝² : Module R N
inst✝¹ : Module S N
inst✝ : IsScalarTower R S N
x : N
a : Set N
h : x ∈ Submodule.span S a
y : N
hy : y ∈ Submodule.span R a
z : { x // x ∈ M }
y' : N
hy' : y' ∈ Submodule.span R a
z' : { x // x ∈ M }
⊢ ∃ y_1, y_1 ∈ Submodule.span R a ∧ ∃ z_1, mk' S 1 z • y + mk' S 1 z' • y' = mk' S 1 z_1 • y_1

tactic: rw [smul_add, ← IsScalarTower.algebraMap_smul S (z : R), ←
  IsScalarTower.algebraMap_smul S (z' : R), smul_smul, smul_smul]
state_before: case mp.refine'_3.intro.intro.intro.intro.intro.intro
R : Type u_2
inst✝¹¹ : CommRing R
M : Submonoid R
S : Type u_3
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra R S
P : Type ?u.169815
inst✝⁸ : CommRing P
g : R →+* P
T : Submonoid P
hy✝ : M ≤ Submonoid.comap g T
Q : Type ?u.170647
inst✝⁷ : CommRing Q
inst✝⁶ : Algebra P Q
inst✝⁵ : IsLocalization T Q
inst✝⁴ : IsLocalization M S
N : Type u_1
inst✝³ : AddCommGroup N
inst✝² : Module R N
inst✝¹ : Module S N
inst✝ : IsScalarTower R S N
x : N
a : Set N
h : x ∈ Submodule.span S a
y : N
hy : y ∈ Submodule.span R a
z : { x // x ∈ M }
y' : N
hy' : y' ∈ Submodule.span R a
z' : { x // x ∈ M }
⊢ mk' S 1 z • y + mk' S 1 z' • y' = mk' S 1 (z * z') • (↑z' • y + ↑z • y')

tactic: congr 1
state_before: case mp.refine'_3.intro.intro.intro.intro.intro.intro
R : Type u_2
inst✝¹¹ : CommRing R
M : Submonoid R
S : Type u_3
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra R S
P : Type ?u.169815
inst✝⁸ : CommRing P
g : R →+* P
T : Submonoid P
hy✝ : M ≤ Submonoid.comap g T
Q : Type ?u.170647
inst✝⁷ : CommRing Q
inst✝⁶ : Algebra P Q
inst✝⁵ : IsLocalization T Q
inst✝⁴ : IsLocalization M S
N : Type u_1
inst✝³ : AddCommGroup N
inst✝² : Module R N
inst✝¹ : Module S N
inst✝ : IsScalarTower R S N
x : N
a : Set N
h : x ∈ Submodule.span S a
y : N
hy : y ∈ Submodule.span R a
z : { x // x ∈ M }
y' : N
hy' : y' ∈ Submodule.span R a
z' : { x // x ∈ M }
⊢ mk' S 1 z • y + mk' S 1 z' • y' =
    (mk' S 1 (z * z') * ↑(algebraMap R S) ↑z') • y + (mk' S 1 (z * z') * ↑(algebraMap R S) ↑z) • y'

tactic: rw [← mul_one (1 : R), mk'_mul, mul_assoc, mk'_spec, _root_.map_one, mul_one, mul_one]
state_before: case mp.refine'_3.intro.intro.intro.intro.intro.intro.e_a
R : Type u_2
inst✝¹¹ : CommRing R
M : Submonoid R
S : Type u_3
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra R S
P : Type ?u.169815
inst✝⁸ : CommRing P
g : R →+* P
T : Submonoid P
hy✝ : M ≤ Submonoid.comap g T
Q : Type ?u.170647
inst✝⁷ : CommRing Q
inst✝⁶ : Algebra P Q
inst✝⁵ : IsLocalization T Q
inst✝⁴ : IsLocalization M S
N : Type u_1
inst✝³ : AddCommGroup N
inst✝² : Module R N
inst✝¹ : Module S N
inst✝ : IsScalarTower R S N
x : N
a : Set N
h : x ∈ Submodule.span S a
y : N
hy : y ∈ Submodule.span R a
z : { x // x ∈ M }
y' : N
hy' : y' ∈ Submodule.span R a
z' : { x // x ∈ M }
⊢ mk' S 1 z • y = (mk' S 1 (z * z') * ↑(algebraMap R S) ↑z') • y

tactic: rw [← mul_one (1 : R), mk'_mul, mul_right_comm, mk'_spec, _root_.map_one, mul_one, one_mul]
state_before: case mp.refine'_3.intro.intro.intro.intro.intro.intro.e_a
R : Type u_2
inst✝¹¹ : CommRing R
M : Submonoid R
S : Type u_3
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra R S
P : Type ?u.169815
inst✝⁸ : CommRing P
g : R →+* P
T : Submonoid P
hy✝ : M ≤ Submonoid.comap g T
Q : Type ?u.170647
inst✝⁷ : CommRing Q
inst✝⁶ : Algebra P Q
inst✝⁵ : IsLocalization T Q
inst✝⁴ : IsLocalization M S
N : Type u_1
inst✝³ : AddCommGroup N
inst✝² : Module R N
inst✝¹ : Module S N
inst✝ : IsScalarTower R S N
x : N
a : Set N
h : x ∈ Submodule.span S a
y : N
hy : y ∈ Submodule.span R a
z : { x // x ∈ M }
y' : N
hy' : y' ∈ Submodule.span R a
z' : { x // x ∈ M }
⊢ mk' S 1 z' • y' = (mk' S 1 (z * z') * ↑(algebraMap R S) ↑z) • y'

tactic: rintro a _ ⟨y, hy, z, rfl⟩
state_before: case mp.refine'_4
R : Type u_2
inst✝¹¹ : CommRing R
M : Submonoid R
S : Type u_3
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra R S
P : Type ?u.169815
inst✝⁸ : CommRing P
g : R →+* P
T : Submonoid P
hy : M ≤ Submonoid.comap g T
Q : Type ?u.170647
inst✝⁷ : CommRing Q
inst✝⁶ : Algebra P Q
inst✝⁵ : IsLocalization T Q
inst✝⁴ : IsLocalization M S
N : Type u_1
inst✝³ : AddCommGroup N
inst✝² : Module R N
inst✝¹ : Module S N
inst✝ : IsScalarTower R S N
x : N
a : Set N
h : x ∈ Submodule.span S a
⊢ ∀ (a_1 : S) (x : N),
    (∃ y, y ∈ Submodule.span R a ∧ ∃ z, x = mk' S 1 z • y) → ∃ y, y ∈ Submodule.span R a ∧ ∃ z, a_1 • x = mk' S 1 z • y

tactic: obtain ⟨y', z', rfl⟩ := mk'_surjective M a
state_before: case mp.refine'_4.intro.intro.intro
R : Type u_2
inst✝¹¹ : CommRing R
M : Submonoid R
S : Type u_3
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra R S
P : Type ?u.169815
inst✝⁸ : CommRing P
g : R →+* P
T : Submonoid P
hy✝ : M ≤ Submonoid.comap g T
Q : Type ?u.170647
inst✝⁷ : CommRing Q
inst✝⁶ : Algebra P Q
inst✝⁵ : IsLocalization T Q
inst✝⁴ : IsLocalization M S
N : Type u_1
inst✝³ : AddCommGroup N
inst✝² : Module R N
inst✝¹ : Module S N
inst✝ : IsScalarTower R S N
x : N
a✝ : Set N
h : x ∈ Submodule.span S a✝
a : S
y : N
hy : y ∈ Submodule.span R a✝
z : { x // x ∈ M }
⊢ ∃ y_1, y_1 ∈ Submodule.span R a✝ ∧ ∃ z_1, a • mk' S 1 z • y = mk' S 1 z_1 • y_1

tactic: refine' ⟨y' • y, Submodule.smul_mem _ _ hy, z' * z, _⟩
state_before: case mp.refine'_4.intro.intro.intro.intro.intro
R : Type u_2
inst✝¹¹ : CommRing R
M : Submonoid R
S : Type u_3
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra R S
P : Type ?u.169815
inst✝⁸ : CommRing P
g : R →+* P
T : Submonoid P
hy✝ : M ≤ Submonoid.comap g T
Q : Type ?u.170647
inst✝⁷ : CommRing Q
inst✝⁶ : Algebra P Q
inst✝⁵ : IsLocalization T Q
inst✝⁴ : IsLocalization M S
N : Type u_1
inst✝³ : AddCommGroup N
inst✝² : Module R N
inst✝¹ : Module S N
inst✝ : IsScalarTower R S N
x : N
a : Set N
h : x ∈ Submodule.span S a
y : N
hy : y ∈ Submodule.span R a
z : { x // x ∈ M }
y' : R
z' : { x // x ∈ M }
⊢ ∃ y_1, y_1 ∈ Submodule.span R a ∧ ∃ z_1, mk' S y' z' • mk' S 1 z • y = mk' S 1 z_1 • y_1

tactic: rw [← IsScalarTower.algebraMap_smul S y', smul_smul, ← mk'_mul, smul_smul,
  mul_comm (mk' S _ _), mul_mk'_eq_mk'_of_mul]
state_before: case mp.refine'_4.intro.intro.intro.intro.intro
R : Type u_2
inst✝¹¹ : CommRing R
M : Submonoid R
S : Type u_3
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra R S
P : Type ?u.169815
inst✝⁸ : CommRing P
g : R →+* P
T : Submonoid P
hy✝ : M ≤ Submonoid.comap g T
Q : Type ?u.170647
inst✝⁷ : CommRing Q
inst✝⁶ : Algebra P Q
inst✝⁵ : IsLocalization T Q
inst✝⁴ : IsLocalization M S
N : Type u_1
inst✝³ : AddCommGroup N
inst✝² : Module R N
inst✝¹ : Module S N
inst✝ : IsScalarTower R S N
x : N
a : Set N
h : x ∈ Submodule.span S a
y : N
hy : y ∈ Submodule.span R a
z : { x // x ∈ M }
y' : R
z' : { x // x ∈ M }
⊢ mk' S y' z' • mk' S 1 z • y = mk' S 1 (z' * z) • y' • y

tactic: rintro ⟨y, hy, z, rfl⟩
state_before: case mpr
R : Type u_2
inst✝¹¹ : CommRing R
M : Submonoid R
S : Type u_3
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra R S
P : Type ?u.169815
inst✝⁸ : CommRing P
g : R →+* P
T : Submonoid P
hy : M ≤ Submonoid.comap g T
Q : Type ?u.170647
inst✝⁷ : CommRing Q
inst✝⁶ : Algebra P Q
inst✝⁵ : IsLocalization T Q
inst✝⁴ : IsLocalization M S
N : Type u_1
inst✝³ : AddCommGroup N
inst✝² : Module R N
inst✝¹ : Module S N
inst✝ : IsScalarTower R S N
x : N
a : Set N
⊢ (∃ y, y ∈ Submodule.span R a ∧ ∃ z, x = mk' S 1 z • y) → x ∈ Submodule.span S a

tactic: exact Submodule.smul_mem _ _ (Submodule.span_subset_span R S _ hy)
state_before: case mpr.intro.intro.intro
R : Type u_2
inst✝¹¹ : CommRing R
M : Submonoid R
S : Type u_3
inst✝¹⁰ : CommRing S
inst✝⁹ : Algebra R S
P : Type ?u.169815
inst✝⁸ : CommRing P
g : R →+* P
T : Submonoid P
hy✝ : M ≤ Submonoid.comap g T
Q : Type ?u.170647
inst✝⁷ : CommRing Q
inst✝⁶ : Algebra P Q
inst✝⁵ : IsLocalization T Q
inst✝⁴ : IsLocalization M S
N : Type u_1
inst✝³ : AddCommGroup N
inst✝² : Module R N
inst✝¹ : Module S N
inst✝ : IsScalarTower R S N
a : Set N
y : N
hy : y ∈ Submodule.span R a
z : { x // x ∈ M }
⊢ mk' S 1 z • y ∈ Submodule.span S a