Theorem: CompleteLattice.Independent.subtype_ne_bot_le_rank
File: Mathlib/LinearAlgebra/Dimension/Finite.lean

tactic: set I := { i : ι // V i ≠ ⊥ }
state_before: R : Type u
M M₁ : Type v
M' : Type v'
ι : Type w
inst✝¹⁰ : Ring R
inst✝⁹ : AddCommGroup M
inst✝⁸ : AddCommGroup M'
inst✝⁷ : AddCommGroup M₁
inst✝⁶ : Module R M
inst✝⁵ : Module R M'
inst✝⁴ : Module R M₁
inst✝³ : StrongRankCondition R
inst✝² : Module.Finite R M
inst✝¹ : NoZeroSMulDivisors R M
inst✝ : Nontrivial R
V : ι → Submodule R M
hV : Independent V
⊢ lift.{v, w} #{ i // V i ≠ ⊥ } ≤ lift.{w, v} (Module.rank R M)
state_after: R : Type u
M M₁ : Type v
M' : Type v'
ι : Type w
inst✝¹⁰ : Ring R
inst✝⁹ : AddCommGroup M
inst✝⁸ : AddCommGroup M'
inst✝⁷ : AddCommGroup M₁
inst✝⁶ : Module R M
inst✝⁵ : Module R M'
inst✝⁴ : Module R M₁
inst✝³ : StrongRankCondition R
inst✝² : Module.Finite R M
inst✝¹ : NoZeroSMulDivisors R M
inst✝ : Nontrivial R
V : ι → Submodule R M
hV : Independent V
I : Type w := { i // V i ≠ ⊥ }
⊢ lift.{v, w} #I ≤ lift.{w, v} (Module.rank R M)

tactic: have hI : ∀ i : I, ∃ v ∈ V i, v ≠ (0 : M) := by
  intro i
  rw [← Submodule.ne_bot_iff]
  exact i.prop
state_before: R : Type u
M M₁ : Type v
M' : Type v'
ι : Type w
inst✝¹⁰ : Ring R
inst✝⁹ : AddCommGroup M
inst✝⁸ : AddCommGroup M'
inst✝⁷ : AddCommGroup M₁
inst✝⁶ : Module R M
inst✝⁵ : Module R M'
inst✝⁴ : Module R M₁
inst✝³ : StrongRankCondition R
inst✝² : Module.Finite R M
inst✝¹ : NoZeroSMulDivisors R M
inst✝ : Nontrivial R
V : ι → Submodule R M
hV : Independent V
I : Type w := { i // V i ≠ ⊥ }
⊢ lift.{v, w} #I ≤ lift.{w, v} (Module.rank R M)
state_after: R : Type u
M M₁ : Type v
M' : Type v'
ι : Type w
inst✝¹⁰ : Ring R
inst✝⁹ : AddCommGroup M
inst✝⁸ : AddCommGroup M'
inst✝⁷ : AddCommGroup M₁
inst✝⁶ : Module R M
inst✝⁵ : Module R M'
inst✝⁴ : Module R M₁
inst✝³ : StrongRankCondition R
inst✝² : Module.Finite R M
inst✝¹ : NoZeroSMulDivisors R M
inst✝ : Nontrivial R
V : ι → Submodule R M
hV : Independent V
I : Type w := { i // V i ≠ ⊥ }
hI : ∀ (i : I), ∃ v ∈ V ↑i, v ≠ 0
⊢ lift.{v, w} #I ≤ lift.{w, v} (Module.rank R M)

tactic: choose v hvV hv using hI
state_before: R : Type u
M M₁ : Type v
M' : Type v'
ι : Type w
inst✝¹⁰ : Ring R
inst✝⁹ : AddCommGroup M
inst✝⁸ : AddCommGroup M'
inst✝⁷ : AddCommGroup M₁
inst✝⁶ : Module R M
inst✝⁵ : Module R M'
inst✝⁴ : Module R M₁
inst✝³ : StrongRankCondition R
inst✝² : Module.Finite R M
inst✝¹ : NoZeroSMulDivisors R M
inst✝ : Nontrivial R
V : ι → Submodule R M
hV : Independent V
I : Type w := { i // V i ≠ ⊥ }
hI : ∀ (i : I), ∃ v ∈ V ↑i, v ≠ 0
⊢ lift.{v, w} #I ≤ lift.{w, v} (Module.rank R M)
state_after: R : Type u
M M₁ : Type v
M' : Type v'
ι : Type w
inst✝¹⁰ : Ring R
inst✝⁹ : AddCommGroup M
inst✝⁸ : AddCommGroup M'
inst✝⁷ : AddCommGroup M₁
inst✝⁶ : Module R M
inst✝⁵ : Module R M'
inst✝⁴ : Module R M₁
inst✝³ : StrongRankCondition R
inst✝² : Module.Finite R M
inst✝¹ : NoZeroSMulDivisors R M
inst✝ : Nontrivial R
V : ι → Submodule R M
hV : Independent V
I : Type w := { i // V i ≠ ⊥ }
v : I → M
hvV : ∀ (i : I), v i ∈ V ↑i
hv : ∀ (i : I), v i ≠ 0
⊢ lift.{v, w} #I ≤ lift.{w, v} (Module.rank R M)

tactic: have : LinearIndependent R v := (hV.comp Subtype.coe_injective).linearIndependent _ hvV hv
state_before: R : Type u
M M₁ : Type v
M' : Type v'
ι : Type w
inst✝¹⁰ : Ring R
inst✝⁹ : AddCommGroup M
inst✝⁸ : AddCommGroup M'
inst✝⁷ : AddCommGroup M₁
inst✝⁶ : Module R M
inst✝⁵ : Module R M'
inst✝⁴ : Module R M₁
inst✝³ : StrongRankCondition R
inst✝² : Module.Finite R M
inst✝¹ : NoZeroSMulDivisors R M
inst✝ : Nontrivial R
V : ι → Submodule R M
hV : Independent V
I : Type w := { i // V i ≠ ⊥ }
v : I → M
hvV : ∀ (i : I), v i ∈ V ↑i
hv : ∀ (i : I), v i ≠ 0
⊢ lift.{v, w} #I ≤ lift.{w, v} (Module.rank R M)
state_after: R : Type u
M M₁ : Type v
M' : Type v'
ι : Type w
inst✝¹⁰ : Ring R
inst✝⁹ : AddCommGroup M
inst✝⁸ : AddCommGroup M'
inst✝⁷ : AddCommGroup M₁
inst✝⁶ : Module R M
inst✝⁵ : Module R M'
inst✝⁴ : Module R M₁
inst✝³ : StrongRankCondition R
inst✝² : Module.Finite R M
inst✝¹ : NoZeroSMulDivisors R M
inst✝ : Nontrivial R
V : ι → Submodule R M
hV : Independent V
I : Type w := { i // V i ≠ ⊥ }
v : I → M
hvV : ∀ (i : I), v i ∈ V ↑i
hv : ∀ (i : I), v i ≠ 0
this : LinearIndependent R v
⊢ lift.{v, w} #I ≤ lift.{w, v} (Module.rank R M)

tactic: exact this.cardinal_lift_le_rank
state_before: R : Type u
M M₁ : Type v
M' : Type v'
ι : Type w
inst✝¹⁰ : Ring R
inst✝⁹ : AddCommGroup M
inst✝⁸ : AddCommGroup M'
inst✝⁷ : AddCommGroup M₁
inst✝⁶ : Module R M
inst✝⁵ : Module R M'
inst✝⁴ : Module R M₁
inst✝³ : StrongRankCondition R
inst✝² : Module.Finite R M
inst✝¹ : NoZeroSMulDivisors R M
inst✝ : Nontrivial R
V : ι → Submodule R M
hV : Independent V
I : Type w := { i // V i ≠ ⊥ }
v : I → M
hvV : ∀ (i : I), v i ∈ V ↑i
hv : ∀ (i : I), v i ≠ 0
this : LinearIndependent R v
⊢ lift.{v, w} #I ≤ lift.{w, v} (Module.rank R M)
state_after: no goals

tactic: intro i
state_before: R : Type u
M M₁ : Type v
M' : Type v'
ι : Type w
inst✝¹⁰ : Ring R
inst✝⁹ : AddCommGroup M
inst✝⁸ : AddCommGroup M'
inst✝⁷ : AddCommGroup M₁
inst✝⁶ : Module R M
inst✝⁵ : Module R M'
inst✝⁴ : Module R M₁
inst✝³ : StrongRankCondition R
inst✝² : Module.Finite R M
inst✝¹ : NoZeroSMulDivisors R M
inst✝ : Nontrivial R
V : ι → Submodule R M
hV : Independent V
I : Type w := { i // V i ≠ ⊥ }
⊢ ∀ (i : I), ∃ v ∈ V ↑i, v ≠ 0
state_after: R : Type u
M M₁ : Type v
M' : Type v'
ι : Type w
inst✝¹⁰ : Ring R
inst✝⁹ : AddCommGroup M
inst✝⁸ : AddCommGroup M'
inst✝⁷ : AddCommGroup M₁
inst✝⁶ : Module R M
inst✝⁵ : Module R M'
inst✝⁴ : Module R M₁
inst✝³ : StrongRankCondition R
inst✝² : Module.Finite R M
inst✝¹ : NoZeroSMulDivisors R M
inst✝ : Nontrivial R
V : ι → Submodule R M
hV : Independent V
I : Type w := { i // V i ≠ ⊥ }
i : I
⊢ ∃ v ∈ V ↑i, v ≠ 0

tactic: rw [← Submodule.ne_bot_iff]
state_before: R : Type u
M M₁ : Type v
M' : Type v'
ι : Type w
inst✝¹⁰ : Ring R
inst✝⁹ : AddCommGroup M
inst✝⁸ : AddCommGroup M'
inst✝⁷ : AddCommGroup M₁
inst✝⁶ : Module R M
inst✝⁵ : Module R M'
inst✝⁴ : Module R M₁
inst✝³ : StrongRankCondition R
inst✝² : Module.Finite R M
inst✝¹ : NoZeroSMulDivisors R M
inst✝ : Nontrivial R
V : ι → Submodule R M
hV : Independent V
I : Type w := { i // V i ≠ ⊥ }
i : I
⊢ ∃ v ∈ V ↑i, v ≠ 0
state_after: R : Type u
M M₁ : Type v
M' : Type v'
ι : Type w
inst✝¹⁰ : Ring R
inst✝⁹ : AddCommGroup M
inst✝⁸ : AddCommGroup M'
inst✝⁷ : AddCommGroup M₁
inst✝⁶ : Module R M
inst✝⁵ : Module R M'
inst✝⁴ : Module R M₁
inst✝³ : StrongRankCondition R
inst✝² : Module.Finite R M
inst✝¹ : NoZeroSMulDivisors R M
inst✝ : Nontrivial R
V : ι → Submodule R M
hV : Independent V
I : Type w := { i // V i ≠ ⊥ }
i : I
⊢ V ↑i ≠ ⊥

tactic: exact i.prop
state_before: R : Type u
M M₁ : Type v
M' : Type v'
ι : Type w
inst✝¹⁰ : Ring R
inst✝⁹ : AddCommGroup M
inst✝⁸ : AddCommGroup M'
inst✝⁷ : AddCommGroup M₁
inst✝⁶ : Module R M
inst✝⁵ : Module R M'
inst✝⁴ : Module R M₁
inst✝³ : StrongRankCondition R
inst✝² : Module.Finite R M
inst✝¹ : NoZeroSMulDivisors R M
inst✝ : Nontrivial R
V : ι → Submodule R M
hV : Independent V
I : Type w := { i // V i ≠ ⊥ }
i : I
⊢ V ↑i ≠ ⊥
state_after: no goals