Theorem: rank_quotient_eq_of_le_torsion
File: Mathlib/LinearAlgebra/Dimension/Constructions.lean

Proof steps:
state_before: R✝ S : Type u
M✝ : Type v
M'✝ : Type v'
M₁ : Type v
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : Ring R✝
inst✝⁹ : CommRing S
inst✝⁸ : AddCommGroup M✝
inst✝⁷ : AddCommGroup M'✝
inst✝⁶ : AddCommGroup M₁
inst✝⁵ : Module R✝ M✝
inst✝⁴ : Module R✝ M'✝
inst✝³ : Module R✝ M₁
R : Type u_2
M : Type u_3
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
M' : Submodule R M
hN : M' ≤ torsion R M
⊢ Module.rank R M ≤ Module.rank R (M ⧸ M')
state_after: R✝ S : Type u
M✝ : Type v
M'✝ : Type v'
M₁ : Type v
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : Ring R✝
inst✝⁹ : CommRing S
inst✝⁸ : AddCommGroup M✝
inst✝⁷ : AddCommGroup M'✝
inst✝⁶ : AddCommGroup M₁
inst✝⁵ : Module R✝ M✝
inst✝⁴ : Module R✝ M'✝
inst✝³ : Module R✝ M₁
R : Type u_2
M : Type u_3
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
M' : Submodule R M
hN : M' ≤ torsion R M
a✝ : Nontrivial R
⊢ Module.rank R M ≤ Module.rank R (M ⧸ M')
tactic: nontriviality R
state_before: R✝ S : Type u
M✝ : Type v
M'✝ : Type v'
M₁ : Type v
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : Ring R✝
inst✝⁹ : CommRing S
inst✝⁸ : AddCommGroup M✝
inst✝⁷ : AddCommGroup M'✝
inst✝⁶ : AddCommGroup M₁
inst✝⁵ : Module R✝ M✝
inst✝⁴ : Module R✝ M'✝
inst✝³ : Module R✝ M₁
R : Type u_2
M : Type u_3
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
M' : Submodule R M
hN : M' ≤ torsion R M
a✝ : Nontrivial R
⊢ Module.rank R M ≤ Module.rank R (M ⧸ M')
state_after: R✝ S : Type u
M✝ : Type v
M'✝ : Type v'
M₁ : Type v
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : Ring R✝
inst✝⁹ : CommRing S
inst✝⁸ : AddCommGroup M✝
inst✝⁷ : AddCommGroup M'✝
inst✝⁶ : AddCommGroup M₁
inst✝⁵ : Module R✝ M✝
inst✝⁴ : Module R✝ M'✝
inst✝³ : Module R✝ M₁
R : Type u_2
M : Type u_3
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
M' : Submodule R M
hN : M' ≤ torsion R M
a✝ : Nontrivial R
⊢ ⨆ ι, #↑↑ι ≤ Module.rank R (M ⧸ M')
tactic: rw [Module.rank]
state_before: R✝ S : Type u
M✝ : Type v
M'✝ : Type v'
M₁ : Type v
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : Ring R✝
inst✝⁹ : CommRing S
inst✝⁸ : AddCommGroup M✝
inst✝⁷ : AddCommGroup M'✝
inst✝⁶ : AddCommGroup M₁
inst✝⁵ : Module R✝ M✝
inst✝⁴ : Module R✝ M'✝
inst✝³ : Module R✝ M₁
R : Type u_2
M : Type u_3
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
M' : Submodule R M
hN : M' ≤ torsion R M
a✝ : Nontrivial R
⊢ ⨆ ι, #↑↑ι ≤ Module.rank R (M ⧸ M')
state_after: R✝ S : Type u
M✝ : Type v
M'✝ : Type v'
M₁ : Type v
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : Ring R✝
inst✝⁹ : CommRing S
inst✝⁸ : AddCommGroup M✝
inst✝⁷ : AddCommGroup M'✝
inst✝⁶ : AddCommGroup M₁
inst✝⁵ : Module R✝ M✝
inst✝⁴ : Module R✝ M'✝
inst✝³ : Module R✝ M₁
R : Type u_2
M : Type u_3
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
M' : Submodule R M
hN : M' ≤ torsion R M
a✝ : Nontrivial R
this : Nonempty { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
⊢ ⨆ ι, #↑↑ι ≤ Module.rank R (M ⧸ M')
tactic: have := nonempty_linearIndependent_set R M
state_before: R✝ S : Type u
M✝ : Type v
M'✝ : Type v'
M₁ : Type v
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : Ring R✝
inst✝⁹ : CommRing S
inst✝⁸ : AddCommGroup M✝
inst✝⁷ : AddCommGroup M'✝
inst✝⁶ : AddCommGroup M₁
inst✝⁵ : Module R✝ M✝
inst✝⁴ : Module R✝ M'✝
inst✝³ : Module R✝ M₁
R : Type u_2
M : Type u_3
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
M' : Submodule R M
hN : M' ≤ torsion R M
a✝ : Nontrivial R
this : Nonempty { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
x✝ : { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
s : Set M
hs : LinearIndependent (ι := { x // x ∈ s }) R Subtype.val
⊢ LinearIndependent R fun (x : ↑↑⟨s, hs⟩) => M'.mkQ ↑x
state_after: R✝ S : Type u
M✝ : Type v
M'✝ : Type v'
M₁ : Type v
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : Ring R✝
inst✝⁹ : CommRing S
inst✝⁸ : AddCommGroup M✝
inst✝⁷ : AddCommGroup M'✝
inst✝⁶ : AddCommGroup M₁
inst✝⁵ : Module R✝ M✝
inst✝⁴ : Module R✝ M'✝
inst✝³ : Module R✝ M₁
R : Type u_2
M : Type u_3
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
M' : Submodule R M
hN : M' ≤ torsion R M
a✝ : Nontrivial R
this : Nonempty { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
x✝ : { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
s : Set M
hs✝ : LinearIndependent (ι := { x // x ∈ s }) R Subtype.val
hs : ∀ (s_1 : Finset { x // x ∈ s }) (g : { x // x ∈ s } → R), ∑ i ∈ s_1, g i • ↑i = 0 → ∀ i ∈ s_1, g i = 0
⊢ ∀ (s_1 : Finset ↑↑⟨s, hs✝⟩) (g : ↑↑⟨s, hs✝⟩ → R), ∑ i ∈ s_1, g i • M'.mkQ ↑i = 0 → ∀ i ∈ s_1, g i = 0
tactic: rw [linearIndependent_iff'] at hs ⊢
state_before: R✝ S : Type u
M✝ : Type v
M'✝ : Type v'
M₁ : Type v
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : Ring R✝
inst✝⁹ : CommRing S
inst✝⁸ : AddCommGroup M✝
inst✝⁷ : AddCommGroup M'✝
inst✝⁶ : AddCommGroup M₁
inst✝⁵ : Module R✝ M✝
inst✝⁴ : Module R✝ M'✝
inst✝³ : Module R✝ M₁
R : Type u_2
M : Type u_3
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
M' : Submodule R M
hN : M' ≤ torsion R M
a✝ : Nontrivial R
this : Nonempty { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
x✝ : { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
s : Set M
hs✝ : LinearIndependent (ι := { x // x ∈ s }) R Subtype.val
hs : ∀ (s_1 : Finset { x // x ∈ s }) (g : { x // x ∈ s } → R), ∑ i ∈ s_1, g i • ↑i = 0 → ∀ i ∈ s_1, g i = 0
⊢ ∀ (s_1 : Finset ↑↑⟨s, hs✝⟩) (g : ↑↑⟨s, hs✝⟩ → R), ∑ i ∈ s_1, g i • M'.mkQ ↑i = 0 → ∀ i ∈ s_1, g i = 0
state_after: R✝ S : Type u
M✝ : Type v
M'✝ : Type v'
M₁ : Type v
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : Ring R✝
inst✝⁹ : CommRing S
inst✝⁸ : AddCommGroup M✝
inst✝⁷ : AddCommGroup M'✝
inst✝⁶ : AddCommGroup M₁
inst✝⁵ : Module R✝ M✝
inst✝⁴ : Module R✝ M'✝
inst✝³ : Module R✝ M₁
R : Type u_2
M : Type u_3
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
M' : Submodule R M
hN : M' ≤ torsion R M
a✝ : Nontrivial R
this : Nonempty { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
x✝ : { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
s : Set M
hs✝ : LinearIndependent (ι := { x // x ∈ s }) R Subtype.val
hs : ∀ (s_1 : Finset { x // x ∈ s }) (g : { x // x ∈ s } → R), ∑ i ∈ s_1, g i • ↑i = 0 → ∀ i ∈ s_1, g i = 0
⊢ ∀ (s_1 : Finset ↑s) (g : ↑s → R), ∑ x ∈ s_1, g x • ↑x ∈ M' → ∀ i ∈ s_1, g i = 0
tactic: simp_rw [← map_smul, ← map_sum, mkQ_apply, Quotient.mk_eq_zero]
state_before: R✝ S : Type u
M✝ : Type v
M'✝ : Type v'
M₁ : Type v
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : Ring R✝
inst✝⁹ : CommRing S
inst✝⁸ : AddCommGroup M✝
inst✝⁷ : AddCommGroup M'✝
inst✝⁶ : AddCommGroup M₁
inst✝⁵ : Module R✝ M✝
inst✝⁴ : Module R✝ M'✝
inst✝³ : Module R✝ M₁
R : Type u_2
M : Type u_3
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
M' : Submodule R M
hN : M' ≤ torsion R M
a✝ : Nontrivial R
this : Nonempty { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
x✝ : { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
s : Set M
hs✝ : LinearIndependent (ι := { x // x ∈ s }) R Subtype.val
hs : ∀ (s_1 : Finset { x // x ∈ s }) (g : { x // x ∈ s } → R), ∑ i ∈ s_1, g i • ↑i = 0 → ∀ i ∈ s_1, g i = 0
⊢ ∀ (s_1 : Finset ↑s) (g : ↑s → R), ∑ x ∈ s_1, g x • ↑x ∈ M' → ∀ i ∈ s_1, g i = 0
state_after: R✝ S : Type u
M✝ : Type v
M'✝ : Type v'
M₁ : Type v
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : Ring R✝
inst✝⁹ : CommRing S
inst✝⁸ : AddCommGroup M✝
inst✝⁷ : AddCommGroup M'✝
inst✝⁶ : AddCommGroup M₁
inst✝⁵ : Module R✝ M✝
inst✝⁴ : Module R✝ M'✝
inst✝³ : Module R✝ M₁
R : Type u_2
M : Type u_3
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
M' : Submodule R M
hN : M' ≤ torsion R M
a✝ : Nontrivial R
this : Nonempty { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
x✝ : { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
s : Set M
hs✝ : LinearIndependent (ι := { x // x ∈ s }) R Subtype.val
hs : ∀ (s_1 : Finset { x // x ∈ s }) (g : { x // x ∈ s } → R), ∑ i ∈ s_1, g i • ↑i = 0 → ∀ i ∈ s_1, g i = 0
t : Finset ↑s
g : ↑s → R
hg : ∑ x ∈ t, g x • ↑x ∈ M'
i : ↑s
hi : i ∈ t
⊢ g i = 0
tactic: intro t g hg i hi
state_before: R✝ S : Type u
M✝ : Type v
M'✝ : Type v'
M₁ : Type v
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : Ring R✝
inst✝⁹ : CommRing S
inst✝⁸ : AddCommGroup M✝
inst✝⁷ : AddCommGroup M'✝
inst✝⁶ : AddCommGroup M₁
inst✝⁵ : Module R✝ M✝
inst✝⁴ : Module R✝ M'✝
inst✝³ : Module R✝ M₁
R : Type u_2
M : Type u_3
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
M' : Submodule R M
hN : M' ≤ torsion R M
a✝ : Nontrivial R
this : Nonempty { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
x✝ : { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
s : Set M
hs✝ : LinearIndependent (ι := { x // x ∈ s }) R Subtype.val
hs : ∀ (s_1 : Finset { x // x ∈ s }) (g : { x // x ∈ s } → R), ∑ i ∈ s_1, g i • ↑i = 0 → ∀ i ∈ s_1, g i = 0
t : Finset ↑s
g : ↑s → R
hg : ∑ x ∈ t, g x • ↑x ∈ M'
i : ↑s
hi : i ∈ t
⊢ g i = 0
state_after: case intro
R✝ S : Type u
M✝ : Type v
M'✝ : Type v'
M₁ : Type v
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : Ring R✝
inst✝⁹ : CommRing S
inst✝⁸ : AddCommGroup M✝
inst✝⁷ : AddCommGroup M'✝
inst✝⁶ : AddCommGroup M₁
inst✝⁵ : Module R✝ M✝
inst✝⁴ : Module R✝ M'✝
inst✝³ : Module R✝ M₁
R : Type u_2
M : Type u_3
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
M' : Submodule R M
hN : M' ≤ torsion R M
a✝ : Nontrivial R
this : Nonempty { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
x✝ : { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
s : Set M
hs✝ : LinearIndependent (ι := { x // x ∈ s }) R Subtype.val
hs : ∀ (s_1 : Finset { x // x ∈ s }) (g : { x // x ∈ s } → R), ∑ i ∈ s_1, g i • ↑i = 0 → ∀ i ∈ s_1, g i = 0
t : Finset ↑s
g : ↑s → R
hg✝ : ∑ x ∈ t, g x • ↑x ∈ M'
i : ↑s
hi : i ∈ t
r : ↥(nonZeroDivisors R)
hg : r • ∑ x ∈ t, g x • ↑x = 0
⊢ g i = 0
tactic: obtain ⟨r, hg⟩ := hN hg
state_before: case intro
R✝ S : Type u
M✝ : Type v
M'✝ : Type v'
M₁ : Type v
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : Ring R✝
inst✝⁹ : CommRing S
inst✝⁸ : AddCommGroup M✝
inst✝⁷ : AddCommGroup M'✝
inst✝⁶ : AddCommGroup M₁
inst✝⁵ : Module R✝ M✝
inst✝⁴ : Module R✝ M'✝
inst✝³ : Module R✝ M₁
R : Type u_2
M : Type u_3
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
M' : Submodule R M
hN : M' ≤ torsion R M
a✝ : Nontrivial R
this : Nonempty { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
x✝ : { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
s : Set M
hs✝ : LinearIndependent (ι := { x // x ∈ s }) R Subtype.val
hs : ∀ (s_1 : Finset { x // x ∈ s }) (g : { x // x ∈ s } → R), ∑ i ∈ s_1, g i • ↑i = 0 → ∀ i ∈ s_1, g i = 0
t : Finset ↑s
g : ↑s → R
hg✝ : ∑ x ∈ t, g x • ↑x ∈ M'
i : ↑s
hi : i ∈ t
r : ↥(nonZeroDivisors R)
hg : r • ∑ x ∈ t, g x • ↑x = 0
⊢ g i = 0
state_after: case intro
R✝ S : Type u
M✝ : Type v
M'✝ : Type v'
M₁ : Type v
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : Ring R✝
inst✝⁹ : CommRing S
inst✝⁸ : AddCommGroup M✝
inst✝⁷ : AddCommGroup M'✝
inst✝⁶ : AddCommGroup M₁
inst✝⁵ : Module R✝ M✝
inst✝⁴ : Module R✝ M'✝
inst✝³ : Module R✝ M₁
R : Type u_2
M : Type u_3
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
M' : Submodule R M
hN : M' ≤ torsion R M
a✝ : Nontrivial R
this : Nonempty { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
x✝ : { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
s : Set M
hs✝ : LinearIndependent (ι := { x // x ∈ s }) R Subtype.val
hs : ∀ (s_1 : Finset { x // x ∈ s }) (g : { x // x ∈ s } → R), ∑ i ∈ s_1, g i • ↑i = 0 → ∀ i ∈ s_1, g i = 0
t : Finset ↑s
g : ↑s → R
hg✝ : ∑ x ∈ t, g x • ↑x ∈ M'
i : ↑s
hi : i ∈ t
r : ↥(nonZeroDivisors R)
hg : ∑ x ∈ t, (↑r * g x) • ↑x = 0
⊢ g i = 0
tactic: simp_rw [Finset.smul_sum, Submonoid.smul_def, smul_smul] at hg
state_before: case intro
R✝ S : Type u
M✝ : Type v
M'✝ : Type v'
M₁ : Type v
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : Ring R✝
inst✝⁹ : CommRing S
inst✝⁸ : AddCommGroup M✝
inst✝⁷ : AddCommGroup M'✝
inst✝⁶ : AddCommGroup M₁
inst✝⁵ : Module R✝ M✝
inst✝⁴ : Module R✝ M'✝
inst✝³ : Module R✝ M₁
R : Type u_2
M : Type u_3
inst✝² : CommRing R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
M' : Submodule R M
hN : M' ≤ torsion R M
a✝ : Nontrivial R
this : Nonempty { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
x✝ : { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
s : Set M
hs✝ : LinearIndependent (ι := { x // x ∈ s }) R Subtype.val
hs : ∀ (s_1 : Finset { x // x ∈ s }) (g : { x // x ∈ s } → R), ∑ i ∈ s_1, g i • ↑i = 0 → ∀ i ∈ s_1, g i = 0
t : Finset ↑s
g : ↑s → R
hg✝ : ∑ x ∈ t, g x • ↑x ∈ M'
i : ↑s
hi : i ∈ t
r : ↥(nonZeroDivisors R)
hg : ∑ x ∈ t, (↑r * g x) • ↑x = 0
⊢ g i = 0
state_after: no goals
tactic: exact r.prop _ (mul_comm (g i) r ▸ hs t _ hg i hi)