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

Proof steps:
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
s : Set M
hs : LinearIndependent (ι := ↑s) R Subtype.val
⊢ ∃ t, s ⊆ t ∧ #↑t = Module.rank R M ∧ LinearIndependent (ι := ↑t) R Subtype.val
state_after: case 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
s : Set M
hs : LinearIndependent (ι := ↑s) R Subtype.val
t : Set (M ⧸ Submodule.span R s)
ht : #↑t = Module.rank R (M ⧸ Submodule.span R s)
ht' : LinearIndependent (ι := ↑t) R Subtype.val
⊢ ∃ t, s ⊆ t ∧ #↑t = Module.rank R M ∧ LinearIndependent (ι := ↑t) R Subtype.val
tactic: obtain ⟨t, ht, ht'⟩ := exists_set_linearIndependent R (M ⧸ Submodule.span R s)
state_before: case 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
s : Set M
hs : LinearIndependent (ι := ↑s) R Subtype.val
t : Set (M ⧸ Submodule.span R s)
ht : #↑t = Module.rank R (M ⧸ Submodule.span R s)
ht' : LinearIndependent (ι := ↑t) R Subtype.val
⊢ ∃ t, s ⊆ t ∧ #↑t = Module.rank R M ∧ LinearIndependent (ι := ↑t) R Subtype.val
state_after: case 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
s : Set M
hs : LinearIndependent (ι := ↑s) R Subtype.val
t : Set (M ⧸ Submodule.span R s)
ht : #↑t = Module.rank R (M ⧸ Submodule.span R s)
ht' : LinearIndependent (ι := ↑t) R Subtype.val
sec : M ⧸ Submodule.span R s → M
hsec : ∀ (b : M ⧸ Submodule.span R s), Submodule.Quotient.mk (sec b) = b
⊢ ∃ t, s ⊆ t ∧ #↑t = Module.rank R M ∧ LinearIndependent (ι := ↑t) R Subtype.val
tactic: choose sec hsec using Submodule.Quotient.mk_surjective (Submodule.span R s)
state_before: case 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
s : Set M
hs : LinearIndependent (ι := ↑s) R Subtype.val
t : Set (M ⧸ Submodule.span R s)
ht : #↑t = Module.rank R (M ⧸ Submodule.span R s)
ht' : LinearIndependent (ι := ↑t) R Subtype.val
sec : M ⧸ Submodule.span R s → M
hsec : ∀ (b : M ⧸ Submodule.span R s), Submodule.Quotient.mk (sec b) = b
⊢ ∃ t, s ⊆ t ∧ #↑t = Module.rank R M ∧ LinearIndependent (ι := ↑t) R Subtype.val
state_after: case 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
s : Set M
hs : LinearIndependent (ι := ↑s) R Subtype.val
t : Set (M ⧸ Submodule.span R s)
ht : #↑t = Module.rank R (M ⧸ Submodule.span R s)
ht' : LinearIndependent (ι := ↑t) R Subtype.val
sec : M ⧸ Submodule.span R s → M
hsec : ∀ (b : M ⧸ Submodule.span R s), Submodule.Quotient.mk (sec b) = b
hsec' : Submodule.Quotient.mk ∘ sec = id
⊢ ∃ t, s ⊆ t ∧ #↑t = Module.rank R M ∧ LinearIndependent (ι := ↑t) R Subtype.val
tactic: have hsec' : Submodule.Quotient.mk ∘ sec = id := funext hsec
state_before: case 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
s : Set M
hs : LinearIndependent (ι := ↑s) R Subtype.val
t : Set (M ⧸ Submodule.span R s)
ht : #↑t = Module.rank R (M ⧸ Submodule.span R s)
ht' : LinearIndependent (ι := ↑t) R Subtype.val
sec : M ⧸ Submodule.span R s → M
hsec : ∀ (b : M ⧸ Submodule.span R s), Submodule.Quotient.mk (sec b) = b
hsec' : Submodule.Quotient.mk ∘ sec = id
⊢ ∃ t, s ⊆ t ∧ #↑t = Module.rank R M ∧ LinearIndependent (ι := ↑t) R Subtype.val
state_after: case 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
s : Set M
hs : LinearIndependent (ι := ↑s) R Subtype.val
t : Set (M ⧸ Submodule.span R s)
ht : #↑t = Module.rank R (M ⧸ Submodule.span R s)
ht' : LinearIndependent (ι := ↑t) R Subtype.val
sec : M ⧸ Submodule.span R s → M
hsec : ∀ (b : M ⧸ Submodule.span R s), Submodule.Quotient.mk (sec b) = b
hsec' : Submodule.Quotient.mk ∘ sec = id
hst : Disjoint s (sec '' t)
⊢ ∃ t, s ⊆ t ∧ #↑t = Module.rank R M ∧ LinearIndependent (ι := ↑t) R Subtype.val
tactic: have hst : Disjoint s (sec '' t) := by
    rw [Set.disjoint_iff]
    rintro _ ⟨hxs, ⟨x, hxt, rfl⟩⟩
    apply ht'.ne_zero ⟨x, hxt⟩
    rw [Subtype.coe_mk, ← hsec x, Submodule.Quotient.mk_eq_zero]
    exact Submodule.subset_span hxs
state_before: case 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
s : Set M
hs : LinearIndependent (ι := ↑s) R Subtype.val
t : Set (M ⧸ Submodule.span R s)
ht : #↑t = Module.rank R (M ⧸ Submodule.span R s)
ht' : LinearIndependent (ι := ↑t) R Subtype.val
sec : M ⧸ Submodule.span R s → M
hsec : ∀ (b : M ⧸ Submodule.span R s), Submodule.Quotient.mk (sec b) = b
hsec' : Submodule.Quotient.mk ∘ sec = id
hst : Disjoint s (sec '' t)
⊢ ∃ t, s ⊆ t ∧ #↑t = Module.rank R M ∧ LinearIndependent (ι := ↑t) R Subtype.val
state_after: case intro.intro.refine_1
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
s : Set M
hs : LinearIndependent (ι := ↑s) R Subtype.val
t : Set (M ⧸ Submodule.span R s)
ht : #↑t = Module.rank R (M ⧸ Submodule.span R s)
ht' : LinearIndependent (ι := ↑t) R Subtype.val
sec : M ⧸ Submodule.span R s → M
hsec : ∀ (b : M ⧸ Submodule.span R s), Submodule.Quotient.mk (sec b) = b
hsec' : Submodule.Quotient.mk ∘ sec = id
hst : Disjoint s (sec '' t)
⊢ #↑(s ∪ sec '' t) = Module.rank R M

case intro.intro.refine_2
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
s : Set M
hs : LinearIndependent (ι := ↑s) R Subtype.val
t : Set (M ⧸ Submodule.span R s)
ht : #↑t = Module.rank R (M ⧸ Submodule.span R s)
ht' : LinearIndependent (ι := ↑t) R Subtype.val
sec : M ⧸ Submodule.span R s → M
hsec : ∀ (b : M ⧸ Submodule.span R s), Submodule.Quotient.mk (sec b) = b
hsec' : Submodule.Quotient.mk ∘ sec = id
hst : Disjoint s (sec '' t)
⊢ LinearIndependent (ι := ↑(s ∪ sec '' t)) R Subtype.val
tactic: refine ⟨s ∪ sec '' t, subset_union_left, ?_, ?_⟩