[GOAL]
R : Type u_1
M : Type u_2
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
N : Submodule R M
⊢ (∃ S, Set.Finite S ∧ span R S = N) → FG N
[PROOFSTEP]
rintro ⟨t', h, rfl⟩
[GOAL]
case intro.intro
R : Type u_1
M : Type u_2
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
t' : Set M
h : Set.Finite t'
⊢ FG (span R t')
[PROOFSTEP]
rcases Finite.exists_finset_coe h with ⟨t, rfl⟩
[GOAL]
case intro.intro.intro
R : Type u_1
M : Type u_2
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
t : Finset M
h : Set.Finite ↑t
⊢ FG (span R ↑t)
[PROOFSTEP]
exact ⟨t, rfl⟩
[GOAL]
R : Type u_1
M : Type u_2
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
P : Submodule ℕ M
x✝ : FG P
S : Finset M
hS : span ℕ ↑S = P
⊢ AddSubmonoid.closure ↑S = P.toAddSubmonoid
[PROOFSTEP]
simpa [← span_nat_eq_addSubmonoid_closure] using hS
[GOAL]
R : Type u_1
M : Type u_2
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
P : Submodule ℕ M
x✝ : AddSubmonoid.FG P.toAddSubmonoid
S : Finset M
hS : AddSubmonoid.closure ↑S = P.toAddSubmonoid
⊢ span ℕ ↑S = P
[PROOFSTEP]
simpa [← span_nat_eq_addSubmonoid_closure] using hS
[GOAL]
R : Type u_1
M : Type u_2
inst✝³ : Semiring R
inst✝² : AddCommMonoid M
inst✝¹ : Module R M
G : Type u_3
inst✝ : AddCommGroup G
P : Submodule ℤ G
x✝ : FG P
S : Finset G
hS : span ℤ ↑S = P
⊢ AddSubgroup.closure ↑S = toAddSubgroup P
[PROOFSTEP]
simpa [← span_int_eq_addSubgroup_closure] using hS
[GOAL]
R : Type u_1
M : Type u_2
inst✝³ : Semiring R
inst✝² : AddCommMonoid M
inst✝¹ : Module R M
G : Type u_3
inst✝ : AddCommGroup G
P : Submodule ℤ G
x✝ : AddSubgroup.FG (toAddSubgroup P)
S : Finset G
hS : AddSubgroup.closure ↑S = toAddSubgroup P
⊢ span ℤ ↑S = P
[PROOFSTEP]
simpa [← span_int_eq_addSubgroup_closure] using hS
[GOAL]
R : Type u_1
M : Type u_2
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
N : Submodule R M
⊢ FG N ↔ ∃ n s, span R (range s) = N
[PROOFSTEP]
rw [fg_def]
[GOAL]
R : Type u_1
M : Type u_2
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
N : Submodule R M
⊢ (∃ S, Set.Finite S ∧ span R S = N) ↔ ∃ n s, span R (range s) = N
[PROOFSTEP]
constructor
[GOAL]
case mp
R : Type u_1
M : Type u_2
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
N : Submodule R M
⊢ (∃ S, Set.Finite S ∧ span R S = N) → ∃ n s, span R (range s) = N
[PROOFSTEP]
rintro ⟨S, Sfin, hS⟩
[GOAL]
case mp.intro.intro
R : Type u_1
M : Type u_2
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
N : Submodule R M
S : Set M
Sfin : Set.Finite S
hS : span R S = N
⊢ ∃ n s, span R (range s) = N
[PROOFSTEP]
obtain ⟨n, f, rfl⟩ := Sfin.fin_embedding
[GOAL]
case mp.intro.intro.intro.intro
R : Type u_1
M : Type u_2
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
N : Submodule R M
n : ℕ
f : Fin n ↪ M
Sfin : Set.Finite (range ↑f)
hS : span R (range ↑f) = N
⊢ ∃ n s, span R (range s) = N
[PROOFSTEP]
exact ⟨n, f, hS⟩
[GOAL]
case mpr
R : Type u_1
M : Type u_2
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
N : Submodule R M
⊢ (∃ n s, span R (range s) = N) → ∃ S, Set.Finite S ∧ span R S = N
[PROOFSTEP]
rintro ⟨n, s, hs⟩
[GOAL]
case mpr.intro.intro
R : Type u_1
M : Type u_2
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
N : Submodule R M
n : ℕ
s : Fin n → M
hs : span R (range s) = N
⊢ ∃ S, Set.Finite S ∧ span R S = N
[PROOFSTEP]
refine' ⟨range s, finite_range s, hs⟩
[GOAL]
R✝ : Type u_1
M✝ : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M✝
inst✝³ : Module R✝ M✝
R : Type u_3
inst✝² : CommRing R
M : Type u_4
inst✝¹ : AddCommGroup M
inst✝ : Module R M
I : Ideal R
N : Submodule R M
hn : FG N
hin : N ≤ I • N
⊢ ∃ r, r - 1 ∈ I ∧ ∀ (n : M), n ∈ N → r • n = 0
[PROOFSTEP]
rw [fg_def] at hn 
[GOAL]
R✝ : Type u_1
M✝ : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M✝
inst✝³ : Module R✝ M✝
R : Type u_3
inst✝² : CommRing R
M : Type u_4
inst✝¹ : AddCommGroup M
inst✝ : Module R M
I : Ideal R
N : Submodule R M
hn : ∃ S, Set.Finite S ∧ span R S = N
hin : N ≤ I • N
⊢ ∃ r, r - 1 ∈ I ∧ ∀ (n : M), n ∈ N → r • n = 0
[PROOFSTEP]
rcases hn with ⟨s, hfs, hs⟩
[GOAL]
case intro.intro
R✝ : Type u_1
M✝ : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M✝
inst✝³ : Module R✝ M✝
R : Type u_3
inst✝² : CommRing R
M : Type u_4
inst✝¹ : AddCommGroup M
inst✝ : Module R M
I : Ideal R
N : Submodule R M
hin : N ≤ I • N
s : Set M
hfs : Set.Finite s
hs : span R s = N
⊢ ∃ r, r - 1 ∈ I ∧ ∀ (n : M), n ∈ N → r • n = 0
[PROOFSTEP]
have : ∃ r : R, r - 1 ∈ I ∧ N ≤ (I • span R s).comap (LinearMap.lsmul R M r) ∧ s ⊆ N :=
  by
  refine' ⟨1, _, _, _⟩
  · rw [sub_self]
    exact I.zero_mem
  · rw [hs]
    intro n hn
    rw [mem_comap]
    change (1 : R) • n ∈ I • N
    rw [one_smul]
    exact hin hn
  · rw [← span_le, hs]
[GOAL]
R✝ : Type u_1
M✝ : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M✝
inst✝³ : Module R✝ M✝
R : Type u_3
inst✝² : CommRing R
M : Type u_4
inst✝¹ : AddCommGroup M
inst✝ : Module R M
I : Ideal R
N : Submodule R M
hin : N ≤ I • N
s : Set M
hfs : Set.Finite s
hs : span R s = N
⊢ ∃ r, r - 1 ∈ I ∧ N ≤ comap (↑(LinearMap.lsmul R M) r) (I • span R s) ∧ s ⊆ ↑N
[PROOFSTEP]
refine' ⟨1, _, _, _⟩
[GOAL]
case refine'_1
R✝ : Type u_1
M✝ : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M✝
inst✝³ : Module R✝ M✝
R : Type u_3
inst✝² : CommRing R
M : Type u_4
inst✝¹ : AddCommGroup M
inst✝ : Module R M
I : Ideal R
N : Submodule R M
hin : N ≤ I • N
s : Set M
hfs : Set.Finite s
hs : span R s = N
⊢ 1 - 1 ∈ I
[PROOFSTEP]
rw [sub_self]
[GOAL]
case refine'_1
R✝ : Type u_1
M✝ : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M✝
inst✝³ : Module R✝ M✝
R : Type u_3
inst✝² : CommRing R
M : Type u_4
inst✝¹ : AddCommGroup M
inst✝ : Module R M
I : Ideal R
N : Submodule R M
hin : N ≤ I • N
s : Set M
hfs : Set.Finite s
hs : span R s = N
⊢ 0 ∈ I
[PROOFSTEP]
exact I.zero_mem
[GOAL]
case refine'_2
R✝ : Type u_1
M✝ : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M✝
inst✝³ : Module R✝ M✝
R : Type u_3
inst✝² : CommRing R
M : Type u_4
inst✝¹ : AddCommGroup M
inst✝ : Module R M
I : Ideal R
N : Submodule R M
hin : N ≤ I • N
s : Set M
hfs : Set.Finite s
hs : span R s = N
⊢ N ≤ comap (↑(LinearMap.lsmul R M) 1) (I • span R s)
[PROOFSTEP]
rw [hs]
[GOAL]
case refine'_2
R✝ : Type u_1
M✝ : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M✝
inst✝³ : Module R✝ M✝
R : Type u_3
inst✝² : CommRing R
M : Type u_4
inst✝¹ : AddCommGroup M
inst✝ : Module R M
I : Ideal R
N : Submodule R M
hin : N ≤ I • N
s : Set M
hfs : Set.Finite s
hs : span R s = N
⊢ N ≤ comap (↑(LinearMap.lsmul R M) 1) (I • N)
[PROOFSTEP]
intro n hn
[GOAL]
case refine'_2
R✝ : Type u_1
M✝ : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M✝
inst✝³ : Module R✝ M✝
R : Type u_3
inst✝² : CommRing R
M : Type u_4
inst✝¹ : AddCommGroup M
inst✝ : Module R M
I : Ideal R
N : Submodule R M
hin : N ≤ I • N
s : Set M
hfs : Set.Finite s
hs : span R s = N
n : M
hn : n ∈ N
⊢ n ∈ comap (↑(LinearMap.lsmul R M) 1) (I • N)
[PROOFSTEP]
rw [mem_comap]
[GOAL]
case refine'_2
R✝ : Type u_1
M✝ : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M✝
inst✝³ : Module R✝ M✝
R : Type u_3
inst✝² : CommRing R
M : Type u_4
inst✝¹ : AddCommGroup M
inst✝ : Module R M
I : Ideal R
N : Submodule R M
hin : N ≤ I • N
s : Set M
hfs : Set.Finite s
hs : span R s = N
n : M
hn : n ∈ N
⊢ ↑(↑(LinearMap.lsmul R M) 1) n ∈ I • N
[PROOFSTEP]
change (1 : R) • n ∈ I • N
[GOAL]
case refine'_2
R✝ : Type u_1
M✝ : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M✝
inst✝³ : Module R✝ M✝
R : Type u_3
inst✝² : CommRing R
M : Type u_4
inst✝¹ : AddCommGroup M
inst✝ : Module R M
I : Ideal R
N : Submodule R M
hin : N ≤ I • N
s : Set M
hfs : Set.Finite s
hs : span R s = N
n : M
hn : n ∈ N
⊢ 1 • n ∈ I • N
[PROOFSTEP]
rw [one_smul]
[GOAL]
case refine'_2
R✝ : Type u_1
M✝ : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M✝
inst✝³ : Module R✝ M✝
R : Type u_3
inst✝² : CommRing R
M : Type u_4
inst✝¹ : AddCommGroup M
inst✝ : Module R M
I : Ideal R
N : Submodule R M
hin : N ≤ I • N
s : Set M
hfs : Set.Finite s
hs : span R s = N
n : M
hn : n ∈ N
⊢ n ∈ I • N
[PROOFSTEP]
exact hin hn
[GOAL]
case refine'_3
R✝ : Type u_1
M✝ : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M✝
inst✝³ : Module R✝ M✝
R : Type u_3
inst✝² : CommRing R
M : Type u_4
inst✝¹ : AddCommGroup M
inst✝ : Module R M
I : Ideal R
N : Submodule R M
hin : N ≤ I • N
s : Set M
hfs : Set.Finite s
hs : span R s = N
⊢ s ⊆ ↑N
[PROOFSTEP]
rw [← span_le, hs]
[GOAL]
case intro.intro
R✝ : Type u_1
M✝ : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M✝
inst✝³ : Module R✝ M✝
R : Type u_3
inst✝² : CommRing R
M : Type u_4
inst✝¹ : AddCommGroup M
inst✝ : Module R M
I : Ideal R
N : Submodule R M
hin : N ≤ I • N
s : Set M
hfs : Set.Finite s
hs : span R s = N
this : ∃ r, r - 1 ∈ I ∧ N ≤ comap (↑(LinearMap.lsmul R M) r) (I • span R s) ∧ s ⊆ ↑N
⊢ ∃ r, r - 1 ∈ I ∧ ∀ (n : M), n ∈ N → r • n = 0
[PROOFSTEP]
clear hin hs
[GOAL]
case intro.intro
R✝ : Type u_1
M✝ : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M✝
inst✝³ : Module R✝ M✝
R : Type u_3
inst✝² : CommRing R
M : Type u_4
inst✝¹ : AddCommGroup M
inst✝ : Module R M
I : Ideal R
N : Submodule R M
s : Set M
hfs : Set.Finite s
this : ∃ r, r - 1 ∈ I ∧ N ≤ comap (↑(LinearMap.lsmul R M) r) (I • span R s) ∧ s ⊆ ↑N
⊢ ∃ r, r - 1 ∈ I ∧ ∀ (n : M), n ∈ N → r • n = 0
[PROOFSTEP]
revert this
[GOAL]
case intro.intro
R✝ : Type u_1
M✝ : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M✝
inst✝³ : Module R✝ M✝
R : Type u_3
inst✝² : CommRing R
M : Type u_4
inst✝¹ : AddCommGroup M
inst✝ : Module R M
I : Ideal R
N : Submodule R M
s : Set M
hfs : Set.Finite s
⊢ (∃ r, r - 1 ∈ I ∧ N ≤ comap (↑(LinearMap.lsmul R M) r) (I • span R s) ∧ s ⊆ ↑N) →
    ∃ r, r - 1 ∈ I ∧ ∀ (n : M), n ∈ N → r • n = 0
[PROOFSTEP]
refine' Set.Finite.dinduction_on _ hfs (fun H => _) @fun i s _ _ ih H => _
[GOAL]
case intro.intro.refine'_1
R✝ : Type u_1
M✝ : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M✝
inst✝³ : Module R✝ M✝
R : Type u_3
inst✝² : CommRing R
M : Type u_4
inst✝¹ : AddCommGroup M
inst✝ : Module R M
I : Ideal R
N : Submodule R M
s : Set M
hfs : Set.Finite s
H : ∃ r, r - 1 ∈ I ∧ N ≤ comap (↑(LinearMap.lsmul R M) r) (I • span R ∅) ∧ ∅ ⊆ ↑N
⊢ ∃ r, r - 1 ∈ I ∧ ∀ (n : M), n ∈ N → r • n = 0
[PROOFSTEP]
rcases H with ⟨r, hr1, hrn, _⟩
[GOAL]
case intro.intro.refine'_1.intro.intro.intro
R✝ : Type u_1
M✝ : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M✝
inst✝³ : Module R✝ M✝
R : Type u_3
inst✝² : CommRing R
M : Type u_4
inst✝¹ : AddCommGroup M
inst✝ : Module R M
I : Ideal R
N : Submodule R M
s : Set M
hfs : Set.Finite s
r : R
hr1 : r - 1 ∈ I
hrn : N ≤ comap (↑(LinearMap.lsmul R M) r) (I • span R ∅)
right✝ : ∅ ⊆ ↑N
⊢ ∃ r, r - 1 ∈ I ∧ ∀ (n : M), n ∈ N → r • n = 0
[PROOFSTEP]
refine' ⟨r, hr1, fun n hn => _⟩
[GOAL]
case intro.intro.refine'_1.intro.intro.intro
R✝ : Type u_1
M✝ : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M✝
inst✝³ : Module R✝ M✝
R : Type u_3
inst✝² : CommRing R
M : Type u_4
inst✝¹ : AddCommGroup M
inst✝ : Module R M
I : Ideal R
N : Submodule R M
s : Set M
hfs : Set.Finite s
r : R
hr1 : r - 1 ∈ I
hrn : N ≤ comap (↑(LinearMap.lsmul R M) r) (I • span R ∅)
right✝ : ∅ ⊆ ↑N
n : M
hn : n ∈ N
⊢ r • n = 0
[PROOFSTEP]
specialize hrn hn
[GOAL]
case intro.intro.refine'_1.intro.intro.intro
R✝ : Type u_1
M✝ : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M✝
inst✝³ : Module R✝ M✝
R : Type u_3
inst✝² : CommRing R
M : Type u_4
inst✝¹ : AddCommGroup M
inst✝ : Module R M
I : Ideal R
N : Submodule R M
s : Set M
hfs : Set.Finite s
r : R
hr1 : r - 1 ∈ I
right✝ : ∅ ⊆ ↑N
n : M
hn : n ∈ N
hrn : n ∈ comap (↑(LinearMap.lsmul R M) r) (I • span R ∅)
⊢ r • n = 0
[PROOFSTEP]
rwa [mem_comap, span_empty, smul_bot, mem_bot] at hrn 
[GOAL]
case intro.intro.refine'_2
R✝ : Type u_1
M✝ : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M✝
inst✝³ : Module R✝ M✝
R : Type u_3
inst✝² : CommRing R
M : Type u_4
inst✝¹ : AddCommGroup M
inst✝ : Module R M
I : Ideal R
N : Submodule R M
s✝ : Set M
hfs : Set.Finite s✝
i : M
s : Set M
x✝¹ : ¬i ∈ s
x✝ : Set.Finite s
ih :
  (∃ r, r - 1 ∈ I ∧ N ≤ comap (↑(LinearMap.lsmul R M) r) (I • span R s) ∧ s ⊆ ↑N) →
    ∃ r, r - 1 ∈ I ∧ ∀ (n : M), n ∈ N → r • n = 0
H : ∃ r, r - 1 ∈ I ∧ N ≤ comap (↑(LinearMap.lsmul R M) r) (I • span R (insert i s)) ∧ insert i s ⊆ ↑N
⊢ ∃ r, r - 1 ∈ I ∧ ∀ (n : M), n ∈ N → r • n = 0
[PROOFSTEP]
apply ih
[GOAL]
case intro.intro.refine'_2
R✝ : Type u_1
M✝ : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M✝
inst✝³ : Module R✝ M✝
R : Type u_3
inst✝² : CommRing R
M : Type u_4
inst✝¹ : AddCommGroup M
inst✝ : Module R M
I : Ideal R
N : Submodule R M
s✝ : Set M
hfs : Set.Finite s✝
i : M
s : Set M
x✝¹ : ¬i ∈ s
x✝ : Set.Finite s
ih :
  (∃ r, r - 1 ∈ I ∧ N ≤ comap (↑(LinearMap.lsmul R M) r) (I • span R s) ∧ s ⊆ ↑N) →
    ∃ r, r - 1 ∈ I ∧ ∀ (n : M), n ∈ N → r • n = 0
H : ∃ r, r - 1 ∈ I ∧ N ≤ comap (↑(LinearMap.lsmul R M) r) (I • span R (insert i s)) ∧ insert i s ⊆ ↑N
⊢ ∃ r, r - 1 ∈ I ∧ N ≤ comap (↑(LinearMap.lsmul R M) r) (I • span R s) ∧ s ⊆ ↑N
[PROOFSTEP]
rcases H with ⟨r, hr1, hrn, hs⟩
[GOAL]
case intro.intro.refine'_2.intro.intro.intro
R✝ : Type u_1
M✝ : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M✝
inst✝³ : Module R✝ M✝
R : Type u_3
inst✝² : CommRing R
M : Type u_4
inst✝¹ : AddCommGroup M
inst✝ : Module R M
I : Ideal R
N : Submodule R M
s✝ : Set M
hfs : Set.Finite s✝
i : M
s : Set M
x✝¹ : ¬i ∈ s
x✝ : Set.Finite s
ih :
  (∃ r, r - 1 ∈ I ∧ N ≤ comap (↑(LinearMap.lsmul R M) r) (I • span R s) ∧ s ⊆ ↑N) →
    ∃ r, r - 1 ∈ I ∧ ∀ (n : M), n ∈ N → r • n = 0
r : R
hr1 : r - 1 ∈ I
hrn : N ≤ comap (↑(LinearMap.lsmul R M) r) (I • span R (insert i s))
hs : insert i s ⊆ ↑N
⊢ ∃ r, r - 1 ∈ I ∧ N ≤ comap (↑(LinearMap.lsmul R M) r) (I • span R s) ∧ s ⊆ ↑N
[PROOFSTEP]
rw [← Set.singleton_union, span_union, smul_sup] at hrn 
[GOAL]
case intro.intro.refine'_2.intro.intro.intro
R✝ : Type u_1
M✝ : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M✝
inst✝³ : Module R✝ M✝
R : Type u_3
inst✝² : CommRing R
M : Type u_4
inst✝¹ : AddCommGroup M
inst✝ : Module R M
I : Ideal R
N : Submodule R M
s✝ : Set M
hfs : Set.Finite s✝
i : M
s : Set M
x✝¹ : ¬i ∈ s
x✝ : Set.Finite s
ih :
  (∃ r, r - 1 ∈ I ∧ N ≤ comap (↑(LinearMap.lsmul R M) r) (I • span R s) ∧ s ⊆ ↑N) →
    ∃ r, r - 1 ∈ I ∧ ∀ (n : M), n ∈ N → r • n = 0
r : R
hr1 : r - 1 ∈ I
hrn : N ≤ comap (↑(LinearMap.lsmul R M) r) (I • span R {i} ⊔ I • span R s)
hs : insert i s ⊆ ↑N
⊢ ∃ r, r - 1 ∈ I ∧ N ≤ comap (↑(LinearMap.lsmul R M) r) (I • span R s) ∧ s ⊆ ↑N
[PROOFSTEP]
rw [Set.insert_subset_iff] at hs 
[GOAL]
case intro.intro.refine'_2.intro.intro.intro
R✝ : Type u_1
M✝ : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M✝
inst✝³ : Module R✝ M✝
R : Type u_3
inst✝² : CommRing R
M : Type u_4
inst✝¹ : AddCommGroup M
inst✝ : Module R M
I : Ideal R
N : Submodule R M
s✝ : Set M
hfs : Set.Finite s✝
i : M
s : Set M
x✝¹ : ¬i ∈ s
x✝ : Set.Finite s
ih :
  (∃ r, r - 1 ∈ I ∧ N ≤ comap (↑(LinearMap.lsmul R M) r) (I • span R s) ∧ s ⊆ ↑N) →
    ∃ r, r - 1 ∈ I ∧ ∀ (n : M), n ∈ N → r • n = 0
r : R
hr1 : r - 1 ∈ I
hrn : N ≤ comap (↑(LinearMap.lsmul R M) r) (I • span R {i} ⊔ I • span R s)
hs : i ∈ ↑N ∧ s ⊆ ↑N
⊢ ∃ r, r - 1 ∈ I ∧ N ≤ comap (↑(LinearMap.lsmul R M) r) (I • span R s) ∧ s ⊆ ↑N
[PROOFSTEP]
have : ∃ c : R, c - 1 ∈ I ∧ c • i ∈ I • span R s :=
  by
  specialize hrn hs.1
  rw [mem_comap, mem_sup] at hrn 
  rcases hrn with ⟨y, hy, z, hz, hyz⟩
  dsimp at hyz 
  rw [mem_smul_span_singleton] at hy 
  rcases hy with ⟨c, hci, rfl⟩
  use r - c
  constructor
  · rw [sub_right_comm]
    exact I.sub_mem hr1 hci
  · rw [sub_smul, ← hyz, add_sub_cancel']
    exact hz
[GOAL]
R✝ : Type u_1
M✝ : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M✝
inst✝³ : Module R✝ M✝
R : Type u_3
inst✝² : CommRing R
M : Type u_4
inst✝¹ : AddCommGroup M
inst✝ : Module R M
I : Ideal R
N : Submodule R M
s✝ : Set M
hfs : Set.Finite s✝
i : M
s : Set M
x✝¹ : ¬i ∈ s
x✝ : Set.Finite s
ih :
  (∃ r, r - 1 ∈ I ∧ N ≤ comap (↑(LinearMap.lsmul R M) r) (I • span R s) ∧ s ⊆ ↑N) →
    ∃ r, r - 1 ∈ I ∧ ∀ (n : M), n ∈ N → r • n = 0
r : R
hr1 : r - 1 ∈ I
hrn : N ≤ comap (↑(LinearMap.lsmul R M) r) (I • span R {i} ⊔ I • span R s)
hs : i ∈ ↑N ∧ s ⊆ ↑N
⊢ ∃ c, c - 1 ∈ I ∧ c • i ∈ I • span R s
[PROOFSTEP]
specialize hrn hs.1
[GOAL]
R✝ : Type u_1
M✝ : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M✝
inst✝³ : Module R✝ M✝
R : Type u_3
inst✝² : CommRing R
M : Type u_4
inst✝¹ : AddCommGroup M
inst✝ : Module R M
I : Ideal R
N : Submodule R M
s✝ : Set M
hfs : Set.Finite s✝
i : M
s : Set M
x✝¹ : ¬i ∈ s
x✝ : Set.Finite s
ih :
  (∃ r, r - 1 ∈ I ∧ N ≤ comap (↑(LinearMap.lsmul R M) r) (I • span R s) ∧ s ⊆ ↑N) →
    ∃ r, r - 1 ∈ I ∧ ∀ (n : M), n ∈ N → r • n = 0
r : R
hr1 : r - 1 ∈ I
hs : i ∈ ↑N ∧ s ⊆ ↑N
hrn : i ∈ comap (↑(LinearMap.lsmul R M) r) (I • span R {i} ⊔ I • span R s)
⊢ ∃ c, c - 1 ∈ I ∧ c • i ∈ I • span R s
[PROOFSTEP]
rw [mem_comap, mem_sup] at hrn 
[GOAL]
R✝ : Type u_1
M✝ : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M✝
inst✝³ : Module R✝ M✝
R : Type u_3
inst✝² : CommRing R
M : Type u_4
inst✝¹ : AddCommGroup M
inst✝ : Module R M
I : Ideal R
N : Submodule R M
s✝ : Set M
hfs : Set.Finite s✝
i : M
s : Set M
x✝¹ : ¬i ∈ s
x✝ : Set.Finite s
ih :
  (∃ r, r - 1 ∈ I ∧ N ≤ comap (↑(LinearMap.lsmul R M) r) (I • span R s) ∧ s ⊆ ↑N) →
    ∃ r, r - 1 ∈ I ∧ ∀ (n : M), n ∈ N → r • n = 0
r : R
hr1 : r - 1 ∈ I
hs : i ∈ ↑N ∧ s ⊆ ↑N
hrn : ∃ y, y ∈ I • span R {i} ∧ ∃ z, z ∈ I • span R s ∧ y + z = ↑(↑(LinearMap.lsmul R M) r) i
⊢ ∃ c, c - 1 ∈ I ∧ c • i ∈ I • span R s
[PROOFSTEP]
rcases hrn with ⟨y, hy, z, hz, hyz⟩
[GOAL]
case intro.intro.intro.intro
R✝ : Type u_1
M✝ : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M✝
inst✝³ : Module R✝ M✝
R : Type u_3
inst✝² : CommRing R
M : Type u_4
inst✝¹ : AddCommGroup M
inst✝ : Module R M
I : Ideal R
N : Submodule R M
s✝ : Set M
hfs : Set.Finite s✝
i : M
s : Set M
x✝¹ : ¬i ∈ s
x✝ : Set.Finite s
ih :
  (∃ r, r - 1 ∈ I ∧ N ≤ comap (↑(LinearMap.lsmul R M) r) (I • span R s) ∧ s ⊆ ↑N) →
    ∃ r, r - 1 ∈ I ∧ ∀ (n : M), n ∈ N → r • n = 0
r : R
hr1 : r - 1 ∈ I
hs : i ∈ ↑N ∧ s ⊆ ↑N
y : M
hy : y ∈ I • span R {i}
z : M
hz : z ∈ I • span R s
hyz : y + z = ↑(↑(LinearMap.lsmul R M) r) i
⊢ ∃ c, c - 1 ∈ I ∧ c • i ∈ I • span R s
[PROOFSTEP]
dsimp at hyz 
[GOAL]
case intro.intro.intro.intro
R✝ : Type u_1
M✝ : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M✝
inst✝³ : Module R✝ M✝
R : Type u_3
inst✝² : CommRing R
M : Type u_4
inst✝¹ : AddCommGroup M
inst✝ : Module R M
I : Ideal R
N : Submodule R M
s✝ : Set M
hfs : Set.Finite s✝
i : M
s : Set M
x✝¹ : ¬i ∈ s
x✝ : Set.Finite s
ih :
  (∃ r, r - 1 ∈ I ∧ N ≤ comap (↑(LinearMap.lsmul R M) r) (I • span R s) ∧ s ⊆ ↑N) →
    ∃ r, r - 1 ∈ I ∧ ∀ (n : M), n ∈ N → r • n = 0
r : R
hr1 : r - 1 ∈ I
hs : i ∈ ↑N ∧ s ⊆ ↑N
y : M
hy : y ∈ I • span R {i}
z : M
hz : z ∈ I • span R s
hyz : y + z = r • i
⊢ ∃ c, c - 1 ∈ I ∧ c • i ∈ I • span R s
[PROOFSTEP]
rw [mem_smul_span_singleton] at hy 
[GOAL]
case intro.intro.intro.intro
R✝ : Type u_1
M✝ : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M✝
inst✝³ : Module R✝ M✝
R : Type u_3
inst✝² : CommRing R
M : Type u_4
inst✝¹ : AddCommGroup M
inst✝ : Module R M
I : Ideal R
N : Submodule R M
s✝ : Set M
hfs : Set.Finite s✝
i : M
s : Set M
x✝¹ : ¬i ∈ s
x✝ : Set.Finite s
ih :
  (∃ r, r - 1 ∈ I ∧ N ≤ comap (↑(LinearMap.lsmul R M) r) (I • span R s) ∧ s ⊆ ↑N) →
    ∃ r, r - 1 ∈ I ∧ ∀ (n : M), n ∈ N → r • n = 0
r : R
hr1 : r - 1 ∈ I
hs : i ∈ ↑N ∧ s ⊆ ↑N
y : M
hy : ∃ y_1, y_1 ∈ I ∧ y_1 • i = y
z : M
hz : z ∈ I • span R s
hyz : y + z = r • i
⊢ ∃ c, c - 1 ∈ I ∧ c • i ∈ I • span R s
[PROOFSTEP]
rcases hy with ⟨c, hci, rfl⟩
[GOAL]
case intro.intro.intro.intro.intro.intro
R✝ : Type u_1
M✝ : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M✝
inst✝³ : Module R✝ M✝
R : Type u_3
inst✝² : CommRing R
M : Type u_4
inst✝¹ : AddCommGroup M
inst✝ : Module R M
I : Ideal R
N : Submodule R M
s✝ : Set M
hfs : Set.Finite s✝
i : M
s : Set M
x✝¹ : ¬i ∈ s
x✝ : Set.Finite s
ih :
  (∃ r, r - 1 ∈ I ∧ N ≤ comap (↑(LinearMap.lsmul R M) r) (I • span R s) ∧ s ⊆ ↑N) →
    ∃ r, r - 1 ∈ I ∧ ∀ (n : M), n ∈ N → r • n = 0
r : R
hr1 : r - 1 ∈ I
hs : i ∈ ↑N ∧ s ⊆ ↑N
z : M
hz : z ∈ I • span R s
c : R
hci : c ∈ I
hyz : c • i + z = r • i
⊢ ∃ c, c - 1 ∈ I ∧ c • i ∈ I • span R s
[PROOFSTEP]
use r - c
[GOAL]
case h
R✝ : Type u_1
M✝ : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M✝
inst✝³ : Module R✝ M✝
R : Type u_3
inst✝² : CommRing R
M : Type u_4
inst✝¹ : AddCommGroup M
inst✝ : Module R M
I : Ideal R
N : Submodule R M
s✝ : Set M
hfs : Set.Finite s✝
i : M
s : Set M
x✝¹ : ¬i ∈ s
x✝ : Set.Finite s
ih :
  (∃ r, r - 1 ∈ I ∧ N ≤ comap (↑(LinearMap.lsmul R M) r) (I • span R s) ∧ s ⊆ ↑N) →
    ∃ r, r - 1 ∈ I ∧ ∀ (n : M), n ∈ N → r • n = 0
r : R
hr1 : r - 1 ∈ I
hs : i ∈ ↑N ∧ s ⊆ ↑N
z : M
hz : z ∈ I • span R s
c : R
hci : c ∈ I
hyz : c • i + z = r • i
⊢ r - c - 1 ∈ I ∧ (r - c) • i ∈ I • span R s
[PROOFSTEP]
constructor
[GOAL]
case h.left
R✝ : Type u_1
M✝ : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M✝
inst✝³ : Module R✝ M✝
R : Type u_3
inst✝² : CommRing R
M : Type u_4
inst✝¹ : AddCommGroup M
inst✝ : Module R M
I : Ideal R
N : Submodule R M
s✝ : Set M
hfs : Set.Finite s✝
i : M
s : Set M
x✝¹ : ¬i ∈ s
x✝ : Set.Finite s
ih :
  (∃ r, r - 1 ∈ I ∧ N ≤ comap (↑(LinearMap.lsmul R M) r) (I • span R s) ∧ s ⊆ ↑N) →
    ∃ r, r - 1 ∈ I ∧ ∀ (n : M), n ∈ N → r • n = 0
r : R
hr1 : r - 1 ∈ I
hs : i ∈ ↑N ∧ s ⊆ ↑N
z : M
hz : z ∈ I • span R s
c : R
hci : c ∈ I
hyz : c • i + z = r • i
⊢ r - c - 1 ∈ I
[PROOFSTEP]
rw [sub_right_comm]
[GOAL]
case h.left
R✝ : Type u_1
M✝ : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M✝
inst✝³ : Module R✝ M✝
R : Type u_3
inst✝² : CommRing R
M : Type u_4
inst✝¹ : AddCommGroup M
inst✝ : Module R M
I : Ideal R
N : Submodule R M
s✝ : Set M
hfs : Set.Finite s✝
i : M
s : Set M
x✝¹ : ¬i ∈ s
x✝ : Set.Finite s
ih :
  (∃ r, r - 1 ∈ I ∧ N ≤ comap (↑(LinearMap.lsmul R M) r) (I • span R s) ∧ s ⊆ ↑N) →
    ∃ r, r - 1 ∈ I ∧ ∀ (n : M), n ∈ N → r • n = 0
r : R
hr1 : r - 1 ∈ I
hs : i ∈ ↑N ∧ s ⊆ ↑N
z : M
hz : z ∈ I • span R s
c : R
hci : c ∈ I
hyz : c • i + z = r • i
⊢ r - 1 - c ∈ I
[PROOFSTEP]
exact I.sub_mem hr1 hci
[GOAL]
case h.right
R✝ : Type u_1
M✝ : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M✝
inst✝³ : Module R✝ M✝
R : Type u_3
inst✝² : CommRing R
M : Type u_4
inst✝¹ : AddCommGroup M
inst✝ : Module R M
I : Ideal R
N : Submodule R M
s✝ : Set M
hfs : Set.Finite s✝
i : M
s : Set M
x✝¹ : ¬i ∈ s
x✝ : Set.Finite s
ih :
  (∃ r, r - 1 ∈ I ∧ N ≤ comap (↑(LinearMap.lsmul R M) r) (I • span R s) ∧ s ⊆ ↑N) →
    ∃ r, r - 1 ∈ I ∧ ∀ (n : M), n ∈ N → r • n = 0
r : R
hr1 : r - 1 ∈ I
hs : i ∈ ↑N ∧ s ⊆ ↑N
z : M
hz : z ∈ I • span R s
c : R
hci : c ∈ I
hyz : c • i + z = r • i
⊢ (r - c) • i ∈ I • span R s
[PROOFSTEP]
rw [sub_smul, ← hyz, add_sub_cancel']
[GOAL]
case h.right
R✝ : Type u_1
M✝ : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M✝
inst✝³ : Module R✝ M✝
R : Type u_3
inst✝² : CommRing R
M : Type u_4
inst✝¹ : AddCommGroup M
inst✝ : Module R M
I : Ideal R
N : Submodule R M
s✝ : Set M
hfs : Set.Finite s✝
i : M
s : Set M
x✝¹ : ¬i ∈ s
x✝ : Set.Finite s
ih :
  (∃ r, r - 1 ∈ I ∧ N ≤ comap (↑(LinearMap.lsmul R M) r) (I • span R s) ∧ s ⊆ ↑N) →
    ∃ r, r - 1 ∈ I ∧ ∀ (n : M), n ∈ N → r • n = 0
r : R
hr1 : r - 1 ∈ I
hs : i ∈ ↑N ∧ s ⊆ ↑N
z : M
hz : z ∈ I • span R s
c : R
hci : c ∈ I
hyz : c • i + z = r • i
⊢ z ∈ I • span R s
[PROOFSTEP]
exact hz
[GOAL]
case intro.intro.refine'_2.intro.intro.intro
R✝ : Type u_1
M✝ : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M✝
inst✝³ : Module R✝ M✝
R : Type u_3
inst✝² : CommRing R
M : Type u_4
inst✝¹ : AddCommGroup M
inst✝ : Module R M
I : Ideal R
N : Submodule R M
s✝ : Set M
hfs : Set.Finite s✝
i : M
s : Set M
x✝¹ : ¬i ∈ s
x✝ : Set.Finite s
ih :
  (∃ r, r - 1 ∈ I ∧ N ≤ comap (↑(LinearMap.lsmul R M) r) (I • span R s) ∧ s ⊆ ↑N) →
    ∃ r, r - 1 ∈ I ∧ ∀ (n : M), n ∈ N → r • n = 0
r : R
hr1 : r - 1 ∈ I
hrn : N ≤ comap (↑(LinearMap.lsmul R M) r) (I • span R {i} ⊔ I • span R s)
hs : i ∈ ↑N ∧ s ⊆ ↑N
this : ∃ c, c - 1 ∈ I ∧ c • i ∈ I • span R s
⊢ ∃ r, r - 1 ∈ I ∧ N ≤ comap (↑(LinearMap.lsmul R M) r) (I • span R s) ∧ s ⊆ ↑N
[PROOFSTEP]
rcases this with ⟨c, hc1, hci⟩
[GOAL]
case intro.intro.refine'_2.intro.intro.intro.intro.intro
R✝ : Type u_1
M✝ : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M✝
inst✝³ : Module R✝ M✝
R : Type u_3
inst✝² : CommRing R
M : Type u_4
inst✝¹ : AddCommGroup M
inst✝ : Module R M
I : Ideal R
N : Submodule R M
s✝ : Set M
hfs : Set.Finite s✝
i : M
s : Set M
x✝¹ : ¬i ∈ s
x✝ : Set.Finite s
ih :
  (∃ r, r - 1 ∈ I ∧ N ≤ comap (↑(LinearMap.lsmul R M) r) (I • span R s) ∧ s ⊆ ↑N) →
    ∃ r, r - 1 ∈ I ∧ ∀ (n : M), n ∈ N → r • n = 0
r : R
hr1 : r - 1 ∈ I
hrn : N ≤ comap (↑(LinearMap.lsmul R M) r) (I • span R {i} ⊔ I • span R s)
hs : i ∈ ↑N ∧ s ⊆ ↑N
c : R
hc1 : c - 1 ∈ I
hci : c • i ∈ I • span R s
⊢ ∃ r, r - 1 ∈ I ∧ N ≤ comap (↑(LinearMap.lsmul R M) r) (I • span R s) ∧ s ⊆ ↑N
[PROOFSTEP]
refine' ⟨c * r, _, _, hs.2⟩
[GOAL]
case intro.intro.refine'_2.intro.intro.intro.intro.intro.refine'_1
R✝ : Type u_1
M✝ : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M✝
inst✝³ : Module R✝ M✝
R : Type u_3
inst✝² : CommRing R
M : Type u_4
inst✝¹ : AddCommGroup M
inst✝ : Module R M
I : Ideal R
N : Submodule R M
s✝ : Set M
hfs : Set.Finite s✝
i : M
s : Set M
x✝¹ : ¬i ∈ s
x✝ : Set.Finite s
ih :
  (∃ r, r - 1 ∈ I ∧ N ≤ comap (↑(LinearMap.lsmul R M) r) (I • span R s) ∧ s ⊆ ↑N) →
    ∃ r, r - 1 ∈ I ∧ ∀ (n : M), n ∈ N → r • n = 0
r : R
hr1 : r - 1 ∈ I
hrn : N ≤ comap (↑(LinearMap.lsmul R M) r) (I • span R {i} ⊔ I • span R s)
hs : i ∈ ↑N ∧ s ⊆ ↑N
c : R
hc1 : c - 1 ∈ I
hci : c • i ∈ I • span R s
⊢ c * r - 1 ∈ I
[PROOFSTEP]
simpa only [mul_sub, mul_one, sub_add_sub_cancel] using I.add_mem (I.mul_mem_left c hr1) hc1
[GOAL]
case intro.intro.refine'_2.intro.intro.intro.intro.intro.refine'_2
R✝ : Type u_1
M✝ : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M✝
inst✝³ : Module R✝ M✝
R : Type u_3
inst✝² : CommRing R
M : Type u_4
inst✝¹ : AddCommGroup M
inst✝ : Module R M
I : Ideal R
N : Submodule R M
s✝ : Set M
hfs : Set.Finite s✝
i : M
s : Set M
x✝¹ : ¬i ∈ s
x✝ : Set.Finite s
ih :
  (∃ r, r - 1 ∈ I ∧ N ≤ comap (↑(LinearMap.lsmul R M) r) (I • span R s) ∧ s ⊆ ↑N) →
    ∃ r, r - 1 ∈ I ∧ ∀ (n : M), n ∈ N → r • n = 0
r : R
hr1 : r - 1 ∈ I
hrn : N ≤ comap (↑(LinearMap.lsmul R M) r) (I • span R {i} ⊔ I • span R s)
hs : i ∈ ↑N ∧ s ⊆ ↑N
c : R
hc1 : c - 1 ∈ I
hci : c • i ∈ I • span R s
⊢ N ≤ comap (↑(LinearMap.lsmul R M) (c * r)) (I • span R s)
[PROOFSTEP]
intro n hn
[GOAL]
case intro.intro.refine'_2.intro.intro.intro.intro.intro.refine'_2
R✝ : Type u_1
M✝ : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M✝
inst✝³ : Module R✝ M✝
R : Type u_3
inst✝² : CommRing R
M : Type u_4
inst✝¹ : AddCommGroup M
inst✝ : Module R M
I : Ideal R
N : Submodule R M
s✝ : Set M
hfs : Set.Finite s✝
i : M
s : Set M
x✝¹ : ¬i ∈ s
x✝ : Set.Finite s
ih :
  (∃ r, r - 1 ∈ I ∧ N ≤ comap (↑(LinearMap.lsmul R M) r) (I • span R s) ∧ s ⊆ ↑N) →
    ∃ r, r - 1 ∈ I ∧ ∀ (n : M), n ∈ N → r • n = 0
r : R
hr1 : r - 1 ∈ I
hrn : N ≤ comap (↑(LinearMap.lsmul R M) r) (I • span R {i} ⊔ I • span R s)
hs : i ∈ ↑N ∧ s ⊆ ↑N
c : R
hc1 : c - 1 ∈ I
hci : c • i ∈ I • span R s
n : M
hn : n ∈ N
⊢ n ∈ comap (↑(LinearMap.lsmul R M) (c * r)) (I • span R s)
[PROOFSTEP]
specialize hrn hn
[GOAL]
case intro.intro.refine'_2.intro.intro.intro.intro.intro.refine'_2
R✝ : Type u_1
M✝ : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M✝
inst✝³ : Module R✝ M✝
R : Type u_3
inst✝² : CommRing R
M : Type u_4
inst✝¹ : AddCommGroup M
inst✝ : Module R M
I : Ideal R
N : Submodule R M
s✝ : Set M
hfs : Set.Finite s✝
i : M
s : Set M
x✝¹ : ¬i ∈ s
x✝ : Set.Finite s
ih :
  (∃ r, r - 1 ∈ I ∧ N ≤ comap (↑(LinearMap.lsmul R M) r) (I • span R s) ∧ s ⊆ ↑N) →
    ∃ r, r - 1 ∈ I ∧ ∀ (n : M), n ∈ N → r • n = 0
r : R
hr1 : r - 1 ∈ I
hs : i ∈ ↑N ∧ s ⊆ ↑N
c : R
hc1 : c - 1 ∈ I
hci : c • i ∈ I • span R s
n : M
hn : n ∈ N
hrn : n ∈ comap (↑(LinearMap.lsmul R M) r) (I • span R {i} ⊔ I • span R s)
⊢ n ∈ comap (↑(LinearMap.lsmul R M) (c * r)) (I • span R s)
[PROOFSTEP]
rw [mem_comap, mem_sup] at hrn 
[GOAL]
case intro.intro.refine'_2.intro.intro.intro.intro.intro.refine'_2
R✝ : Type u_1
M✝ : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M✝
inst✝³ : Module R✝ M✝
R : Type u_3
inst✝² : CommRing R
M : Type u_4
inst✝¹ : AddCommGroup M
inst✝ : Module R M
I : Ideal R
N : Submodule R M
s✝ : Set M
hfs : Set.Finite s✝
i : M
s : Set M
x✝¹ : ¬i ∈ s
x✝ : Set.Finite s
ih :
  (∃ r, r - 1 ∈ I ∧ N ≤ comap (↑(LinearMap.lsmul R M) r) (I • span R s) ∧ s ⊆ ↑N) →
    ∃ r, r - 1 ∈ I ∧ ∀ (n : M), n ∈ N → r • n = 0
r : R
hr1 : r - 1 ∈ I
hs : i ∈ ↑N ∧ s ⊆ ↑N
c : R
hc1 : c - 1 ∈ I
hci : c • i ∈ I • span R s
n : M
hn : n ∈ N
hrn : ∃ y, y ∈ I • span R {i} ∧ ∃ z, z ∈ I • span R s ∧ y + z = ↑(↑(LinearMap.lsmul R M) r) n
⊢ n ∈ comap (↑(LinearMap.lsmul R M) (c * r)) (I • span R s)
[PROOFSTEP]
rcases hrn with ⟨y, hy, z, hz, hyz⟩
[GOAL]
case intro.intro.refine'_2.intro.intro.intro.intro.intro.refine'_2.intro.intro.intro.intro
R✝ : Type u_1
M✝ : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M✝
inst✝³ : Module R✝ M✝
R : Type u_3
inst✝² : CommRing R
M : Type u_4
inst✝¹ : AddCommGroup M
inst✝ : Module R M
I : Ideal R
N : Submodule R M
s✝ : Set M
hfs : Set.Finite s✝
i : M
s : Set M
x✝¹ : ¬i ∈ s
x✝ : Set.Finite s
ih :
  (∃ r, r - 1 ∈ I ∧ N ≤ comap (↑(LinearMap.lsmul R M) r) (I • span R s) ∧ s ⊆ ↑N) →
    ∃ r, r - 1 ∈ I ∧ ∀ (n : M), n ∈ N → r • n = 0
r : R
hr1 : r - 1 ∈ I
hs : i ∈ ↑N ∧ s ⊆ ↑N
c : R
hc1 : c - 1 ∈ I
hci : c • i ∈ I • span R s
n : M
hn : n ∈ N
y : M
hy : y ∈ I • span R {i}
z : M
hz : z ∈ I • span R s
hyz : y + z = ↑(↑(LinearMap.lsmul R M) r) n
⊢ n ∈ comap (↑(LinearMap.lsmul R M) (c * r)) (I • span R s)
[PROOFSTEP]
dsimp at hyz 
[GOAL]
case intro.intro.refine'_2.intro.intro.intro.intro.intro.refine'_2.intro.intro.intro.intro
R✝ : Type u_1
M✝ : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M✝
inst✝³ : Module R✝ M✝
R : Type u_3
inst✝² : CommRing R
M : Type u_4
inst✝¹ : AddCommGroup M
inst✝ : Module R M
I : Ideal R
N : Submodule R M
s✝ : Set M
hfs : Set.Finite s✝
i : M
s : Set M
x✝¹ : ¬i ∈ s
x✝ : Set.Finite s
ih :
  (∃ r, r - 1 ∈ I ∧ N ≤ comap (↑(LinearMap.lsmul R M) r) (I • span R s) ∧ s ⊆ ↑N) →
    ∃ r, r - 1 ∈ I ∧ ∀ (n : M), n ∈ N → r • n = 0
r : R
hr1 : r - 1 ∈ I
hs : i ∈ ↑N ∧ s ⊆ ↑N
c : R
hc1 : c - 1 ∈ I
hci : c • i ∈ I • span R s
n : M
hn : n ∈ N
y : M
hy : y ∈ I • span R {i}
z : M
hz : z ∈ I • span R s
hyz : y + z = r • n
⊢ n ∈ comap (↑(LinearMap.lsmul R M) (c * r)) (I • span R s)
[PROOFSTEP]
rw [mem_smul_span_singleton] at hy 
[GOAL]
case intro.intro.refine'_2.intro.intro.intro.intro.intro.refine'_2.intro.intro.intro.intro
R✝ : Type u_1
M✝ : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M✝
inst✝³ : Module R✝ M✝
R : Type u_3
inst✝² : CommRing R
M : Type u_4
inst✝¹ : AddCommGroup M
inst✝ : Module R M
I : Ideal R
N : Submodule R M
s✝ : Set M
hfs : Set.Finite s✝
i : M
s : Set M
x✝¹ : ¬i ∈ s
x✝ : Set.Finite s
ih :
  (∃ r, r - 1 ∈ I ∧ N ≤ comap (↑(LinearMap.lsmul R M) r) (I • span R s) ∧ s ⊆ ↑N) →
    ∃ r, r - 1 ∈ I ∧ ∀ (n : M), n ∈ N → r • n = 0
r : R
hr1 : r - 1 ∈ I
hs : i ∈ ↑N ∧ s ⊆ ↑N
c : R
hc1 : c - 1 ∈ I
hci : c • i ∈ I • span R s
n : M
hn : n ∈ N
y : M
hy : ∃ y_1, y_1 ∈ I ∧ y_1 • i = y
z : M
hz : z ∈ I • span R s
hyz : y + z = r • n
⊢ n ∈ comap (↑(LinearMap.lsmul R M) (c * r)) (I • span R s)
[PROOFSTEP]
rcases hy with ⟨d, _, rfl⟩
[GOAL]
case intro.intro.refine'_2.intro.intro.intro.intro.intro.refine'_2.intro.intro.intro.intro.intro.intro
R✝ : Type u_1
M✝ : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M✝
inst✝³ : Module R✝ M✝
R : Type u_3
inst✝² : CommRing R
M : Type u_4
inst✝¹ : AddCommGroup M
inst✝ : Module R M
I : Ideal R
N : Submodule R M
s✝ : Set M
hfs : Set.Finite s✝
i : M
s : Set M
x✝¹ : ¬i ∈ s
x✝ : Set.Finite s
ih :
  (∃ r, r - 1 ∈ I ∧ N ≤ comap (↑(LinearMap.lsmul R M) r) (I • span R s) ∧ s ⊆ ↑N) →
    ∃ r, r - 1 ∈ I ∧ ∀ (n : M), n ∈ N → r • n = 0
r : R
hr1 : r - 1 ∈ I
hs : i ∈ ↑N ∧ s ⊆ ↑N
c : R
hc1 : c - 1 ∈ I
hci : c • i ∈ I • span R s
n : M
hn : n ∈ N
z : M
hz : z ∈ I • span R s
d : R
left✝ : d ∈ I
hyz : d • i + z = r • n
⊢ n ∈ comap (↑(LinearMap.lsmul R M) (c * r)) (I • span R s)
[PROOFSTEP]
simp only [mem_comap, LinearMap.lsmul_apply]
[GOAL]
case intro.intro.refine'_2.intro.intro.intro.intro.intro.refine'_2.intro.intro.intro.intro.intro.intro
R✝ : Type u_1
M✝ : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M✝
inst✝³ : Module R✝ M✝
R : Type u_3
inst✝² : CommRing R
M : Type u_4
inst✝¹ : AddCommGroup M
inst✝ : Module R M
I : Ideal R
N : Submodule R M
s✝ : Set M
hfs : Set.Finite s✝
i : M
s : Set M
x✝¹ : ¬i ∈ s
x✝ : Set.Finite s
ih :
  (∃ r, r - 1 ∈ I ∧ N ≤ comap (↑(LinearMap.lsmul R M) r) (I • span R s) ∧ s ⊆ ↑N) →
    ∃ r, r - 1 ∈ I ∧ ∀ (n : M), n ∈ N → r • n = 0
r : R
hr1 : r - 1 ∈ I
hs : i ∈ ↑N ∧ s ⊆ ↑N
c : R
hc1 : c - 1 ∈ I
hci : c • i ∈ I • span R s
n : M
hn : n ∈ N
z : M
hz : z ∈ I • span R s
d : R
left✝ : d ∈ I
hyz : d • i + z = r • n
⊢ (c * r) • n ∈ I • span R s
[PROOFSTEP]
rw [mul_smul, ← hyz, smul_add, smul_smul, mul_comm, mul_smul]
[GOAL]
case intro.intro.refine'_2.intro.intro.intro.intro.intro.refine'_2.intro.intro.intro.intro.intro.intro
R✝ : Type u_1
M✝ : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M✝
inst✝³ : Module R✝ M✝
R : Type u_3
inst✝² : CommRing R
M : Type u_4
inst✝¹ : AddCommGroup M
inst✝ : Module R M
I : Ideal R
N : Submodule R M
s✝ : Set M
hfs : Set.Finite s✝
i : M
s : Set M
x✝¹ : ¬i ∈ s
x✝ : Set.Finite s
ih :
  (∃ r, r - 1 ∈ I ∧ N ≤ comap (↑(LinearMap.lsmul R M) r) (I • span R s) ∧ s ⊆ ↑N) →
    ∃ r, r - 1 ∈ I ∧ ∀ (n : M), n ∈ N → r • n = 0
r : R
hr1 : r - 1 ∈ I
hs : i ∈ ↑N ∧ s ⊆ ↑N
c : R
hc1 : c - 1 ∈ I
hci : c • i ∈ I • span R s
n : M
hn : n ∈ N
z : M
hz : z ∈ I • span R s
d : R
left✝ : d ∈ I
hyz : d • i + z = r • n
⊢ d • c • i + c • z ∈ I • span R s
[PROOFSTEP]
exact add_mem (smul_mem _ _ hci) (smul_mem _ _ hz)
[GOAL]
R✝ : Type u_1
M✝ : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M✝
inst✝³ : Module R✝ M✝
R : Type u_3
inst✝² : CommRing R
M : Type u_4
inst✝¹ : AddCommGroup M
inst✝ : Module R M
I : Ideal R
N : Submodule R M
hn : FG N
hin : N ≤ I • N
⊢ ∃ r, r ∈ I ∧ ∀ (n : M), n ∈ N → r • n = n
[PROOFSTEP]
obtain ⟨r, hr, hr'⟩ := exists_sub_one_mem_and_smul_eq_zero_of_fg_of_le_smul I N hn hin
[GOAL]
case intro.intro
R✝ : Type u_1
M✝ : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M✝
inst✝³ : Module R✝ M✝
R : Type u_3
inst✝² : CommRing R
M : Type u_4
inst✝¹ : AddCommGroup M
inst✝ : Module R M
I : Ideal R
N : Submodule R M
hn : FG N
hin : N ≤ I • N
r : R
hr : r - 1 ∈ I
hr' : ∀ (n : M), n ∈ N → r • n = 0
⊢ ∃ r, r ∈ I ∧ ∀ (n : M), n ∈ N → r • n = n
[PROOFSTEP]
exact ⟨-(r - 1), I.neg_mem hr, fun n hn => by simpa [sub_smul] using hr' n hn⟩
[GOAL]
R✝ : Type u_1
M✝ : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M✝
inst✝³ : Module R✝ M✝
R : Type u_3
inst✝² : CommRing R
M : Type u_4
inst✝¹ : AddCommGroup M
inst✝ : Module R M
I : Ideal R
N : Submodule R M
hn✝ : FG N
hin : N ≤ I • N
r : R
hr : r - 1 ∈ I
hr' : ∀ (n : M), n ∈ N → r • n = 0
n : M
hn : n ∈ N
⊢ -(r - 1) • n = n
[PROOFSTEP]
simpa [sub_smul] using hr' n hn
[GOAL]
R : Type u_1
M : Type u_2
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
⊢ span R ↑∅ = ⊥
[PROOFSTEP]
rw [Finset.coe_empty, span_empty]
[GOAL]
R✝ : Type u_1
M : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M
inst✝³ : Module R✝ M
R : Type u_3
A : Type u_4
inst✝² : CommSemiring R
inst✝¹ : Semiring A
inst✝ : Algebra R A
⊢ span R ↑{1} = ↑Subalgebra.toSubmodule ⊥
[PROOFSTEP]
simp [Algebra.toSubmodule_bot]
[GOAL]
R✝ : Type u_1
M : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M
inst✝³ : Module R✝ M
R : Type u_3
A : Type u_4
inst✝² : CommSemiring R
inst✝¹ : Semiring A
inst✝ : Algebra R A
I : (Submodule R A)ˣ
⊢ FG ↑I
[PROOFSTEP]
have : (1 : A) ∈ (I * ↑I⁻¹ : Submodule R A) := by
  rw [I.mul_inv]
  exact one_le.mp le_rfl
[GOAL]
R✝ : Type u_1
M : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M
inst✝³ : Module R✝ M
R : Type u_3
A : Type u_4
inst✝² : CommSemiring R
inst✝¹ : Semiring A
inst✝ : Algebra R A
I : (Submodule R A)ˣ
⊢ 1 ∈ ↑I * ↑I⁻¹
[PROOFSTEP]
rw [I.mul_inv]
[GOAL]
R✝ : Type u_1
M : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M
inst✝³ : Module R✝ M
R : Type u_3
A : Type u_4
inst✝² : CommSemiring R
inst✝¹ : Semiring A
inst✝ : Algebra R A
I : (Submodule R A)ˣ
⊢ 1 ∈ 1
[PROOFSTEP]
exact one_le.mp le_rfl
[GOAL]
R✝ : Type u_1
M : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M
inst✝³ : Module R✝ M
R : Type u_3
A : Type u_4
inst✝² : CommSemiring R
inst✝¹ : Semiring A
inst✝ : Algebra R A
I : (Submodule R A)ˣ
this : 1 ∈ ↑I * ↑I⁻¹
⊢ FG ↑I
[PROOFSTEP]
obtain ⟨T, T', hT, hT', one_mem⟩ := mem_span_mul_finite_of_mem_mul this
[GOAL]
case intro.intro.intro.intro
R✝ : Type u_1
M : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M
inst✝³ : Module R✝ M
R : Type u_3
A : Type u_4
inst✝² : CommSemiring R
inst✝¹ : Semiring A
inst✝ : Algebra R A
I : (Submodule R A)ˣ
this : 1 ∈ ↑I * ↑I⁻¹
T T' : Finset A
hT : ↑T ⊆ ↑↑I
hT' : ↑T' ⊆ ↑↑I⁻¹
one_mem : 1 ∈ span R (↑T * ↑T')
⊢ FG ↑I
[PROOFSTEP]
refine' ⟨T, span_eq_of_le _ hT _⟩
[GOAL]
case intro.intro.intro.intro
R✝ : Type u_1
M : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M
inst✝³ : Module R✝ M
R : Type u_3
A : Type u_4
inst✝² : CommSemiring R
inst✝¹ : Semiring A
inst✝ : Algebra R A
I : (Submodule R A)ˣ
this : 1 ∈ ↑I * ↑I⁻¹
T T' : Finset A
hT : ↑T ⊆ ↑↑I
hT' : ↑T' ⊆ ↑↑I⁻¹
one_mem : 1 ∈ span R (↑T * ↑T')
⊢ ↑I ≤ span R ↑T
[PROOFSTEP]
rw [← one_mul I, ← mul_one (span R (T : Set A))]
[GOAL]
case intro.intro.intro.intro
R✝ : Type u_1
M : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M
inst✝³ : Module R✝ M
R : Type u_3
A : Type u_4
inst✝² : CommSemiring R
inst✝¹ : Semiring A
inst✝ : Algebra R A
I : (Submodule R A)ˣ
this : 1 ∈ ↑I * ↑I⁻¹
T T' : Finset A
hT : ↑T ⊆ ↑↑I
hT' : ↑T' ⊆ ↑↑I⁻¹
one_mem : 1 ∈ span R (↑T * ↑T')
⊢ ↑(1 * I) ≤ span R ↑T * 1
[PROOFSTEP]
conv_rhs => rw [← I.inv_mul, ← mul_assoc]
[GOAL]
R✝ : Type u_1
M : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M
inst✝³ : Module R✝ M
R : Type u_3
A : Type u_4
inst✝² : CommSemiring R
inst✝¹ : Semiring A
inst✝ : Algebra R A
I : (Submodule R A)ˣ
this : 1 ∈ ↑I * ↑I⁻¹
T T' : Finset A
hT : ↑T ⊆ ↑↑I
hT' : ↑T' ⊆ ↑↑I⁻¹
one_mem : 1 ∈ span R (↑T * ↑T')
| span R ↑T * 1
[PROOFSTEP]
rw [← I.inv_mul, ← mul_assoc]
[GOAL]
R✝ : Type u_1
M : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M
inst✝³ : Module R✝ M
R : Type u_3
A : Type u_4
inst✝² : CommSemiring R
inst✝¹ : Semiring A
inst✝ : Algebra R A
I : (Submodule R A)ˣ
this : 1 ∈ ↑I * ↑I⁻¹
T T' : Finset A
hT : ↑T ⊆ ↑↑I
hT' : ↑T' ⊆ ↑↑I⁻¹
one_mem : 1 ∈ span R (↑T * ↑T')
| span R ↑T * 1
[PROOFSTEP]
rw [← I.inv_mul, ← mul_assoc]
[GOAL]
R✝ : Type u_1
M : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M
inst✝³ : Module R✝ M
R : Type u_3
A : Type u_4
inst✝² : CommSemiring R
inst✝¹ : Semiring A
inst✝ : Algebra R A
I : (Submodule R A)ˣ
this : 1 ∈ ↑I * ↑I⁻¹
T T' : Finset A
hT : ↑T ⊆ ↑↑I
hT' : ↑T' ⊆ ↑↑I⁻¹
one_mem : 1 ∈ span R (↑T * ↑T')
| span R ↑T * 1
[PROOFSTEP]
rw [← I.inv_mul, ← mul_assoc]
[GOAL]
case intro.intro.intro.intro
R✝ : Type u_1
M : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M
inst✝³ : Module R✝ M
R : Type u_3
A : Type u_4
inst✝² : CommSemiring R
inst✝¹ : Semiring A
inst✝ : Algebra R A
I : (Submodule R A)ˣ
this : 1 ∈ ↑I * ↑I⁻¹
T T' : Finset A
hT : ↑T ⊆ ↑↑I
hT' : ↑T' ⊆ ↑↑I⁻¹
one_mem : 1 ∈ span R (↑T * ↑T')
⊢ ↑(1 * I) ≤ span R ↑T * ↑I⁻¹ * ↑I
[PROOFSTEP]
refine' mul_le_mul_left (le_trans _ <| mul_le_mul_right <| span_le.mpr hT')
[GOAL]
case intro.intro.intro.intro
R✝ : Type u_1
M : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M
inst✝³ : Module R✝ M
R : Type u_3
A : Type u_4
inst✝² : CommSemiring R
inst✝¹ : Semiring A
inst✝ : Algebra R A
I : (Submodule R A)ˣ
this : 1 ∈ ↑I * ↑I⁻¹
T T' : Finset A
hT : ↑T ⊆ ↑↑I
hT' : ↑T' ⊆ ↑↑I⁻¹
one_mem : 1 ∈ span R (↑T * ↑T')
⊢ ↑1 ≤ span R ↑T * span R ↑T'
[PROOFSTEP]
simp only [Units.val_one, span_mul_span]
[GOAL]
case intro.intro.intro.intro
R✝ : Type u_1
M : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M
inst✝³ : Module R✝ M
R : Type u_3
A : Type u_4
inst✝² : CommSemiring R
inst✝¹ : Semiring A
inst✝ : Algebra R A
I : (Submodule R A)ˣ
this : 1 ∈ ↑I * ↑I⁻¹
T T' : Finset A
hT : ↑T ⊆ ↑↑I
hT' : ↑T' ⊆ ↑↑I⁻¹
one_mem : 1 ∈ span R (↑T * ↑T')
⊢ 1 ≤ span R (↑T * ↑T')
[PROOFSTEP]
rwa [one_le]
[GOAL]
R : Type u_1
M : Type u_2
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
s : Set M
hs : Set.Finite s
⊢ span R ↑(Finite.toFinset hs) = span R s
[PROOFSTEP]
rw [hs.coe_toFinset]
[GOAL]
R : Type u_1
M : Type u_2
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
N₁ N₂ : Submodule R M
hN₁ : FG N₁
hN₂ : FG N₂
t₁ : Set M
ht₁ : Set.Finite t₁ ∧ span R t₁ = N₁
t₂ : Set M
ht₂ : Set.Finite t₂ ∧ span R t₂ = N₂
⊢ span R (t₁ ∪ t₂) = N₁ ⊔ N₂
[PROOFSTEP]
rw [span_union, ht₁.2, ht₂.2]
[GOAL]
R : Type u_1
M : Type u_2
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
ι : Type u_3
s : Finset ι
N : ι → Submodule R M
h : ∀ (i : ι), i ∈ s → FG (N i)
⊢ FG (⨆ (i : ι) (_ : i ∈ s), N i)
[PROOFSTEP]
simpa only [Finset.sup_eq_iSup] using fg_finset_sup s N h
[GOAL]
R : Type u_1
M : Type u_2
inst✝³ : Semiring R
inst✝² : AddCommMonoid M
inst✝¹ : Module R M
ι : Type u_3
inst✝ : Finite ι
N : ι → Submodule R M
h : ∀ (i : ι), FG (N i)
⊢ FG (iSup N)
[PROOFSTEP]
cases nonempty_fintype ι
[GOAL]
case intro
R : Type u_1
M : Type u_2
inst✝³ : Semiring R
inst✝² : AddCommMonoid M
inst✝¹ : Module R M
ι : Type u_3
inst✝ : Finite ι
N : ι → Submodule R M
h : ∀ (i : ι), FG (N i)
val✝ : Fintype ι
⊢ FG (iSup N)
[PROOFSTEP]
simpa using fg_biSup Finset.univ N fun i _ => h i
[GOAL]
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type u_3
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f : M →ₗ[R] P
N : Submodule R M
hs : FG N
t : Set M
ht : Set.Finite t ∧ span R t = N
⊢ span R (↑f '' t) = Submodule.map f N
[PROOFSTEP]
rw [span_image, ht.2]
[GOAL]
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type u_3
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f✝ f : M →ₗ[R] P
hf : Function.Injective ↑f
N : Submodule R M
hfn : FG (map f N)
t : Finset P
ht : span R ↑t = map f N
⊢ map f
      (span R ↑(Finset.preimage t ↑f (_ : ∀ (x : M), x ∈ ↑f ⁻¹' ↑t → ∀ (y : M), y ∈ ↑f ⁻¹' ↑t → ↑f x = ↑f y → x = y))) =
    map f N
[PROOFSTEP]
rw [map_span, Finset.coe_preimage, Set.image_preimage_eq_inter_range, Set.inter_eq_self_of_subset_left, ht]
[GOAL]
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type u_3
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f✝ f : M →ₗ[R] P
hf : Function.Injective ↑f
N : Submodule R M
hfn : FG (map f N)
t : Finset P
ht : span R ↑t = map f N
⊢ ↑t ⊆ range ↑f
[PROOFSTEP]
rw [← LinearMap.range_coe, ← span_le, ht, ← map_top]
[GOAL]
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type u_3
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f✝ f : M →ₗ[R] P
hf : Function.Injective ↑f
N : Submodule R M
hfn : FG (map f N)
t : Finset P
ht : span R ↑t = map f N
⊢ map f N ≤ map f ⊤
[PROOFSTEP]
exact map_mono le_top
[GOAL]
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type u_3
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f : M →ₗ[R] P
N : Submodule R M
h : FG N
⊢ FG (map (Submodule.subtype N) ⊤)
[PROOFSTEP]
rwa [map_top, range_subtype]
[GOAL]
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type u_3
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f : M →ₗ[R] P
sb : Submodule R M
sc : Submodule R P
hsb : FG sb
hsc : FG sc
tb : Set M
htb : Set.Finite tb ∧ span R tb = sb
tc : Set P
htc : Set.Finite tc ∧ span R tc = sc
⊢ span R (↑(LinearMap.inl R M P) '' tb ∪ ↑(LinearMap.inr R M P) '' tc) = Submodule.prod sb sc
[PROOFSTEP]
rw [LinearMap.span_inl_union_inr, htb.2, htc.2]
[GOAL]
R : Type u_1
M✝ : Type u_2
inst✝⁷ : Semiring R
inst✝⁶ : AddCommMonoid M✝
inst✝⁵ : Module R M✝
P : Type u_3
inst✝⁴ : AddCommMonoid P
inst✝³ : Module R P
f : M✝ →ₗ[R] P
ι : Type u_4
M : ι → Type u_5
inst✝² : Finite ι
inst✝¹ : (i : ι) → AddCommMonoid (M i)
inst✝ : (i : ι) → Module R (M i)
p : (i : ι) → Submodule R (M i)
hsb : ∀ (i : ι), FG (p i)
⊢ FG (pi univ p)
[PROOFSTEP]
classical
simp_rw [fg_def] at hsb ⊢
choose t htf hts using hsb
refine ⟨⋃ i, (LinearMap.single i : _ →ₗ[R] _) '' t i, Set.finite_iUnion fun i => (htf i).image _, ?_⟩
simp_rw [span_iUnion, span_image, hts, Submodule.iSup_map_single]
[GOAL]
R : Type u_1
M✝ : Type u_2
inst✝⁷ : Semiring R
inst✝⁶ : AddCommMonoid M✝
inst✝⁵ : Module R M✝
P : Type u_3
inst✝⁴ : AddCommMonoid P
inst✝³ : Module R P
f : M✝ →ₗ[R] P
ι : Type u_4
M : ι → Type u_5
inst✝² : Finite ι
inst✝¹ : (i : ι) → AddCommMonoid (M i)
inst✝ : (i : ι) → Module R (M i)
p : (i : ι) → Submodule R (M i)
hsb : ∀ (i : ι), FG (p i)
⊢ FG (pi univ p)
[PROOFSTEP]
simp_rw [fg_def] at hsb ⊢
[GOAL]
R : Type u_1
M✝ : Type u_2
inst✝⁷ : Semiring R
inst✝⁶ : AddCommMonoid M✝
inst✝⁵ : Module R M✝
P : Type u_3
inst✝⁴ : AddCommMonoid P
inst✝³ : Module R P
f : M✝ →ₗ[R] P
ι : Type u_4
M : ι → Type u_5
inst✝² : Finite ι
inst✝¹ : (i : ι) → AddCommMonoid (M i)
inst✝ : (i : ι) → Module R (M i)
p : (i : ι) → Submodule R (M i)
hsb : ∀ (i : ι), ∃ S, Set.Finite S ∧ span R S = p i
⊢ ∃ S, Set.Finite S ∧ span R S = pi univ p
[PROOFSTEP]
choose t htf hts using hsb
[GOAL]
R : Type u_1
M✝ : Type u_2
inst✝⁷ : Semiring R
inst✝⁶ : AddCommMonoid M✝
inst✝⁵ : Module R M✝
P : Type u_3
inst✝⁴ : AddCommMonoid P
inst✝³ : Module R P
f : M✝ →ₗ[R] P
ι : Type u_4
M : ι → Type u_5
inst✝² : Finite ι
inst✝¹ : (i : ι) → AddCommMonoid (M i)
inst✝ : (i : ι) → Module R (M i)
p : (i : ι) → Submodule R (M i)
t : (i : ι) → Set (M i)
htf : ∀ (i : ι), Set.Finite (t i)
hts : ∀ (i : ι), span R (t i) = p i
⊢ ∃ S, Set.Finite S ∧ span R S = pi univ p
[PROOFSTEP]
refine ⟨⋃ i, (LinearMap.single i : _ →ₗ[R] _) '' t i, Set.finite_iUnion fun i => (htf i).image _, ?_⟩
[GOAL]
R : Type u_1
M✝ : Type u_2
inst✝⁷ : Semiring R
inst✝⁶ : AddCommMonoid M✝
inst✝⁵ : Module R M✝
P : Type u_3
inst✝⁴ : AddCommMonoid P
inst✝³ : Module R P
f : M✝ →ₗ[R] P
ι : Type u_4
M : ι → Type u_5
inst✝² : Finite ι
inst✝¹ : (i : ι) → AddCommMonoid (M i)
inst✝ : (i : ι) → Module R (M i)
p : (i : ι) → Submodule R (M i)
t : (i : ι) → Set (M i)
htf : ∀ (i : ι), Set.Finite (t i)
hts : ∀ (i : ι), span R (t i) = p i
⊢ span R (⋃ (i : ι), ↑(LinearMap.single i) '' t i) = pi univ p
[PROOFSTEP]
simp_rw [span_iUnion, span_image, hts, Submodule.iSup_map_single]
[GOAL]
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
hs1 : FG (map f s)
hs2 : FG (s ⊓ LinearMap.ker f)
⊢ FG s
[PROOFSTEP]
haveI := Classical.decEq R
[GOAL]
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
hs1 : FG (map f s)
hs2 : FG (s ⊓ LinearMap.ker f)
this : DecidableEq R
⊢ FG s
[PROOFSTEP]
haveI := Classical.decEq M
[GOAL]
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
hs1 : FG (map f s)
hs2 : FG (s ⊓ LinearMap.ker f)
this✝ : DecidableEq R
this : DecidableEq M
⊢ FG s
[PROOFSTEP]
haveI := Classical.decEq P
[GOAL]
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
hs1 : FG (map f s)
hs2 : FG (s ⊓ LinearMap.ker f)
this✝¹ : DecidableEq R
this✝ : DecidableEq M
this : DecidableEq P
⊢ FG s
[PROOFSTEP]
cases' hs1 with t1 ht1
[GOAL]
case intro
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
hs2 : FG (s ⊓ LinearMap.ker f)
this✝¹ : DecidableEq R
this✝ : DecidableEq M
this : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
⊢ FG s
[PROOFSTEP]
cases' hs2 with t2 ht2
[GOAL]
case intro.intro
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝¹ : DecidableEq R
this✝ : DecidableEq M
this : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
⊢ FG s
[PROOFSTEP]
have : ∀ y ∈ t1, ∃ x ∈ s, f x = y := by
  intro y hy
  have : y ∈ s.map f := by
    rw [← ht1]
    exact subset_span hy
  rcases mem_map.1 this with ⟨x, hx1, hx2⟩
  exact ⟨x, hx1, hx2⟩
[GOAL]
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝¹ : DecidableEq R
this✝ : DecidableEq M
this : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
⊢ ∀ (y : P), y ∈ t1 → ∃ x, x ∈ s ∧ ↑f x = y
[PROOFSTEP]
intro y hy
[GOAL]
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝¹ : DecidableEq R
this✝ : DecidableEq M
this : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
y : P
hy : y ∈ t1
⊢ ∃ x, x ∈ s ∧ ↑f x = y
[PROOFSTEP]
have : y ∈ s.map f := by
  rw [← ht1]
  exact subset_span hy
[GOAL]
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝¹ : DecidableEq R
this✝ : DecidableEq M
this : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
y : P
hy : y ∈ t1
⊢ y ∈ map f s
[PROOFSTEP]
rw [← ht1]
[GOAL]
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝¹ : DecidableEq R
this✝ : DecidableEq M
this : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
y : P
hy : y ∈ t1
⊢ y ∈ span R ↑t1
[PROOFSTEP]
exact subset_span hy
[GOAL]
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝² : DecidableEq R
this✝¹ : DecidableEq M
this✝ : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
y : P
hy : y ∈ t1
this : y ∈ map f s
⊢ ∃ x, x ∈ s ∧ ↑f x = y
[PROOFSTEP]
rcases mem_map.1 this with ⟨x, hx1, hx2⟩
[GOAL]
case intro.intro
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝² : DecidableEq R
this✝¹ : DecidableEq M
this✝ : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
y : P
hy : y ∈ t1
this : y ∈ map f s
x : M
hx1 : x ∈ s
hx2 : ↑f x = y
⊢ ∃ x, x ∈ s ∧ ↑f x = y
[PROOFSTEP]
exact ⟨x, hx1, hx2⟩
[GOAL]
case intro.intro
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝² : DecidableEq R
this✝¹ : DecidableEq M
this✝ : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
this : ∀ (y : P), y ∈ t1 → ∃ x, x ∈ s ∧ ↑f x = y
⊢ FG s
[PROOFSTEP]
have : ∃ g : P → M, ∀ y ∈ t1, g y ∈ s ∧ f (g y) = y :=
  by
  choose g hg1 hg2 using this
  exists fun y => if H : y ∈ t1 then g y H else 0
  intro y H
  constructor
  · simp only [dif_pos H]
    apply hg1
  · simp only [dif_pos H]
    apply hg2
[GOAL]
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝² : DecidableEq R
this✝¹ : DecidableEq M
this✝ : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
this : ∀ (y : P), y ∈ t1 → ∃ x, x ∈ s ∧ ↑f x = y
⊢ ∃ g, ∀ (y : P), y ∈ t1 → g y ∈ s ∧ ↑f (g y) = y
[PROOFSTEP]
choose g hg1 hg2 using this
[GOAL]
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝¹ : DecidableEq R
this✝ : DecidableEq M
this : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
g : (y : P) → y ∈ t1 → M
hg1 : ∀ (y : P) (a : y ∈ t1), g y a ∈ s
hg2 : ∀ (y : P) (a : y ∈ t1), ↑f (g y a) = y
⊢ ∃ g, ∀ (y : P), y ∈ t1 → g y ∈ s ∧ ↑f (g y) = y
[PROOFSTEP]
exists fun y => if H : y ∈ t1 then g y H else 0
[GOAL]
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝¹ : DecidableEq R
this✝ : DecidableEq M
this : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
g : (y : P) → y ∈ t1 → M
hg1 : ∀ (y : P) (a : y ∈ t1), g y a ∈ s
hg2 : ∀ (y : P) (a : y ∈ t1), ↑f (g y a) = y
⊢ ∀ (y : P),
    y ∈ t1 → (fun y => if H : y ∈ t1 then g y H else 0) y ∈ s ∧ ↑f ((fun y => if H : y ∈ t1 then g y H else 0) y) = y
[PROOFSTEP]
intro y H
[GOAL]
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝¹ : DecidableEq R
this✝ : DecidableEq M
this : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
g : (y : P) → y ∈ t1 → M
hg1 : ∀ (y : P) (a : y ∈ t1), g y a ∈ s
hg2 : ∀ (y : P) (a : y ∈ t1), ↑f (g y a) = y
y : P
H : y ∈ t1
⊢ (fun y => if H : y ∈ t1 then g y H else 0) y ∈ s ∧ ↑f ((fun y => if H : y ∈ t1 then g y H else 0) y) = y
[PROOFSTEP]
constructor
[GOAL]
case left
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝¹ : DecidableEq R
this✝ : DecidableEq M
this : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
g : (y : P) → y ∈ t1 → M
hg1 : ∀ (y : P) (a : y ∈ t1), g y a ∈ s
hg2 : ∀ (y : P) (a : y ∈ t1), ↑f (g y a) = y
y : P
H : y ∈ t1
⊢ (fun y => if H : y ∈ t1 then g y H else 0) y ∈ s
[PROOFSTEP]
simp only [dif_pos H]
[GOAL]
case left
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝¹ : DecidableEq R
this✝ : DecidableEq M
this : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
g : (y : P) → y ∈ t1 → M
hg1 : ∀ (y : P) (a : y ∈ t1), g y a ∈ s
hg2 : ∀ (y : P) (a : y ∈ t1), ↑f (g y a) = y
y : P
H : y ∈ t1
⊢ g y H ∈ s
[PROOFSTEP]
apply hg1
[GOAL]
case right
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝¹ : DecidableEq R
this✝ : DecidableEq M
this : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
g : (y : P) → y ∈ t1 → M
hg1 : ∀ (y : P) (a : y ∈ t1), g y a ∈ s
hg2 : ∀ (y : P) (a : y ∈ t1), ↑f (g y a) = y
y : P
H : y ∈ t1
⊢ ↑f ((fun y => if H : y ∈ t1 then g y H else 0) y) = y
[PROOFSTEP]
simp only [dif_pos H]
[GOAL]
case right
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝¹ : DecidableEq R
this✝ : DecidableEq M
this : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
g : (y : P) → y ∈ t1 → M
hg1 : ∀ (y : P) (a : y ∈ t1), g y a ∈ s
hg2 : ∀ (y : P) (a : y ∈ t1), ↑f (g y a) = y
y : P
H : y ∈ t1
⊢ ↑f (g y H) = y
[PROOFSTEP]
apply hg2
[GOAL]
case intro.intro
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝³ : DecidableEq R
this✝² : DecidableEq M
this✝¹ : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
this✝ : ∀ (y : P), y ∈ t1 → ∃ x, x ∈ s ∧ ↑f x = y
this : ∃ g, ∀ (y : P), y ∈ t1 → g y ∈ s ∧ ↑f (g y) = y
⊢ FG s
[PROOFSTEP]
cases' this with g hg
[GOAL]
case intro.intro.intro
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝² : DecidableEq R
this✝¹ : DecidableEq M
this✝ : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
this : ∀ (y : P), y ∈ t1 → ∃ x, x ∈ s ∧ ↑f x = y
g : P → M
hg : ∀ (y : P), y ∈ t1 → g y ∈ s ∧ ↑f (g y) = y
⊢ FG s
[PROOFSTEP]
clear this
[GOAL]
case intro.intro.intro
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝¹ : DecidableEq R
this✝ : DecidableEq M
this : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
g : P → M
hg : ∀ (y : P), y ∈ t1 → g y ∈ s ∧ ↑f (g y) = y
⊢ FG s
[PROOFSTEP]
exists t1.image g ∪ t2
[GOAL]
case intro.intro.intro
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝¹ : DecidableEq R
this✝ : DecidableEq M
this : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
g : P → M
hg : ∀ (y : P), y ∈ t1 → g y ∈ s ∧ ↑f (g y) = y
⊢ span R ↑(Finset.image g t1 ∪ t2) = s
[PROOFSTEP]
rw [Finset.coe_union, span_union, Finset.coe_image]
[GOAL]
case intro.intro.intro
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝¹ : DecidableEq R
this✝ : DecidableEq M
this : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
g : P → M
hg : ∀ (y : P), y ∈ t1 → g y ∈ s ∧ ↑f (g y) = y
⊢ span R (g '' ↑t1) ⊔ span R ↑t2 = s
[PROOFSTEP]
apply le_antisymm
[GOAL]
case intro.intro.intro.a
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝¹ : DecidableEq R
this✝ : DecidableEq M
this : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
g : P → M
hg : ∀ (y : P), y ∈ t1 → g y ∈ s ∧ ↑f (g y) = y
⊢ span R (g '' ↑t1) ⊔ span R ↑t2 ≤ s
[PROOFSTEP]
refine' sup_le (span_le.2 <| image_subset_iff.2 _) (span_le.2 _)
[GOAL]
case intro.intro.intro.a.refine'_1
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝¹ : DecidableEq R
this✝ : DecidableEq M
this : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
g : P → M
hg : ∀ (y : P), y ∈ t1 → g y ∈ s ∧ ↑f (g y) = y
⊢ ↑t1 ⊆ g ⁻¹' ↑s
[PROOFSTEP]
intro y hy
[GOAL]
case intro.intro.intro.a.refine'_1
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝¹ : DecidableEq R
this✝ : DecidableEq M
this : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
g : P → M
hg : ∀ (y : P), y ∈ t1 → g y ∈ s ∧ ↑f (g y) = y
y : P
hy : y ∈ ↑t1
⊢ y ∈ g ⁻¹' ↑s
[PROOFSTEP]
exact (hg y hy).1
[GOAL]
case intro.intro.intro.a.refine'_2
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝¹ : DecidableEq R
this✝ : DecidableEq M
this : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
g : P → M
hg : ∀ (y : P), y ∈ t1 → g y ∈ s ∧ ↑f (g y) = y
⊢ ↑t2 ⊆ ↑s
[PROOFSTEP]
intro x hx
[GOAL]
case intro.intro.intro.a.refine'_2
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝¹ : DecidableEq R
this✝ : DecidableEq M
this : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
g : P → M
hg : ∀ (y : P), y ∈ t1 → g y ∈ s ∧ ↑f (g y) = y
x : M
hx : x ∈ ↑t2
⊢ x ∈ ↑s
[PROOFSTEP]
have : x ∈ span R t2 := subset_span hx
[GOAL]
case intro.intro.intro.a.refine'_2
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝² : DecidableEq R
this✝¹ : DecidableEq M
this✝ : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
g : P → M
hg : ∀ (y : P), y ∈ t1 → g y ∈ s ∧ ↑f (g y) = y
x : M
hx : x ∈ ↑t2
this : x ∈ span R ↑t2
⊢ x ∈ ↑s
[PROOFSTEP]
rw [ht2] at this 
[GOAL]
case intro.intro.intro.a.refine'_2
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝² : DecidableEq R
this✝¹ : DecidableEq M
this✝ : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
g : P → M
hg : ∀ (y : P), y ∈ t1 → g y ∈ s ∧ ↑f (g y) = y
x : M
hx : x ∈ ↑t2
this : x ∈ s ⊓ LinearMap.ker f
⊢ x ∈ ↑s
[PROOFSTEP]
exact this.1
[GOAL]
case intro.intro.intro.a
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝¹ : DecidableEq R
this✝ : DecidableEq M
this : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
g : P → M
hg : ∀ (y : P), y ∈ t1 → g y ∈ s ∧ ↑f (g y) = y
⊢ s ≤ span R (g '' ↑t1) ⊔ span R ↑t2
[PROOFSTEP]
intro x hx
[GOAL]
case intro.intro.intro.a
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝¹ : DecidableEq R
this✝ : DecidableEq M
this : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
g : P → M
hg : ∀ (y : P), y ∈ t1 → g y ∈ s ∧ ↑f (g y) = y
x : M
hx : x ∈ s
⊢ x ∈ span R (g '' ↑t1) ⊔ span R ↑t2
[PROOFSTEP]
have : f x ∈ s.map f := by
  rw [mem_map]
  exact ⟨x, hx, rfl⟩
[GOAL]
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝¹ : DecidableEq R
this✝ : DecidableEq M
this : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
g : P → M
hg : ∀ (y : P), y ∈ t1 → g y ∈ s ∧ ↑f (g y) = y
x : M
hx : x ∈ s
⊢ ↑f x ∈ map f s
[PROOFSTEP]
rw [mem_map]
[GOAL]
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝¹ : DecidableEq R
this✝ : DecidableEq M
this : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
g : P → M
hg : ∀ (y : P), y ∈ t1 → g y ∈ s ∧ ↑f (g y) = y
x : M
hx : x ∈ s
⊢ ∃ y, y ∈ s ∧ ↑f y = ↑f x
[PROOFSTEP]
exact ⟨x, hx, rfl⟩
[GOAL]
case intro.intro.intro.a
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝² : DecidableEq R
this✝¹ : DecidableEq M
this✝ : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
g : P → M
hg : ∀ (y : P), y ∈ t1 → g y ∈ s ∧ ↑f (g y) = y
x : M
hx : x ∈ s
this : ↑f x ∈ map f s
⊢ x ∈ span R (g '' ↑t1) ⊔ span R ↑t2
[PROOFSTEP]
rw [← ht1, ← Set.image_id (t1 : Set P), Finsupp.mem_span_image_iff_total] at this 
[GOAL]
case intro.intro.intro.a
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝² : DecidableEq R
this✝¹ : DecidableEq M
this✝ : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
g : P → M
hg : ∀ (y : P), y ∈ t1 → g y ∈ s ∧ ↑f (g y) = y
x : M
hx : x ∈ s
this : ∃ l, l ∈ Finsupp.supported R R ↑t1 ∧ ↑(Finsupp.total P ((fun x => P) x) R id) l = ↑f x
⊢ x ∈ span R (g '' ↑t1) ⊔ span R ↑t2
[PROOFSTEP]
rcases this with ⟨l, hl1, hl2⟩
[GOAL]
case intro.intro.intro.a.intro.intro
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝¹ : DecidableEq R
this✝ : DecidableEq M
this : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
g : P → M
hg : ∀ (y : P), y ∈ t1 → g y ∈ s ∧ ↑f (g y) = y
x : M
hx : x ∈ s
l : P →₀ R
hl1 : l ∈ Finsupp.supported R R ↑t1
hl2 : ↑(Finsupp.total P ((fun x => P) x) R id) l = ↑f x
⊢ x ∈ span R (g '' ↑t1) ⊔ span R ↑t2
[PROOFSTEP]
refine'
  mem_sup.2
    ⟨(Finsupp.total M M R id).toFun ((Finsupp.lmapDomain R R g : (P →₀ R) → M →₀ R) l), _,
      x - Finsupp.total M M R id ((Finsupp.lmapDomain R R g : (P →₀ R) → M →₀ R) l), _, add_sub_cancel'_right _ _⟩
[GOAL]
case intro.intro.intro.a.intro.intro.refine'_1
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝¹ : DecidableEq R
this✝ : DecidableEq M
this : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
g : P → M
hg : ∀ (y : P), y ∈ t1 → g y ∈ s ∧ ↑f (g y) = y
x : M
hx : x ∈ s
l : P →₀ R
hl1 : l ∈ Finsupp.supported R R ↑t1
hl2 : ↑(Finsupp.total P ((fun x => P) x) R id) l = ↑f x
⊢ AddHom.toFun (Finsupp.total M M R id).toAddHom (↑(Finsupp.lmapDomain R R g) l) ∈ span R (g '' ↑t1)
[PROOFSTEP]
rw [← Set.image_id (g '' ↑t1), Finsupp.mem_span_image_iff_total]
[GOAL]
case intro.intro.intro.a.intro.intro.refine'_1
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝¹ : DecidableEq R
this✝ : DecidableEq M
this : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
g : P → M
hg : ∀ (y : P), y ∈ t1 → g y ∈ s ∧ ↑f (g y) = y
x : M
hx : x ∈ s
l : P →₀ R
hl1 : l ∈ Finsupp.supported R R ↑t1
hl2 : ↑(Finsupp.total P ((fun x => P) x) R id) l = ↑f x
⊢ ∃ l_1,
    l_1 ∈ Finsupp.supported R R (g '' ↑t1) ∧
      ↑(Finsupp.total M M R id) l_1 = AddHom.toFun (Finsupp.total M M R id).toAddHom (↑(Finsupp.lmapDomain R R g) l)
[PROOFSTEP]
refine' ⟨_, _, rfl⟩
[GOAL]
case intro.intro.intro.a.intro.intro.refine'_1
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝¹ : DecidableEq R
this✝ : DecidableEq M
this : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
g : P → M
hg : ∀ (y : P), y ∈ t1 → g y ∈ s ∧ ↑f (g y) = y
x : M
hx : x ∈ s
l : P →₀ R
hl1 : l ∈ Finsupp.supported R R ↑t1
hl2 : ↑(Finsupp.total P ((fun x => P) x) R id) l = ↑f x
⊢ ↑(Finsupp.lmapDomain R R g) l ∈ Finsupp.supported R R (g '' ↑t1)
[PROOFSTEP]
haveI : Inhabited P := ⟨0⟩
[GOAL]
case intro.intro.intro.a.intro.intro.refine'_1
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝² : DecidableEq R
this✝¹ : DecidableEq M
this✝ : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
g : P → M
hg : ∀ (y : P), y ∈ t1 → g y ∈ s ∧ ↑f (g y) = y
x : M
hx : x ∈ s
l : P →₀ R
hl1 : l ∈ Finsupp.supported R R ↑t1
hl2 : ↑(Finsupp.total P ((fun x => P) x) R id) l = ↑f x
this : Inhabited P
⊢ ↑(Finsupp.lmapDomain R R g) l ∈ Finsupp.supported R R (g '' ↑t1)
[PROOFSTEP]
rw [← Finsupp.lmapDomain_supported _ _ g, mem_map]
[GOAL]
case intro.intro.intro.a.intro.intro.refine'_1
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝² : DecidableEq R
this✝¹ : DecidableEq M
this✝ : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
g : P → M
hg : ∀ (y : P), y ∈ t1 → g y ∈ s ∧ ↑f (g y) = y
x : M
hx : x ∈ s
l : P →₀ R
hl1 : l ∈ Finsupp.supported R R ↑t1
hl2 : ↑(Finsupp.total P ((fun x => P) x) R id) l = ↑f x
this : Inhabited P
⊢ ∃ y, y ∈ Finsupp.supported R R ↑t1 ∧ ↑(Finsupp.lmapDomain R R g) y = ↑(Finsupp.lmapDomain R R g) l
[PROOFSTEP]
refine' ⟨l, hl1, _⟩
[GOAL]
case intro.intro.intro.a.intro.intro.refine'_1
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝² : DecidableEq R
this✝¹ : DecidableEq M
this✝ : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
g : P → M
hg : ∀ (y : P), y ∈ t1 → g y ∈ s ∧ ↑f (g y) = y
x : M
hx : x ∈ s
l : P →₀ R
hl1 : l ∈ Finsupp.supported R R ↑t1
hl2 : ↑(Finsupp.total P ((fun x => P) x) R id) l = ↑f x
this : Inhabited P
⊢ ↑(Finsupp.lmapDomain R R g) l = ↑(Finsupp.lmapDomain R R g) l
[PROOFSTEP]
rfl
[GOAL]
case intro.intro.intro.a.intro.intro.refine'_2
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝¹ : DecidableEq R
this✝ : DecidableEq M
this : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
g : P → M
hg : ∀ (y : P), y ∈ t1 → g y ∈ s ∧ ↑f (g y) = y
x : M
hx : x ∈ s
l : P →₀ R
hl1 : l ∈ Finsupp.supported R R ↑t1
hl2 : ↑(Finsupp.total P ((fun x => P) x) R id) l = ↑f x
⊢ x - ↑(Finsupp.total M M R id) (↑(Finsupp.lmapDomain R R g) l) ∈ span R ↑t2
[PROOFSTEP]
rw [ht2, mem_inf]
[GOAL]
case intro.intro.intro.a.intro.intro.refine'_2
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝¹ : DecidableEq R
this✝ : DecidableEq M
this : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
g : P → M
hg : ∀ (y : P), y ∈ t1 → g y ∈ s ∧ ↑f (g y) = y
x : M
hx : x ∈ s
l : P →₀ R
hl1 : l ∈ Finsupp.supported R R ↑t1
hl2 : ↑(Finsupp.total P ((fun x => P) x) R id) l = ↑f x
⊢ x - ↑(Finsupp.total M M R id) (↑(Finsupp.lmapDomain R R g) l) ∈ s ∧
    x - ↑(Finsupp.total M M R id) (↑(Finsupp.lmapDomain R R g) l) ∈ LinearMap.ker f
[PROOFSTEP]
constructor
[GOAL]
case intro.intro.intro.a.intro.intro.refine'_2.left
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝¹ : DecidableEq R
this✝ : DecidableEq M
this : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
g : P → M
hg : ∀ (y : P), y ∈ t1 → g y ∈ s ∧ ↑f (g y) = y
x : M
hx : x ∈ s
l : P →₀ R
hl1 : l ∈ Finsupp.supported R R ↑t1
hl2 : ↑(Finsupp.total P ((fun x => P) x) R id) l = ↑f x
⊢ x - ↑(Finsupp.total M M R id) (↑(Finsupp.lmapDomain R R g) l) ∈ s
[PROOFSTEP]
apply s.sub_mem hx
[GOAL]
case intro.intro.intro.a.intro.intro.refine'_2.left
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝¹ : DecidableEq R
this✝ : DecidableEq M
this : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
g : P → M
hg : ∀ (y : P), y ∈ t1 → g y ∈ s ∧ ↑f (g y) = y
x : M
hx : x ∈ s
l : P →₀ R
hl1 : l ∈ Finsupp.supported R R ↑t1
hl2 : ↑(Finsupp.total P ((fun x => P) x) R id) l = ↑f x
⊢ ↑(Finsupp.total M M R id) (↑(Finsupp.lmapDomain R R g) l) ∈ s
[PROOFSTEP]
rw [Finsupp.total_apply, Finsupp.lmapDomain_apply, Finsupp.sum_mapDomain_index]
[GOAL]
case intro.intro.intro.a.intro.intro.refine'_2.left
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝¹ : DecidableEq R
this✝ : DecidableEq M
this : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
g : P → M
hg : ∀ (y : P), y ∈ t1 → g y ∈ s ∧ ↑f (g y) = y
x : M
hx : x ∈ s
l : P →₀ R
hl1 : l ∈ Finsupp.supported R R ↑t1
hl2 : ↑(Finsupp.total P ((fun x => P) x) R id) l = ↑f x
⊢ (Finsupp.sum l fun a m => m • id (g a)) ∈ s
case intro.intro.intro.a.intro.intro.refine'_2.left.h_zero
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝¹ : DecidableEq R
this✝ : DecidableEq M
this : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
g : P → M
hg : ∀ (y : P), y ∈ t1 → g y ∈ s ∧ ↑f (g y) = y
x : M
hx : x ∈ s
l : P →₀ R
hl1 : l ∈ Finsupp.supported R R ↑t1
hl2 : ↑(Finsupp.total P ((fun x => P) x) R id) l = ↑f x
⊢ ∀ (b : M), 0 • id b = 0
case intro.intro.intro.a.intro.intro.refine'_2.left.h_add
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝¹ : DecidableEq R
this✝ : DecidableEq M
this : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
g : P → M
hg : ∀ (y : P), y ∈ t1 → g y ∈ s ∧ ↑f (g y) = y
x : M
hx : x ∈ s
l : P →₀ R
hl1 : l ∈ Finsupp.supported R R ↑t1
hl2 : ↑(Finsupp.total P ((fun x => P) x) R id) l = ↑f x
⊢ ∀ (b : M) (m₁ m₂ : R), (m₁ + m₂) • id b = m₁ • id b + m₂ • id b
[PROOFSTEP]
refine' s.sum_mem _
[GOAL]
case intro.intro.intro.a.intro.intro.refine'_2.left
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝¹ : DecidableEq R
this✝ : DecidableEq M
this : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
g : P → M
hg : ∀ (y : P), y ∈ t1 → g y ∈ s ∧ ↑f (g y) = y
x : M
hx : x ∈ s
l : P →₀ R
hl1 : l ∈ Finsupp.supported R R ↑t1
hl2 : ↑(Finsupp.total P ((fun x => P) x) R id) l = ↑f x
⊢ ∀ (c : P), c ∈ l.support → (fun a m => m • id (g a)) c (↑l c) ∈ s
[PROOFSTEP]
intro y hy
[GOAL]
case intro.intro.intro.a.intro.intro.refine'_2.left
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝¹ : DecidableEq R
this✝ : DecidableEq M
this : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
g : P → M
hg : ∀ (y : P), y ∈ t1 → g y ∈ s ∧ ↑f (g y) = y
x : M
hx : x ∈ s
l : P →₀ R
hl1 : l ∈ Finsupp.supported R R ↑t1
hl2 : ↑(Finsupp.total P ((fun x => P) x) R id) l = ↑f x
y : P
hy : y ∈ l.support
⊢ (fun a m => m • id (g a)) y (↑l y) ∈ s
[PROOFSTEP]
exact s.smul_mem _ (hg y (hl1 hy)).1
[GOAL]
case intro.intro.intro.a.intro.intro.refine'_2.left.h_zero
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝¹ : DecidableEq R
this✝ : DecidableEq M
this : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
g : P → M
hg : ∀ (y : P), y ∈ t1 → g y ∈ s ∧ ↑f (g y) = y
x : M
hx : x ∈ s
l : P →₀ R
hl1 : l ∈ Finsupp.supported R R ↑t1
hl2 : ↑(Finsupp.total P ((fun x => P) x) R id) l = ↑f x
⊢ ∀ (b : M), 0 • id b = 0
[PROOFSTEP]
exact zero_smul _
[GOAL]
case intro.intro.intro.a.intro.intro.refine'_2.left.h_add
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝¹ : DecidableEq R
this✝ : DecidableEq M
this : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
g : P → M
hg : ∀ (y : P), y ∈ t1 → g y ∈ s ∧ ↑f (g y) = y
x : M
hx : x ∈ s
l : P →₀ R
hl1 : l ∈ Finsupp.supported R R ↑t1
hl2 : ↑(Finsupp.total P ((fun x => P) x) R id) l = ↑f x
⊢ ∀ (b : M) (m₁ m₂ : R), (m₁ + m₂) • id b = m₁ • id b + m₂ • id b
[PROOFSTEP]
exact fun _ _ _ => add_smul _ _ _
[GOAL]
case intro.intro.intro.a.intro.intro.refine'_2.right
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝¹ : DecidableEq R
this✝ : DecidableEq M
this : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
g : P → M
hg : ∀ (y : P), y ∈ t1 → g y ∈ s ∧ ↑f (g y) = y
x : M
hx : x ∈ s
l : P →₀ R
hl1 : l ∈ Finsupp.supported R R ↑t1
hl2 : ↑(Finsupp.total P ((fun x => P) x) R id) l = ↑f x
⊢ x - ↑(Finsupp.total M M R id) (↑(Finsupp.lmapDomain R R g) l) ∈ LinearMap.ker f
[PROOFSTEP]
rw [LinearMap.mem_ker, f.map_sub, ← hl2]
[GOAL]
case intro.intro.intro.a.intro.intro.refine'_2.right
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝¹ : DecidableEq R
this✝ : DecidableEq M
this : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
g : P → M
hg : ∀ (y : P), y ∈ t1 → g y ∈ s ∧ ↑f (g y) = y
x : M
hx : x ∈ s
l : P →₀ R
hl1 : l ∈ Finsupp.supported R R ↑t1
hl2 : ↑(Finsupp.total P ((fun x => P) x) R id) l = ↑f x
⊢ ↑(Finsupp.total P ((fun x => P) x) R id) l - ↑f (↑(Finsupp.total M M R id) (↑(Finsupp.lmapDomain R R g) l)) = 0
[PROOFSTEP]
rw [Finsupp.total_apply, Finsupp.total_apply, Finsupp.lmapDomain_apply]
[GOAL]
case intro.intro.intro.a.intro.intro.refine'_2.right
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝¹ : DecidableEq R
this✝ : DecidableEq M
this : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
g : P → M
hg : ∀ (y : P), y ∈ t1 → g y ∈ s ∧ ↑f (g y) = y
x : M
hx : x ∈ s
l : P →₀ R
hl1 : l ∈ Finsupp.supported R R ↑t1
hl2 : ↑(Finsupp.total P ((fun x => P) x) R id) l = ↑f x
⊢ (Finsupp.sum l fun i a => a • id i) - ↑f (Finsupp.sum (Finsupp.mapDomain g l) fun i a => a • id i) = 0
[PROOFSTEP]
rw [Finsupp.sum_mapDomain_index, Finsupp.sum, Finsupp.sum, f.map_sum]
[GOAL]
case intro.intro.intro.a.intro.intro.refine'_2.right
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝¹ : DecidableEq R
this✝ : DecidableEq M
this : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
g : P → M
hg : ∀ (y : P), y ∈ t1 → g y ∈ s ∧ ↑f (g y) = y
x : M
hx : x ∈ s
l : P →₀ R
hl1 : l ∈ Finsupp.supported R R ↑t1
hl2 : ↑(Finsupp.total P ((fun x => P) x) R id) l = ↑f x
⊢ ∑ a in l.support, ↑l a • id a - ∑ i in l.support, ↑f (↑l i • id (g i)) = 0
case intro.intro.intro.a.intro.intro.refine'_2.right.h_zero
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝¹ : DecidableEq R
this✝ : DecidableEq M
this : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
g : P → M
hg : ∀ (y : P), y ∈ t1 → g y ∈ s ∧ ↑f (g y) = y
x : M
hx : x ∈ s
l : P →₀ R
hl1 : l ∈ Finsupp.supported R R ↑t1
hl2 : ↑(Finsupp.total P ((fun x => P) x) R id) l = ↑f x
⊢ ∀ (b : M), 0 • id b = 0
case intro.intro.intro.a.intro.intro.refine'_2.right.h_add
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝¹ : DecidableEq R
this✝ : DecidableEq M
this : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
g : P → M
hg : ∀ (y : P), y ∈ t1 → g y ∈ s ∧ ↑f (g y) = y
x : M
hx : x ∈ s
l : P →₀ R
hl1 : l ∈ Finsupp.supported R R ↑t1
hl2 : ↑(Finsupp.total P ((fun x => P) x) R id) l = ↑f x
⊢ ∀ (b : M) (m₁ m₂ : R), (m₁ + m₂) • id b = m₁ • id b + m₂ • id b
[PROOFSTEP]
rw [sub_eq_zero]
[GOAL]
case intro.intro.intro.a.intro.intro.refine'_2.right
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝¹ : DecidableEq R
this✝ : DecidableEq M
this : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
g : P → M
hg : ∀ (y : P), y ∈ t1 → g y ∈ s ∧ ↑f (g y) = y
x : M
hx : x ∈ s
l : P →₀ R
hl1 : l ∈ Finsupp.supported R R ↑t1
hl2 : ↑(Finsupp.total P ((fun x => P) x) R id) l = ↑f x
⊢ ∑ a in l.support, ↑l a • id a = ∑ i in l.support, ↑f (↑l i • id (g i))
case intro.intro.intro.a.intro.intro.refine'_2.right.h_zero
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝¹ : DecidableEq R
this✝ : DecidableEq M
this : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
g : P → M
hg : ∀ (y : P), y ∈ t1 → g y ∈ s ∧ ↑f (g y) = y
x : M
hx : x ∈ s
l : P →₀ R
hl1 : l ∈ Finsupp.supported R R ↑t1
hl2 : ↑(Finsupp.total P ((fun x => P) x) R id) l = ↑f x
⊢ ∀ (b : M), 0 • id b = 0
case intro.intro.intro.a.intro.intro.refine'_2.right.h_add
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝¹ : DecidableEq R
this✝ : DecidableEq M
this : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
g : P → M
hg : ∀ (y : P), y ∈ t1 → g y ∈ s ∧ ↑f (g y) = y
x : M
hx : x ∈ s
l : P →₀ R
hl1 : l ∈ Finsupp.supported R R ↑t1
hl2 : ↑(Finsupp.total P ((fun x => P) x) R id) l = ↑f x
⊢ ∀ (b : M) (m₁ m₂ : R), (m₁ + m₂) • id b = m₁ • id b + m₂ • id b
[PROOFSTEP]
refine' Finset.sum_congr rfl fun y hy => _
[GOAL]
case intro.intro.intro.a.intro.intro.refine'_2.right
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝¹ : DecidableEq R
this✝ : DecidableEq M
this : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
g : P → M
hg : ∀ (y : P), y ∈ t1 → g y ∈ s ∧ ↑f (g y) = y
x : M
hx : x ∈ s
l : P →₀ R
hl1 : l ∈ Finsupp.supported R R ↑t1
hl2 : ↑(Finsupp.total P ((fun x => P) x) R id) l = ↑f x
y : P
hy : y ∈ l.support
⊢ ↑l y • id y = ↑f (↑l y • id (g y))
case intro.intro.intro.a.intro.intro.refine'_2.right.h_zero
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝¹ : DecidableEq R
this✝ : DecidableEq M
this : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
g : P → M
hg : ∀ (y : P), y ∈ t1 → g y ∈ s ∧ ↑f (g y) = y
x : M
hx : x ∈ s
l : P →₀ R
hl1 : l ∈ Finsupp.supported R R ↑t1
hl2 : ↑(Finsupp.total P ((fun x => P) x) R id) l = ↑f x
⊢ ∀ (b : M), 0 • id b = 0
case intro.intro.intro.a.intro.intro.refine'_2.right.h_add
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝¹ : DecidableEq R
this✝ : DecidableEq M
this : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
g : P → M
hg : ∀ (y : P), y ∈ t1 → g y ∈ s ∧ ↑f (g y) = y
x : M
hx : x ∈ s
l : P →₀ R
hl1 : l ∈ Finsupp.supported R R ↑t1
hl2 : ↑(Finsupp.total P ((fun x => P) x) R id) l = ↑f x
⊢ ∀ (b : M) (m₁ m₂ : R), (m₁ + m₂) • id b = m₁ • id b + m₂ • id b
[PROOFSTEP]
unfold id
[GOAL]
case intro.intro.intro.a.intro.intro.refine'_2.right
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝¹ : DecidableEq R
this✝ : DecidableEq M
this : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
g : P → M
hg : ∀ (y : P), y ∈ t1 → g y ∈ s ∧ ↑f (g y) = y
x : M
hx : x ∈ s
l : P →₀ R
hl1 : l ∈ Finsupp.supported R R ↑t1
hl2 : ↑(Finsupp.total P ((fun x => P) x) R id) l = ↑f x
y : P
hy : y ∈ l.support
⊢ ↑l y • y = ↑f (↑l y • g y)
case intro.intro.intro.a.intro.intro.refine'_2.right.h_zero
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝¹ : DecidableEq R
this✝ : DecidableEq M
this : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
g : P → M
hg : ∀ (y : P), y ∈ t1 → g y ∈ s ∧ ↑f (g y) = y
x : M
hx : x ∈ s
l : P →₀ R
hl1 : l ∈ Finsupp.supported R R ↑t1
hl2 : ↑(Finsupp.total P ((fun x => P) x) R id) l = ↑f x
⊢ ∀ (b : M), 0 • id b = 0
case intro.intro.intro.a.intro.intro.refine'_2.right.h_add
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝¹ : DecidableEq R
this✝ : DecidableEq M
this : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
g : P → M
hg : ∀ (y : P), y ∈ t1 → g y ∈ s ∧ ↑f (g y) = y
x : M
hx : x ∈ s
l : P →₀ R
hl1 : l ∈ Finsupp.supported R R ↑t1
hl2 : ↑(Finsupp.total P ((fun x => P) x) R id) l = ↑f x
⊢ ∀ (b : M) (m₁ m₂ : R), (m₁ + m₂) • id b = m₁ • id b + m₂ • id b
[PROOFSTEP]
rw [f.map_smul, (hg y (hl1 hy)).2]
[GOAL]
case intro.intro.intro.a.intro.intro.refine'_2.right.h_zero
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝¹ : DecidableEq R
this✝ : DecidableEq M
this : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
g : P → M
hg : ∀ (y : P), y ∈ t1 → g y ∈ s ∧ ↑f (g y) = y
x : M
hx : x ∈ s
l : P →₀ R
hl1 : l ∈ Finsupp.supported R R ↑t1
hl2 : ↑(Finsupp.total P ((fun x => P) x) R id) l = ↑f x
⊢ ∀ (b : M), 0 • id b = 0
[PROOFSTEP]
exact zero_smul _
[GOAL]
case intro.intro.intro.a.intro.intro.refine'_2.right.h_add
R✝ : Type u_1
M✝ : Type u_2
inst✝⁹ : Semiring R✝
inst✝⁸ : AddCommMonoid M✝
inst✝⁷ : Module R✝ M✝
P✝ : Type u_3
inst✝⁶ : AddCommMonoid P✝
inst✝⁵ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
P : Type u_6
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
this✝¹ : DecidableEq R
this✝ : DecidableEq M
this : DecidableEq P
t1 : Finset P
ht1 : span R ↑t1 = map f s
t2 : Finset M
ht2 : span R ↑t2 = s ⊓ LinearMap.ker f
g : P → M
hg : ∀ (y : P), y ∈ t1 → g y ∈ s ∧ ↑f (g y) = y
x : M
hx : x ∈ s
l : P →₀ R
hl1 : l ∈ Finsupp.supported R R ↑t1
hl2 : ↑(Finsupp.total P ((fun x => P) x) R id) l = ↑f x
⊢ ∀ (b : M) (m₁ m₂ : R), (m₁ + m₂) • id b = m₁ • id b + m₂ • id b
[PROOFSTEP]
exact fun _ _ _ => add_smul _ _ _
[GOAL]
R✝ : Type u_1
M✝ : Type u_2
inst✝⁷ : Semiring R✝
inst✝⁶ : AddCommMonoid M✝
inst✝⁵ : Module R✝ M✝
P✝ : Type u_3
inst✝⁴ : AddCommMonoid P✝
inst✝³ : Module R✝ P✝
f : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
P : Submodule R M → Prop
h₁ : ∀ (x : M), P (span R {x})
h₂ : ∀ (M₁ M₂ : Submodule R M), P M₁ → P M₂ → P (M₁ ⊔ M₂)
N : Submodule R M
hN : FG N
⊢ P N
[PROOFSTEP]
classical
obtain ⟨s, rfl⟩ := hN
induction s using Finset.induction
· rw [Finset.coe_empty, Submodule.span_empty, ← Submodule.span_zero_singleton]
  apply h₁
· rw [Finset.coe_insert, Submodule.span_insert]
  apply h₂ <;> apply_assumption
[GOAL]
R✝ : Type u_1
M✝ : Type u_2
inst✝⁷ : Semiring R✝
inst✝⁶ : AddCommMonoid M✝
inst✝⁵ : Module R✝ M✝
P✝ : Type u_3
inst✝⁴ : AddCommMonoid P✝
inst✝³ : Module R✝ P✝
f : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
P : Submodule R M → Prop
h₁ : ∀ (x : M), P (span R {x})
h₂ : ∀ (M₁ M₂ : Submodule R M), P M₁ → P M₂ → P (M₁ ⊔ M₂)
N : Submodule R M
hN : FG N
⊢ P N
[PROOFSTEP]
obtain ⟨s, rfl⟩ := hN
[GOAL]
case intro
R✝ : Type u_1
M✝ : Type u_2
inst✝⁷ : Semiring R✝
inst✝⁶ : AddCommMonoid M✝
inst✝⁵ : Module R✝ M✝
P✝ : Type u_3
inst✝⁴ : AddCommMonoid P✝
inst✝³ : Module R✝ P✝
f : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
P : Submodule R M → Prop
h₁ : ∀ (x : M), P (span R {x})
h₂ : ∀ (M₁ M₂ : Submodule R M), P M₁ → P M₂ → P (M₁ ⊔ M₂)
s : Finset M
⊢ P (span R ↑s)
[PROOFSTEP]
induction s using Finset.induction
[GOAL]
case intro.empty
R✝ : Type u_1
M✝ : Type u_2
inst✝⁷ : Semiring R✝
inst✝⁶ : AddCommMonoid M✝
inst✝⁵ : Module R✝ M✝
P✝ : Type u_3
inst✝⁴ : AddCommMonoid P✝
inst✝³ : Module R✝ P✝
f : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
P : Submodule R M → Prop
h₁ : ∀ (x : M), P (span R {x})
h₂ : ∀ (M₁ M₂ : Submodule R M), P M₁ → P M₂ → P (M₁ ⊔ M₂)
⊢ P (span R ↑∅)
[PROOFSTEP]
rw [Finset.coe_empty, Submodule.span_empty, ← Submodule.span_zero_singleton]
[GOAL]
case intro.empty
R✝ : Type u_1
M✝ : Type u_2
inst✝⁷ : Semiring R✝
inst✝⁶ : AddCommMonoid M✝
inst✝⁵ : Module R✝ M✝
P✝ : Type u_3
inst✝⁴ : AddCommMonoid P✝
inst✝³ : Module R✝ P✝
f : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
P : Submodule R M → Prop
h₁ : ∀ (x : M), P (span R {x})
h₂ : ∀ (M₁ M₂ : Submodule R M), P M₁ → P M₂ → P (M₁ ⊔ M₂)
⊢ P (span R {0})
[PROOFSTEP]
apply h₁
[GOAL]
case intro.insert
R✝ : Type u_1
M✝ : Type u_2
inst✝⁷ : Semiring R✝
inst✝⁶ : AddCommMonoid M✝
inst✝⁵ : Module R✝ M✝
P✝ : Type u_3
inst✝⁴ : AddCommMonoid P✝
inst✝³ : Module R✝ P✝
f : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
P : Submodule R M → Prop
h₁ : ∀ (x : M), P (span R {x})
h₂ : ∀ (M₁ M₂ : Submodule R M), P M₁ → P M₂ → P (M₁ ⊔ M₂)
a✝² : M
s✝ : Finset M
a✝¹ : ¬a✝² ∈ s✝
a✝ : P (span R ↑s✝)
⊢ P (span R ↑(insert a✝² s✝))
[PROOFSTEP]
rw [Finset.coe_insert, Submodule.span_insert]
[GOAL]
case intro.insert
R✝ : Type u_1
M✝ : Type u_2
inst✝⁷ : Semiring R✝
inst✝⁶ : AddCommMonoid M✝
inst✝⁵ : Module R✝ M✝
P✝ : Type u_3
inst✝⁴ : AddCommMonoid P✝
inst✝³ : Module R✝ P✝
f : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
P : Submodule R M → Prop
h₁ : ∀ (x : M), P (span R {x})
h₂ : ∀ (M₁ M₂ : Submodule R M), P M₁ → P M₂ → P (M₁ ⊔ M₂)
a✝² : M
s✝ : Finset M
a✝¹ : ¬a✝² ∈ s✝
a✝ : P (span R ↑s✝)
⊢ P (span R {a✝²} ⊔ span R ↑s✝)
[PROOFSTEP]
apply h₂
[GOAL]
case intro.insert.a
R✝ : Type u_1
M✝ : Type u_2
inst✝⁷ : Semiring R✝
inst✝⁶ : AddCommMonoid M✝
inst✝⁵ : Module R✝ M✝
P✝ : Type u_3
inst✝⁴ : AddCommMonoid P✝
inst✝³ : Module R✝ P✝
f : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
P : Submodule R M → Prop
h₁ : ∀ (x : M), P (span R {x})
h₂ : ∀ (M₁ M₂ : Submodule R M), P M₁ → P M₂ → P (M₁ ⊔ M₂)
a✝² : M
s✝ : Finset M
a✝¹ : ¬a✝² ∈ s✝
a✝ : P (span R ↑s✝)
⊢ P (span R {a✝²})
[PROOFSTEP]
apply_assumption
[GOAL]
case intro.insert.a
R✝ : Type u_1
M✝ : Type u_2
inst✝⁷ : Semiring R✝
inst✝⁶ : AddCommMonoid M✝
inst✝⁵ : Module R✝ M✝
P✝ : Type u_3
inst✝⁴ : AddCommMonoid P✝
inst✝³ : Module R✝ P✝
f : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
P : Submodule R M → Prop
h₁ : ∀ (x : M), P (span R {x})
h₂ : ∀ (M₁ M₂ : Submodule R M), P M₁ → P M₂ → P (M₁ ⊔ M₂)
a✝² : M
s✝ : Finset M
a✝¹ : ¬a✝² ∈ s✝
a✝ : P (span R ↑s✝)
⊢ P (span R ↑s✝)
[PROOFSTEP]
apply_assumption
[GOAL]
R✝ : Type u_1
M✝ : Type u_2
inst✝¹¹ : Semiring R✝
inst✝¹⁰ : AddCommMonoid M✝
inst✝⁹ : Module R✝ M✝
P✝ : Type u_3
inst✝⁸ : AddCommMonoid P✝
inst✝⁷ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
N : Type u_6
P : Type u_7
inst✝⁶ : Ring R
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
inst✝³ : AddCommGroup N
inst✝² : Module R N
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] N
g : N →ₗ[R] P
hf1 : FG (LinearMap.ker f)
hf2 : FG (LinearMap.ker g)
hsur : Surjective ↑f
⊢ FG (LinearMap.ker (LinearMap.comp g f))
[PROOFSTEP]
rw [LinearMap.ker_comp]
[GOAL]
R✝ : Type u_1
M✝ : Type u_2
inst✝¹¹ : Semiring R✝
inst✝¹⁰ : AddCommMonoid M✝
inst✝⁹ : Module R✝ M✝
P✝ : Type u_3
inst✝⁸ : AddCommMonoid P✝
inst✝⁷ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
N : Type u_6
P : Type u_7
inst✝⁶ : Ring R
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
inst✝³ : AddCommGroup N
inst✝² : Module R N
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] N
g : N →ₗ[R] P
hf1 : FG (LinearMap.ker f)
hf2 : FG (LinearMap.ker g)
hsur : Surjective ↑f
⊢ FG (comap f (LinearMap.ker g))
[PROOFSTEP]
apply fg_of_fg_map_of_fg_inf_ker f
[GOAL]
case hs1
R✝ : Type u_1
M✝ : Type u_2
inst✝¹¹ : Semiring R✝
inst✝¹⁰ : AddCommMonoid M✝
inst✝⁹ : Module R✝ M✝
P✝ : Type u_3
inst✝⁸ : AddCommMonoid P✝
inst✝⁷ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
N : Type u_6
P : Type u_7
inst✝⁶ : Ring R
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
inst✝³ : AddCommGroup N
inst✝² : Module R N
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] N
g : N →ₗ[R] P
hf1 : FG (LinearMap.ker f)
hf2 : FG (LinearMap.ker g)
hsur : Surjective ↑f
⊢ FG (map f (comap f (LinearMap.ker g)))
[PROOFSTEP]
rwa [Submodule.map_comap_eq, LinearMap.range_eq_top.2 hsur, top_inf_eq]
[GOAL]
case hs2
R✝ : Type u_1
M✝ : Type u_2
inst✝¹¹ : Semiring R✝
inst✝¹⁰ : AddCommMonoid M✝
inst✝⁹ : Module R✝ M✝
P✝ : Type u_3
inst✝⁸ : AddCommMonoid P✝
inst✝⁷ : Module R✝ P✝
f✝ : M✝ →ₗ[R✝] P✝
R : Type u_4
M : Type u_5
N : Type u_6
P : Type u_7
inst✝⁶ : Ring R
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
inst✝³ : AddCommGroup N
inst✝² : Module R N
inst✝¹ : AddCommGroup P
inst✝ : Module R P
f : M →ₗ[R] N
g : N →ₗ[R] P
hf1 : FG (LinearMap.ker f)
hf2 : FG (LinearMap.ker g)
hsur : Surjective ↑f
⊢ FG (comap f (LinearMap.ker g) ⊓ LinearMap.ker f)
[PROOFSTEP]
rwa [inf_of_le_right (show (LinearMap.ker f) ≤ (LinearMap.ker g).comap f from comap_mono bot_le)]
[GOAL]
R✝ : Type u_1
M✝ : Type u_2
inst✝¹¹ : Semiring R✝
inst✝¹⁰ : AddCommMonoid M✝
inst✝⁹ : Module R✝ M✝
P : Type u_3
inst✝⁸ : AddCommMonoid P
inst✝⁷ : Module R✝ P
f : M✝ →ₗ[R✝] P
R : Type u_4
S : Type u_5
M : Type u_6
inst✝⁶ : CommSemiring R
inst✝⁵ : Semiring S
inst✝⁴ : Algebra R S
inst✝³ : AddCommGroup M
inst✝² : Module S M
inst✝¹ : Module R M
inst✝ : IsScalarTower R S M
N : Submodule S M
hfin : FG N
h : Surjective ↑(algebraMap R S)
⊢ FG (restrictScalars R N)
[PROOFSTEP]
obtain ⟨X, rfl⟩ := hfin
[GOAL]
case intro
R✝ : Type u_1
M✝ : Type u_2
inst✝¹¹ : Semiring R✝
inst✝¹⁰ : AddCommMonoid M✝
inst✝⁹ : Module R✝ M✝
P : Type u_3
inst✝⁸ : AddCommMonoid P
inst✝⁷ : Module R✝ P
f : M✝ →ₗ[R✝] P
R : Type u_4
S : Type u_5
M : Type u_6
inst✝⁶ : CommSemiring R
inst✝⁵ : Semiring S
inst✝⁴ : Algebra R S
inst✝³ : AddCommGroup M
inst✝² : Module S M
inst✝¹ : Module R M
inst✝ : IsScalarTower R S M
h : Surjective ↑(algebraMap R S)
X : Finset M
⊢ FG (restrictScalars R (span S ↑X))
[PROOFSTEP]
use X
[GOAL]
case h
R✝ : Type u_1
M✝ : Type u_2
inst✝¹¹ : Semiring R✝
inst✝¹⁰ : AddCommMonoid M✝
inst✝⁹ : Module R✝ M✝
P : Type u_3
inst✝⁸ : AddCommMonoid P
inst✝⁷ : Module R✝ P
f : M✝ →ₗ[R✝] P
R : Type u_4
S : Type u_5
M : Type u_6
inst✝⁶ : CommSemiring R
inst✝⁵ : Semiring S
inst✝⁴ : Algebra R S
inst✝³ : AddCommGroup M
inst✝² : Module S M
inst✝¹ : Module R M
inst✝ : IsScalarTower R S M
h : Surjective ↑(algebraMap R S)
X : Finset M
⊢ span R ↑X = restrictScalars R (span S ↑X)
[PROOFSTEP]
exact (Submodule.restrictScalars_span R S h (X : Set M)).symm
[GOAL]
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type u_3
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f : M →ₗ[R] P
M' : Submodule R M
hM' : FG M'
N : ℕ →o Submodule R M
H : iSup ↑N = M'
⊢ ∃ n, M' = ↑N n
[PROOFSTEP]
obtain ⟨S, hS⟩ := hM'
[GOAL]
case intro
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type u_3
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f : M →ₗ[R] P
M' : Submodule R M
N : ℕ →o Submodule R M
H : iSup ↑N = M'
S : Finset M
hS : span R ↑S = M'
⊢ ∃ n, M' = ↑N n
[PROOFSTEP]
have : ∀ s : S, ∃ n, (s : M) ∈ N n := fun s =>
  (Submodule.mem_iSup_of_chain N s).mp
    (by
      rw [H, ← hS]
      exact Submodule.subset_span s.2)
[GOAL]
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type u_3
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f : M →ₗ[R] P
M' : Submodule R M
N : ℕ →o Submodule R M
H : iSup ↑N = M'
S : Finset M
hS : span R ↑S = M'
s : { x // x ∈ S }
⊢ ↑s ∈ ⨆ (k : ℕ), ↑N k
[PROOFSTEP]
rw [H, ← hS]
[GOAL]
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type u_3
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f : M →ₗ[R] P
M' : Submodule R M
N : ℕ →o Submodule R M
H : iSup ↑N = M'
S : Finset M
hS : span R ↑S = M'
s : { x // x ∈ S }
⊢ ↑s ∈ span R ↑S
[PROOFSTEP]
exact Submodule.subset_span s.2
[GOAL]
case intro
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type u_3
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f : M →ₗ[R] P
M' : Submodule R M
N : ℕ →o Submodule R M
H : iSup ↑N = M'
S : Finset M
hS : span R ↑S = M'
this : ∀ (s : { x // x ∈ S }), ∃ n, ↑s ∈ ↑N n
⊢ ∃ n, M' = ↑N n
[PROOFSTEP]
choose f hf using this
[GOAL]
case intro
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type u_3
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f✝ : M →ₗ[R] P
M' : Submodule R M
N : ℕ →o Submodule R M
H : iSup ↑N = M'
S : Finset M
hS : span R ↑S = M'
f : { x // x ∈ S } → ℕ
hf : ∀ (s : { x // x ∈ S }), ↑s ∈ ↑N (f s)
⊢ ∃ n, M' = ↑N n
[PROOFSTEP]
use S.attach.sup f
[GOAL]
case h
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type u_3
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f✝ : M →ₗ[R] P
M' : Submodule R M
N : ℕ →o Submodule R M
H : iSup ↑N = M'
S : Finset M
hS : span R ↑S = M'
f : { x // x ∈ S } → ℕ
hf : ∀ (s : { x // x ∈ S }), ↑s ∈ ↑N (f s)
⊢ M' = ↑N (Finset.sup (Finset.attach S) f)
[PROOFSTEP]
apply le_antisymm
[GOAL]
case h.a
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type u_3
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f✝ : M →ₗ[R] P
M' : Submodule R M
N : ℕ →o Submodule R M
H : iSup ↑N = M'
S : Finset M
hS : span R ↑S = M'
f : { x // x ∈ S } → ℕ
hf : ∀ (s : { x // x ∈ S }), ↑s ∈ ↑N (f s)
⊢ M' ≤ ↑N (Finset.sup (Finset.attach S) f)
[PROOFSTEP]
conv_lhs => rw [← hS]
[GOAL]
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type u_3
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f✝ : M →ₗ[R] P
M' : Submodule R M
N : ℕ →o Submodule R M
H : iSup ↑N = M'
S : Finset M
hS : span R ↑S = M'
f : { x // x ∈ S } → ℕ
hf : ∀ (s : { x // x ∈ S }), ↑s ∈ ↑N (f s)
| M'
[PROOFSTEP]
rw [← hS]
[GOAL]
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type u_3
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f✝ : M →ₗ[R] P
M' : Submodule R M
N : ℕ →o Submodule R M
H : iSup ↑N = M'
S : Finset M
hS : span R ↑S = M'
f : { x // x ∈ S } → ℕ
hf : ∀ (s : { x // x ∈ S }), ↑s ∈ ↑N (f s)
| M'
[PROOFSTEP]
rw [← hS]
[GOAL]
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type u_3
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f✝ : M →ₗ[R] P
M' : Submodule R M
N : ℕ →o Submodule R M
H : iSup ↑N = M'
S : Finset M
hS : span R ↑S = M'
f : { x // x ∈ S } → ℕ
hf : ∀ (s : { x // x ∈ S }), ↑s ∈ ↑N (f s)
| M'
[PROOFSTEP]
rw [← hS]
[GOAL]
case h.a
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type u_3
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f✝ : M →ₗ[R] P
M' : Submodule R M
N : ℕ →o Submodule R M
H : iSup ↑N = M'
S : Finset M
hS : span R ↑S = M'
f : { x // x ∈ S } → ℕ
hf : ∀ (s : { x // x ∈ S }), ↑s ∈ ↑N (f s)
⊢ span R ↑S ≤ ↑N (Finset.sup (Finset.attach S) f)
[PROOFSTEP]
rw [Submodule.span_le]
[GOAL]
case h.a
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type u_3
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f✝ : M →ₗ[R] P
M' : Submodule R M
N : ℕ →o Submodule R M
H : iSup ↑N = M'
S : Finset M
hS : span R ↑S = M'
f : { x // x ∈ S } → ℕ
hf : ∀ (s : { x // x ∈ S }), ↑s ∈ ↑N (f s)
⊢ ↑S ⊆ ↑(↑N (Finset.sup (Finset.attach S) f))
[PROOFSTEP]
intro s hs
[GOAL]
case h.a
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type u_3
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f✝ : M →ₗ[R] P
M' : Submodule R M
N : ℕ →o Submodule R M
H : iSup ↑N = M'
S : Finset M
hS : span R ↑S = M'
f : { x // x ∈ S } → ℕ
hf : ∀ (s : { x // x ∈ S }), ↑s ∈ ↑N (f s)
s : M
hs : s ∈ ↑S
⊢ s ∈ ↑(↑N (Finset.sup (Finset.attach S) f))
[PROOFSTEP]
exact N.2 (Finset.le_sup <| S.mem_attach ⟨s, hs⟩) (hf _)
[GOAL]
case h.a
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type u_3
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f✝ : M →ₗ[R] P
M' : Submodule R M
N : ℕ →o Submodule R M
H : iSup ↑N = M'
S : Finset M
hS : span R ↑S = M'
f : { x // x ∈ S } → ℕ
hf : ∀ (s : { x // x ∈ S }), ↑s ∈ ↑N (f s)
⊢ ↑N (Finset.sup (Finset.attach S) f) ≤ M'
[PROOFSTEP]
rw [← H]
[GOAL]
case h.a
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type u_3
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f✝ : M →ₗ[R] P
M' : Submodule R M
N : ℕ →o Submodule R M
H : iSup ↑N = M'
S : Finset M
hS : span R ↑S = M'
f : { x // x ∈ S } → ℕ
hf : ∀ (s : { x // x ∈ S }), ↑s ∈ ↑N (f s)
⊢ ↑N (Finset.sup (Finset.attach S) f) ≤ iSup ↑N
[PROOFSTEP]
exact le_iSup _ _
[GOAL]
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type u_3
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
⊢ FG s ↔ CompleteLattice.IsCompactElement s
[PROOFSTEP]
classical
  -- Introduce shorthand for span of an element
let sp : M → Submodule R M := fun a =>
  span R
    { a }
      -- Trivial rewrite lemma; a small hack since simp (only) & rw can't accomplish this smoothly.
have supr_rw : ∀ t : Finset M, ⨆ x ∈ t, sp x = ⨆ x ∈ (↑t : Set M), sp x := fun t => by rfl
constructor
· rintro ⟨t, rfl⟩
  rw [span_eq_iSup_of_singleton_spans, ← supr_rw, ← Finset.sup_eq_iSup t sp]
  apply CompleteLattice.finset_sup_compact_of_compact
  exact fun n _ => singleton_span_isCompactElement n
· intro h
  have sSup' : s = sSup (sp '' ↑s) := by
    rw [sSup_eq_iSup, iSup_image, ← span_eq_iSup_of_singleton_spans, eq_comm, span_eq]
      -- by h, s is then below (and equal to) the sup of the spans of finitely many elements.
  obtain ⟨u, ⟨huspan, husup⟩⟩ := h (sp '' ↑s) (le_of_eq sSup')
  have ssup : s = u.sup id := by
    suffices : u.sup id ≤ s
    exact le_antisymm husup this
    rw [sSup', Finset.sup_id_eq_sSup]
    exact sSup_le_sSup huspan
  have := Finset.subset_image_iff.mp huspan
  obtain ⟨t, ⟨-, rfl⟩⟩ := this
  rw [Finset.sup_image, Function.comp.left_id, Finset.sup_eq_iSup, supr_rw, ← span_eq_iSup_of_singleton_spans,
    eq_comm] at ssup 
  exact ⟨t, ssup⟩
[GOAL]
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type u_3
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
⊢ FG s ↔ CompleteLattice.IsCompactElement s
[PROOFSTEP]
let sp : M → Submodule R M := fun a =>
  span R
    { a }
      -- Trivial rewrite lemma; a small hack since simp (only) & rw can't accomplish this smoothly.
[GOAL]
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type u_3
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
sp : M → Submodule R M := fun a => span R {a}
⊢ FG s ↔ CompleteLattice.IsCompactElement s
[PROOFSTEP]
have supr_rw : ∀ t : Finset M, ⨆ x ∈ t, sp x = ⨆ x ∈ (↑t : Set M), sp x := fun t => by rfl
[GOAL]
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type u_3
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
sp : M → Submodule R M := fun a => span R {a}
t : Finset M
⊢ ⨆ (x : M) (_ : x ∈ t), sp x = ⨆ (x : M) (_ : x ∈ ↑t), sp x
[PROOFSTEP]
rfl
[GOAL]
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type u_3
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
sp : M → Submodule R M := fun a => span R {a}
supr_rw : ∀ (t : Finset M), ⨆ (x : M) (_ : x ∈ t), sp x = ⨆ (x : M) (_ : x ∈ ↑t), sp x
⊢ FG s ↔ CompleteLattice.IsCompactElement s
[PROOFSTEP]
constructor
[GOAL]
case mp
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type u_3
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
sp : M → Submodule R M := fun a => span R {a}
supr_rw : ∀ (t : Finset M), ⨆ (x : M) (_ : x ∈ t), sp x = ⨆ (x : M) (_ : x ∈ ↑t), sp x
⊢ FG s → CompleteLattice.IsCompactElement s
[PROOFSTEP]
rintro ⟨t, rfl⟩
[GOAL]
case mp.intro
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type u_3
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f : M →ₗ[R] P
sp : M → Submodule R M := fun a => span R {a}
supr_rw : ∀ (t : Finset M), ⨆ (x : M) (_ : x ∈ t), sp x = ⨆ (x : M) (_ : x ∈ ↑t), sp x
t : Finset M
⊢ CompleteLattice.IsCompactElement (span R ↑t)
[PROOFSTEP]
rw [span_eq_iSup_of_singleton_spans, ← supr_rw, ← Finset.sup_eq_iSup t sp]
[GOAL]
case mp.intro
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type u_3
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f : M →ₗ[R] P
sp : M → Submodule R M := fun a => span R {a}
supr_rw : ∀ (t : Finset M), ⨆ (x : M) (_ : x ∈ t), sp x = ⨆ (x : M) (_ : x ∈ ↑t), sp x
t : Finset M
⊢ CompleteLattice.IsCompactElement (Finset.sup t sp)
[PROOFSTEP]
apply CompleteLattice.finset_sup_compact_of_compact
[GOAL]
case mp.intro.h
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type u_3
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f : M →ₗ[R] P
sp : M → Submodule R M := fun a => span R {a}
supr_rw : ∀ (t : Finset M), ⨆ (x : M) (_ : x ∈ t), sp x = ⨆ (x : M) (_ : x ∈ ↑t), sp x
t : Finset M
⊢ ∀ (x : M), x ∈ t → CompleteLattice.IsCompactElement (sp x)
[PROOFSTEP]
exact fun n _ => singleton_span_isCompactElement n
[GOAL]
case mpr
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type u_3
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
sp : M → Submodule R M := fun a => span R {a}
supr_rw : ∀ (t : Finset M), ⨆ (x : M) (_ : x ∈ t), sp x = ⨆ (x : M) (_ : x ∈ ↑t), sp x
⊢ CompleteLattice.IsCompactElement s → FG s
[PROOFSTEP]
intro h
[GOAL]
case mpr
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type u_3
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
sp : M → Submodule R M := fun a => span R {a}
supr_rw : ∀ (t : Finset M), ⨆ (x : M) (_ : x ∈ t), sp x = ⨆ (x : M) (_ : x ∈ ↑t), sp x
h : CompleteLattice.IsCompactElement s
⊢ FG s
[PROOFSTEP]
have sSup' : s = sSup (sp '' ↑s) := by
  rw [sSup_eq_iSup, iSup_image, ← span_eq_iSup_of_singleton_spans, eq_comm, span_eq]
    -- by h, s is then below (and equal to) the sup of the spans of finitely many elements.
[GOAL]
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type u_3
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
sp : M → Submodule R M := fun a => span R {a}
supr_rw : ∀ (t : Finset M), ⨆ (x : M) (_ : x ∈ t), sp x = ⨆ (x : M) (_ : x ∈ ↑t), sp x
h : CompleteLattice.IsCompactElement s
⊢ s = sSup (sp '' ↑s)
[PROOFSTEP]
rw [sSup_eq_iSup, iSup_image, ← span_eq_iSup_of_singleton_spans, eq_comm, span_eq]
  -- by h, s is then below (and equal to) the sup of the spans of finitely many elements.
[GOAL]
case mpr
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type u_3
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
sp : M → Submodule R M := fun a => span R {a}
supr_rw : ∀ (t : Finset M), ⨆ (x : M) (_ : x ∈ t), sp x = ⨆ (x : M) (_ : x ∈ ↑t), sp x
h : CompleteLattice.IsCompactElement s
sSup' : s = sSup (sp '' ↑s)
⊢ FG s
[PROOFSTEP]
obtain ⟨u, ⟨huspan, husup⟩⟩ := h (sp '' ↑s) (le_of_eq sSup')
[GOAL]
case mpr.intro.intro
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type u_3
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
sp : M → Submodule R M := fun a => span R {a}
supr_rw : ∀ (t : Finset M), ⨆ (x : M) (_ : x ∈ t), sp x = ⨆ (x : M) (_ : x ∈ ↑t), sp x
h : CompleteLattice.IsCompactElement s
sSup' : s = sSup (sp '' ↑s)
u : Finset (Submodule R M)
huspan : ↑u ⊆ sp '' ↑s
husup : s ≤ Finset.sup u id
⊢ FG s
[PROOFSTEP]
have ssup : s = u.sup id := by
  suffices : u.sup id ≤ s
  exact le_antisymm husup this
  rw [sSup', Finset.sup_id_eq_sSup]
  exact sSup_le_sSup huspan
[GOAL]
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type u_3
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
sp : M → Submodule R M := fun a => span R {a}
supr_rw : ∀ (t : Finset M), ⨆ (x : M) (_ : x ∈ t), sp x = ⨆ (x : M) (_ : x ∈ ↑t), sp x
h : CompleteLattice.IsCompactElement s
sSup' : s = sSup (sp '' ↑s)
u : Finset (Submodule R M)
huspan : ↑u ⊆ sp '' ↑s
husup : s ≤ Finset.sup u id
⊢ s = Finset.sup u id
[PROOFSTEP]
suffices : u.sup id ≤ s
[GOAL]
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type u_3
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
sp : M → Submodule R M := fun a => span R {a}
supr_rw : ∀ (t : Finset M), ⨆ (x : M) (_ : x ∈ t), sp x = ⨆ (x : M) (_ : x ∈ ↑t), sp x
h : CompleteLattice.IsCompactElement s
sSup' : s = sSup (sp '' ↑s)
u : Finset (Submodule R M)
huspan : ↑u ⊆ sp '' ↑s
husup : s ≤ Finset.sup u id
this : Finset.sup u id ≤ s
⊢ s = Finset.sup u id
case this
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type u_3
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
sp : M → Submodule R M := fun a => span R {a}
supr_rw : ∀ (t : Finset M), ⨆ (x : M) (_ : x ∈ t), sp x = ⨆ (x : M) (_ : x ∈ ↑t), sp x
h : CompleteLattice.IsCompactElement s
sSup' : s = sSup (sp '' ↑s)
u : Finset (Submodule R M)
huspan : ↑u ⊆ sp '' ↑s
husup : s ≤ Finset.sup u id
⊢ Finset.sup u id ≤ s
[PROOFSTEP]
exact le_antisymm husup this
[GOAL]
case this
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type u_3
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
sp : M → Submodule R M := fun a => span R {a}
supr_rw : ∀ (t : Finset M), ⨆ (x : M) (_ : x ∈ t), sp x = ⨆ (x : M) (_ : x ∈ ↑t), sp x
h : CompleteLattice.IsCompactElement s
sSup' : s = sSup (sp '' ↑s)
u : Finset (Submodule R M)
huspan : ↑u ⊆ sp '' ↑s
husup : s ≤ Finset.sup u id
⊢ Finset.sup u id ≤ s
[PROOFSTEP]
rw [sSup', Finset.sup_id_eq_sSup]
[GOAL]
case this
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type u_3
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
sp : M → Submodule R M := fun a => span R {a}
supr_rw : ∀ (t : Finset M), ⨆ (x : M) (_ : x ∈ t), sp x = ⨆ (x : M) (_ : x ∈ ↑t), sp x
h : CompleteLattice.IsCompactElement s
sSup' : s = sSup (sp '' ↑s)
u : Finset (Submodule R M)
huspan : ↑u ⊆ sp '' ↑s
husup : s ≤ Finset.sup u id
⊢ sSup ↑u ≤ sSup (sp '' ↑s)
[PROOFSTEP]
exact sSup_le_sSup huspan
[GOAL]
case mpr.intro.intro
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type u_3
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
sp : M → Submodule R M := fun a => span R {a}
supr_rw : ∀ (t : Finset M), ⨆ (x : M) (_ : x ∈ t), sp x = ⨆ (x : M) (_ : x ∈ ↑t), sp x
h : CompleteLattice.IsCompactElement s
sSup' : s = sSup (sp '' ↑s)
u : Finset (Submodule R M)
huspan : ↑u ⊆ sp '' ↑s
husup : s ≤ Finset.sup u id
ssup : s = Finset.sup u id
⊢ FG s
[PROOFSTEP]
have := Finset.subset_image_iff.mp huspan
[GOAL]
case mpr.intro.intro
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type u_3
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
sp : M → Submodule R M := fun a => span R {a}
supr_rw : ∀ (t : Finset M), ⨆ (x : M) (_ : x ∈ t), sp x = ⨆ (x : M) (_ : x ∈ ↑t), sp x
h : CompleteLattice.IsCompactElement s
sSup' : s = sSup (sp '' ↑s)
u : Finset (Submodule R M)
huspan : ↑u ⊆ sp '' ↑s
husup : s ≤ Finset.sup u id
ssup : s = Finset.sup u id
this : ∃ s', ↑s' ⊆ ↑s ∧ Finset.image sp s' = u
⊢ FG s
[PROOFSTEP]
obtain ⟨t, ⟨-, rfl⟩⟩ := this
[GOAL]
case mpr.intro.intro.intro.intro
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type u_3
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
sp : M → Submodule R M := fun a => span R {a}
supr_rw : ∀ (t : Finset M), ⨆ (x : M) (_ : x ∈ t), sp x = ⨆ (x : M) (_ : x ∈ ↑t), sp x
h : CompleteLattice.IsCompactElement s
sSup' : s = sSup (sp '' ↑s)
t : Finset M
huspan : ↑(Finset.image sp t) ⊆ sp '' ↑s
husup : s ≤ Finset.sup (Finset.image sp t) id
ssup : s = Finset.sup (Finset.image sp t) id
⊢ FG s
[PROOFSTEP]
rw [Finset.sup_image, Function.comp.left_id, Finset.sup_eq_iSup, supr_rw, ← span_eq_iSup_of_singleton_spans, eq_comm] at
  ssup 
[GOAL]
case mpr.intro.intro.intro.intro
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type u_3
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f : M →ₗ[R] P
s : Submodule R M
sp : M → Submodule R M := fun a => span R {a}
supr_rw : ∀ (t : Finset M), ⨆ (x : M) (_ : x ∈ t), sp x = ⨆ (x : M) (_ : x ∈ ↑t), sp x
h : CompleteLattice.IsCompactElement s
sSup' : s = sSup (sp '' ↑s)
t : Finset M
huspan : ↑(Finset.image sp t) ⊆ sp '' ↑s
husup : s ≤ Finset.sup (Finset.image sp t) id
ssup : span R ↑t = s
⊢ FG s
[PROOFSTEP]
exact ⟨t, ssup⟩
[GOAL]
R : Type u_1
A : Type u_2
inst✝² : CommSemiring R
inst✝¹ : Semiring A
inst✝ : Algebra R A
M N : Submodule R A
h : FG M
n : ℕ
⊢ span R ↑{1} = M ^ Nat.zero
[PROOFSTEP]
simp [one_eq_span]
[GOAL]
R : Type u_1
A : Type u_2
inst✝² : CommSemiring R
inst✝¹ : Semiring A
inst✝ : Algebra R A
M N : Submodule R A
h : FG M
n✝ n : ℕ
ih : FG (M ^ n)
⊢ FG (M ^ Nat.succ n)
[PROOFSTEP]
simpa [pow_succ] using h.mul ih
[GOAL]
R✝ : Type u_1
M : Type u_2
inst✝⁴ : Semiring R✝
inst✝³ : AddCommMonoid M
inst✝² : Module R✝ M
R : Type u_3
S : Type u_4
inst✝¹ : Semiring R
inst✝ : Semiring S
I : Ideal R
h : FG I
f : R →+* S
⊢ FG (Ideal.map f I)
[PROOFSTEP]
classical
obtain ⟨s, hs⟩ := h
refine' ⟨s.image f, _⟩
rw [Finset.coe_image, ← Ideal.map_span, hs]
[GOAL]
R✝ : Type u_1
M : Type u_2
inst✝⁴ : Semiring R✝
inst✝³ : AddCommMonoid M
inst✝² : Module R✝ M
R : Type u_3
S : Type u_4
inst✝¹ : Semiring R
inst✝ : Semiring S
I : Ideal R
h : FG I
f : R →+* S
⊢ FG (Ideal.map f I)
[PROOFSTEP]
obtain ⟨s, hs⟩ := h
[GOAL]
case intro
R✝ : Type u_1
M : Type u_2
inst✝⁴ : Semiring R✝
inst✝³ : AddCommMonoid M
inst✝² : Module R✝ M
R : Type u_3
S : Type u_4
inst✝¹ : Semiring R
inst✝ : Semiring S
I : Ideal R
f : R →+* S
s : Finset R
hs : span ↑s = I
⊢ FG (Ideal.map f I)
[PROOFSTEP]
refine' ⟨s.image f, _⟩
[GOAL]
case intro
R✝ : Type u_1
M : Type u_2
inst✝⁴ : Semiring R✝
inst✝³ : AddCommMonoid M
inst✝² : Module R✝ M
R : Type u_3
S : Type u_4
inst✝¹ : Semiring R
inst✝ : Semiring S
I : Ideal R
f : R →+* S
s : Finset R
hs : span ↑s = I
⊢ span ↑(Finset.image (↑f) s) = Ideal.map f I
[PROOFSTEP]
rw [Finset.coe_image, ← Ideal.map_span, hs]
[GOAL]
R✝ : Type u_1
M : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M
inst✝³ : Module R✝ M
R : Type u_3
S : Type u_4
A : Type u_5
inst✝² : CommRing R
inst✝¹ : CommRing S
inst✝ : CommRing A
f : R →+* S
g : S →+* A
hf : FG (RingHom.ker f)
hg : FG (RingHom.ker g)
hsur : Surjective ↑f
⊢ FG (RingHom.ker (RingHom.comp g f))
[PROOFSTEP]
letI : Algebra R S := RingHom.toAlgebra f
[GOAL]
R✝ : Type u_1
M : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M
inst✝³ : Module R✝ M
R : Type u_3
S : Type u_4
A : Type u_5
inst✝² : CommRing R
inst✝¹ : CommRing S
inst✝ : CommRing A
f : R →+* S
g : S →+* A
hf : FG (RingHom.ker f)
hg : FG (RingHom.ker g)
hsur : Surjective ↑f
this : Algebra R S := RingHom.toAlgebra f
⊢ FG (RingHom.ker (RingHom.comp g f))
[PROOFSTEP]
letI : Algebra R A := RingHom.toAlgebra (g.comp f)
[GOAL]
R✝ : Type u_1
M : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M
inst✝³ : Module R✝ M
R : Type u_3
S : Type u_4
A : Type u_5
inst✝² : CommRing R
inst✝¹ : CommRing S
inst✝ : CommRing A
f : R →+* S
g : S →+* A
hf : FG (RingHom.ker f)
hg : FG (RingHom.ker g)
hsur : Surjective ↑f
this✝ : Algebra R S := RingHom.toAlgebra f
this : Algebra R A := RingHom.toAlgebra (RingHom.comp g f)
⊢ FG (RingHom.ker (RingHom.comp g f))
[PROOFSTEP]
letI : Algebra S A := RingHom.toAlgebra g
[GOAL]
R✝ : Type u_1
M : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M
inst✝³ : Module R✝ M
R : Type u_3
S : Type u_4
A : Type u_5
inst✝² : CommRing R
inst✝¹ : CommRing S
inst✝ : CommRing A
f : R →+* S
g : S →+* A
hf : FG (RingHom.ker f)
hg : FG (RingHom.ker g)
hsur : Surjective ↑f
this✝¹ : Algebra R S := RingHom.toAlgebra f
this✝ : Algebra R A := RingHom.toAlgebra (RingHom.comp g f)
this : Algebra S A := RingHom.toAlgebra g
⊢ FG (RingHom.ker (RingHom.comp g f))
[PROOFSTEP]
letI : IsScalarTower R S A := IsScalarTower.of_algebraMap_eq fun _ => rfl
[GOAL]
R✝ : Type u_1
M : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M
inst✝³ : Module R✝ M
R : Type u_3
S : Type u_4
A : Type u_5
inst✝² : CommRing R
inst✝¹ : CommRing S
inst✝ : CommRing A
f : R →+* S
g : S →+* A
hf : FG (RingHom.ker f)
hg : FG (RingHom.ker g)
hsur : Surjective ↑f
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : Algebra R A := RingHom.toAlgebra (RingHom.comp g f)
this✝ : Algebra S A := RingHom.toAlgebra g
this : IsScalarTower R S A := IsScalarTower.of_algebraMap_eq fun x => rfl
⊢ FG (RingHom.ker (RingHom.comp g f))
[PROOFSTEP]
let f₁ := Algebra.linearMap R S
[GOAL]
R✝ : Type u_1
M : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M
inst✝³ : Module R✝ M
R : Type u_3
S : Type u_4
A : Type u_5
inst✝² : CommRing R
inst✝¹ : CommRing S
inst✝ : CommRing A
f : R →+* S
g : S →+* A
hf : FG (RingHom.ker f)
hg : FG (RingHom.ker g)
hsur : Surjective ↑f
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : Algebra R A := RingHom.toAlgebra (RingHom.comp g f)
this✝ : Algebra S A := RingHom.toAlgebra g
this : IsScalarTower R S A := IsScalarTower.of_algebraMap_eq fun x => rfl
f₁ : R →ₗ[R] S := Algebra.linearMap R S
⊢ FG (RingHom.ker (RingHom.comp g f))
[PROOFSTEP]
let g₁ := (IsScalarTower.toAlgHom R S A).toLinearMap
[GOAL]
R✝ : Type u_1
M : Type u_2
inst✝⁵ : Semiring R✝
inst✝⁴ : AddCommMonoid M
inst✝³ : Module R✝ M
R : Type u_3
S : Type u_4
A : Type u_5
inst✝² : CommRing R
inst✝¹ : CommRing S
inst✝ : CommRing A
f : R →+* S
g : S →+* A
hf : FG (RingHom.ker f)
hg : FG (RingHom.ker g)
hsur : Surjective ↑f
this✝² : Algebra R S := RingHom.toAlgebra f
this✝¹ : Algebra R A := RingHom.toAlgebra (RingHom.comp g f)
this✝ : Algebra S A := RingHom.toAlgebra g
this : IsScalarTower R S A := IsScalarTower.of_algebraMap_eq fun x => rfl
f₁ : R →ₗ[R] S := Algebra.linearMap R S
g₁ : S →ₗ[R] A := AlgHom.toLinearMap (IsScalarTower.toAlgHom R S A)
⊢ FG (RingHom.ker (RingHom.comp g f))
[PROOFSTEP]
exact Submodule.fg_ker_comp f₁ g₁ hf (Submodule.fg_restrictScalars (RingHom.ker g) hg hsur) hsur
[GOAL]
R✝ : Type u_1
M : Type u_2
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_3
inst✝ : CommSemiring R
I : Ideal R
h : FG (radical I)
⊢ ∃ n, radical I ^ n ≤ I
[PROOFSTEP]
have := le_refl I.radical
[GOAL]
R✝ : Type u_1
M : Type u_2
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_3
inst✝ : CommSemiring R
I : Ideal R
h : FG (radical I)
this : radical I ≤ radical I
⊢ ∃ n, radical I ^ n ≤ I
[PROOFSTEP]
revert this
[GOAL]
R✝ : Type u_1
M : Type u_2
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_3
inst✝ : CommSemiring R
I : Ideal R
h : FG (radical I)
⊢ radical I ≤ radical I → ∃ n, radical I ^ n ≤ I
[PROOFSTEP]
refine' Submodule.fg_induction _ _ (fun J => J ≤ I.radical → ∃ n : ℕ, J ^ n ≤ I) _ _ _ h
[GOAL]
case refine'_1
R✝ : Type u_1
M : Type u_2
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_3
inst✝ : CommSemiring R
I : Ideal R
h : FG (radical I)
⊢ ∀ (x : R), (fun J => J ≤ radical I → ∃ n, J ^ n ≤ I) (Submodule.span R {x})
[PROOFSTEP]
intro x hx
[GOAL]
case refine'_1
R✝ : Type u_1
M : Type u_2
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_3
inst✝ : CommSemiring R
I : Ideal R
h : FG (radical I)
x : R
hx : Submodule.span R {x} ≤ radical I
⊢ ∃ n, Submodule.span R {x} ^ n ≤ I
[PROOFSTEP]
obtain ⟨n, hn⟩ := hx (subset_span (Set.mem_singleton x))
[GOAL]
case refine'_1.intro
R✝ : Type u_1
M : Type u_2
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_3
inst✝ : CommSemiring R
I : Ideal R
h : FG (radical I)
x : R
hx : Submodule.span R {x} ≤ radical I
n : ℕ
hn : x ^ n ∈ I
⊢ ∃ n, Submodule.span R {x} ^ n ≤ I
[PROOFSTEP]
exact ⟨n, by rwa [← Ideal.span, span_singleton_pow, span_le, Set.singleton_subset_iff]⟩
[GOAL]
R✝ : Type u_1
M : Type u_2
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_3
inst✝ : CommSemiring R
I : Ideal R
h : FG (radical I)
x : R
hx : Submodule.span R {x} ≤ radical I
n : ℕ
hn : x ^ n ∈ I
⊢ Submodule.span R {x} ^ n ≤ I
[PROOFSTEP]
rwa [← Ideal.span, span_singleton_pow, span_le, Set.singleton_subset_iff]
[GOAL]
case refine'_2
R✝ : Type u_1
M : Type u_2
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_3
inst✝ : CommSemiring R
I : Ideal R
h : FG (radical I)
⊢ ∀ (M₁ M₂ : Submodule R R),
    (fun J => J ≤ radical I → ∃ n, J ^ n ≤ I) M₁ →
      (fun J => J ≤ radical I → ∃ n, J ^ n ≤ I) M₂ → (fun J => J ≤ radical I → ∃ n, J ^ n ≤ I) (M₁ ⊔ M₂)
[PROOFSTEP]
intro J K hJ hK hJK
[GOAL]
case refine'_2
R✝ : Type u_1
M : Type u_2
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_3
inst✝ : CommSemiring R
I : Ideal R
h : FG (radical I)
J K : Submodule R R
hJ : J ≤ radical I → ∃ n, J ^ n ≤ I
hK : K ≤ radical I → ∃ n, K ^ n ≤ I
hJK : J ⊔ K ≤ radical I
⊢ ∃ n, (J ⊔ K) ^ n ≤ I
[PROOFSTEP]
obtain ⟨n, hn⟩ := hJ fun x hx => hJK <| Ideal.mem_sup_left hx
[GOAL]
case refine'_2.intro
R✝ : Type u_1
M : Type u_2
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_3
inst✝ : CommSemiring R
I : Ideal R
h : FG (radical I)
J K : Submodule R R
hJ : J ≤ radical I → ∃ n, J ^ n ≤ I
hK : K ≤ radical I → ∃ n, K ^ n ≤ I
hJK : J ⊔ K ≤ radical I
n : ℕ
hn : J ^ n ≤ I
⊢ ∃ n, (J ⊔ K) ^ n ≤ I
[PROOFSTEP]
obtain ⟨m, hm⟩ := hK fun x hx => hJK <| Ideal.mem_sup_right hx
[GOAL]
case refine'_2.intro.intro
R✝ : Type u_1
M : Type u_2
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_3
inst✝ : CommSemiring R
I : Ideal R
h : FG (radical I)
J K : Submodule R R
hJ : J ≤ radical I → ∃ n, J ^ n ≤ I
hK : K ≤ radical I → ∃ n, K ^ n ≤ I
hJK : J ⊔ K ≤ radical I
n : ℕ
hn : J ^ n ≤ I
m : ℕ
hm : K ^ m ≤ I
⊢ ∃ n, (J ⊔ K) ^ n ≤ I
[PROOFSTEP]
use n + m
[GOAL]
case h
R✝ : Type u_1
M : Type u_2
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_3
inst✝ : CommSemiring R
I : Ideal R
h : FG (radical I)
J K : Submodule R R
hJ : J ≤ radical I → ∃ n, J ^ n ≤ I
hK : K ≤ radical I → ∃ n, K ^ n ≤ I
hJK : J ⊔ K ≤ radical I
n : ℕ
hn : J ^ n ≤ I
m : ℕ
hm : K ^ m ≤ I
⊢ (J ⊔ K) ^ (n + m) ≤ I
[PROOFSTEP]
rw [← Ideal.add_eq_sup, add_pow, Ideal.sum_eq_sup, Finset.sup_le_iff]
[GOAL]
case h
R✝ : Type u_1
M : Type u_2
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_3
inst✝ : CommSemiring R
I : Ideal R
h : FG (radical I)
J K : Submodule R R
hJ : J ≤ radical I → ∃ n, J ^ n ≤ I
hK : K ≤ radical I → ∃ n, K ^ n ≤ I
hJK : J ⊔ K ≤ radical I
n : ℕ
hn : J ^ n ≤ I
m : ℕ
hm : K ^ m ≤ I
⊢ ∀ (b : ℕ), b ∈ Finset.range (n + m + 1) → J ^ b * K ^ (n + m - b) * ↑(Nat.choose (n + m) b) ≤ I
[PROOFSTEP]
refine' fun i _ => Ideal.mul_le_right.trans _
[GOAL]
case h
R✝ : Type u_1
M : Type u_2
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_3
inst✝ : CommSemiring R
I : Ideal R
h : FG (radical I)
J K : Submodule R R
hJ : J ≤ radical I → ∃ n, J ^ n ≤ I
hK : K ≤ radical I → ∃ n, K ^ n ≤ I
hJK : J ⊔ K ≤ radical I
n : ℕ
hn : J ^ n ≤ I
m : ℕ
hm : K ^ m ≤ I
i : ℕ
x✝ : i ∈ Finset.range (n + m + 1)
⊢ J ^ i * K ^ (n + m - i) ≤ I
[PROOFSTEP]
obtain h | h := le_or_lt n i
[GOAL]
case h.inl
R✝ : Type u_1
M : Type u_2
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_3
inst✝ : CommSemiring R
I : Ideal R
h✝ : FG (radical I)
J K : Submodule R R
hJ : J ≤ radical I → ∃ n, J ^ n ≤ I
hK : K ≤ radical I → ∃ n, K ^ n ≤ I
hJK : J ⊔ K ≤ radical I
n : ℕ
hn : J ^ n ≤ I
m : ℕ
hm : K ^ m ≤ I
i : ℕ
x✝ : i ∈ Finset.range (n + m + 1)
h : n ≤ i
⊢ J ^ i * K ^ (n + m - i) ≤ I
[PROOFSTEP]
apply Ideal.mul_le_right.trans ((Ideal.pow_le_pow h).trans hn)
[GOAL]
case h.inr
R✝ : Type u_1
M : Type u_2
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_3
inst✝ : CommSemiring R
I : Ideal R
h✝ : FG (radical I)
J K : Submodule R R
hJ : J ≤ radical I → ∃ n, J ^ n ≤ I
hK : K ≤ radical I → ∃ n, K ^ n ≤ I
hJK : J ⊔ K ≤ radical I
n : ℕ
hn : J ^ n ≤ I
m : ℕ
hm : K ^ m ≤ I
i : ℕ
x✝ : i ∈ Finset.range (n + m + 1)
h : i < n
⊢ J ^ i * K ^ (n + m - i) ≤ I
[PROOFSTEP]
apply Ideal.mul_le_left.trans
[GOAL]
case h.inr
R✝ : Type u_1
M : Type u_2
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_3
inst✝ : CommSemiring R
I : Ideal R
h✝ : FG (radical I)
J K : Submodule R R
hJ : J ≤ radical I → ∃ n, J ^ n ≤ I
hK : K ≤ radical I → ∃ n, K ^ n ≤ I
hJK : J ⊔ K ≤ radical I
n : ℕ
hn : J ^ n ≤ I
m : ℕ
hm : K ^ m ≤ I
i : ℕ
x✝ : i ∈ Finset.range (n + m + 1)
h : i < n
⊢ K ^ (n + m - i) ≤ I
[PROOFSTEP]
refine' (Ideal.pow_le_pow _).trans hm
[GOAL]
case h.inr
R✝ : Type u_1
M : Type u_2
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_3
inst✝ : CommSemiring R
I : Ideal R
h✝ : FG (radical I)
J K : Submodule R R
hJ : J ≤ radical I → ∃ n, J ^ n ≤ I
hK : K ≤ radical I → ∃ n, K ^ n ≤ I
hJK : J ⊔ K ≤ radical I
n : ℕ
hn : J ^ n ≤ I
m : ℕ
hm : K ^ m ≤ I
i : ℕ
x✝ : i ∈ Finset.range (n + m + 1)
h : i < n
⊢ m ≤ n + m - i
[PROOFSTEP]
rw [add_comm, Nat.add_sub_assoc h.le]
[GOAL]
case h.inr
R✝ : Type u_1
M : Type u_2
inst✝³ : Semiring R✝
inst✝² : AddCommMonoid M
inst✝¹ : Module R✝ M
R : Type u_3
inst✝ : CommSemiring R
I : Ideal R
h✝ : FG (radical I)
J K : Submodule R R
hJ : J ≤ radical I → ∃ n, J ^ n ≤ I
hK : K ≤ radical I → ∃ n, K ^ n ≤ I
hJK : J ⊔ K ≤ radical I
n : ℕ
hn : J ^ n ≤ I
m : ℕ
hm : K ^ m ≤ I
i : ℕ
x✝ : i ∈ Finset.range (n + m + 1)
h : i < n
⊢ m ≤ m + (n - i)
[PROOFSTEP]
apply Nat.le_add_right
[GOAL]
R : Type u_1
A : Type u_2
B : Type u_3
M : Type u_4
N : Type u_5
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
inst✝¹ : AddCommMonoid N
inst✝ : Module R N
hM : Finite R M
f : M →ₗ[R] N
hf : Surjective ↑f
⊢ FG ⊤
[PROOFSTEP]
rw [← LinearMap.range_eq_top.2 hf, ← Submodule.map_top]
[GOAL]
R : Type u_1
A : Type u_2
B : Type u_3
M : Type u_4
N : Type u_5
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
inst✝¹ : AddCommMonoid N
inst✝ : Module R N
hM : Finite R M
f : M →ₗ[R] N
hf : Surjective ↑f
⊢ FG (map f ⊤)
[PROOFSTEP]
exact hM.1.map f
[GOAL]
R : Type u_1
A : Type u_2
B : Type u_3
M : Type u_4
N : Type u_5
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
inst✝¹ : AddCommMonoid N
inst✝ : Module R N
⊢ span R ↑{1} = ⊤
[PROOFSTEP]
simpa only [Finset.coe_singleton] using Ideal.span_singleton_one
[GOAL]
R✝ : Type u_1
A✝ : Type u_2
B : Type u_3
M✝ : Type u_4
N : Type u_5
inst✝¹¹ : Semiring R✝
inst✝¹⁰ : AddCommMonoid M✝
inst✝⁹ : Module R✝ M✝
inst✝⁸ : AddCommMonoid N
inst✝⁷ : Module R✝ N
R : Type u_6
A : Type u_7
M : Type u_8
inst✝⁶ : CommSemiring R
inst✝⁵ : Semiring A
inst✝⁴ : AddCommMonoid M
inst✝³ : Module R M
inst✝² : Module A M
inst✝¹ : Algebra R A
inst✝ : IsScalarTower R A M
hM : Finite R M
⊢ Finite A M
[PROOFSTEP]
rw [finite_def, Submodule.fg_def] at hM ⊢
[GOAL]
R✝ : Type u_1
A✝ : Type u_2
B : Type u_3
M✝ : Type u_4
N : Type u_5
inst✝¹¹ : Semiring R✝
inst✝¹⁰ : AddCommMonoid M✝
inst✝⁹ : Module R✝ M✝
inst✝⁸ : AddCommMonoid N
inst✝⁷ : Module R✝ N
R : Type u_6
A : Type u_7
M : Type u_8
inst✝⁶ : CommSemiring R
inst✝⁵ : Semiring A
inst✝⁴ : AddCommMonoid M
inst✝³ : Module R M
inst✝² : Module A M
inst✝¹ : Algebra R A
inst✝ : IsScalarTower R A M
hM : ∃ S, Set.Finite S ∧ span R S = ⊤
⊢ ∃ S, Set.Finite S ∧ span A S = ⊤
[PROOFSTEP]
obtain ⟨S, hSfin, hSgen⟩ := hM
[GOAL]
case intro.intro
R✝ : Type u_1
A✝ : Type u_2
B : Type u_3
M✝ : Type u_4
N : Type u_5
inst✝¹¹ : Semiring R✝
inst✝¹⁰ : AddCommMonoid M✝
inst✝⁹ : Module R✝ M✝
inst✝⁸ : AddCommMonoid N
inst✝⁷ : Module R✝ N
R : Type u_6
A : Type u_7
M : Type u_8
inst✝⁶ : CommSemiring R
inst✝⁵ : Semiring A
inst✝⁴ : AddCommMonoid M
inst✝³ : Module R M
inst✝² : Module A M
inst✝¹ : Algebra R A
inst✝ : IsScalarTower R A M
S : Set M
hSfin : Set.Finite S
hSgen : span R S = ⊤
⊢ ∃ S, Set.Finite S ∧ span A S = ⊤
[PROOFSTEP]
refine' ⟨S, hSfin, eq_top_iff.2 _⟩
[GOAL]
case intro.intro
R✝ : Type u_1
A✝ : Type u_2
B : Type u_3
M✝ : Type u_4
N : Type u_5
inst✝¹¹ : Semiring R✝
inst✝¹⁰ : AddCommMonoid M✝
inst✝⁹ : Module R✝ M✝
inst✝⁸ : AddCommMonoid N
inst✝⁷ : Module R✝ N
R : Type u_6
A : Type u_7
M : Type u_8
inst✝⁶ : CommSemiring R
inst✝⁵ : Semiring A
inst✝⁴ : AddCommMonoid M
inst✝³ : Module R M
inst✝² : Module A M
inst✝¹ : Algebra R A
inst✝ : IsScalarTower R A M
S : Set M
hSfin : Set.Finite S
hSgen : span R S = ⊤
⊢ ⊤ ≤ span A S
[PROOFSTEP]
have := Submodule.span_le_restrictScalars R A S
[GOAL]
case intro.intro
R✝ : Type u_1
A✝ : Type u_2
B : Type u_3
M✝ : Type u_4
N : Type u_5
inst✝¹¹ : Semiring R✝
inst✝¹⁰ : AddCommMonoid M✝
inst✝⁹ : Module R✝ M✝
inst✝⁸ : AddCommMonoid N
inst✝⁷ : Module R✝ N
R : Type u_6
A : Type u_7
M : Type u_8
inst✝⁶ : CommSemiring R
inst✝⁵ : Semiring A
inst✝⁴ : AddCommMonoid M
inst✝³ : Module R M
inst✝² : Module A M
inst✝¹ : Algebra R A
inst✝ : IsScalarTower R A M
S : Set M
hSfin : Set.Finite S
hSgen : span R S = ⊤
this : span R S ≤ restrictScalars R (span A S)
⊢ ⊤ ≤ span A S
[PROOFSTEP]
rw [hSgen] at this 
[GOAL]
case intro.intro
R✝ : Type u_1
A✝ : Type u_2
B : Type u_3
M✝ : Type u_4
N : Type u_5
inst✝¹¹ : Semiring R✝
inst✝¹⁰ : AddCommMonoid M✝
inst✝⁹ : Module R✝ M✝
inst✝⁸ : AddCommMonoid N
inst✝⁷ : Module R✝ N
R : Type u_6
A : Type u_7
M : Type u_8
inst✝⁶ : CommSemiring R
inst✝⁵ : Semiring A
inst✝⁴ : AddCommMonoid M
inst✝³ : Module R M
inst✝² : Module A M
inst✝¹ : Algebra R A
inst✝ : IsScalarTower R A M
S : Set M
hSfin : Set.Finite S
hSgen : span R S = ⊤
this : ⊤ ≤ restrictScalars R (span A S)
⊢ ⊤ ≤ span A S
[PROOFSTEP]
exact this
[GOAL]
R : Type u_1
A : Type u_2
B : Type u_3
M : Type u_4
N : Type u_5
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
inst✝¹ : AddCommMonoid N
inst✝ : Module R N
hM : Finite R M
hN : Finite R N
⊢ FG ⊤
[PROOFSTEP]
rw [← Submodule.prod_top]
[GOAL]
R : Type u_1
A : Type u_2
B : Type u_3
M : Type u_4
N : Type u_5
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
inst✝¹ : AddCommMonoid N
inst✝ : Module R N
hM : Finite R M
hN : Finite R N
⊢ FG (Submodule.prod ⊤ ⊤)
[PROOFSTEP]
exact hM.1.prod hN.1
[GOAL]
R : Type u_1
A : Type u_2
B : Type u_3
M✝ : Type u_4
N : Type u_5
inst✝⁷ : Semiring R
inst✝⁶ : AddCommMonoid M✝
inst✝⁵ : Module R M✝
inst✝⁴ : AddCommMonoid N
inst✝³ : Module R N
ι : Type u_6
M : ι → Type u_7
inst✝² : _root_.Finite ι
inst✝¹ : (i : ι) → AddCommMonoid (M i)
inst✝ : (i : ι) → Module R (M i)
h : ∀ (i : ι), Finite R (M i)
⊢ FG ⊤
[PROOFSTEP]
rw [← Submodule.pi_top]
[GOAL]
R : Type u_1
A : Type u_2
B : Type u_3
M✝ : Type u_4
N : Type u_5
inst✝⁷ : Semiring R
inst✝⁶ : AddCommMonoid M✝
inst✝⁵ : Module R M✝
inst✝⁴ : AddCommMonoid N
inst✝³ : Module R N
ι : Type u_6
M : ι → Type u_7
inst✝² : _root_.Finite ι
inst✝¹ : (i : ι) → AddCommMonoid (M i)
inst✝ : (i : ι) → Module R (M i)
h : ∀ (i : ι), Finite R (M i)
⊢ FG (Submodule.pi ?m.416535 fun i => ⊤)
R : Type u_1
A : Type u_2
B : Type u_3
M✝ : Type u_4
N : Type u_5
inst✝⁷ : Semiring R
inst✝⁶ : AddCommMonoid M✝
inst✝⁵ : Module R M✝
inst✝⁴ : AddCommMonoid N
inst✝³ : Module R N
ι : Type u_6
M : ι → Type u_7
inst✝² : _root_.Finite ι
inst✝¹ : (i : ι) → AddCommMonoid (M i)
inst✝ : (i : ι) → Module R (M i)
h : ∀ (i : ι), Finite R (M i)
⊢ Set ι
[PROOFSTEP]
exact Submodule.fg_pi fun i => (h i).1
[GOAL]
R✝ : Type u_1
A✝ : Type u_2
B : Type u_3
M✝ : Type u_4
N : Type u_5
inst✝¹¹ : Semiring R✝
inst✝¹⁰ : AddCommMonoid M✝
inst✝⁹ : Module R✝ M✝
inst✝⁸ : AddCommMonoid N
inst✝⁷ : Module R✝ N
R : Type u_6
A : Type u_7
M : Type u_8
inst✝⁶ : CommSemiring R
inst✝⁵ : Semiring A
inst✝⁴ : Algebra R A
inst✝³ : AddCommMonoid M
inst✝² : Module R M
inst✝¹ : Module A M
inst✝ : IsScalarTower R A M
s : Finset A
hs : span R ↑s = ⊤
t : Finset M
ht : span A ↑t = ⊤
⊢ span R (image2 (fun x x_1 => x • x_1) ↑s ↑t) = ⊤
[PROOFSTEP]
erw [Set.image2_smul, Submodule.span_smul_of_span_eq_top hs (↑t : Set M), ht, Submodule.restrictScalars_top]
[GOAL]
R : Type u_1
A : Type u_2
B : Type u_3
M : Type u_4
N : Type u_5
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Algebra R A
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
h : Finite R M
⊢ Finite A (TensorProduct R A M)
[PROOFSTEP]
classical
obtain ⟨s, hs⟩ := h.out
refine' ⟨⟨s.image (TensorProduct.mk R A M 1), eq_top_iff.mpr fun x _ => _⟩⟩
apply @TensorProduct.induction_on _ _ _ _ _ _ _ _ _ x
· exact zero_mem _
· intro x y
  haveI : IsScalarTower R A (TensorProduct R A M) := TensorProduct.isScalarTower_left
  rw [Finset.coe_image, ← Submodule.span_span_of_tower R, Submodule.span_image, hs, Submodule.map_top,
    LinearMap.range_coe]
  change _ ∈ Submodule.span A (Set.range <| TensorProduct.mk R A M 1)
  rw [← mul_one x, ← smul_eq_mul, ← TensorProduct.smul_tmul']
  exact Submodule.smul_mem _ x (Submodule.subset_span <| Set.mem_range_self y)
· exact fun _ _ => Submodule.add_mem _
[GOAL]
R : Type u_1
A : Type u_2
B : Type u_3
M : Type u_4
N : Type u_5
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Algebra R A
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
h : Finite R M
⊢ Finite A (TensorProduct R A M)
[PROOFSTEP]
obtain ⟨s, hs⟩ := h.out
[GOAL]
case intro
R : Type u_1
A : Type u_2
B : Type u_3
M : Type u_4
N : Type u_5
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Algebra R A
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
h : Finite R M
s : Finset M
hs : Submodule.span R ↑s = ⊤
⊢ Finite A (TensorProduct R A M)
[PROOFSTEP]
refine' ⟨⟨s.image (TensorProduct.mk R A M 1), eq_top_iff.mpr fun x _ => _⟩⟩
[GOAL]
case intro
R : Type u_1
A : Type u_2
B : Type u_3
M : Type u_4
N : Type u_5
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Algebra R A
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
h : Finite R M
s : Finset M
hs : Submodule.span R ↑s = ⊤
x : TensorProduct R A M
x✝ : x ∈ ⊤
⊢ x ∈ Submodule.span A ↑(Finset.image (↑(↑(TensorProduct.mk R A M) 1)) s)
[PROOFSTEP]
apply @TensorProduct.induction_on _ _ _ _ _ _ _ _ _ x
[GOAL]
case intro.zero
R : Type u_1
A : Type u_2
B : Type u_3
M : Type u_4
N : Type u_5
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Algebra R A
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
h : Finite R M
s : Finset M
hs : Submodule.span R ↑s = ⊤
x : TensorProduct R A M
x✝ : x ∈ ⊤
⊢ 0 ∈ Submodule.span A ↑(Finset.image (↑(↑(TensorProduct.mk R A M) 1)) s)
[PROOFSTEP]
exact zero_mem _
[GOAL]
case intro.tmul
R : Type u_1
A : Type u_2
B : Type u_3
M : Type u_4
N : Type u_5
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Algebra R A
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
h : Finite R M
s : Finset M
hs : Submodule.span R ↑s = ⊤
x : TensorProduct R A M
x✝ : x ∈ ⊤
⊢ ∀ (x : A) (y : M), x ⊗ₜ[R] y ∈ Submodule.span A ↑(Finset.image (↑(↑(TensorProduct.mk R A M) 1)) s)
[PROOFSTEP]
intro x y
[GOAL]
case intro.tmul
R : Type u_1
A : Type u_2
B : Type u_3
M : Type u_4
N : Type u_5
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Algebra R A
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
h : Finite R M
s : Finset M
hs : Submodule.span R ↑s = ⊤
x✝¹ : TensorProduct R A M
x✝ : x✝¹ ∈ ⊤
x : A
y : M
⊢ x ⊗ₜ[R] y ∈ Submodule.span A ↑(Finset.image (↑(↑(TensorProduct.mk R A M) 1)) s)
[PROOFSTEP]
haveI : IsScalarTower R A (TensorProduct R A M) := TensorProduct.isScalarTower_left
[GOAL]
case intro.tmul
R : Type u_1
A : Type u_2
B : Type u_3
M : Type u_4
N : Type u_5
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Algebra R A
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
h : Finite R M
s : Finset M
hs : Submodule.span R ↑s = ⊤
x✝¹ : TensorProduct R A M
x✝ : x✝¹ ∈ ⊤
x : A
y : M
this : IsScalarTower R A (TensorProduct R A M)
⊢ x ⊗ₜ[R] y ∈ Submodule.span A ↑(Finset.image (↑(↑(TensorProduct.mk R A M) 1)) s)
[PROOFSTEP]
rw [Finset.coe_image, ← Submodule.span_span_of_tower R, Submodule.span_image, hs, Submodule.map_top,
  LinearMap.range_coe]
[GOAL]
case intro.tmul
R : Type u_1
A : Type u_2
B : Type u_3
M : Type u_4
N : Type u_5
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Algebra R A
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
h : Finite R M
s : Finset M
hs : Submodule.span R ↑s = ⊤
x✝¹ : TensorProduct R A M
x✝ : x✝¹ ∈ ⊤
x : A
y : M
this : IsScalarTower R A (TensorProduct R A M)
⊢ x ⊗ₜ[R] y ∈ Submodule.span A (Set.range ↑(↑(TensorProduct.mk R A M) 1))
[PROOFSTEP]
change _ ∈ Submodule.span A (Set.range <| TensorProduct.mk R A M 1)
[GOAL]
case intro.tmul
R : Type u_1
A : Type u_2
B : Type u_3
M : Type u_4
N : Type u_5
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Algebra R A
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
h : Finite R M
s : Finset M
hs : Submodule.span R ↑s = ⊤
x✝¹ : TensorProduct R A M
x✝ : x✝¹ ∈ ⊤
x : A
y : M
this : IsScalarTower R A (TensorProduct R A M)
⊢ x ⊗ₜ[R] y ∈ Submodule.span A (Set.range ↑(↑(TensorProduct.mk R A M) 1))
[PROOFSTEP]
rw [← mul_one x, ← smul_eq_mul, ← TensorProduct.smul_tmul']
[GOAL]
case intro.tmul
R : Type u_1
A : Type u_2
B : Type u_3
M : Type u_4
N : Type u_5
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Algebra R A
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
h : Finite R M
s : Finset M
hs : Submodule.span R ↑s = ⊤
x✝¹ : TensorProduct R A M
x✝ : x✝¹ ∈ ⊤
x : A
y : M
this : IsScalarTower R A (TensorProduct R A M)
⊢ x • 1 ⊗ₜ[R] y ∈ Submodule.span A (Set.range ↑(↑(TensorProduct.mk R A M) 1))
[PROOFSTEP]
exact Submodule.smul_mem _ x (Submodule.subset_span <| Set.mem_range_self y)
[GOAL]
case intro.add
R : Type u_1
A : Type u_2
B : Type u_3
M : Type u_4
N : Type u_5
inst✝⁴ : CommSemiring R
inst✝³ : Semiring A
inst✝² : Algebra R A
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
h : Finite R M
s : Finset M
hs : Submodule.span R ↑s = ⊤
x : TensorProduct R A M
x✝ : x ∈ ⊤
⊢ ∀ (x y : TensorProduct R A M),
    x ∈ Submodule.span A ↑(Finset.image (↑(↑(TensorProduct.mk R A M) 1)) s) →
      y ∈ Submodule.span A ↑(Finset.image (↑(↑(TensorProduct.mk R A M) 1)) s) →
        x + y ∈ Submodule.span A ↑(Finset.image (↑(↑(TensorProduct.mk R A M) 1)) s)
[PROOFSTEP]
exact fun _ _ => Submodule.add_mem _
[GOAL]
A : Type u_1
B : Type u_2
C : Type u_3
inst✝² : CommRing A
inst✝¹ : CommRing B
inst✝ : CommRing C
g : B →+* C
f : A →+* B
hg : Finite g
hf : Finite f
⊢ Finite (RingHom.comp g f)
[PROOFSTEP]
letI := f.toAlgebra
[GOAL]
A : Type u_1
B : Type u_2
C : Type u_3
inst✝² : CommRing A
inst✝¹ : CommRing B
inst✝ : CommRing C
g : B →+* C
f : A →+* B
hg : Finite g
hf : Finite f
this : Algebra A B := toAlgebra f
⊢ Finite (RingHom.comp g f)
[PROOFSTEP]
letI := g.toAlgebra
[GOAL]
A : Type u_1
B : Type u_2
C : Type u_3
inst✝² : CommRing A
inst✝¹ : CommRing B
inst✝ : CommRing C
g : B →+* C
f : A →+* B
hg : Finite g
hf : Finite f
this✝ : Algebra A B := toAlgebra f
this : Algebra B C := toAlgebra g
⊢ Finite (RingHom.comp g f)
[PROOFSTEP]
letI := (g.comp f).toAlgebra
[GOAL]
A : Type u_1
B : Type u_2
C : Type u_3
inst✝² : CommRing A
inst✝¹ : CommRing B
inst✝ : CommRing C
g : B →+* C
f : A →+* B
hg : Finite g
hf : Finite f
this✝¹ : Algebra A B := toAlgebra f
this✝ : Algebra B C := toAlgebra g
this : Algebra A C := toAlgebra (RingHom.comp g f)
⊢ Finite (RingHom.comp g f)
[PROOFSTEP]
letI : IsScalarTower A B C := RestrictScalars.isScalarTower A B C
[GOAL]
A : Type u_1
B : Type u_2
C : Type u_3
inst✝² : CommRing A
inst✝¹ : CommRing B
inst✝ : CommRing C
g : B →+* C
f : A →+* B
hg : Finite g
hf : Finite f
this✝² : Algebra A B := toAlgebra f
this✝¹ : Algebra B C := toAlgebra g
this✝ : Algebra A C := toAlgebra (RingHom.comp g f)
this : IsScalarTower A B C := RestrictScalars.isScalarTower A B C
⊢ Finite (RingHom.comp g f)
[PROOFSTEP]
letI : Module.Finite A B := hf
[GOAL]
A : Type u_1
B : Type u_2
C : Type u_3
inst✝² : CommRing A
inst✝¹ : CommRing B
inst✝ : CommRing C
g : B →+* C
f : A →+* B
hg : Finite g
hf : Finite f
this✝³ : Algebra A B := toAlgebra f
this✝² : Algebra B C := toAlgebra g
this✝¹ : Algebra A C := toAlgebra (RingHom.comp g f)
this✝ : IsScalarTower A B C := RestrictScalars.isScalarTower A B C
this : Module.Finite A B := hf
⊢ Finite (RingHom.comp g f)
[PROOFSTEP]
letI : Module.Finite B C := hg
[GOAL]
A : Type u_1
B : Type u_2
C : Type u_3
inst✝² : CommRing A
inst✝¹ : CommRing B
inst✝ : CommRing C
g : B →+* C
f : A →+* B
hg : Finite g
hf : Finite f
this✝⁴ : Algebra A B := toAlgebra f
this✝³ : Algebra B C := toAlgebra g
this✝² : Algebra A C := toAlgebra (RingHom.comp g f)
this✝¹ : IsScalarTower A B C := RestrictScalars.isScalarTower A B C
this✝ : Module.Finite A B := hf
this : Module.Finite B C := hg
⊢ Finite (RingHom.comp g f)
[PROOFSTEP]
exact Module.Finite.trans B C
[GOAL]
A : Type u_1
B : Type u_2
C : Type u_3
inst✝² : CommRing A
inst✝¹ : CommRing B
inst✝ : CommRing C
f : A →+* B
g : B →+* C
h : Finite (RingHom.comp g f)
⊢ Finite g
[PROOFSTEP]
letI := f.toAlgebra
[GOAL]
A : Type u_1
B : Type u_2
C : Type u_3
inst✝² : CommRing A
inst✝¹ : CommRing B
inst✝ : CommRing C
f : A →+* B
g : B →+* C
h : Finite (RingHom.comp g f)
this : Algebra A B := toAlgebra f
⊢ Finite g
[PROOFSTEP]
letI := g.toAlgebra
[GOAL]
A : Type u_1
B : Type u_2
C : Type u_3
inst✝² : CommRing A
inst✝¹ : CommRing B
inst✝ : CommRing C
f : A →+* B
g : B →+* C
h : Finite (RingHom.comp g f)
this✝ : Algebra A B := toAlgebra f
this : Algebra B C := toAlgebra g
⊢ Finite g
[PROOFSTEP]
letI := (g.comp f).toAlgebra
[GOAL]
A : Type u_1
B : Type u_2
C : Type u_3
inst✝² : CommRing A
inst✝¹ : CommRing B
inst✝ : CommRing C
f : A →+* B
g : B →+* C
h : Finite (RingHom.comp g f)
this✝¹ : Algebra A B := toAlgebra f
this✝ : Algebra B C := toAlgebra g
this : Algebra A C := toAlgebra (RingHom.comp g f)
⊢ Finite g
[PROOFSTEP]
letI : IsScalarTower A B C := RestrictScalars.isScalarTower A B C
[GOAL]
A : Type u_1
B : Type u_2
C : Type u_3
inst✝² : CommRing A
inst✝¹ : CommRing B
inst✝ : CommRing C
f : A →+* B
g : B →+* C
h : Finite (RingHom.comp g f)
this✝² : Algebra A B := toAlgebra f
this✝¹ : Algebra B C := toAlgebra g
this✝ : Algebra A C := toAlgebra (RingHom.comp g f)
this : IsScalarTower A B C := RestrictScalars.isScalarTower A B C
⊢ Finite g
[PROOFSTEP]
letI : Module.Finite A C := h
[GOAL]
A : Type u_1
B : Type u_2
C : Type u_3
inst✝² : CommRing A
inst✝¹ : CommRing B
inst✝ : CommRing C
f : A →+* B
g : B →+* C
h : Finite (RingHom.comp g f)
this✝³ : Algebra A B := toAlgebra f
this✝² : Algebra B C := toAlgebra g
this✝¹ : Algebra A C := toAlgebra (RingHom.comp g f)
this✝ : IsScalarTower A B C := RestrictScalars.isScalarTower A B C
this : Module.Finite A C := h
⊢ Finite g
[PROOFSTEP]
exact Module.Finite.of_restrictScalars_finite A B C
