Theorem: exists_linearIndependent_cons_of_lt_rank
File: Mathlib/LinearAlgebra/Dimension/RankNullity.lean

tactic: obtain ⟨t, h₁, h₂, h₃⟩ := exists_linearIndependent_of_lt_rank hv.to_subtype_range
state_before: R : Type u_1
M M₁ M₂ M₃ : Type u
M' : Type v
inst✝¹² : Ring R
inst✝¹¹ : AddCommGroup M
inst✝¹⁰ : AddCommGroup M₁
inst✝⁹ : AddCommGroup M₂
inst✝⁸ : AddCommGroup M₃
inst✝⁷ : AddCommGroup M'
inst✝⁶ : Module R M
inst✝⁵ : Module R M₁
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
inst✝¹ : HasRankNullity.{u, u_1} R
inst✝ : StrongRankCondition R
n : ℕ
v : Fin n → M
hv : LinearIndependent R v
h : ↑n < Module.rank R M
⊢ ∃ x, LinearIndependent R (Fin.cons x v)
state_after: case intro.intro.intro
R : Type u_1
M M₁ M₂ M₃ : Type u
M' : Type v
inst✝¹² : Ring R
inst✝¹¹ : AddCommGroup M
inst✝¹⁰ : AddCommGroup M₁
inst✝⁹ : AddCommGroup M₂
inst✝⁸ : AddCommGroup M₃
inst✝⁷ : AddCommGroup M'
inst✝⁶ : Module R M
inst✝⁵ : Module R M₁
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
inst✝¹ : HasRankNullity.{u, u_1} R
inst✝ : StrongRankCondition R
n : ℕ
v : Fin n → M
hv : LinearIndependent R v
h : ↑n < Module.rank R M
t : Set M
h₁ : range v ⊆ t
h₂ : #↑t = Module.rank R M
h₃ : LinearIndependent (ι := ↑t) R Subtype.val
⊢ ∃ x, LinearIndependent R (Fin.cons x v)

