Theorem: union_support_maximal_linearIndependent_eq_range_basis
File: Mathlib/LinearAlgebra/Basis.lean

Proof steps:
state_before: ι✝¹ : Type u_1
ι' : Type u_2
R✝ : Type u_3
R₂ : Type u_4
K : Type u_5
M✝ : Type u_6
M'✝ : Type u_7
M'' : Type u_8
V : Type u
V' : Type u_9
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✝³ : Nontrivial R
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M₁
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : i.Maximal
⊢ ⋃ k, ↑(b.repr (v k)).support = Set.univ
state_after: ι✝¹ : Type u_1
ι' : Type u_2
R✝ : Type u_3
R₂ : Type u_4
K : Type u_5
M✝ : Type u_6
M'✝ : Type u_7
M'' : Type u_8
V : Type u
V' : Type u_9
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✝³ : Nontrivial R
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M₁
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : i.Maximal
h : ¬⋃ k, ↑(b.repr (v k)).support = Set.univ
⊢ False
tactic: by_contra h
state_before: ι✝¹ : Type u_1
ι' : Type u_2
R✝ : Type u_3
R₂ : Type u_4
K : Type u_5
M✝ : Type u_6
M'✝ : Type u_7
M'' : Type u_8
V : Type u
V' : Type u_9
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✝³ : Nontrivial R
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M₁
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : i.Maximal
h : ¬⋃ k, ↑(b.repr (v k)).support = Set.univ
⊢ False
state_after: ι✝¹ : Type u_1
ι' : Type u_2
R✝ : Type u_3
R₂ : Type u_4
K : Type u_5
M✝ : Type u_6
M'✝ : Type u_7
M'' : Type u_8
V : Type u
V' : Type u_9
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✝³ : Nontrivial R
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M₁
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : i.Maximal
h : ∃ a, ∀ (x : κ), (b.repr (v x)) a = 0
⊢ False
tactic: simp only [← Ne.eq_def, ne_univ_iff_exists_not_mem, mem_iUnion, not_exists_not,
    Finsupp.mem_support_iff, Finset.mem_coe] at h
