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

tactic: obtain ⟨t, ht, ht'⟩ := exists_set_linearIndependent R (M ⧸ Submodule.span R s)
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: 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
⊢ ∃ 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: 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
⊢ ∃ 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 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
⊢ ∃ 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: refine ⟨s ∪ sec '' t, subset_union_left, ?_, ?_⟩
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: rw [Set.disjoint_iff]
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 : 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
⊢ Disjoint s (sec '' 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
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
⊢ s ∩ sec '' t ⊆ ∅

tactic: rintro _ ⟨hxs, ⟨x, hxt, rfl⟩⟩
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 : 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
⊢ s ∩ sec '' t ⊆ ∅
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
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
x : M ⧸ Submodule.span R s
hxt : x ∈ t
hxs : sec x ∈ s
⊢ sec x ∈ ∅

tactic: apply ht'.ne_zero ⟨x, hxt⟩
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
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
x : M ⧸ Submodule.span R s
hxt : x ∈ t
hxs : sec x ∈ s
⊢ sec x ∈ ∅
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
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
x : M ⧸ Submodule.span R s
hxt : x ∈ t
hxs : sec x ∈ s
⊢ ↑⟨x, hxt⟩ = 0

tactic: rw [Subtype.coe_mk, ← hsec x, Submodule.Quotient.mk_eq_zero]
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
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
x : M ⧸ Submodule.span R s
hxt : x ∈ t
hxs : sec x ∈ s
⊢ ↑⟨x, hxt⟩ = 0
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
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
x : M ⧸ Submodule.span R s
hxt : x ∈ t
hxs : sec x ∈ s
⊢ sec x ∈ Submodule.span R s

tactic: exact Submodule.subset_span hxs
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
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
x : M ⧸ Submodule.span R s
hxt : x ∈ t
hxs : sec x ∈ s
⊢ sec x ∈ Submodule.span R s
state_after: no goals

tactic: rw [Cardinal.mk_union_of_disjoint hst, Cardinal.mk_image_eq, ht,
  ← rank_quotient_add_rank (Submodule.span R s), add_comm, rank_span_set hs]
state_before: 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
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)
⊢ Injective sec

tactic: exact HasLeftInverse.injective ⟨Submodule.Quotient.mk, hsec⟩
state_before: 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)
⊢ Injective sec
state_after: no goals

tactic: apply LinearIndependent.union_of_quotient Submodule.subset_span hs
state_before: 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
state_after: 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 (ι := ↑(sec '' t)) R (Submodule.Quotient.mk ∘ Subtype.val)

tactic: rwa [Function.comp, linearIndependent_image (hsec'.symm ▸ injective_id).injOn.image_of_comp,
  ← image_comp, hsec', image_id]
state_before: 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 (ι := ↑(sec '' t)) R (Submodule.Quotient.mk ∘ Subtype.val)
state_after: no goals