tactic: have : range v ≠ t := by
  refine fun e ↦ h.ne ?_
  rw [← e, ← lift_injective.eq_iff, mk_range_eq_of_injective hv.injective] at h₂
  simpa only [mk_fintype, Fintype.card_fin, lift_natCast, lift_id'] using h₂
state_before: case intro.intro.intro
R : Type u_1
M M₁ M₂ M₃ : Type u
M' : Type v
inst✝¹² : Ring R
inst✝¹¹ : AddCommGroup M
inst✝¹⁰ : AddCommGroup M₁
inst✝⁹ : AddCommGroup M₂
inst✝⁸ : AddCommGroup M₃
inst✝⁷ : AddCommGroup M'
inst✝⁶ : Module R M
inst✝⁵ : Module R M₁
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
inst✝¹ : HasRankNullity.{u, u_1} R
inst✝ : StrongRankCondition R
n : ℕ
v : Fin n → M
hv : LinearIndependent R v
h : ↑n < Module.rank R M
t : Set M
h₁ : range v ⊆ t
h₂ : #↑t = Module.rank R M
h₃ : LinearIndependent (ι := ↑t) R Subtype.val
⊢ ∃ x, LinearIndependent R (Fin.cons x v)
state_after: case intro.intro.intro
R : Type u_1
M M₁ M₂ M₃ : Type u
M' : Type v
inst✝¹² : Ring R
inst✝¹¹ : AddCommGroup M
inst✝¹⁰ : AddCommGroup M₁
inst✝⁹ : AddCommGroup M₂
inst✝⁸ : AddCommGroup M₃
inst✝⁷ : AddCommGroup M'
inst✝⁶ : Module R M
inst✝⁵ : Module R M₁
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
inst✝¹ : HasRankNullity.{u, u_1} R
inst✝ : StrongRankCondition R
n : ℕ
v : Fin n → M
hv : LinearIndependent R v
h : ↑n < Module.rank R M
t : Set M
h₁ : range v ⊆ t
h₂ : #↑t = Module.rank R M
h₃ : LinearIndependent (ι := ↑t) R Subtype.val
this : range v ≠ t
⊢ ∃ x, LinearIndependent R (Fin.cons x v)

tactic: obtain ⟨x, hx, hx'⟩ := nonempty_of_ssubset (h₁.ssubset_of_ne this)
state_before: case intro.intro.intro
R : Type u_1
M M₁ M₂ M₃ : Type u
M' : Type v
inst✝¹² : Ring R
inst✝¹¹ : AddCommGroup M
inst✝¹⁰ : AddCommGroup M₁
inst✝⁹ : AddCommGroup M₂
inst✝⁸ : AddCommGroup M₃
inst✝⁷ : AddCommGroup M'
inst✝⁶ : Module R M
inst✝⁵ : Module R M₁
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
inst✝¹ : HasRankNullity.{u, u_1} R
inst✝ : StrongRankCondition R
n : ℕ
v : Fin n → M
hv : LinearIndependent R v
h : ↑n < Module.rank R M
t : Set M
h₁ : range v ⊆ t
h₂ : #↑t = Module.rank R M
h₃ : LinearIndependent (ι := ↑t) R Subtype.val
this : range v ≠ t
⊢ ∃ x, LinearIndependent R (Fin.cons x v)
state_after: case intro.intro.intro.intro.intro
R : Type u_1
M M₁ M₂ M₃ : Type u
M' : Type v
inst✝¹² : Ring R
inst✝¹¹ : AddCommGroup M
inst✝¹⁰ : AddCommGroup M₁
inst✝⁹ : AddCommGroup M₂
inst✝⁸ : AddCommGroup M₃
inst✝⁷ : AddCommGroup M'
inst✝⁶ : Module R M
inst✝⁵ : Module R M₁
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
inst✝¹ : HasRankNullity.{u, u_1} R
inst✝ : StrongRankCondition R
n : ℕ
v : Fin n → M
hv : LinearIndependent R v
h : ↑n < Module.rank R M
t : Set M
h₁ : range v ⊆ t
h₂ : #↑t = Module.rank R M
h₃ : LinearIndependent (ι := ↑t) R Subtype.val
this : range v ≠ t
x : M
hx : x ∈ t
hx' : x ∉ range v
⊢ ∃ x, LinearIndependent R (Fin.cons x v)

tactic: exact ⟨x, (linearIndependent_subtype_range (Fin.cons_injective_iff.mpr ⟨hx', hv.injective⟩)).mp
  (h₃.mono (Fin.range_cons x v ▸ insert_subset hx h₁))⟩
state_before: case intro.intro.intro.intro.intro
R : Type u_1
M M₁ M₂ M₃ : Type u
M' : Type v
inst✝¹² : Ring R
inst✝¹¹ : AddCommGroup M
inst✝¹⁰ : AddCommGroup M₁
inst✝⁹ : AddCommGroup M₂
inst✝⁸ : AddCommGroup M₃
inst✝⁷ : AddCommGroup M'
inst✝⁶ : Module R M
inst✝⁵ : Module R M₁
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
inst✝¹ : HasRankNullity.{u, u_1} R
inst✝ : StrongRankCondition R
n : ℕ
v : Fin n → M
hv : LinearIndependent R v
h : ↑n < Module.rank R M
t : Set M
h₁ : range v ⊆ t
h₂ : #↑t = Module.rank R M
h₃ : LinearIndependent (ι := ↑t) R Subtype.val
this : range v ≠ t
x : M
hx : x ∈ t
hx' : x ∉ range v
⊢ ∃ x, LinearIndependent R (Fin.cons x v)
state_after: no goals

tactic: refine fun e ↦ h.ne ?_
state_before: R : Type u_1
M M₁ M₂ M₃ : Type u
M' : Type v
inst✝¹² : Ring R
inst✝¹¹ : AddCommGroup M
inst✝¹⁰ : AddCommGroup M₁
inst✝⁹ : AddCommGroup M₂
inst✝⁸ : AddCommGroup M₃
inst✝⁷ : AddCommGroup M'
inst✝⁶ : Module R M
inst✝⁵ : Module R M₁
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
inst✝¹ : HasRankNullity.{u, u_1} R
inst✝ : StrongRankCondition R
n : ℕ
v : Fin n → M
hv : LinearIndependent R v
h : ↑n < Module.rank R M
t : Set M
h₁ : range v ⊆ t
h₂ : #↑t = Module.rank R M
h₃ : LinearIndependent (ι := ↑t) R Subtype.val
⊢ range v ≠ t
state_after: R : Type u_1
M M₁ M₂ M₃ : Type u
M' : Type v
inst✝¹² : Ring R
inst✝¹¹ : AddCommGroup M
inst✝¹⁰ : AddCommGroup M₁
inst✝⁹ : AddCommGroup M₂
inst✝⁸ : AddCommGroup M₃
inst✝⁷ : AddCommGroup M'
inst✝⁶ : Module R M
inst✝⁵ : Module R M₁
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
inst✝¹ : HasRankNullity.{u, u_1} R
inst✝ : StrongRankCondition R
n : ℕ
v : Fin n → M
hv : LinearIndependent R v
h : ↑n < Module.rank R M
t : Set M
h₁ : range v ⊆ t
h₂ : #↑t = Module.rank R M
h₃ : LinearIndependent (ι := ↑t) R Subtype.val
e : range v = t
⊢ ↑n = Module.rank R M

tactic: rw [← e, ← lift_injective.eq_iff, mk_range_eq_of_injective hv.injective] at h₂
state_before: R : Type u_1
M M₁ M₂ M₃ : Type u
M' : Type v
inst✝¹² : Ring R
inst✝¹¹ : AddCommGroup M
inst✝¹⁰ : AddCommGroup M₁
inst✝⁹ : AddCommGroup M₂
inst✝⁸ : AddCommGroup M₃
inst✝⁷ : AddCommGroup M'
inst✝⁶ : Module R M
inst✝⁵ : Module R M₁
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
inst✝¹ : HasRankNullity.{u, u_1} R
inst✝ : StrongRankCondition R
n : ℕ
v : Fin n → M
hv : LinearIndependent R v
h : ↑n < Module.rank R M
t : Set M
h₁ : range v ⊆ t
h₂ : #↑t = Module.rank R M
h₃ : LinearIndependent (ι := ↑t) R Subtype.val
e : range v = t
⊢ ↑n = Module.rank R M
state_after: R : Type u_1
M M₁ M₂ M₃ : Type u
M' : Type v
inst✝¹² : Ring R
inst✝¹¹ : AddCommGroup M
inst✝¹⁰ : AddCommGroup M₁
inst✝⁹ : AddCommGroup M₂
inst✝⁸ : AddCommGroup M₃
inst✝⁷ : AddCommGroup M'
inst✝⁶ : Module R M
inst✝⁵ : Module R M₁
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
inst✝¹ : HasRankNullity.{u, u_1} R
inst✝ : StrongRankCondition R
n : ℕ
v : Fin n → M
hv : LinearIndependent R v
h : ↑n < Module.rank R M
t : Set M
h₁ : range v ⊆ t
h₂ : lift.{u, 0} #(Fin n) = lift.{0, u} (Module.rank R M)
h₃ : LinearIndependent (ι := ↑t) R Subtype.val
e : range v = t
⊢ ↑n = Module.rank R M

tactic: simpa only [mk_fintype, Fintype.card_fin, lift_natCast, lift_id'] using h₂
state_before: R : Type u_1
M M₁ M₂ M₃ : Type u
M' : Type v
inst✝¹² : Ring R
inst✝¹¹ : AddCommGroup M
inst✝¹⁰ : AddCommGroup M₁
inst✝⁹ : AddCommGroup M₂
inst✝⁸ : AddCommGroup M₃
inst✝⁷ : AddCommGroup M'
inst✝⁶ : Module R M
inst✝⁵ : Module R M₁
inst✝⁴ : Module R M₂
inst✝³ : Module R M₃
inst✝² : Module R M'
inst✝¹ : HasRankNullity.{u, u_1} R
inst✝ : StrongRankCondition R
n : ℕ
v : Fin n → M
hv : LinearIndependent R v
h : ↑n < Module.rank R M
t : Set M
h₁ : range v ⊆ t
h₂ : lift.{u, 0} #(Fin n) = lift.{0, u} (Module.rank R M)
h₃ : LinearIndependent (ι := ↑t) R Subtype.val
e : range v = t
⊢ ↑n = Module.rank R M
state_after: no goals