state_before: ι✝¹ : Type u_1
ι' : Type u_2
R✝ : Type u_3
R₂ : Type u_4
K : Type u_5
M✝ : Type u_6
M'✝ : Type u_7
M'' : Type u_8
V : Type u
V' : Type u_9
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✝³ : Nontrivial R
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M₁
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : i.Maximal
h : ∃ a, ∀ (x : κ), (b.repr (v x)) a = 0
⊢ False
state_after: case intro
ι✝¹ : Type u_1
ι' : Type u_2
R✝ : Type u_3
R₂ : Type u_4
K : Type u_5
M✝ : Type u_6
M'✝ : Type u_7
M'' : Type u_8
V : Type u
V' : Type u_9
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✝³ : Nontrivial R
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M₁
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : i.Maximal
b' : ι
w : ∀ (x : κ), (b.repr (v x)) b' = 0
⊢ False
tactic: obtain ⟨b', w⟩ := h
state_before: case intro
ι✝¹ : Type u_1
ι' : Type u_2
R✝ : Type u_3
R₂ : Type u_4
K : Type u_5
M✝ : Type u_6
M'✝ : Type u_7
M'' : Type u_8
V : Type u
V' : Type u_9
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✝³ : Nontrivial R
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M₁
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : i.Maximal
b' : ι
w : ∀ (x : κ), (b.repr (v x)) b' = 0
⊢ False
state_after: case intro
ι✝¹ : Type u_1
ι' : Type u_2
R✝ : Type u_3
R₂ : Type u_4
K : Type u_5
M✝ : Type u_6
M'✝ : Type u_7
M'' : Type u_8
V : Type u
V' : Type u_9
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✝³ : Nontrivial R
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M₁
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : i.Maximal
b' : ι
w : ∀ (x : κ), (b.repr (v x)) b' = 0
v' : Option κ → M := fun o => o.elim (b b') v
⊢ False
tactic: let v' : Option κ → M := fun o => o.elim (b b') v
state_before: case intro
ι✝¹ : Type u_1
ι' : Type u_2
R✝ : Type u_3
R₂ : Type u_4
K : Type u_5
M✝ : Type u_6
M'✝ : Type u_7
M'' : Type u_8
V : Type u
V' : Type u_9
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✝³ : Nontrivial R
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M₁
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : i.Maximal
b' : ι
w : ∀ (x : κ), (b.repr (v x)) b' = 0
v' : Option κ → M := fun o => o.elim (b b') v
⊢ False
state_after: case intro
ι✝¹ : Type u_1
ι' : Type u_2
R✝ : Type u_3
R₂ : Type u_4
K : Type u_5
M✝ : Type u_6
M'✝ : Type u_7
M'' : Type u_8
V : Type u
V' : Type u_9
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✝³ : Nontrivial R
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M₁
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : i.Maximal
b' : ι
w : ∀ (x : κ), (b.repr (v x)) b' = 0
v' : Option κ → M := fun o => o.elim (b b') v
r : range v ⊆ range v'
⊢ False
tactic: have r : range v ⊆ range v' := by
    rintro - ⟨k, rfl⟩
    use some k
    simp only [v', Option.elim_some]
state_before: case intro
ι✝¹ : Type u_1
ι' : Type u_2
R✝ : Type u_3
R₂ : Type u_4
K : Type u_5
M✝ : Type u_6
M'✝ : Type u_7
M'' : Type u_8
V : Type u
V' : Type u_9
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✝³ : Nontrivial R
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M₁
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : i.Maximal
b' : ι
w : ∀ (x : κ), (b.repr (v x)) b' = 0
v' : Option κ → M := fun o => o.elim (b b') v
r : range v ⊆ range v'
⊢ False
state_after: case intro
ι✝¹ : Type u_1
ι' : Type u_2
R✝ : Type u_3
R₂ : Type u_4
K : Type u_5
M✝ : Type u_6
M'✝ : Type u_7
M'' : Type u_8
V : Type u
V' : Type u_9
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✝³ : Nontrivial R
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M₁
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : i.Maximal
b' : ι
w : ∀ (x : κ), (b.repr (v x)) b' = 0
v' : Option κ → M := fun o => o.elim (b b') v
r : range v ⊆ range v'
r' : b b' ∉ range v
⊢ False
tactic: have r' : b b' ∉ range v := by
    rintro ⟨k, p⟩
    simpa [w] using congr_arg (fun m => (b.repr m) b') p
state_before: case intro
ι✝¹ : Type u_1
ι' : Type u_2
R✝ : Type u_3
R₂ : Type u_4
K : Type u_5
M✝ : Type u_6
M'✝ : Type u_7
M'' : Type u_8
V : Type u
V' : Type u_9
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✝³ : Nontrivial R
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M₁
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : i.Maximal
b' : ι
w : ∀ (x : κ), (b.repr (v x)) b' = 0
v' : Option κ → M := fun o => o.elim (b b') v
r : range v ⊆ range v'
r' : b b' ∉ range v
⊢ False
state_after: case intro
ι✝¹ : Type u_1
ι' : Type u_2
R✝ : Type u_3
R₂ : Type u_4
K : Type u_5
M✝ : Type u_6
M'✝ : Type u_7
M'' : Type u_8
V : Type u
V' : Type u_9
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✝³ : Nontrivial R
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M₁
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : i.Maximal
b' : ι
w : ∀ (x : κ), (b.repr (v x)) b' = 0
v' : Option κ → M := fun o => o.elim (b b') v
r : range v ⊆ range v'
r' : b b' ∉ range v
r'' : range v ≠ range v'
⊢ False
tactic: have r'' : range v ≠ range v' := by
    intro e
    have p : b b' ∈ range v' := by
      use none
      simp only [v', Option.elim_none]
    rw [← e] at p
    exact r' p
state_before: case intro
ι✝¹ : Type u_1
ι' : Type u_2
R✝ : Type u_3
R₂ : Type u_4
K : Type u_5
M✝ : Type u_6
M'✝ : Type u_7
M'' : Type u_8
V : Type u
V' : Type u_9
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✝³ : Nontrivial R
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M₁
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : i.Maximal
b' : ι
w : ∀ (x : κ), (b.repr (v x)) b' = 0
v' : Option κ → M := fun o => o.elim (b b') v
r : range v ⊆ range v'
r' : b b' ∉ range v
r'' : range v ≠ range v'
i' : LinearIndependent (ι := { x // x ∈ range v' }) R Subtype.val
⊢ False
state_after: case intro
ι✝¹ : Type u_1
ι' : Type u_2
R✝ : Type u_3
R₂ : Type u_4
K : Type u_5
M✝ : Type u_6
M'✝ : Type u_7
M'' : Type u_8
V : Type u
V' : Type u_9
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✝³ : Nontrivial R
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M₁
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : ∀ (s : Set M), LinearIndependent (ι := { x // x ∈ s }) R Subtype.val → range v ≤ s → range v = s
b' : ι
w : ∀ (x : κ), (b.repr (v x)) b' = 0
v' : Option κ → M := fun o => o.elim (b b') v
r : range v ⊆ range v'
r' : b b' ∉ range v
r'' : range v ≠ range v'
i' : LinearIndependent (ι := { x // x ∈ range v' }) R Subtype.val
⊢ False
tactic: rw [LinearIndependent.Maximal] at m
state_before: case intro
ι✝¹ : Type u_1
ι' : Type u_2
R✝ : Type u_3
R₂ : Type u_4
K : Type u_5
M✝ : Type u_6
M'✝ : Type u_7
M'' : Type u_8
V : Type u
V' : Type u_9
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✝³ : Nontrivial R
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M₁
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : ∀ (s : Set M), LinearIndependent (ι := { x // x ∈ s }) R Subtype.val → range v ≤ s → range v = s
b' : ι
w : ∀ (x : κ), (b.repr (v x)) b' = 0
v' : Option κ → M := fun o => o.elim (b b') v
r : range v ⊆ range v'
r' : b b' ∉ range v
r'' : range v ≠ range v'
i' : LinearIndependent (ι := { x // x ∈ range v' }) R Subtype.val
⊢ False
state_after: case intro
ι✝¹ : Type u_1
ι' : Type u_2
R✝ : Type u_3
R₂ : Type u_4
K : Type u_5
M✝ : Type u_6
M'✝ : Type u_7
M'' : Type u_8
V : Type u
V' : Type u_9
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✝³ : Nontrivial R
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M₁
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
b' : ι
w : ∀ (x : κ), (b.repr (v x)) b' = 0
v' : Option κ → M := fun o => o.elim (b b') v
r : range v ⊆ range v'
r' : b b' ∉ range v
r'' : range v ≠ range v'
i' : LinearIndependent (ι := { x // x ∈ range v' }) R Subtype.val
m : range v = range v'
⊢ False
tactic: specialize m (range v') i' r
state_before: case intro
ι✝¹ : Type u_1
ι' : Type u_2
R✝ : Type u_3
R₂ : Type u_4
K : Type u_5
M✝ : Type u_6
M'✝ : Type u_7
M'' : Type u_8
V : Type u
V' : Type u_9
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✝³ : Nontrivial R
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M₁
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
b' : ι
w : ∀ (x : κ), (b.repr (v x)) b' = 0
v' : Option κ → M := fun o => o.elim (b b') v
r : range v ⊆ range v'
r' : b b' ∉ range v
r'' : range v ≠ range v'
i' : LinearIndependent (ι := { x // x ∈ range v' }) R Subtype.val
m : range v = range v'
⊢ False
state_after: no goals
tactic: exact r'' m