Theorem: exists_finset_linearIndependent_of_le_rank
File: Mathlib/LinearAlgebra/Dimension/Finite.lean

tactic: have := nonempty_linearIndependent_set
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
n : ℕ
hn : ↑n ≤ Module.rank R M
⊢ ∃ s, s.card = n ∧ LinearIndependent R Subtype.val
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
n : ℕ
hn : ↑n ≤ Module.rank R M
this :
  ∀ (R : Type ?u.183187) (M : Type ?u.183186) [inst : Semiring R] [inst_1 : AddCommMonoid M] [inst_2 : Module R M],
    Nonempty { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
⊢ ∃ s, s.card = n ∧ LinearIndependent R Subtype.val

tactic: cases' hn.eq_or_lt with h h
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
n : ℕ
hn : ↑n ≤ Module.rank R M
this :
  ∀ (R : Type ?u.183187) (M : Type ?u.183186) [inst : Semiring R] [inst_1 : AddCommMonoid M] [inst_2 : Module R M],
    Nonempty { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
⊢ ∃ s, s.card = n ∧ LinearIndependent R Subtype.val
state_after: case inl
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
n : ℕ
hn : ↑n ≤ Module.rank R M
this :
  ∀ (R : Type ?u.183187) (M : Type ?u.183186) [inst : Semiring R] [inst_1 : AddCommMonoid M] [inst_2 : Module R M],
    Nonempty { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
h : ↑n = Module.rank R M
⊢ ∃ s, s.card = n ∧ LinearIndependent R Subtype.val

case inr
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
n : ℕ
hn : ↑n ≤ Module.rank R M
this :
  ∀ (R : Type ?u.183187) (M : Type ?u.183186) [inst : Semiring R] [inst_1 : AddCommMonoid M] [inst_2 : Module R M],
    Nonempty { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
h : ↑n < Module.rank R M
⊢ ∃ s, s.card = n ∧ LinearIndependent R Subtype.val

tactic: obtain ⟨⟨s, hs⟩, hs'⟩ := Cardinal.exists_eq_natCast_of_iSup_eq _
  (Cardinal.bddAbove_range.{v, v} _) _ (h.trans (Module.rank_def R M)).symm
state_before: case inl
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
n : ℕ
hn : ↑n ≤ Module.rank R M
this :
  ∀ (R : Type ?u.183187) (M : Type ?u.183186) [inst : Semiring R] [inst_1 : AddCommMonoid M] [inst_2 : Module R M],
    Nonempty { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
h : ↑n = Module.rank R M
⊢ ∃ s, s.card = n ∧ LinearIndependent R Subtype.val
state_after: case inl.intro.mk
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
n : ℕ
hn : ↑n ≤ Module.rank R M
this :
  ∀ (R : Type u) (M : Type v) [inst : Semiring R] [inst_1 : AddCommMonoid M] [inst_2 : Module R M],
    Nonempty { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
h : ↑n = Module.rank R M
s : Set M
hs : LinearIndependent (ι := { x // x ∈ s }) R Subtype.val
hs' : #↑↑⟨s, hs⟩ = ↑n
⊢ ∃ s, s.card = n ∧ LinearIndependent R Subtype.val

tactic: have : Finite s := lt_aleph0_iff_finite.mp (hs' ▸ nat_lt_aleph0 n)
state_before: case inl.intro.mk
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
n : ℕ
hn : ↑n ≤ Module.rank R M
this :
  ∀ (R : Type u) (M : Type v) [inst : Semiring R] [inst_1 : AddCommMonoid M] [inst_2 : Module R M],
    Nonempty { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
h : ↑n = Module.rank R M
s : Set M
hs : LinearIndependent (ι := { x // x ∈ s }) R Subtype.val
hs' : #↑↑⟨s, hs⟩ = ↑n
⊢ ∃ s, s.card = n ∧ LinearIndependent R Subtype.val
state_after: case inl.intro.mk
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
n : ℕ
hn : ↑n ≤ Module.rank R M
this✝ :
  ∀ (R : Type u) (M : Type v) [inst : Semiring R] [inst_1 : AddCommMonoid M] [inst_2 : Module R M],
    Nonempty { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
h : ↑n = Module.rank R M
s : Set M
hs : LinearIndependent (ι := { x // x ∈ s }) R Subtype.val
hs' : #↑↑⟨s, hs⟩ = ↑n
this : Finite ↑s
⊢ ∃ s, s.card = n ∧ LinearIndependent R Subtype.val

tactic: cases nonempty_fintype s
state_before: case inl.intro.mk
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
n : ℕ
hn : ↑n ≤ Module.rank R M
this✝ :
  ∀ (R : Type u) (M : Type v) [inst : Semiring R] [inst_1 : AddCommMonoid M] [inst_2 : Module R M],
    Nonempty { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
h : ↑n = Module.rank R M
s : Set M
hs : LinearIndependent (ι := { x // x ∈ s }) R Subtype.val
hs' : #↑↑⟨s, hs⟩ = ↑n
this : Finite ↑s
⊢ ∃ s, s.card = n ∧ LinearIndependent R Subtype.val
state_after: case inl.intro.mk.intro
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
n : ℕ
hn : ↑n ≤ Module.rank R M
this✝ :
  ∀ (R : Type u) (M : Type v) [inst : Semiring R] [inst_1 : AddCommMonoid M] [inst_2 : Module R M],
    Nonempty { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
h : ↑n = Module.rank R M
s : Set M
hs : LinearIndependent (ι := { x // x ∈ s }) R Subtype.val
hs' : #↑↑⟨s, hs⟩ = ↑n
this : Finite ↑s
val✝ : Fintype ↑s
⊢ ∃ s, s.card = n ∧ LinearIndependent R Subtype.val

tactic: exact ⟨s.toFinset, by simpa using hs', by convert hs <;> exact Set.mem_toFinset⟩
state_before: case inl.intro.mk.intro
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
n : ℕ
hn : ↑n ≤ Module.rank R M
this✝ :
  ∀ (R : Type u) (M : Type v) [inst : Semiring R] [inst_1 : AddCommMonoid M] [inst_2 : Module R M],
    Nonempty { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
h : ↑n = Module.rank R M
s : Set M
hs : LinearIndependent (ι := { x // x ∈ s }) R Subtype.val
hs' : #↑↑⟨s, hs⟩ = ↑n
this : Finite ↑s
val✝ : Fintype ↑s
⊢ ∃ s, s.card = n ∧ LinearIndependent R Subtype.val
state_after: no goals

tactic: simpa using hs'
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
n : ℕ
hn : ↑n ≤ Module.rank R M
this✝ :
  ∀ (R : Type u) (M : Type v) [inst : Semiring R] [inst_1 : AddCommMonoid M] [inst_2 : Module R M],
    Nonempty { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
h : ↑n = Module.rank R M
s : Set M
hs : LinearIndependent (ι := { x // x ∈ s }) R Subtype.val
hs' : #↑↑⟨s, hs⟩ = ↑n
this : Finite ↑s
val✝ : Fintype ↑s
⊢ s.toFinset.card = n
state_after: no goals

tactic: convert hs <;> exact Set.mem_toFinset
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
n : ℕ
hn : ↑n ≤ Module.rank R M
this✝ :
  ∀ (R : Type u) (M : Type v) [inst : Semiring R] [inst_1 : AddCommMonoid M] [inst_2 : Module R M],
    Nonempty { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
h : ↑n = Module.rank R M
s : Set M
hs : LinearIndependent (ι := { x // x ∈ s }) R Subtype.val
hs' : #↑↑⟨s, hs⟩ = ↑n
this : Finite ↑s
val✝ : Fintype ↑s
⊢ LinearIndependent R Subtype.val
state_after: no goals

tactic: obtain ⟨s, hs, hs'⟩ := exists_set_linearIndependent_of_lt_rank h
state_before: case inr
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
n : ℕ
hn : ↑n ≤ Module.rank R M
this :
  ∀ (R : Type u) (M : Type v) [inst : Semiring R] [inst_1 : AddCommMonoid M] [inst_2 : Module R M],
    Nonempty { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
h : ↑n < Module.rank R M
⊢ ∃ s, s.card = n ∧ LinearIndependent R Subtype.val
state_after: case inr.intro.intro
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
n : ℕ
hn : ↑n ≤ Module.rank R M
this :
  ∀ (R : Type u) (M : Type v) [inst : Semiring R] [inst_1 : AddCommMonoid M] [inst_2 : Module R M],
    Nonempty { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
h : ↑n < Module.rank R M
s : Set M
hs : #↑s = ↑n
hs' : LinearIndependent (ι := { x // x ∈ s }) R Subtype.val
⊢ ∃ s, s.card = n ∧ LinearIndependent R Subtype.val

tactic: have : Finite s := lt_aleph0_iff_finite.mp (hs ▸ nat_lt_aleph0 n)
state_before: case inr.intro.intro
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
n : ℕ
hn : ↑n ≤ Module.rank R M
this :
  ∀ (R : Type u) (M : Type v) [inst : Semiring R] [inst_1 : AddCommMonoid M] [inst_2 : Module R M],
    Nonempty { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
h : ↑n < Module.rank R M
s : Set M
hs : #↑s = ↑n
hs' : LinearIndependent (ι := { x // x ∈ s }) R Subtype.val
⊢ ∃ s, s.card = n ∧ LinearIndependent R Subtype.val
state_after: case inr.intro.intro
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
n : ℕ
hn : ↑n ≤ Module.rank R M
this✝ :
  ∀ (R : Type u) (M : Type v) [inst : Semiring R] [inst_1 : AddCommMonoid M] [inst_2 : Module R M],
    Nonempty { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
h : ↑n < Module.rank R M
s : Set M
hs : #↑s = ↑n
hs' : LinearIndependent (ι := { x // x ∈ s }) R Subtype.val
this : Finite ↑s
⊢ ∃ s, s.card = n ∧ LinearIndependent R Subtype.val

tactic: cases nonempty_fintype s
state_before: case inr.intro.intro
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
n : ℕ
hn : ↑n ≤ Module.rank R M
this✝ :
  ∀ (R : Type u) (M : Type v) [inst : Semiring R] [inst_1 : AddCommMonoid M] [inst_2 : Module R M],
    Nonempty { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
h : ↑n < Module.rank R M
s : Set M
hs : #↑s = ↑n
hs' : LinearIndependent (ι := { x // x ∈ s }) R Subtype.val
this : Finite ↑s
⊢ ∃ s, s.card = n ∧ LinearIndependent R Subtype.val
state_after: case inr.intro.intro.intro
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
n : ℕ
hn : ↑n ≤ Module.rank R M
this✝ :
  ∀ (R : Type u) (M : Type v) [inst : Semiring R] [inst_1 : AddCommMonoid M] [inst_2 : Module R M],
    Nonempty { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
h : ↑n < Module.rank R M
s : Set M
hs : #↑s = ↑n
hs' : LinearIndependent (ι := { x // x ∈ s }) R Subtype.val
this : Finite ↑s
val✝ : Fintype ↑s
⊢ ∃ s, s.card = n ∧ LinearIndependent R Subtype.val

tactic: exact ⟨s.toFinset, by simpa using hs, by convert hs' <;> exact Set.mem_toFinset⟩
state_before: case inr.intro.intro.intro
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
n : ℕ
hn : ↑n ≤ Module.rank R M
this✝ :
  ∀ (R : Type u) (M : Type v) [inst : Semiring R] [inst_1 : AddCommMonoid M] [inst_2 : Module R M],
    Nonempty { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
h : ↑n < Module.rank R M
s : Set M
hs : #↑s = ↑n
hs' : LinearIndependent (ι := { x // x ∈ s }) R Subtype.val
this : Finite ↑s
val✝ : Fintype ↑s
⊢ ∃ s, s.card = n ∧ LinearIndependent R Subtype.val
state_after: no goals

tactic: simpa using hs
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
n : ℕ
hn : ↑n ≤ Module.rank R M
this✝ :
  ∀ (R : Type u) (M : Type v) [inst : Semiring R] [inst_1 : AddCommMonoid M] [inst_2 : Module R M],
    Nonempty { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
h : ↑n < Module.rank R M
s : Set M
hs : #↑s = ↑n
hs' : LinearIndependent (ι := { x // x ∈ s }) R Subtype.val
this : Finite ↑s
val✝ : Fintype ↑s
⊢ s.toFinset.card = n
state_after: no goals

tactic: convert hs' <;> exact Set.mem_toFinset
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
n : ℕ
hn : ↑n ≤ Module.rank R M
this✝ :
  ∀ (R : Type u) (M : Type v) [inst : Semiring R] [inst_1 : AddCommMonoid M] [inst_2 : Module R M],
    Nonempty { s // LinearIndependent (ι := { x // x ∈ s }) R Subtype.val }
h : ↑n < Module.rank R M
s : Set M
hs : #↑s = ↑n
hs' : LinearIndependent (ι := { x // x ∈ s }) R Subtype.val
this : Finite ↑s
val✝ : Fintype ↑s
⊢ LinearIndependent R Subtype.val
state_after: no goals