[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁶ : Ring R
M : Type v
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type v'
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
M₁ : Type v
inst✝¹ : AddCommGroup M₁
inst✝ : Module R M₁
f : M →ₗ[R] M'
i : Injective ↑f
⊢ lift (Module.rank R M) ≤ lift (Module.rank R M')
[PROOFSTEP]
simp only [Module.rank_def]
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁶ : Ring R
M : Type v
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type v'
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
M₁ : Type v
inst✝¹ : AddCommGroup M₁
inst✝ : Module R M₁
f : M →ₗ[R] M'
i : Injective ↑f
⊢ lift (⨆ (ι : { s // LinearIndependent R Subtype.val }), #↑↑ι) ≤
    lift (⨆ (ι : { s // LinearIndependent R Subtype.val }), #↑↑ι)
[PROOFSTEP]
rw [Cardinal.lift_iSup (Cardinal.bddAbove_range.{v', v'} _), Cardinal.lift_iSup (Cardinal.bddAbove_range.{v, v} _)]
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁶ : Ring R
M : Type v
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type v'
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
M₁ : Type v
inst✝¹ : AddCommGroup M₁
inst✝ : Module R M₁
f : M →ₗ[R] M'
i : Injective ↑f
⊢ ⨆ (i : { s // LinearIndependent R Subtype.val }), lift #↑↑i ≤
    ⨆ (i : { s // LinearIndependent R Subtype.val }), lift #↑↑i
[PROOFSTEP]
apply ciSup_mono' (Cardinal.bddAbove_range.{v', v} _)
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁶ : Ring R
M : Type v
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type v'
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
M₁ : Type v
inst✝¹ : AddCommGroup M₁
inst✝ : Module R M₁
f : M →ₗ[R] M'
i : Injective ↑f
⊢ ∀ (i : { s // LinearIndependent R Subtype.val }), ∃ i', lift #↑↑i ≤ lift #↑↑i'
[PROOFSTEP]
rintro ⟨s, li⟩
[GOAL]
case mk
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁶ : Ring R
M : Type v
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type v'
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
M₁ : Type v
inst✝¹ : AddCommGroup M₁
inst✝ : Module R M₁
f : M →ₗ[R] M'
i : Injective ↑f
s : Set M
li : LinearIndependent R Subtype.val
⊢ ∃ i', lift #↑↑{ val := s, property := li } ≤ lift #↑↑i'
[PROOFSTEP]
refine' ⟨⟨f '' s, _⟩, Cardinal.lift_mk_le'.mpr ⟨(Equiv.Set.image f s i).toEmbedding⟩⟩
[GOAL]
case mk
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁶ : Ring R
M : Type v
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type v'
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
M₁ : Type v
inst✝¹ : AddCommGroup M₁
inst✝ : Module R M₁
f : M →ₗ[R] M'
i : Injective ↑f
s : Set M
li : LinearIndependent R Subtype.val
⊢ LinearIndependent R Subtype.val
[PROOFSTEP]
exact (li.map' _ <| LinearMap.ker_eq_bot.mpr i).image
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁶ : Ring R
M : Type v
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type v'
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
M₁ : Type v
inst✝¹ : AddCommGroup M₁
inst✝ : Module R M₁
n : ℕ
H : ∀ (s : Finset M), (LinearIndependent R fun i => ↑i) → Finset.card s ≤ n
⊢ Module.rank R M ≤ ↑n
[PROOFSTEP]
rw [Module.rank_def]
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁶ : Ring R
M : Type v
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type v'
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
M₁ : Type v
inst✝¹ : AddCommGroup M₁
inst✝ : Module R M₁
n : ℕ
H : ∀ (s : Finset M), (LinearIndependent R fun i => ↑i) → Finset.card s ≤ n
⊢ ⨆ (ι : { s // LinearIndependent R Subtype.val }), #↑↑ι ≤ ↑n
[PROOFSTEP]
apply ciSup_le'
[GOAL]
case h
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁶ : Ring R
M : Type v
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type v'
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
M₁ : Type v
inst✝¹ : AddCommGroup M₁
inst✝ : Module R M₁
n : ℕ
H : ∀ (s : Finset M), (LinearIndependent R fun i => ↑i) → Finset.card s ≤ n
⊢ ∀ (i : { s // LinearIndependent R Subtype.val }), #↑↑i ≤ ↑n
[PROOFSTEP]
rintro ⟨s, li⟩
[GOAL]
case h.mk
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁶ : Ring R
M : Type v
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type v'
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
M₁ : Type v
inst✝¹ : AddCommGroup M₁
inst✝ : Module R M₁
n : ℕ
H : ∀ (s : Finset M), (LinearIndependent R fun i => ↑i) → Finset.card s ≤ n
s : Set M
li : LinearIndependent R Subtype.val
⊢ #↑↑{ val := s, property := li } ≤ ↑n
[PROOFSTEP]
exact linearIndependent_bounded_of_finset_linearIndependent_bounded H _ li
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁶ : Ring R
M : Type v
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type v'
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
M₁ : Type v
inst✝¹ : AddCommGroup M₁
inst✝ : Module R M₁
f : M →ₗ[R] M'
⊢ lift (Module.rank R { x // x ∈ LinearMap.range f }) ≤ lift (Module.rank R M)
[PROOFSTEP]
simp only [Module.rank_def]
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁶ : Ring R
M : Type v
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type v'
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
M₁ : Type v
inst✝¹ : AddCommGroup M₁
inst✝ : Module R M₁
f : M →ₗ[R] M'
⊢ lift (⨆ (ι : { s // LinearIndependent R Subtype.val }), #↑↑ι) ≤
    lift (⨆ (ι : { s // LinearIndependent R Subtype.val }), #↑↑ι)
[PROOFSTEP]
rw [Cardinal.lift_iSup (Cardinal.bddAbove_range.{v', v'} _)]
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁶ : Ring R
M : Type v
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type v'
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
M₁ : Type v
inst✝¹ : AddCommGroup M₁
inst✝ : Module R M₁
f : M →ₗ[R] M'
⊢ ⨆ (i : { s // LinearIndependent R Subtype.val }), lift #↑↑i ≤
    lift (⨆ (ι : { s // LinearIndependent R Subtype.val }), #↑↑ι)
[PROOFSTEP]
apply ciSup_le'
[GOAL]
case h
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁶ : Ring R
M : Type v
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type v'
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
M₁ : Type v
inst✝¹ : AddCommGroup M₁
inst✝ : Module R M₁
f : M →ₗ[R] M'
⊢ ∀ (i : { s // LinearIndependent R Subtype.val }),
    lift #↑↑i ≤ lift (⨆ (ι : { s // LinearIndependent R Subtype.val }), #↑↑ι)
[PROOFSTEP]
rintro ⟨s, li⟩
[GOAL]
case h.mk
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁶ : Ring R
M : Type v
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type v'
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
M₁ : Type v
inst✝¹ : AddCommGroup M₁
inst✝ : Module R M₁
f : M →ₗ[R] M'
s : Set { x // x ∈ LinearMap.range f }
li : LinearIndependent R Subtype.val
⊢ lift #↑↑{ val := s, property := li } ≤ lift (⨆ (ι : { s // LinearIndependent R Subtype.val }), #↑↑ι)
[PROOFSTEP]
apply le_trans
[GOAL]
case h.mk.a
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁶ : Ring R
M : Type v
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type v'
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
M₁ : Type v
inst✝¹ : AddCommGroup M₁
inst✝ : Module R M₁
f : M →ₗ[R] M'
s : Set { x // x ∈ LinearMap.range f }
li : LinearIndependent R Subtype.val
⊢ lift #↑↑{ val := s, property := li } ≤ ?h.mk.b
case h.mk.a
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁶ : Ring R
M : Type v
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type v'
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
M₁ : Type v
inst✝¹ : AddCommGroup M₁
inst✝ : Module R M₁
f : M →ₗ[R] M'
s : Set { x // x ∈ LinearMap.range f }
li : LinearIndependent R Subtype.val
⊢ ?h.mk.b ≤ lift (⨆ (ι : { s // LinearIndependent R Subtype.val }), #↑↑ι)
case h.mk.b
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁶ : Ring R
M : Type v
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type v'
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
M₁ : Type v
inst✝¹ : AddCommGroup M₁
inst✝ : Module R M₁
f : M →ₗ[R] M'
s : Set { x // x ∈ LinearMap.range f }
li : LinearIndependent R Subtype.val
⊢ Cardinal.{max v' v}
[PROOFSTEP]
swap
[GOAL]
case h.mk.a
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁶ : Ring R
M : Type v
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type v'
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
M₁ : Type v
inst✝¹ : AddCommGroup M₁
inst✝ : Module R M₁
f : M →ₗ[R] M'
s : Set { x // x ∈ LinearMap.range f }
li : LinearIndependent R Subtype.val
⊢ ?h.mk.b ≤ lift (⨆ (ι : { s // LinearIndependent R Subtype.val }), #↑↑ι)
[PROOFSTEP]
apply Cardinal.lift_le.mpr
[GOAL]
case h.mk.a
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁶ : Ring R
M : Type v
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type v'
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
M₁ : Type v
inst✝¹ : AddCommGroup M₁
inst✝ : Module R M₁
f : M →ₗ[R] M'
s : Set { x // x ∈ LinearMap.range f }
li : LinearIndependent R Subtype.val
⊢ ?m.20621 ≤ ⨆ (ι : { s // LinearIndependent R Subtype.val }), #↑↑ι
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁶ : Ring R
M : Type v
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type v'
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
M₁ : Type v
inst✝¹ : AddCommGroup M₁
inst✝ : Module R M₁
f : M →ₗ[R] M'
s : Set { x // x ∈ LinearMap.range f }
li : LinearIndependent R Subtype.val
⊢ Cardinal.{v}
[PROOFSTEP]
refine' le_ciSup (Cardinal.bddAbove_range.{v, v} _) ⟨rangeSplitting f '' s, _⟩
[GOAL]
case h.mk.a
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁶ : Ring R
M : Type v
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type v'
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
M₁ : Type v
inst✝¹ : AddCommGroup M₁
inst✝ : Module R M₁
f : M →ₗ[R] M'
s : Set { x // x ∈ LinearMap.range f }
li : LinearIndependent R Subtype.val
⊢ LinearIndependent R Subtype.val
[PROOFSTEP]
apply LinearIndependent.of_comp f.rangeRestrict
[GOAL]
case h.mk.a
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁶ : Ring R
M : Type v
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type v'
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
M₁ : Type v
inst✝¹ : AddCommGroup M₁
inst✝ : Module R M₁
f : M →ₗ[R] M'
s : Set { x // x ∈ LinearMap.range f }
li : LinearIndependent R Subtype.val
⊢ LinearIndependent R (↑(LinearMap.rangeRestrict f) ∘ Subtype.val)
[PROOFSTEP]
convert li.comp (Equiv.Set.rangeSplittingImageEquiv f s) (Equiv.injective _) using 1
[GOAL]
case h.mk.a
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁶ : Ring R
M : Type v
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type v'
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
M₁ : Type v
inst✝¹ : AddCommGroup M₁
inst✝ : Module R M₁
f : M →ₗ[R] M'
s : Set { x // x ∈ LinearMap.range f }
li : LinearIndependent R Subtype.val
⊢ lift #↑↑{ val := s, property := li } ≤
    lift #↑↑{ val := rangeSplitting ↑f '' s, property := (_ : LinearIndependent R Subtype.val) }
[PROOFSTEP]
exact (Cardinal.lift_mk_eq'.mpr ⟨Equiv.Set.rangeSplittingImageEquiv f s⟩).ge
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁶ : Ring R
M : Type v
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type v'
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
M₁ : Type v
inst✝¹ : AddCommGroup M₁
inst✝ : Module R M₁
f : M →ₗ[R] M₁
⊢ Module.rank R { x // x ∈ LinearMap.range f } ≤ Module.rank R M
[PROOFSTEP]
simpa using lift_rank_range_le f
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁶ : Ring R
M : Type v
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type v'
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
M₁ : Type v
inst✝¹ : AddCommGroup M₁
inst✝ : Module R M₁
f : M →ₗ[R] M'
p : Submodule R M
⊢ lift (Module.rank R { x // x ∈ Submodule.map f p }) ≤ lift (Module.rank R { x // x ∈ p })
[PROOFSTEP]
have h := lift_rank_range_le (f.comp (Submodule.subtype p))
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁶ : Ring R
M : Type v
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type v'
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
M₁ : Type v
inst✝¹ : AddCommGroup M₁
inst✝ : Module R M₁
f : M →ₗ[R] M'
p : Submodule R M
h :
  lift (Module.rank R { x // x ∈ LinearMap.range (LinearMap.comp f (Submodule.subtype p)) }) ≤
    lift (Module.rank R { x // x ∈ p })
⊢ lift (Module.rank R { x // x ∈ Submodule.map f p }) ≤ lift (Module.rank R { x // x ∈ p })
[PROOFSTEP]
rwa [LinearMap.range_comp, range_subtype] at h 
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁶ : Ring R
M : Type v
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type v'
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
M₁ : Type v
inst✝¹ : AddCommGroup M₁
inst✝ : Module R M₁
f : M →ₗ[R] M₁
p : Submodule R M
⊢ Module.rank R { x // x ∈ Submodule.map f p } ≤ Module.rank R { x // x ∈ p }
[PROOFSTEP]
simpa using lift_rank_map_le f p
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁶ : Ring R
M : Type v
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type v'
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
M₁ : Type v
inst✝¹ : AddCommGroup M₁
inst✝ : Module R M₁
f : M ≃ₗ[R] M'
⊢ lift (Module.rank R M) = lift (Module.rank R M')
[PROOFSTEP]
apply le_antisymm
[GOAL]
case a
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁶ : Ring R
M : Type v
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type v'
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
M₁ : Type v
inst✝¹ : AddCommGroup M₁
inst✝ : Module R M₁
f : M ≃ₗ[R] M'
⊢ lift (Module.rank R M) ≤ lift (Module.rank R M')
[PROOFSTEP]
exact f.toLinearMap.lift_rank_le_of_injective f.injective
[GOAL]
case a
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁶ : Ring R
M : Type v
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type v'
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
M₁ : Type v
inst✝¹ : AddCommGroup M₁
inst✝ : Module R M₁
f : M ≃ₗ[R] M'
⊢ lift (Module.rank R M') ≤ lift (Module.rank R M)
[PROOFSTEP]
exact f.symm.toLinearMap.lift_rank_le_of_injective f.symm.injective
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁶ : Ring R
M : Type v
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type v'
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
M₁ : Type v
inst✝¹ : AddCommGroup M₁
inst✝ : Module R M₁
⊢ Module.rank R { x // x ∈ ⊤ } = Module.rank R M
[PROOFSTEP]
have : (⊤ : Submodule R M) ≃ₗ[R] M := LinearEquiv.ofTop ⊤ rfl
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁶ : Ring R
M : Type v
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type v'
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
M₁ : Type v
inst✝¹ : AddCommGroup M₁
inst✝ : Module R M₁
this : { x // x ∈ ⊤ } ≃ₗ[R] M
⊢ Module.rank R { x // x ∈ ⊤ } = Module.rank R M
[PROOFSTEP]
rw [this.rank_eq]
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁶ : Ring R
M : Type v
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type v'
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
M₁ : Type v
inst✝¹ : AddCommGroup M₁
inst✝ : Module R M₁
f : M →ₗ[R] M'
h : Surjective ↑f
⊢ Module.rank R { x // x ∈ LinearMap.range f } = Module.rank R M'
[PROOFSTEP]
rw [LinearMap.range_eq_top.2 h, rank_top]
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁶ : Ring R
M : Type v
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type v'
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
M₁ : Type v
inst✝¹ : AddCommGroup M₁
inst✝ : Module R M₁
s : Submodule R M
⊢ Module.rank R { x // x ∈ s } ≤ Module.rank R M
[PROOFSTEP]
rw [← rank_top R M]
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁶ : Ring R
M : Type v
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type v'
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
M₁ : Type v
inst✝¹ : AddCommGroup M₁
inst✝ : Module R M₁
s : Submodule R M
⊢ Module.rank R { x // x ∈ s } ≤ Module.rank R { x // x ∈ ⊤ }
[PROOFSTEP]
exact rank_le_of_submodule _ _ le_top
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁶ : Ring R
M : Type v
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type v'
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
M₁ : Type v
inst✝¹ : AddCommGroup M₁
inst✝ : Module R M₁
f : M →ₗ[R] M₁
h : Surjective ↑f
⊢ Module.rank R M₁ ≤ Module.rank R M
[PROOFSTEP]
rw [← rank_range_of_surjective f h]
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁶ : Ring R
M : Type v
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
M' : Type v'
inst✝³ : AddCommGroup M'
inst✝² : Module R M'
M₁ : Type v
inst✝¹ : AddCommGroup M₁
inst✝ : Module R M₁
f : M →ₗ[R] M₁
h : Surjective ↑f
⊢ Module.rank R { x // x ∈ range f } ≤ Module.rank R M
[PROOFSTEP]
apply rank_range_le
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : Type w
v : ι → M
hv : LinearIndependent R v
⊢ lift #ι ≤ lift (Module.rank R M)
[PROOFSTEP]
apply le_trans
[GOAL]
case a
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : Type w
v : ι → M
hv : LinearIndependent R v
⊢ lift #ι ≤ ?b
[PROOFSTEP]
exact Cardinal.lift_mk_le'.mpr ⟨(Equiv.ofInjective _ hv.injective).toEmbedding⟩
[GOAL]
case a
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : Type w
v : ι → M
hv : LinearIndependent R v
⊢ lift #↑(range v) ≤ lift (Module.rank R M)
[PROOFSTEP]
simp only [Cardinal.lift_le, Module.rank_def]
[GOAL]
case a
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : Type w
v : ι → M
hv : LinearIndependent R v
⊢ #↑(range v) ≤ ⨆ (ι : { s // LinearIndependent R Subtype.val }), #↑↑ι
[PROOFSTEP]
apply le_trans
[GOAL]
case a.a
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : Type w
v : ι → M
hv : LinearIndependent R v
⊢ #↑(range v) ≤ ?a.b✝
case a.a
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : Type w
v : ι → M
hv : LinearIndependent R v
⊢ ?a.b✝ ≤ ⨆ (ι : { s // LinearIndependent R Subtype.val }), #↑↑ι
case a.b
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : Type w
v : ι → M
hv : LinearIndependent R v
⊢ Cardinal.{v}
[PROOFSTEP]
swap
[GOAL]
case a.a
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : Type w
v : ι → M
hv : LinearIndependent R v
⊢ ?a.b✝ ≤ ⨆ (ι : { s // LinearIndependent R Subtype.val }), #↑↑ι
[PROOFSTEP]
exact le_ciSup (Cardinal.bddAbove_range.{v, v} _) ⟨range v, hv.coe_range⟩
[GOAL]
case a.a
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : Type w
v : ι → M
hv : LinearIndependent R v
⊢ #↑(range v) ≤ #↑↑{ val := range v, property := (_ : LinearIndependent R Subtype.val) }
[PROOFSTEP]
exact le_rfl
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : Type v
v : ι → M
hv : LinearIndependent R v
⊢ #ι ≤ Module.rank R M
[PROOFSTEP]
simpa using cardinal_lift_le_rank_of_linearIndependent hv
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
⊢ Module.rank R PUnit = 0
[PROOFSTEP]
rw [← bot_eq_zero, ← le_bot_iff, Module.rank_def]
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
⊢ ⨆ (ι : { s // LinearIndependent R Subtype.val }), #↑↑ι ≤ ⊥
[PROOFSTEP]
apply ciSup_le'
[GOAL]
case h
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
⊢ ∀ (i : { s // LinearIndependent R Subtype.val }), #↑↑i ≤ ⊥
[PROOFSTEP]
rintro ⟨s, li⟩
[GOAL]
case h.mk
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
s : Set PUnit
li : LinearIndependent R Subtype.val
⊢ #↑↑{ val := s, property := li } ≤ ⊥
[PROOFSTEP]
rw [le_bot_iff, bot_eq_zero, Cardinal.mk_emptyCollection_iff, Subtype.coe_mk]
[GOAL]
case h.mk
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
s : Set PUnit
li : LinearIndependent R Subtype.val
⊢ s = ∅
[PROOFSTEP]
by_contra h
[GOAL]
case h.mk
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
s : Set PUnit
li : LinearIndependent R Subtype.val
h : ¬s = ∅
⊢ False
[PROOFSTEP]
obtain ⟨a, ha⟩ := nonempty_iff_ne_empty.2 h
[GOAL]
case h.mk.intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
s : Set PUnit
li : LinearIndependent R Subtype.val
h : ¬s = ∅
a : PUnit
ha : a ∈ s
⊢ False
[PROOFSTEP]
simpa using LinearIndependent.ne_zero (⟨a, ha⟩ : s) li
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
⊢ Module.rank R { x // x ∈ ⊥ } = 0
[PROOFSTEP]
have : (⊥ : Submodule R M) ≃ₗ[R] PUnit := botEquivPUnit
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
this : { x // x ∈ ⊥ } ≃ₗ[R] PUnit
⊢ Module.rank R { x // x ∈ ⊥ } = 0
[PROOFSTEP]
rw [this.rank_eq, rank_punit]
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
s : Submodule R M
h : 0 < Module.rank R { x // x ∈ s }
eq : s = ⊥
⊢ False
[PROOFSTEP]
rw [eq, rank_bot] at h 
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
s : Submodule R M
h : 0 < 0
eq : s = ⊥
⊢ False
[PROOFSTEP]
exact lt_irrefl _ h
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁸ : Ring R
M : Type v
inst✝⁷ : AddCommGroup M
inst✝⁶ : Module R M
M' : Type v'
inst✝⁵ : AddCommGroup M'
inst✝⁴ : Module R M'
M₁ : Type v
inst✝³ : AddCommGroup M₁
inst✝² : Module R M₁
inst✝¹ : Nontrivial R
inst✝ : IsNoetherian R M
v : ι → M
hv : LinearIndependent R v
⊢ Finite ι
[PROOFSTEP]
have hwf := isNoetherian_iff_wellFounded.mp (by infer_instance : IsNoetherian R M)
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁸ : Ring R
M : Type v
inst✝⁷ : AddCommGroup M
inst✝⁶ : Module R M
M' : Type v'
inst✝⁵ : AddCommGroup M'
inst✝⁴ : Module R M'
M₁ : Type v
inst✝³ : AddCommGroup M₁
inst✝² : Module R M₁
inst✝¹ : Nontrivial R
inst✝ : IsNoetherian R M
v : ι → M
hv : LinearIndependent R v
⊢ IsNoetherian R M
[PROOFSTEP]
infer_instance
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁸ : Ring R
M : Type v
inst✝⁷ : AddCommGroup M
inst✝⁶ : Module R M
M' : Type v'
inst✝⁵ : AddCommGroup M'
inst✝⁴ : Module R M'
M₁ : Type v
inst✝³ : AddCommGroup M₁
inst✝² : Module R M₁
inst✝¹ : Nontrivial R
inst✝ : IsNoetherian R M
v : ι → M
hv : LinearIndependent R v
hwf : WellFounded fun x x_1 => x > x_1
⊢ Finite ι
[PROOFSTEP]
refine' CompleteLattice.WellFounded.finite_of_independent hwf hv.independent_span_singleton fun i contra => _
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁸ : Ring R
M : Type v
inst✝⁷ : AddCommGroup M
inst✝⁶ : Module R M
M' : Type v'
inst✝⁵ : AddCommGroup M'
inst✝⁴ : Module R M'
M₁ : Type v
inst✝³ : AddCommGroup M₁
inst✝² : Module R M₁
inst✝¹ : Nontrivial R
inst✝ : IsNoetherian R M
v : ι → M
hv : LinearIndependent R v
hwf : WellFounded fun x x_1 => x > x_1
i : ι
contra : span R {v i} = ⊥
⊢ False
[PROOFSTEP]
apply hv.ne_zero i
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁸ : Ring R
M : Type v
inst✝⁷ : AddCommGroup M
inst✝⁶ : Module R M
M' : Type v'
inst✝⁵ : AddCommGroup M'
inst✝⁴ : Module R M'
M₁ : Type v
inst✝³ : AddCommGroup M₁
inst✝² : Module R M₁
inst✝¹ : Nontrivial R
inst✝ : IsNoetherian R M
v : ι → M
hv : LinearIndependent R v
hwf : WellFounded fun x x_1 => x > x_1
i : ι
contra : span R {v i} = ⊥
⊢ v i = 0
[PROOFSTEP]
have : v i ∈ R ∙ v i := Submodule.mem_span_singleton_self (v i)
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁸ : Ring R
M : Type v
inst✝⁷ : AddCommGroup M
inst✝⁶ : Module R M
M' : Type v'
inst✝⁵ : AddCommGroup M'
inst✝⁴ : Module R M'
M₁ : Type v
inst✝³ : AddCommGroup M₁
inst✝² : Module R M₁
inst✝¹ : Nontrivial R
inst✝ : IsNoetherian R M
v : ι → M
hv : LinearIndependent R v
hwf : WellFounded fun x x_1 => x > x_1
i : ι
contra : span R {v i} = ⊥
this : v i ∈ span R {v i}
⊢ v i = 0
[PROOFSTEP]
rwa [contra, Submodule.mem_bot] at this 
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
w : Set M
hw : Set.Finite w
s : span R w = ⊤
ι : Type w
b : Basis ι R M
⊢ Finite ι
[PROOFSTEP]
classical
haveI := hw.to_subtype
cases nonempty_fintype w
rw [← not_infinite_iff_finite]
intro i
let S : Finset ι := Finset.univ.sup fun x : w => (b.repr x).support
let bS : Set M := b '' S
have h : ∀ x ∈ w, x ∈ span R bS := by
  intro x m
  rw [← b.total_repr x, Finsupp.span_image_eq_map_total, Submodule.mem_map]
  use b.repr x
  simp only [and_true_iff, eq_self_iff_true, Finsupp.mem_supported]
  change (b.repr x).support ≤ S
  convert Finset.le_sup (α := Finset ι) (by simp : (⟨x, m⟩ : w) ∈ Finset.univ)
  rfl
    -- Thus this finite subset of the basis elements spans the entire module.
have k : span R bS = ⊤ :=
  eq_top_iff.2
    (le_trans s.ge (span_le.2 h))
      -- Now there is some `x : ι` not in `S`, since `ι` is infinite.
obtain ⟨x, nm⟩ := Infinite.exists_not_mem_finset S
have k' : b x ∈ span R bS := by
  rw [k]
  exact mem_top
refine' b.linearIndependent.not_mem_span_image _ k'
exact nm
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
w : Set M
hw : Set.Finite w
s : span R w = ⊤
ι : Type w
b : Basis ι R M
⊢ Finite ι
[PROOFSTEP]
haveI := hw.to_subtype
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
w : Set M
hw : Set.Finite w
s : span R w = ⊤
ι : Type w
b : Basis ι R M
this : Finite ↑w
⊢ Finite ι
[PROOFSTEP]
cases nonempty_fintype w
[GOAL]
case intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
w : Set M
hw : Set.Finite w
s : span R w = ⊤
ι : Type w
b : Basis ι R M
this : Finite ↑w
val✝ : Fintype ↑w
⊢ Finite ι
[PROOFSTEP]
rw [← not_infinite_iff_finite]
[GOAL]
case intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
w : Set M
hw : Set.Finite w
s : span R w = ⊤
ι : Type w
b : Basis ι R M
this : Finite ↑w
val✝ : Fintype ↑w
⊢ ¬Infinite ι
[PROOFSTEP]
intro i
[GOAL]
case intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
w : Set M
hw : Set.Finite w
s : span R w = ⊤
ι : Type w
b : Basis ι R M
this : Finite ↑w
val✝ : Fintype ↑w
i : Infinite ι
⊢ False
[PROOFSTEP]
let S : Finset ι := Finset.univ.sup fun x : w => (b.repr x).support
[GOAL]
case intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
w : Set M
hw : Set.Finite w
s : span R w = ⊤
ι : Type w
b : Basis ι R M
this : Finite ↑w
val✝ : Fintype ↑w
i : Infinite ι
S : Finset ι := Finset.sup Finset.univ fun x => (↑b.repr ↑x).support
⊢ False
[PROOFSTEP]
let bS : Set M := b '' S
[GOAL]
case intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
w : Set M
hw : Set.Finite w
s : span R w = ⊤
ι : Type w
b : Basis ι R M
this : Finite ↑w
val✝ : Fintype ↑w
i : Infinite ι
S : Finset ι := Finset.sup Finset.univ fun x => (↑b.repr ↑x).support
bS : Set M := ↑b '' ↑S
⊢ False
[PROOFSTEP]
have h : ∀ x ∈ w, x ∈ span R bS := by
  intro x m
  rw [← b.total_repr x, Finsupp.span_image_eq_map_total, Submodule.mem_map]
  use b.repr x
  simp only [and_true_iff, eq_self_iff_true, Finsupp.mem_supported]
  change (b.repr x).support ≤ S
  convert Finset.le_sup (α := Finset ι) (by simp : (⟨x, m⟩ : w) ∈ Finset.univ)
  rfl
    -- Thus this finite subset of the basis elements spans the entire module.
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
w : Set M
hw : Set.Finite w
s : span R w = ⊤
ι : Type w
b : Basis ι R M
this : Finite ↑w
val✝ : Fintype ↑w
i : Infinite ι
S : Finset ι := Finset.sup Finset.univ fun x => (↑b.repr ↑x).support
bS : Set M := ↑b '' ↑S
⊢ ∀ (x : M), x ∈ w → x ∈ span R bS
[PROOFSTEP]
intro x m
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
w : Set M
hw : Set.Finite w
s : span R w = ⊤
ι : Type w
b : Basis ι R M
this : Finite ↑w
val✝ : Fintype ↑w
i : Infinite ι
S : Finset ι := Finset.sup Finset.univ fun x => (↑b.repr ↑x).support
bS : Set M := ↑b '' ↑S
x : M
m : x ∈ w
⊢ x ∈ span R bS
[PROOFSTEP]
rw [← b.total_repr x, Finsupp.span_image_eq_map_total, Submodule.mem_map]
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
w : Set M
hw : Set.Finite w
s : span R w = ⊤
ι : Type w
b : Basis ι R M
this : Finite ↑w
val✝ : Fintype ↑w
i : Infinite ι
S : Finset ι := Finset.sup Finset.univ fun x => (↑b.repr ↑x).support
bS : Set M := ↑b '' ↑S
x : M
m : x ∈ w
⊢ ∃ y, y ∈ Finsupp.supported R R ↑S ∧ ↑(Finsupp.total ι M R ↑b) y = ↑(Finsupp.total ι M R ↑b) (↑b.repr x)
[PROOFSTEP]
use b.repr x
[GOAL]
case h
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
w : Set M
hw : Set.Finite w
s : span R w = ⊤
ι : Type w
b : Basis ι R M
this : Finite ↑w
val✝ : Fintype ↑w
i : Infinite ι
S : Finset ι := Finset.sup Finset.univ fun x => (↑b.repr ↑x).support
bS : Set M := ↑b '' ↑S
x : M
m : x ∈ w
⊢ ↑b.repr x ∈ Finsupp.supported R R ↑S ∧ ↑(Finsupp.total ι M R ↑b) (↑b.repr x) = ↑(Finsupp.total ι M R ↑b) (↑b.repr x)
[PROOFSTEP]
simp only [and_true_iff, eq_self_iff_true, Finsupp.mem_supported]
[GOAL]
case h
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
w : Set M
hw : Set.Finite w
s : span R w = ⊤
ι : Type w
b : Basis ι R M
this : Finite ↑w
val✝ : Fintype ↑w
i : Infinite ι
S : Finset ι := Finset.sup Finset.univ fun x => (↑b.repr ↑x).support
bS : Set M := ↑b '' ↑S
x : M
m : x ∈ w
⊢ ↑(↑b.repr x).support ⊆ ↑(Finset.sup Finset.univ fun x => (↑b.repr ↑x).support)
[PROOFSTEP]
change (b.repr x).support ≤ S
[GOAL]
case h
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
w : Set M
hw : Set.Finite w
s : span R w = ⊤
ι : Type w
b : Basis ι R M
this : Finite ↑w
val✝ : Fintype ↑w
i : Infinite ι
S : Finset ι := Finset.sup Finset.univ fun x => (↑b.repr ↑x).support
bS : Set M := ↑b '' ↑S
x : M
m : x ∈ w
⊢ (↑b.repr x).support ≤ S
[PROOFSTEP]
convert Finset.le_sup (α := Finset ι) (by simp : (⟨x, m⟩ : w) ∈ Finset.univ)
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
w : Set M
hw : Set.Finite w
s : span R w = ⊤
ι : Type w
b : Basis ι R M
this : Finite ↑w
val✝ : Fintype ↑w
i : Infinite ι
S : Finset ι := Finset.sup Finset.univ fun x => (↑b.repr ↑x).support
bS : Set M := ↑b '' ↑S
x : M
m : x ∈ w
⊢ { val := x, property := m } ∈ Finset.univ
[PROOFSTEP]
simp
[GOAL]
case h.e'_3
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
w : Set M
hw : Set.Finite w
s : span R w = ⊤
ι : Type w
b : Basis ι R M
this : Finite ↑w
val✝ : Fintype ↑w
i : Infinite ι
S : Finset ι := Finset.sup Finset.univ fun x => (↑b.repr ↑x).support
bS : Set M := ↑b '' ↑S
x : M
m : x ∈ w
⊢ (↑b.repr x).support = (↑b.repr ↑{ val := x, property := m }).support
[PROOFSTEP]
rfl
  -- Thus this finite subset of the basis elements spans the entire module.
[GOAL]
case intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
w : Set M
hw : Set.Finite w
s : span R w = ⊤
ι : Type w
b : Basis ι R M
this : Finite ↑w
val✝ : Fintype ↑w
i : Infinite ι
S : Finset ι := Finset.sup Finset.univ fun x => (↑b.repr ↑x).support
bS : Set M := ↑b '' ↑S
h : ∀ (x : M), x ∈ w → x ∈ span R bS
⊢ False
[PROOFSTEP]
have k : span R bS = ⊤ :=
  eq_top_iff.2
    (le_trans s.ge (span_le.2 h))
      -- Now there is some `x : ι` not in `S`, since `ι` is infinite.
[GOAL]
case intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
w : Set M
hw : Set.Finite w
s : span R w = ⊤
ι : Type w
b : Basis ι R M
this : Finite ↑w
val✝ : Fintype ↑w
i : Infinite ι
S : Finset ι := Finset.sup Finset.univ fun x => (↑b.repr ↑x).support
bS : Set M := ↑b '' ↑S
h : ∀ (x : M), x ∈ w → x ∈ span R bS
k : span R bS = ⊤
⊢ False
[PROOFSTEP]
obtain ⟨x, nm⟩ := Infinite.exists_not_mem_finset S
[GOAL]
case intro.intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
w : Set M
hw : Set.Finite w
s : span R w = ⊤
ι : Type w
b : Basis ι R M
this : Finite ↑w
val✝ : Fintype ↑w
i : Infinite ι
S : Finset ι := Finset.sup Finset.univ fun x => (↑b.repr ↑x).support
bS : Set M := ↑b '' ↑S
h : ∀ (x : M), x ∈ w → x ∈ span R bS
k : span R bS = ⊤
x : ι
nm : ¬x ∈ S
⊢ False
[PROOFSTEP]
have k' : b x ∈ span R bS := by
  rw [k]
  exact mem_top
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
w : Set M
hw : Set.Finite w
s : span R w = ⊤
ι : Type w
b : Basis ι R M
this : Finite ↑w
val✝ : Fintype ↑w
i : Infinite ι
S : Finset ι := Finset.sup Finset.univ fun x => (↑b.repr ↑x).support
bS : Set M := ↑b '' ↑S
h : ∀ (x : M), x ∈ w → x ∈ span R bS
k : span R bS = ⊤
x : ι
nm : ¬x ∈ S
⊢ ↑b x ∈ span R bS
[PROOFSTEP]
rw [k]
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
w : Set M
hw : Set.Finite w
s : span R w = ⊤
ι : Type w
b : Basis ι R M
this : Finite ↑w
val✝ : Fintype ↑w
i : Infinite ι
S : Finset ι := Finset.sup Finset.univ fun x => (↑b.repr ↑x).support
bS : Set M := ↑b '' ↑S
h : ∀ (x : M), x ∈ w → x ∈ span R bS
k : span R bS = ⊤
x : ι
nm : ¬x ∈ S
⊢ ↑b x ∈ ⊤
[PROOFSTEP]
exact mem_top
[GOAL]
case intro.intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
w : Set M
hw : Set.Finite w
s : span R w = ⊤
ι : Type w
b : Basis ι R M
this : Finite ↑w
val✝ : Fintype ↑w
i : Infinite ι
S : Finset ι := Finset.sup Finset.univ fun x => (↑b.repr ↑x).support
bS : Set M := ↑b '' ↑S
h : ∀ (x : M), x ∈ w → x ∈ span R bS
k : span R bS = ⊤
x : ι
nm : ¬x ∈ S
k' : ↑b x ∈ span R bS
⊢ False
[PROOFSTEP]
refine' b.linearIndependent.not_mem_span_image _ k'
[GOAL]
case intro.intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
w : Set M
hw : Set.Finite w
s : span R w = ⊤
ι : Type w
b : Basis ι R M
this : Finite ↑w
val✝ : Fintype ↑w
i : Infinite ι
S : Finset ι := Finset.sup Finset.univ fun x => (↑b.repr ↑x).support
bS : Set M := ↑b '' ↑S
h : ∀ (x : M), x ∈ w → x ∈ span R bS
k : span R bS = ⊤
x : ι
nm : ¬x ∈ S
k' : ↑b x ∈ span R bS
⊢ ¬x ∈ ↑S
[PROOFSTEP]
exact nm
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : LinearIndependent.Maximal i
⊢ ⋃ (k : κ), ↑(↑b.repr (v k)).support = Set.univ
[PROOFSTEP]
by_contra h
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : LinearIndependent.Maximal i
h : ¬⋃ (k : κ), ↑(↑b.repr (v k)).support = Set.univ
⊢ False
[PROOFSTEP]
simp only [← Ne.def, ne_univ_iff_exists_not_mem, mem_iUnion, not_exists_not, Finsupp.mem_support_iff, Finset.mem_coe] at
  h 
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : LinearIndependent.Maximal i
h : ∃ a, ∀ (x : κ), ↑(↑b.repr (v x)) a = 0
⊢ False
[PROOFSTEP]
obtain ⟨b', w⟩ := h
[GOAL]
case intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : LinearIndependent.Maximal i
b' : ι
w : ∀ (x : κ), ↑(↑b.repr (v x)) b' = 0
⊢ False
[PROOFSTEP]
let v' : Option κ → M := fun o => o.elim (b b') v
[GOAL]
case intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : LinearIndependent.Maximal i
b' : ι
w : ∀ (x : κ), ↑(↑b.repr (v x)) b' = 0
v' : Option κ → M := fun o => Option.elim o (↑b b') v
⊢ False
[PROOFSTEP]
have r : range v ⊆ range v' := by
  rintro - ⟨k, rfl⟩
  use some k
  rfl
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : LinearIndependent.Maximal i
b' : ι
w : ∀ (x : κ), ↑(↑b.repr (v x)) b' = 0
v' : Option κ → M := fun o => Option.elim o (↑b b') v
⊢ range v ⊆ range v'
[PROOFSTEP]
rintro - ⟨k, rfl⟩
[GOAL]
case intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : LinearIndependent.Maximal i
b' : ι
w : ∀ (x : κ), ↑(↑b.repr (v x)) b' = 0
v' : Option κ → M := fun o => Option.elim o (↑b b') v
k : κ
⊢ v k ∈ range v'
[PROOFSTEP]
use some k
[GOAL]
case h
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : LinearIndependent.Maximal i
b' : ι
w : ∀ (x : κ), ↑(↑b.repr (v x)) b' = 0
v' : Option κ → M := fun o => Option.elim o (↑b b') v
k : κ
⊢ v' (some k) = v k
[PROOFSTEP]
rfl
[GOAL]
case intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : LinearIndependent.Maximal i
b' : ι
w : ∀ (x : κ), ↑(↑b.repr (v x)) b' = 0
v' : Option κ → M := fun o => Option.elim o (↑b b') v
r : range v ⊆ range v'
⊢ False
[PROOFSTEP]
have r' : b b' ∉ range v := by
  rintro ⟨k, p⟩
  simpa [w] using congr_arg (fun m => (b.repr m) b') p
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : LinearIndependent.Maximal i
b' : ι
w : ∀ (x : κ), ↑(↑b.repr (v x)) b' = 0
v' : Option κ → M := fun o => Option.elim o (↑b b') v
r : range v ⊆ range v'
⊢ ¬↑b b' ∈ range v
[PROOFSTEP]
rintro ⟨k, p⟩
[GOAL]
case intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : LinearIndependent.Maximal i
b' : ι
w : ∀ (x : κ), ↑(↑b.repr (v x)) b' = 0
v' : Option κ → M := fun o => Option.elim o (↑b b') v
r : range v ⊆ range v'
k : κ
p : v k = ↑b b'
⊢ False
[PROOFSTEP]
simpa [w] using congr_arg (fun m => (b.repr m) b') p
[GOAL]
case intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : LinearIndependent.Maximal i
b' : ι
w : ∀ (x : κ), ↑(↑b.repr (v x)) b' = 0
v' : Option κ → M := fun o => Option.elim o (↑b b') v
r : range v ⊆ range v'
r' : ¬↑b b' ∈ range v
⊢ False
[PROOFSTEP]
have r'' : range v ≠ range v' := by
  intro e
  have p : b b' ∈ range v' := by
    use none
    rfl
  rw [← e] at p 
  exact r' p
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : LinearIndependent.Maximal i
b' : ι
w : ∀ (x : κ), ↑(↑b.repr (v x)) b' = 0
v' : Option κ → M := fun o => Option.elim o (↑b b') v
r : range v ⊆ range v'
r' : ¬↑b b' ∈ range v
⊢ range v ≠ range v'
[PROOFSTEP]
intro e
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : LinearIndependent.Maximal i
b' : ι
w : ∀ (x : κ), ↑(↑b.repr (v x)) b' = 0
v' : Option κ → M := fun o => Option.elim o (↑b b') v
r : range v ⊆ range v'
r' : ¬↑b b' ∈ range v
e : range v = range v'
⊢ False
[PROOFSTEP]
have p : b b' ∈ range v' := by
  use none
  rfl
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : LinearIndependent.Maximal i
b' : ι
w : ∀ (x : κ), ↑(↑b.repr (v x)) b' = 0
v' : Option κ → M := fun o => Option.elim o (↑b b') v
r : range v ⊆ range v'
r' : ¬↑b b' ∈ range v
e : range v = range v'
⊢ ↑b b' ∈ range v'
[PROOFSTEP]
use none
[GOAL]
case h
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : LinearIndependent.Maximal i
b' : ι
w : ∀ (x : κ), ↑(↑b.repr (v x)) b' = 0
v' : Option κ → M := fun o => Option.elim o (↑b b') v
r : range v ⊆ range v'
r' : ¬↑b b' ∈ range v
e : range v = range v'
⊢ v' none = ↑b b'
[PROOFSTEP]
rfl
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : LinearIndependent.Maximal i
b' : ι
w : ∀ (x : κ), ↑(↑b.repr (v x)) b' = 0
v' : Option κ → M := fun o => Option.elim o (↑b b') v
r : range v ⊆ range v'
r' : ¬↑b b' ∈ range v
e : range v = range v'
p : ↑b b' ∈ range v'
⊢ False
[PROOFSTEP]
rw [← e] at p 
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : LinearIndependent.Maximal i
b' : ι
w : ∀ (x : κ), ↑(↑b.repr (v x)) b' = 0
v' : Option κ → M := fun o => Option.elim o (↑b b') v
r : range v ⊆ range v'
r' : ¬↑b b' ∈ range v
e : range v = range v'
p : ↑b b' ∈ range v
⊢ False
[PROOFSTEP]
exact r' p
[GOAL]
case intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : LinearIndependent.Maximal i
b' : ι
w : ∀ (x : κ), ↑(↑b.repr (v x)) b' = 0
v' : Option κ → M := fun o => Option.elim o (↑b b') v
r : range v ⊆ range v'
r' : ¬↑b b' ∈ range v
r'' : range v ≠ range v'
⊢ False
[PROOFSTEP]
have inj' : Injective v' := by
  rintro (_ | k) (_ | k) z
  · rfl
  · exfalso
    exact r' ⟨k, z.symm⟩
  · exfalso
    exact r' ⟨k, z⟩
  · congr
    exact i.injective z
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : LinearIndependent.Maximal i
b' : ι
w : ∀ (x : κ), ↑(↑b.repr (v x)) b' = 0
v' : Option κ → M := fun o => Option.elim o (↑b b') v
r : range v ⊆ range v'
r' : ¬↑b b' ∈ range v
r'' : range v ≠ range v'
⊢ Injective v'
[PROOFSTEP]
rintro (_ | k) (_ | k) z
[GOAL]
case none.none
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : LinearIndependent.Maximal i
b' : ι
w : ∀ (x : κ), ↑(↑b.repr (v x)) b' = 0
v' : Option κ → M := fun o => Option.elim o (↑b b') v
r : range v ⊆ range v'
r' : ¬↑b b' ∈ range v
r'' : range v ≠ range v'
z : v' none = v' none
⊢ none = none
[PROOFSTEP]
rfl
[GOAL]
case none.some
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : LinearIndependent.Maximal i
b' : ι
w : ∀ (x : κ), ↑(↑b.repr (v x)) b' = 0
v' : Option κ → M := fun o => Option.elim o (↑b b') v
r : range v ⊆ range v'
r' : ¬↑b b' ∈ range v
r'' : range v ≠ range v'
k : κ
z : v' none = v' (some k)
⊢ none = some k
[PROOFSTEP]
exfalso
[GOAL]
case none.some.h
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : LinearIndependent.Maximal i
b' : ι
w : ∀ (x : κ), ↑(↑b.repr (v x)) b' = 0
v' : Option κ → M := fun o => Option.elim o (↑b b') v
r : range v ⊆ range v'
r' : ¬↑b b' ∈ range v
r'' : range v ≠ range v'
k : κ
z : v' none = v' (some k)
⊢ False
[PROOFSTEP]
exact r' ⟨k, z.symm⟩
[GOAL]
case some.none
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : LinearIndependent.Maximal i
b' : ι
w : ∀ (x : κ), ↑(↑b.repr (v x)) b' = 0
v' : Option κ → M := fun o => Option.elim o (↑b b') v
r : range v ⊆ range v'
r' : ¬↑b b' ∈ range v
r'' : range v ≠ range v'
k : κ
z : v' (some k) = v' none
⊢ some k = none
[PROOFSTEP]
exfalso
[GOAL]
case some.none.h
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : LinearIndependent.Maximal i
b' : ι
w : ∀ (x : κ), ↑(↑b.repr (v x)) b' = 0
v' : Option κ → M := fun o => Option.elim o (↑b b') v
r : range v ⊆ range v'
r' : ¬↑b b' ∈ range v
r'' : range v ≠ range v'
k : κ
z : v' (some k) = v' none
⊢ False
[PROOFSTEP]
exact r' ⟨k, z⟩
[GOAL]
case some.some
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : LinearIndependent.Maximal i
b' : ι
w : ∀ (x : κ), ↑(↑b.repr (v x)) b' = 0
v' : Option κ → M := fun o => Option.elim o (↑b b') v
r : range v ⊆ range v'
r' : ¬↑b b' ∈ range v
r'' : range v ≠ range v'
k✝ k : κ
z : v' (some k✝) = v' (some k)
⊢ some k✝ = some k
[PROOFSTEP]
congr
[GOAL]
case some.some.e_val
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : LinearIndependent.Maximal i
b' : ι
w : ∀ (x : κ), ↑(↑b.repr (v x)) b' = 0
v' : Option κ → M := fun o => Option.elim o (↑b b') v
r : range v ⊆ range v'
r' : ¬↑b b' ∈ range v
r'' : range v ≠ range v'
k✝ k : κ
z : v' (some k✝) = v' (some k)
⊢ k✝ = k
[PROOFSTEP]
exact i.injective z
[GOAL]
case intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : LinearIndependent.Maximal i
b' : ι
w : ∀ (x : κ), ↑(↑b.repr (v x)) b' = 0
v' : Option κ → M := fun o => Option.elim o (↑b b') v
r : range v ⊆ range v'
r' : ¬↑b b' ∈ range v
r'' : range v ≠ range v'
inj' : Injective v'
⊢ False
[PROOFSTEP]
have i' : LinearIndependent R ((↑) : range v' → M) :=
  by
  rw [linearIndependent_subtype_range inj', linearIndependent_iff]
  intro l z
  rw [Finsupp.total_option] at z 
  simp only [Option.elim'] at z 
  change _ + Finsupp.total κ M R v l.some = 0 at z 
  have l₀ : l none = 0 := by
    rw [← eq_neg_iff_add_eq_zero] at z 
    replace z := neg_eq_iff_eq_neg.mpr z
    apply_fun fun x => b.repr x b' at z 
    simp only [repr_self, LinearEquiv.map_smul, mul_one, Finsupp.single_eq_same, Pi.neg_apply, Finsupp.smul_single',
      LinearEquiv.map_neg, Finsupp.coe_neg] at z 
    erw [FunLike.congr_fun (Finsupp.apply_total R (b.repr : M →ₗ[R] ι →₀ R) v l.some) b'] at z 
    simpa [Finsupp.total_apply, w] using z
  have l₁ : l.some = 0 := by
    rw [l₀, zero_smul, zero_add] at z 
    exact linearIndependent_iff.mp i _ z
  ext (_ | a)
  · simp only [l₀, Finsupp.coe_zero, Pi.zero_apply]
  · erw [FunLike.congr_fun l₁ a]
    simp only [Finsupp.coe_zero, Pi.zero_apply]
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : LinearIndependent.Maximal i
b' : ι
w : ∀ (x : κ), ↑(↑b.repr (v x)) b' = 0
v' : Option κ → M := fun o => Option.elim o (↑b b') v
r : range v ⊆ range v'
r' : ¬↑b b' ∈ range v
r'' : range v ≠ range v'
inj' : Injective v'
⊢ LinearIndependent R Subtype.val
[PROOFSTEP]
rw [linearIndependent_subtype_range inj', linearIndependent_iff]
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : LinearIndependent.Maximal i
b' : ι
w : ∀ (x : κ), ↑(↑b.repr (v x)) b' = 0
v' : Option κ → M := fun o => Option.elim o (↑b b') v
r : range v ⊆ range v'
r' : ¬↑b b' ∈ range v
r'' : range v ≠ range v'
inj' : Injective v'
⊢ ∀ (l : Option κ →₀ R), ↑(Finsupp.total (Option κ) M R v') l = 0 → l = 0
[PROOFSTEP]
intro l z
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : LinearIndependent.Maximal i
b' : ι
w : ∀ (x : κ), ↑(↑b.repr (v x)) b' = 0
v' : Option κ → M := fun o => Option.elim o (↑b b') v
r : range v ⊆ range v'
r' : ¬↑b b' ∈ range v
r'' : range v ≠ range v'
inj' : Injective v'
l : Option κ →₀ R
z : ↑(Finsupp.total (Option κ) M R v') l = 0
⊢ l = 0
[PROOFSTEP]
rw [Finsupp.total_option] at z 
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : LinearIndependent.Maximal i
b' : ι
w : ∀ (x : κ), ↑(↑b.repr (v x)) b' = 0
v' : Option κ → M := fun o => Option.elim o (↑b b') v
r : range v ⊆ range v'
r' : ¬↑b b' ∈ range v
r'' : range v ≠ range v'
inj' : Injective v'
l : Option κ →₀ R
z : ↑l none • v' none + ↑(Finsupp.total κ M R (v' ∘ some)) (Finsupp.some l) = 0
⊢ l = 0
[PROOFSTEP]
simp only [Option.elim'] at z 
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : LinearIndependent.Maximal i
b' : ι
w : ∀ (x : κ), ↑(↑b.repr (v x)) b' = 0
v' : Option κ → M := fun o => Option.elim o (↑b b') v
r : range v ⊆ range v'
r' : ¬↑b b' ∈ range v
r'' : range v ≠ range v'
inj' : Injective v'
l : Option κ →₀ R
z :
  ↑l none • Option.elim none (↑b b') v +
      ↑(Finsupp.total κ M R ((fun o => Option.elim o (↑b b') v) ∘ some)) (Finsupp.some l) =
    0
⊢ l = 0
[PROOFSTEP]
change _ + Finsupp.total κ M R v l.some = 0 at z 
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : LinearIndependent.Maximal i
b' : ι
w : ∀ (x : κ), ↑(↑b.repr (v x)) b' = 0
v' : Option κ → M := fun o => Option.elim o (↑b b') v
r : range v ⊆ range v'
r' : ¬↑b b' ∈ range v
r'' : range v ≠ range v'
inj' : Injective v'
l : Option κ →₀ R
z : ↑l none • Option.elim none (↑b b') v + ↑(Finsupp.total κ M R v) (Finsupp.some l) = 0
⊢ l = 0
[PROOFSTEP]
have l₀ : l none = 0 := by
  rw [← eq_neg_iff_add_eq_zero] at z 
  replace z := neg_eq_iff_eq_neg.mpr z
  apply_fun fun x => b.repr x b' at z 
  simp only [repr_self, LinearEquiv.map_smul, mul_one, Finsupp.single_eq_same, Pi.neg_apply, Finsupp.smul_single',
    LinearEquiv.map_neg, Finsupp.coe_neg] at z 
  erw [FunLike.congr_fun (Finsupp.apply_total R (b.repr : M →ₗ[R] ι →₀ R) v l.some) b'] at z 
  simpa [Finsupp.total_apply, w] using z
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : LinearIndependent.Maximal i
b' : ι
w : ∀ (x : κ), ↑(↑b.repr (v x)) b' = 0
v' : Option κ → M := fun o => Option.elim o (↑b b') v
r : range v ⊆ range v'
r' : ¬↑b b' ∈ range v
r'' : range v ≠ range v'
inj' : Injective v'
l : Option κ →₀ R
z : ↑l none • Option.elim none (↑b b') v + ↑(Finsupp.total κ M R v) (Finsupp.some l) = 0
⊢ ↑l none = 0
[PROOFSTEP]
rw [← eq_neg_iff_add_eq_zero] at z 
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : LinearIndependent.Maximal i
b' : ι
w : ∀ (x : κ), ↑(↑b.repr (v x)) b' = 0
v' : Option κ → M := fun o => Option.elim o (↑b b') v
r : range v ⊆ range v'
r' : ¬↑b b' ∈ range v
r'' : range v ≠ range v'
inj' : Injective v'
l : Option κ →₀ R
z : ↑l none • Option.elim none (↑b b') v = -↑(Finsupp.total κ M R v) (Finsupp.some l)
⊢ ↑l none = 0
[PROOFSTEP]
replace z := neg_eq_iff_eq_neg.mpr z
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : LinearIndependent.Maximal i
b' : ι
w : ∀ (x : κ), ↑(↑b.repr (v x)) b' = 0
v' : Option κ → M := fun o => Option.elim o (↑b b') v
r : range v ⊆ range v'
r' : ¬↑b b' ∈ range v
r'' : range v ≠ range v'
inj' : Injective v'
l : Option κ →₀ R
z : -(↑l none • Option.elim none (↑b b') v) = ↑(Finsupp.total κ M R v) (Finsupp.some l)
⊢ ↑l none = 0
[PROOFSTEP]
apply_fun fun x => b.repr x b' at z 
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : LinearIndependent.Maximal i
b' : ι
w : ∀ (x : κ), ↑(↑b.repr (v x)) b' = 0
v' : Option κ → M := fun o => Option.elim o (↑b b') v
r : range v ⊆ range v'
r' : ¬↑b b' ∈ range v
r'' : range v ≠ range v'
inj' : Injective v'
l : Option κ →₀ R
z : ↑(↑b.repr (-(↑l none • Option.elim none (↑b b') v))) b' = ↑(↑b.repr (↑(Finsupp.total κ M R v) (Finsupp.some l))) b'
⊢ ↑l none = 0
[PROOFSTEP]
simp only [repr_self, LinearEquiv.map_smul, mul_one, Finsupp.single_eq_same, Pi.neg_apply, Finsupp.smul_single',
  LinearEquiv.map_neg, Finsupp.coe_neg] at z 
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : LinearIndependent.Maximal i
b' : ι
w : ∀ (x : κ), ↑(↑b.repr (v x)) b' = 0
v' : Option κ → M := fun o => Option.elim o (↑b b') v
r : range v ⊆ range v'
r' : ¬↑b b' ∈ range v
r'' : range v ≠ range v'
inj' : Injective v'
l : Option κ →₀ R
z : -↑(↑l none • ↑b.repr (Option.elim none (↑b b') v)) b' = ↑(↑b.repr (↑(Finsupp.total κ M R v) (Finsupp.some l))) b'
⊢ ↑l none = 0
[PROOFSTEP]
erw [FunLike.congr_fun (Finsupp.apply_total R (b.repr : M →ₗ[R] ι →₀ R) v l.some) b'] at z 
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : LinearIndependent.Maximal i
b' : ι
w : ∀ (x : κ), ↑(↑b.repr (v x)) b' = 0
v' : Option κ → M := fun o => Option.elim o (↑b b') v
r : range v ⊆ range v'
r' : ¬↑b b' ∈ range v
r'' : range v ≠ range v'
inj' : Injective v'
l : Option κ →₀ R
z :
  -↑(↑l none • ↑b.repr (Option.elim none (↑b b') v)) b' =
    ↑(↑(Finsupp.total κ (ι →₀ R) R (↑↑b.repr ∘ v)) (Finsupp.some l)) b'
⊢ ↑l none = 0
[PROOFSTEP]
simpa [Finsupp.total_apply, w] using z
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : LinearIndependent.Maximal i
b' : ι
w : ∀ (x : κ), ↑(↑b.repr (v x)) b' = 0
v' : Option κ → M := fun o => Option.elim o (↑b b') v
r : range v ⊆ range v'
r' : ¬↑b b' ∈ range v
r'' : range v ≠ range v'
inj' : Injective v'
l : Option κ →₀ R
z : ↑l none • Option.elim none (↑b b') v + ↑(Finsupp.total κ M R v) (Finsupp.some l) = 0
l₀ : ↑l none = 0
⊢ l = 0
[PROOFSTEP]
have l₁ : l.some = 0 := by
  rw [l₀, zero_smul, zero_add] at z 
  exact linearIndependent_iff.mp i _ z
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : LinearIndependent.Maximal i
b' : ι
w : ∀ (x : κ), ↑(↑b.repr (v x)) b' = 0
v' : Option κ → M := fun o => Option.elim o (↑b b') v
r : range v ⊆ range v'
r' : ¬↑b b' ∈ range v
r'' : range v ≠ range v'
inj' : Injective v'
l : Option κ →₀ R
z : ↑l none • Option.elim none (↑b b') v + ↑(Finsupp.total κ M R v) (Finsupp.some l) = 0
l₀ : ↑l none = 0
⊢ Finsupp.some l = 0
[PROOFSTEP]
rw [l₀, zero_smul, zero_add] at z 
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : LinearIndependent.Maximal i
b' : ι
w : ∀ (x : κ), ↑(↑b.repr (v x)) b' = 0
v' : Option κ → M := fun o => Option.elim o (↑b b') v
r : range v ⊆ range v'
r' : ¬↑b b' ∈ range v
r'' : range v ≠ range v'
inj' : Injective v'
l : Option κ →₀ R
z : ↑(Finsupp.total κ M R v) (Finsupp.some l) = 0
l₀ : ↑l none = 0
⊢ Finsupp.some l = 0
[PROOFSTEP]
exact linearIndependent_iff.mp i _ z
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : LinearIndependent.Maximal i
b' : ι
w : ∀ (x : κ), ↑(↑b.repr (v x)) b' = 0
v' : Option κ → M := fun o => Option.elim o (↑b b') v
r : range v ⊆ range v'
r' : ¬↑b b' ∈ range v
r'' : range v ≠ range v'
inj' : Injective v'
l : Option κ →₀ R
z : ↑l none • Option.elim none (↑b b') v + ↑(Finsupp.total κ M R v) (Finsupp.some l) = 0
l₀ : ↑l none = 0
l₁ : Finsupp.some l = 0
⊢ l = 0
[PROOFSTEP]
ext (_ | a)
[GOAL]
case h.none
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : LinearIndependent.Maximal i
b' : ι
w : ∀ (x : κ), ↑(↑b.repr (v x)) b' = 0
v' : Option κ → M := fun o => Option.elim o (↑b b') v
r : range v ⊆ range v'
r' : ¬↑b b' ∈ range v
r'' : range v ≠ range v'
inj' : Injective v'
l : Option κ →₀ R
z : ↑l none • Option.elim none (↑b b') v + ↑(Finsupp.total κ M R v) (Finsupp.some l) = 0
l₀ : ↑l none = 0
l₁ : Finsupp.some l = 0
⊢ ↑l none = ↑0 none
[PROOFSTEP]
simp only [l₀, Finsupp.coe_zero, Pi.zero_apply]
[GOAL]
case h.some
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : LinearIndependent.Maximal i
b' : ι
w : ∀ (x : κ), ↑(↑b.repr (v x)) b' = 0
v' : Option κ → M := fun o => Option.elim o (↑b b') v
r : range v ⊆ range v'
r' : ¬↑b b' ∈ range v
r'' : range v ≠ range v'
inj' : Injective v'
l : Option κ →₀ R
z : ↑l none • Option.elim none (↑b b') v + ↑(Finsupp.total κ M R v) (Finsupp.some l) = 0
l₀ : ↑l none = 0
l₁ : Finsupp.some l = 0
a : κ
⊢ ↑l (some a) = ↑0 (some a)
[PROOFSTEP]
erw [FunLike.congr_fun l₁ a]
[GOAL]
case h.some
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : LinearIndependent.Maximal i
b' : ι
w : ∀ (x : κ), ↑(↑b.repr (v x)) b' = 0
v' : Option κ → M := fun o => Option.elim o (↑b b') v
r : range v ⊆ range v'
r' : ¬↑b b' ∈ range v
r'' : range v ≠ range v'
inj' : Injective v'
l : Option κ →₀ R
z : ↑l none • Option.elim none (↑b b') v + ↑(Finsupp.total κ M R v) (Finsupp.some l) = 0
l₀ : ↑l none = 0
l₁ : Finsupp.some l = 0
a : κ
⊢ ↑0 a = ↑0 (some a)
[PROOFSTEP]
simp only [Finsupp.coe_zero, Pi.zero_apply]
[GOAL]
case intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : LinearIndependent.Maximal i
b' : ι
w : ∀ (x : κ), ↑(↑b.repr (v x)) b' = 0
v' : Option κ → M := fun o => Option.elim o (↑b b') v
r : range v ⊆ range v'
r' : ¬↑b b' ∈ range v
r'' : range v ≠ range v'
inj' : Injective v'
i' : LinearIndependent R Subtype.val
⊢ False
[PROOFSTEP]
dsimp [LinearIndependent.Maximal] at m 
[GOAL]
case intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : Type w
b : Basis ι R M
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : ∀ (s : Set M), LinearIndependent R Subtype.val → range v ⊆ s → range v = s
b' : ι
w : ∀ (x : κ), ↑(↑b.repr (v x)) b' = 0
v' : Option κ → M := fun o => Option.elim o (↑b b') v
r : range v ⊆ range v'
r' : ¬↑b b' ∈ range v
r'' : range v ≠ range v'
inj' : Injective v'
i' : LinearIndependent R Subtype.val
⊢ False
[PROOFSTEP]
specialize m (range v') i' r
[GOAL]
case intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁷ : Ring R
M : Type v
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
M' : Type v'
inst✝⁴ : AddCommGroup M'
inst✝³ : Module R M'
M₁ : Type v
inst✝² : AddCommGroup M₁
inst✝¹ : Module R M₁
inst✝ : Nontrivial R
ι : 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 => Option.elim o (↑b b') v
r : range v ⊆ range v'
r' : ¬↑b b' ∈ range v
r'' : range v ≠ range v'
inj' : Injective v'
i' : LinearIndependent R Subtype.val
m : range v = range v'
⊢ False
[PROOFSTEP]
exact r'' m
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁸ : Ring R
M : Type v
inst✝⁷ : AddCommGroup M
inst✝⁶ : Module R M
M' : Type v'
inst✝⁵ : AddCommGroup M'
inst✝⁴ : Module R M'
M₁ : Type v
inst✝³ : AddCommGroup M₁
inst✝² : Module R M₁
inst✝¹ : Nontrivial R
ι : Type w
b : Basis ι R M
inst✝ : Infinite ι
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : LinearIndependent.Maximal i
⊢ lift #ι ≤ lift #κ
[PROOFSTEP]
let Φ := fun k : κ => (b.repr (v k)).support
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁸ : Ring R
M : Type v
inst✝⁷ : AddCommGroup M
inst✝⁶ : Module R M
M' : Type v'
inst✝⁵ : AddCommGroup M'
inst✝⁴ : Module R M'
M₁ : Type v
inst✝³ : AddCommGroup M₁
inst✝² : Module R M₁
inst✝¹ : Nontrivial R
ι : Type w
b : Basis ι R M
inst✝ : Infinite ι
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : LinearIndependent.Maximal i
Φ : κ → Finset ι := fun k => (↑b.repr (v k)).support
⊢ lift #ι ≤ lift #κ
[PROOFSTEP]
have w₁ : #ι ≤ #(Set.range Φ) := by
  apply Cardinal.le_range_of_union_finset_eq_top
  exact union_support_maximal_linearIndependent_eq_range_basis b v i m
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁸ : Ring R
M : Type v
inst✝⁷ : AddCommGroup M
inst✝⁶ : Module R M
M' : Type v'
inst✝⁵ : AddCommGroup M'
inst✝⁴ : Module R M'
M₁ : Type v
inst✝³ : AddCommGroup M₁
inst✝² : Module R M₁
inst✝¹ : Nontrivial R
ι : Type w
b : Basis ι R M
inst✝ : Infinite ι
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : LinearIndependent.Maximal i
Φ : κ → Finset ι := fun k => (↑b.repr (v k)).support
⊢ #ι ≤ #↑(range Φ)
[PROOFSTEP]
apply Cardinal.le_range_of_union_finset_eq_top
[GOAL]
case w
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁸ : Ring R
M : Type v
inst✝⁷ : AddCommGroup M
inst✝⁶ : Module R M
M' : Type v'
inst✝⁵ : AddCommGroup M'
inst✝⁴ : Module R M'
M₁ : Type v
inst✝³ : AddCommGroup M₁
inst✝² : Module R M₁
inst✝¹ : Nontrivial R
ι : Type w
b : Basis ι R M
inst✝ : Infinite ι
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : LinearIndependent.Maximal i
Φ : κ → Finset ι := fun k => (↑b.repr (v k)).support
⊢ ⋃ (a : κ), ↑(Φ a) = ⊤
[PROOFSTEP]
exact union_support_maximal_linearIndependent_eq_range_basis b v i m
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁸ : Ring R
M : Type v
inst✝⁷ : AddCommGroup M
inst✝⁶ : Module R M
M' : Type v'
inst✝⁵ : AddCommGroup M'
inst✝⁴ : Module R M'
M₁ : Type v
inst✝³ : AddCommGroup M₁
inst✝² : Module R M₁
inst✝¹ : Nontrivial R
ι : Type w
b : Basis ι R M
inst✝ : Infinite ι
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : LinearIndependent.Maximal i
Φ : κ → Finset ι := fun k => (↑b.repr (v k)).support
w₁ : #ι ≤ #↑(range Φ)
⊢ lift #ι ≤ lift #κ
[PROOFSTEP]
have w₂ : Cardinal.lift.{w'} #(Set.range Φ) ≤ Cardinal.lift.{w} #κ := Cardinal.mk_range_le_lift
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁸ : Ring R
M : Type v
inst✝⁷ : AddCommGroup M
inst✝⁶ : Module R M
M' : Type v'
inst✝⁵ : AddCommGroup M'
inst✝⁴ : Module R M'
M₁ : Type v
inst✝³ : AddCommGroup M₁
inst✝² : Module R M₁
inst✝¹ : Nontrivial R
ι : Type w
b : Basis ι R M
inst✝ : Infinite ι
κ : Type w'
v : κ → M
i : LinearIndependent R v
m : LinearIndependent.Maximal i
Φ : κ → Finset ι := fun k => (↑b.repr (v k)).support
w₁ : #ι ≤ #↑(range Φ)
w₂ : lift #↑(range Φ) ≤ lift #κ
⊢ lift #ι ≤ lift #κ
[PROOFSTEP]
exact (Cardinal.lift_le.mpr w₁).trans w₂
[GOAL]
K : Type u
V✝ V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁸ : Ring R
M : Type v
inst✝⁷ : AddCommGroup M
inst✝⁶ : Module R M
M' : Type v'
inst✝⁵ : AddCommGroup M'
inst✝⁴ : Module R M'
M₁ : Type v
inst✝³ : AddCommGroup M₁
inst✝² : Module R M₁
inst✝¹ : Nontrivial R
inst✝ : NoZeroSMulDivisors R M
V : ι → Submodule R M
hV : Independent V
⊢ lift #{ i // V i ≠ ⊥ } ≤ lift (Module.rank R M)
[PROOFSTEP]
set I := { i : ι // V i ≠ ⊥ }
[GOAL]
K : Type u
V✝ V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁸ : Ring R
M : Type v
inst✝⁷ : AddCommGroup M
inst✝⁶ : Module R M
M' : Type v'
inst✝⁵ : AddCommGroup M'
inst✝⁴ : Module R M'
M₁ : Type v
inst✝³ : AddCommGroup M₁
inst✝² : Module R M₁
inst✝¹ : Nontrivial R
inst✝ : NoZeroSMulDivisors R M
V : ι → Submodule R M
hV : Independent V
I : Type w := { i // V i ≠ ⊥ }
⊢ lift #I ≤ lift (Module.rank R M)
[PROOFSTEP]
have hI : ∀ i : I, ∃ v ∈ V i, v ≠ (0 : M) := by
  intro i
  rw [← Submodule.ne_bot_iff]
  exact i.prop
[GOAL]
K : Type u
V✝ V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁸ : Ring R
M : Type v
inst✝⁷ : AddCommGroup M
inst✝⁶ : Module R M
M' : Type v'
inst✝⁵ : AddCommGroup M'
inst✝⁴ : Module R M'
M₁ : Type v
inst✝³ : AddCommGroup M₁
inst✝² : Module R M₁
inst✝¹ : Nontrivial R
inst✝ : NoZeroSMulDivisors R M
V : ι → Submodule R M
hV : Independent V
I : Type w := { i // V i ≠ ⊥ }
⊢ ∀ (i : I), ∃ v, v ∈ V ↑i ∧ v ≠ 0
[PROOFSTEP]
intro i
[GOAL]
K : Type u
V✝ V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁸ : Ring R
M : Type v
inst✝⁷ : AddCommGroup M
inst✝⁶ : Module R M
M' : Type v'
inst✝⁵ : AddCommGroup M'
inst✝⁴ : Module R M'
M₁ : Type v
inst✝³ : AddCommGroup M₁
inst✝² : Module R M₁
inst✝¹ : Nontrivial R
inst✝ : NoZeroSMulDivisors R M
V : ι → Submodule R M
hV : Independent V
I : Type w := { i // V i ≠ ⊥ }
i : I
⊢ ∃ v, v ∈ V ↑i ∧ v ≠ 0
[PROOFSTEP]
rw [← Submodule.ne_bot_iff]
[GOAL]
K : Type u
V✝ V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁸ : Ring R
M : Type v
inst✝⁷ : AddCommGroup M
inst✝⁶ : Module R M
M' : Type v'
inst✝⁵ : AddCommGroup M'
inst✝⁴ : Module R M'
M₁ : Type v
inst✝³ : AddCommGroup M₁
inst✝² : Module R M₁
inst✝¹ : Nontrivial R
inst✝ : NoZeroSMulDivisors R M
V : ι → Submodule R M
hV : Independent V
I : Type w := { i // V i ≠ ⊥ }
i : I
⊢ V ↑i ≠ ⊥
[PROOFSTEP]
exact i.prop
[GOAL]
K : Type u
V✝ V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁸ : Ring R
M : Type v
inst✝⁷ : AddCommGroup M
inst✝⁶ : Module R M
M' : Type v'
inst✝⁵ : AddCommGroup M'
inst✝⁴ : Module R M'
M₁ : Type v
inst✝³ : AddCommGroup M₁
inst✝² : Module R M₁
inst✝¹ : Nontrivial R
inst✝ : NoZeroSMulDivisors R M
V : ι → Submodule R M
hV : Independent V
I : Type w := { i // V i ≠ ⊥ }
hI : ∀ (i : I), ∃ v, v ∈ V ↑i ∧ v ≠ 0
⊢ lift #I ≤ lift (Module.rank R M)
[PROOFSTEP]
choose v hvV hv using hI
[GOAL]
K : Type u
V✝ V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁸ : Ring R
M : Type v
inst✝⁷ : AddCommGroup M
inst✝⁶ : Module R M
M' : Type v'
inst✝⁵ : AddCommGroup M'
inst✝⁴ : Module R M'
M₁ : Type v
inst✝³ : AddCommGroup M₁
inst✝² : Module R M₁
inst✝¹ : Nontrivial R
inst✝ : NoZeroSMulDivisors R M
V : ι → Submodule R M
hV : Independent V
I : Type w := { i // V i ≠ ⊥ }
v : I → M
hvV : ∀ (i : I), v i ∈ V ↑i
hv : ∀ (i : I), v i ≠ 0
⊢ lift #I ≤ lift (Module.rank R M)
[PROOFSTEP]
have : LinearIndependent R v := (hV.comp Subtype.coe_injective).linearIndependent _ hvV hv
[GOAL]
K : Type u
V✝ V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁸ : Ring R
M : Type v
inst✝⁷ : AddCommGroup M
inst✝⁶ : Module R M
M' : Type v'
inst✝⁵ : AddCommGroup M'
inst✝⁴ : Module R M'
M₁ : Type v
inst✝³ : AddCommGroup M₁
inst✝² : Module R M₁
inst✝¹ : Nontrivial R
inst✝ : NoZeroSMulDivisors R M
V : ι → Submodule R M
hV : Independent V
I : Type w := { i // V i ≠ ⊥ }
v : I → M
hvV : ∀ (i : I), v i ∈ V ↑i
hv : ∀ (i : I), v i ≠ 0
this : LinearIndependent R v
⊢ lift #I ≤ lift (Module.rank R M)
[PROOFSTEP]
exact cardinal_lift_le_rank_of_linearIndependent' this
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
M : Type v
inst✝³ : Ring R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
inst✝ : Subsingleton R
⊢ Module.rank R M = 1
[PROOFSTEP]
haveI := Module.subsingleton R M
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
M : Type v
inst✝³ : Ring R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
inst✝ : Subsingleton R
this : Subsingleton M
⊢ Module.rank R M = 1
[PROOFSTEP]
have : Nonempty { s : Set M // LinearIndependent R ((↑) : s → M) } := ⟨⟨∅, linearIndependent_empty _ _⟩⟩
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
M : Type v
inst✝³ : Ring R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
inst✝ : Subsingleton R
this✝ : Subsingleton M
this : Nonempty { s // LinearIndependent R Subtype.val }
⊢ Module.rank R M = 1
[PROOFSTEP]
rw [Module.rank_def, ciSup_eq_of_forall_le_of_forall_lt_exists_gt]
[GOAL]
case h₁
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
M : Type v
inst✝³ : Ring R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
inst✝ : Subsingleton R
this✝ : Subsingleton M
this : Nonempty { s // LinearIndependent R Subtype.val }
⊢ ∀ (i : { s // LinearIndependent R Subtype.val }), #↑↑i ≤ 1
[PROOFSTEP]
rintro ⟨s, hs⟩
[GOAL]
case h₁.mk
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
M : Type v
inst✝³ : Ring R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
inst✝ : Subsingleton R
this✝ : Subsingleton M
this : Nonempty { s // LinearIndependent R Subtype.val }
s : Set M
hs : LinearIndependent R Subtype.val
⊢ #↑↑{ val := s, property := hs } ≤ 1
[PROOFSTEP]
rw [Cardinal.mk_le_one_iff_set_subsingleton]
[GOAL]
case h₁.mk
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
M : Type v
inst✝³ : Ring R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
inst✝ : Subsingleton R
this✝ : Subsingleton M
this : Nonempty { s // LinearIndependent R Subtype.val }
s : Set M
hs : LinearIndependent R Subtype.val
⊢ Set.Subsingleton ↑{ val := s, property := hs }
[PROOFSTEP]
apply subsingleton_of_subsingleton
[GOAL]
case h₂
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
M : Type v
inst✝³ : Ring R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
inst✝ : Subsingleton R
this✝ : Subsingleton M
this : Nonempty { s // LinearIndependent R Subtype.val }
⊢ ∀ (w : Cardinal.{v}), w < 1 → ∃ i, w < #↑↑i
[PROOFSTEP]
intro w hw
[GOAL]
case h₂
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
M : Type v
inst✝³ : Ring R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
inst✝ : Subsingleton R
this✝ : Subsingleton M
this : Nonempty { s // LinearIndependent R Subtype.val }
w : Cardinal.{v}
hw : w < 1
⊢ ∃ i, w < #↑↑i
[PROOFSTEP]
refine' ⟨⟨{0}, _⟩, _⟩
[GOAL]
case h₂.refine'_1
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
M : Type v
inst✝³ : Ring R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
inst✝ : Subsingleton R
this✝ : Subsingleton M
this : Nonempty { s // LinearIndependent R Subtype.val }
w : Cardinal.{v}
hw : w < 1
⊢ LinearIndependent R Subtype.val
[PROOFSTEP]
rw [linearIndependent_iff']
[GOAL]
case h₂.refine'_1
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
M : Type v
inst✝³ : Ring R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
inst✝ : Subsingleton R
this✝ : Subsingleton M
this : Nonempty { s // LinearIndependent R Subtype.val }
w : Cardinal.{v}
hw : w < 1
⊢ ∀ (s : Finset { x // x ∈ {0} }) (g : { x // x ∈ {0} } → R),
    ∑ i in s, g i • ↑i = 0 → ∀ (i : { x // x ∈ {0} }), i ∈ s → g i = 0
[PROOFSTEP]
intros
[GOAL]
case h₂.refine'_1
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
M : Type v
inst✝³ : Ring R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
inst✝ : Subsingleton R
this✝ : Subsingleton M
this : Nonempty { s // LinearIndependent R Subtype.val }
w : Cardinal.{v}
hw : w < 1
s✝ : Finset { x // x ∈ {0} }
g✝ : { x // x ∈ {0} } → R
a✝¹ : ∑ i in s✝, g✝ i • ↑i = 0
i✝ : { x // x ∈ {0} }
a✝ : i✝ ∈ s✝
⊢ g✝ i✝ = 0
[PROOFSTEP]
exact Subsingleton.elim _ _
[GOAL]
case h₂.refine'_2
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
M : Type v
inst✝³ : Ring R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
inst✝ : Subsingleton R
this✝ : Subsingleton M
this : Nonempty { s // LinearIndependent R Subtype.val }
w : Cardinal.{v}
hw : w < 1
⊢ w < #↑↑{ val := {0}, property := (_ : LinearIndependent R Subtype.val) }
[PROOFSTEP]
exact hw.trans_eq (Cardinal.mk_singleton _).symm
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
M : Type v
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : NoZeroSMulDivisors R M
inst✝ : Nontrivial M
⊢ 0 < Module.rank R M
[PROOFSTEP]
obtain ⟨x, hx⟩ := exists_ne (0 : M)
[GOAL]
case intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
M : Type v
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : NoZeroSMulDivisors R M
inst✝ : Nontrivial M
x : M
hx : x ≠ 0
⊢ 0 < Module.rank R M
[PROOFSTEP]
suffices 1 ≤ Module.rank R M by exact zero_lt_one.trans_le this
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
M : Type v
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : NoZeroSMulDivisors R M
inst✝ : Nontrivial M
x : M
hx : x ≠ 0
this : 1 ≤ Module.rank R M
⊢ 0 < Module.rank R M
[PROOFSTEP]
exact zero_lt_one.trans_le this
[GOAL]
case intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
M : Type v
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : NoZeroSMulDivisors R M
inst✝ : Nontrivial M
x : M
hx : x ≠ 0
⊢ 1 ≤ Module.rank R M
[PROOFSTEP]
letI := Module.nontrivial R M
[GOAL]
case intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
M : Type v
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : NoZeroSMulDivisors R M
inst✝ : Nontrivial M
x : M
hx : x ≠ 0
this : Nontrivial R := Module.nontrivial R M
⊢ 1 ≤ Module.rank R M
[PROOFSTEP]
suffices LinearIndependent R fun y : ({ x } : Set M) => (y : M) by
  simpa using cardinal_le_rank_of_linearIndependent this
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
M : Type v
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : NoZeroSMulDivisors R M
inst✝ : Nontrivial M
x : M
hx : x ≠ 0
this✝ : Nontrivial R := Module.nontrivial R M
this : LinearIndependent R fun y => ↑y
⊢ 1 ≤ Module.rank R M
[PROOFSTEP]
simpa using cardinal_le_rank_of_linearIndependent this
[GOAL]
case intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
M : Type v
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : NoZeroSMulDivisors R M
inst✝ : Nontrivial M
x : M
hx : x ≠ 0
this : Nontrivial R := Module.nontrivial R M
⊢ LinearIndependent R fun y => ↑y
[PROOFSTEP]
exact linearIndependent_singleton hx
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
M : Type v
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : NoZeroSMulDivisors R M
inst✝ : Nontrivial R
⊢ Module.rank R M = 0 ↔ ∀ (x : M), x = 0
[PROOFSTEP]
refine' ⟨fun h => _, fun h => _⟩
[GOAL]
case refine'_1
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
M : Type v
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : NoZeroSMulDivisors R M
inst✝ : Nontrivial R
h : Module.rank R M = 0
⊢ ∀ (x : M), x = 0
[PROOFSTEP]
contrapose! h
[GOAL]
case refine'_1
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
M : Type v
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : NoZeroSMulDivisors R M
inst✝ : Nontrivial R
h : ∃ x, x ≠ 0
⊢ Module.rank R M ≠ 0
[PROOFSTEP]
obtain ⟨x, hx⟩ := h
[GOAL]
case refine'_1.intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
M : Type v
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : NoZeroSMulDivisors R M
inst✝ : Nontrivial R
x : M
hx : x ≠ 0
⊢ Module.rank R M ≠ 0
[PROOFSTEP]
letI : Nontrivial M := nontrivial_of_ne _ _ hx
[GOAL]
case refine'_1.intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
M : Type v
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : NoZeroSMulDivisors R M
inst✝ : Nontrivial R
x : M
hx : x ≠ 0
this : Nontrivial M := nontrivial_of_ne x 0 hx
⊢ Module.rank R M ≠ 0
[PROOFSTEP]
exact rank_pos.ne'
[GOAL]
case refine'_2
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
M : Type v
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : NoZeroSMulDivisors R M
inst✝ : Nontrivial R
h : ∀ (x : M), x = 0
⊢ Module.rank R M = 0
[PROOFSTEP]
have : (⊤ : Submodule R M) = ⊥ := by
  ext x
  simp [h x]
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
M : Type v
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : NoZeroSMulDivisors R M
inst✝ : Nontrivial R
h : ∀ (x : M), x = 0
⊢ ⊤ = ⊥
[PROOFSTEP]
ext x
[GOAL]
case h
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
M : Type v
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : NoZeroSMulDivisors R M
inst✝ : Nontrivial R
h : ∀ (x : M), x = 0
x : M
⊢ x ∈ ⊤ ↔ x ∈ ⊥
[PROOFSTEP]
simp [h x]
[GOAL]
case refine'_2
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
M : Type v
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : NoZeroSMulDivisors R M
inst✝ : Nontrivial R
h : ∀ (x : M), x = 0
this : ⊤ = ⊥
⊢ Module.rank R M = 0
[PROOFSTEP]
rw [← rank_top, this, rank_bot]
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
M : Type v
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : NoZeroSMulDivisors R M
inst✝ : Nontrivial R
⊢ 0 < Module.rank R M ↔ ∃ x, x ≠ 0
[PROOFSTEP]
rw [← not_iff_not]
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
M : Type v
inst✝⁴ : Ring R
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : NoZeroSMulDivisors R M
inst✝ : Nontrivial R
⊢ ¬0 < Module.rank R M ↔ ¬∃ x, x ≠ 0
[PROOFSTEP]
simpa using rank_zero_iff_forall_zero
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : InvariantBasisNumber R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
v : Basis ι R M
v' : Basis ι' R M
⊢ lift #ι = lift #ι'
[PROOFSTEP]
classical
haveI := nontrivial_of_invariantBasisNumber R
cases fintypeOrInfinite ι
·
  -- `v` is a finite basis, so by `basis_finite_of_finite_spans` so is `v'`.
      -- haveI : Finite (range v) := Set.finite_range v
  haveI := basis_finite_of_finite_spans _ (Set.finite_range v) v.span_eq v'
  cases nonempty_fintype ι'
  rw [Cardinal.mk_fintype, Cardinal.mk_fintype]
  simp only [Cardinal.lift_natCast, Cardinal.natCast_inj]
    -- Now we can use invariant basis number to show they have the same cardinality.
  apply card_eq_of_linearEquiv R
  exact
    (Finsupp.linearEquivFunOnFinite R R ι).symm.trans v.repr.symm ≪≫ₗ v'.repr ≪≫ₗ Finsupp.linearEquivFunOnFinite R R ι'
·
  -- `v` is an infinite basis,
      -- so by `infinite_basis_le_maximal_linearIndependent`, `v'` is at least as big,
      -- and then applying `infinite_basis_le_maximal_linearIndependent` again
      -- we see they have the same cardinality.
  have w₁ := infinite_basis_le_maximal_linearIndependent' v _ v'.linearIndependent v'.maximal
  rcases Cardinal.lift_mk_le'.mp w₁ with ⟨f⟩
  haveI : Infinite ι' := Infinite.of_injective f f.2
  have w₂ := infinite_basis_le_maximal_linearIndependent' v' _ v.linearIndependent v.maximal
  exact le_antisymm w₁ w₂
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : InvariantBasisNumber R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
v : Basis ι R M
v' : Basis ι' R M
⊢ lift #ι = lift #ι'
[PROOFSTEP]
haveI := nontrivial_of_invariantBasisNumber R
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : InvariantBasisNumber R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
v : Basis ι R M
v' : Basis ι' R M
this : Nontrivial R
⊢ lift #ι = lift #ι'
[PROOFSTEP]
cases fintypeOrInfinite ι
[GOAL]
case inl
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : InvariantBasisNumber R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
v : Basis ι R M
v' : Basis ι' R M
this : Nontrivial R
val✝ : Fintype ι
⊢ lift #ι = lift #ι'
[PROOFSTEP]
haveI := basis_finite_of_finite_spans _ (Set.finite_range v) v.span_eq v'
[GOAL]
case inl
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : InvariantBasisNumber R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
v : Basis ι R M
v' : Basis ι' R M
this✝ : Nontrivial R
val✝ : Fintype ι
this : Finite ι'
⊢ lift #ι = lift #ι'
[PROOFSTEP]
cases nonempty_fintype ι'
[GOAL]
case inl.intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : InvariantBasisNumber R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
v : Basis ι R M
v' : Basis ι' R M
this✝ : Nontrivial R
val✝¹ : Fintype ι
this : Finite ι'
val✝ : Fintype ι'
⊢ lift #ι = lift #ι'
[PROOFSTEP]
rw [Cardinal.mk_fintype, Cardinal.mk_fintype]
[GOAL]
case inl.intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : InvariantBasisNumber R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
v : Basis ι R M
v' : Basis ι' R M
this✝ : Nontrivial R
val✝¹ : Fintype ι
this : Finite ι'
val✝ : Fintype ι'
⊢ lift ↑(Fintype.card ι) = lift ↑(Fintype.card ι')
[PROOFSTEP]
simp only [Cardinal.lift_natCast, Cardinal.natCast_inj]
  -- Now we can use invariant basis number to show they have the same cardinality.
[GOAL]
case inl.intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : InvariantBasisNumber R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
v : Basis ι R M
v' : Basis ι' R M
this✝ : Nontrivial R
val✝¹ : Fintype ι
this : Finite ι'
val✝ : Fintype ι'
⊢ Fintype.card ι = Fintype.card ι'
[PROOFSTEP]
apply card_eq_of_linearEquiv R
[GOAL]
case inl.intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : InvariantBasisNumber R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
v : Basis ι R M
v' : Basis ι' R M
this✝ : Nontrivial R
val✝¹ : Fintype ι
this : Finite ι'
val✝ : Fintype ι'
⊢ (ι → R) ≃ₗ[R] ι' → R
[PROOFSTEP]
exact
  (Finsupp.linearEquivFunOnFinite R R ι).symm.trans v.repr.symm ≪≫ₗ v'.repr ≪≫ₗ Finsupp.linearEquivFunOnFinite R R ι'
[GOAL]
case inr
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : InvariantBasisNumber R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
v : Basis ι R M
v' : Basis ι' R M
this : Nontrivial R
val✝ : Infinite ι
⊢ lift #ι = lift #ι'
[PROOFSTEP]
have w₁ := infinite_basis_le_maximal_linearIndependent' v _ v'.linearIndependent v'.maximal
[GOAL]
case inr
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : InvariantBasisNumber R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
v : Basis ι R M
v' : Basis ι' R M
this : Nontrivial R
val✝ : Infinite ι
w₁ : lift #ι ≤ lift #ι'
⊢ lift #ι = lift #ι'
[PROOFSTEP]
rcases Cardinal.lift_mk_le'.mp w₁ with ⟨f⟩
[GOAL]
case inr.intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : InvariantBasisNumber R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
v : Basis ι R M
v' : Basis ι' R M
this : Nontrivial R
val✝ : Infinite ι
w₁ : lift #ι ≤ lift #ι'
f : ι ↪ ι'
⊢ lift #ι = lift #ι'
[PROOFSTEP]
haveI : Infinite ι' := Infinite.of_injective f f.2
[GOAL]
case inr.intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : InvariantBasisNumber R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
v : Basis ι R M
v' : Basis ι' R M
this✝ : Nontrivial R
val✝ : Infinite ι
w₁ : lift #ι ≤ lift #ι'
f : ι ↪ ι'
this : Infinite ι'
⊢ lift #ι = lift #ι'
[PROOFSTEP]
have w₂ := infinite_basis_le_maximal_linearIndependent' v' _ v.linearIndependent v.maximal
[GOAL]
case inr.intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : InvariantBasisNumber R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
v : Basis ι R M
v' : Basis ι' R M
this✝ : Nontrivial R
val✝ : Infinite ι
w₁ : lift #ι ≤ lift #ι'
f : ι ↪ ι'
this : Infinite ι'
w₂ : lift #ι' ≤ lift #ι
⊢ lift #ι = lift #ι'
[PROOFSTEP]
exact le_antisymm w₁ w₂
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁵ : Ring R
inst✝⁴ : RankCondition R
M : Type v
inst✝³ : AddCommGroup M
inst✝² : Module R M
ι : Type u_2
inst✝¹ : Fintype ι
b : Basis ι R M
w : Set M
inst✝ : Fintype ↑w
s : span R w = ⊤
⊢ Fintype.card ι ≤ Fintype.card ↑w
[PROOFSTEP]
fapply card_le_of_surjective' R
[GOAL]
case f
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁵ : Ring R
inst✝⁴ : RankCondition R
M : Type v
inst✝³ : AddCommGroup M
inst✝² : Module R M
ι : Type u_2
inst✝¹ : Fintype ι
b : Basis ι R M
w : Set M
inst✝ : Fintype ↑w
s : span R w = ⊤
⊢ (↑w →₀ R) →ₗ[R] ι →₀ R
[PROOFSTEP]
exact b.repr.toLinearMap.comp (Finsupp.total w M R (↑))
[GOAL]
case i
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁵ : Ring R
inst✝⁴ : RankCondition R
M : Type v
inst✝³ : AddCommGroup M
inst✝² : Module R M
ι : Type u_2
inst✝¹ : Fintype ι
b : Basis ι R M
w : Set M
inst✝ : Fintype ↑w
s : span R w = ⊤
⊢ Surjective ↑(LinearMap.comp (↑b.repr) (Finsupp.total (↑w) M R Subtype.val))
[PROOFSTEP]
apply Surjective.comp (g := b.repr.toLinearMap)
[GOAL]
case i.hg
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁵ : Ring R
inst✝⁴ : RankCondition R
M : Type v
inst✝³ : AddCommGroup M
inst✝² : Module R M
ι : Type u_2
inst✝¹ : Fintype ι
b : Basis ι R M
w : Set M
inst✝ : Fintype ↑w
s : span R w = ⊤
⊢ Surjective ↑↑b.repr
case i.hf
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁵ : Ring R
inst✝⁴ : RankCondition R
M : Type v
inst✝³ : AddCommGroup M
inst✝² : Module R M
ι : Type u_2
inst✝¹ : Fintype ι
b : Basis ι R M
w : Set M
inst✝ : Fintype ↑w
s : span R w = ⊤
⊢ Surjective fun x => ↑(Finsupp.total (↑w) M R Subtype.val) x
[PROOFSTEP]
apply LinearEquiv.surjective
[GOAL]
case i.hf
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁵ : Ring R
inst✝⁴ : RankCondition R
M : Type v
inst✝³ : AddCommGroup M
inst✝² : Module R M
ι : Type u_2
inst✝¹ : Fintype ι
b : Basis ι R M
w : Set M
inst✝ : Fintype ↑w
s : span R w = ⊤
⊢ Surjective fun x => ↑(Finsupp.total (↑w) M R Subtype.val) x
[PROOFSTEP]
rw [← LinearMap.range_eq_top, Finsupp.range_total]
[GOAL]
case i.hf
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁵ : Ring R
inst✝⁴ : RankCondition R
M : Type v
inst✝³ : AddCommGroup M
inst✝² : Module R M
ι : Type u_2
inst✝¹ : Fintype ι
b : Basis ι R M
w : Set M
inst✝ : Fintype ↑w
s : span R w = ⊤
⊢ span R (range Subtype.val) = ⊤
[PROOFSTEP]
simpa using s
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁴ : Ring R
inst✝³ : RankCondition R
M : Type v
inst✝² : AddCommGroup M
inst✝¹ : Module R M
ι : Type u_2
b : Basis ι R M
w : Set M
inst✝ : Fintype ↑w
s : span R w = ⊤
⊢ #ι ≤ ↑(Fintype.card ↑w)
[PROOFSTEP]
haveI := nontrivial_of_invariantBasisNumber R
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁴ : Ring R
inst✝³ : RankCondition R
M : Type v
inst✝² : AddCommGroup M
inst✝¹ : Module R M
ι : Type u_2
b : Basis ι R M
w : Set M
inst✝ : Fintype ↑w
s : span R w = ⊤
this : Nontrivial R
⊢ #ι ≤ ↑(Fintype.card ↑w)
[PROOFSTEP]
haveI := basis_finite_of_finite_spans w (toFinite _) s b
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁴ : Ring R
inst✝³ : RankCondition R
M : Type v
inst✝² : AddCommGroup M
inst✝¹ : Module R M
ι : Type u_2
b : Basis ι R M
w : Set M
inst✝ : Fintype ↑w
s : span R w = ⊤
this✝ : Nontrivial R
this : Finite ι
⊢ #ι ≤ ↑(Fintype.card ↑w)
[PROOFSTEP]
cases nonempty_fintype ι
[GOAL]
case intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁴ : Ring R
inst✝³ : RankCondition R
M : Type v
inst✝² : AddCommGroup M
inst✝¹ : Module R M
ι : Type u_2
b : Basis ι R M
w : Set M
inst✝ : Fintype ↑w
s : span R w = ⊤
this✝ : Nontrivial R
this : Finite ι
val✝ : Fintype ι
⊢ #ι ≤ ↑(Fintype.card ↑w)
[PROOFSTEP]
rw [Cardinal.mk_fintype ι]
[GOAL]
case intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁴ : Ring R
inst✝³ : RankCondition R
M : Type v
inst✝² : AddCommGroup M
inst✝¹ : Module R M
ι : Type u_2
b : Basis ι R M
w : Set M
inst✝ : Fintype ↑w
s : span R w = ⊤
this✝ : Nontrivial R
this : Finite ι
val✝ : Fintype ι
⊢ ↑(Fintype.card ι) ≤ ↑(Fintype.card ↑w)
[PROOFSTEP]
simp only [Cardinal.natCast_le]
[GOAL]
case intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁴ : Ring R
inst✝³ : RankCondition R
M : Type v
inst✝² : AddCommGroup M
inst✝¹ : Module R M
ι : Type u_2
b : Basis ι R M
w : Set M
inst✝ : Fintype ↑w
s : span R w = ⊤
this✝ : Nontrivial R
this : Finite ι
val✝ : Fintype ι
⊢ Fintype.card ι ≤ Fintype.card ↑w
[PROOFSTEP]
exact Basis.le_span'' b s
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : RankCondition R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
J : Set M
v : Basis ι R M
hJ : span R J = ⊤
⊢ #↑(range ↑v) ≤ #↑J
[PROOFSTEP]
haveI := nontrivial_of_invariantBasisNumber R
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : RankCondition R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
J : Set M
v : Basis ι R M
hJ : span R J = ⊤
this : Nontrivial R
⊢ #↑(range ↑v) ≤ #↑J
[PROOFSTEP]
cases fintypeOrInfinite J
[GOAL]
case inl
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : RankCondition R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
J : Set M
v : Basis ι R M
hJ : span R J = ⊤
this : Nontrivial R
val✝ : Fintype ↑J
⊢ #↑(range ↑v) ≤ #↑J
[PROOFSTEP]
rw [← Cardinal.lift_le, Cardinal.mk_range_eq_of_injective v.injective, Cardinal.mk_fintype J]
[GOAL]
case inl
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : RankCondition R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
J : Set M
v : Basis ι R M
hJ : span R J = ⊤
this : Nontrivial R
val✝ : Fintype ↑J
⊢ lift #ι ≤ lift ↑(Fintype.card ↑J)
[PROOFSTEP]
convert Cardinal.lift_le.{v}.2 (basis_le_span' v hJ)
[GOAL]
case h.e'_4
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : RankCondition R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
J : Set M
v : Basis ι R M
hJ : span R J = ⊤
this : Nontrivial R
val✝ : Fintype ↑J
⊢ lift ↑(Fintype.card ↑J) = lift ↑(Fintype.card ↑J)
[PROOFSTEP]
simp
[GOAL]
case inr
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : RankCondition R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
J : Set M
v : Basis ι R M
hJ : span R J = ⊤
this : Nontrivial R
val✝ : Infinite ↑J
⊢ #↑(range ↑v) ≤ #↑J
[PROOFSTEP]
let S : J → Set ι := fun j => ↑(v.repr j).support
[GOAL]
case inr
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : RankCondition R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
J : Set M
v : Basis ι R M
hJ : span R J = ⊤
this : Nontrivial R
val✝ : Infinite ↑J
S : ↑J → Set ι := fun j => ↑(↑v.repr ↑j).support
⊢ #↑(range ↑v) ≤ #↑J
[PROOFSTEP]
let S' : J → Set M := fun j => v '' S j
[GOAL]
case inr
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : RankCondition R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
J : Set M
v : Basis ι R M
hJ : span R J = ⊤
this : Nontrivial R
val✝ : Infinite ↑J
S : ↑J → Set ι := fun j => ↑(↑v.repr ↑j).support
S' : ↑J → Set M := fun j => ↑v '' S j
⊢ #↑(range ↑v) ≤ #↑J
[PROOFSTEP]
have hs : range v ⊆ ⋃ j, S' j := by
  intro b hb
  rcases mem_range.1 hb with ⟨i, hi⟩
  have : span R J ≤ comap v.repr.toLinearMap (Finsupp.supported R R (⋃ j, S j)) :=
    span_le.2 fun j hj x hx => ⟨_, ⟨⟨j, hj⟩, rfl⟩, hx⟩
  rw [hJ] at this 
  replace : v.repr (v i) ∈ Finsupp.supported R R (⋃ j, S j) := this trivial
  rw [v.repr_self, Finsupp.mem_supported, Finsupp.support_single_ne_zero _ one_ne_zero] at this 
  · subst b
    rcases mem_iUnion.1 (this (Finset.mem_singleton_self _)) with ⟨j, hj⟩
    exact mem_iUnion.2 ⟨j, (mem_image _ _ _).2 ⟨i, hj, rfl⟩⟩
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : RankCondition R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
J : Set M
v : Basis ι R M
hJ : span R J = ⊤
this : Nontrivial R
val✝ : Infinite ↑J
S : ↑J → Set ι := fun j => ↑(↑v.repr ↑j).support
S' : ↑J → Set M := fun j => ↑v '' S j
⊢ range ↑v ⊆ ⋃ (j : ↑J), S' j
[PROOFSTEP]
intro b hb
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : RankCondition R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
J : Set M
v : Basis ι R M
hJ : span R J = ⊤
this : Nontrivial R
val✝ : Infinite ↑J
S : ↑J → Set ι := fun j => ↑(↑v.repr ↑j).support
S' : ↑J → Set M := fun j => ↑v '' S j
b : M
hb : b ∈ range ↑v
⊢ b ∈ ⋃ (j : ↑J), S' j
[PROOFSTEP]
rcases mem_range.1 hb with ⟨i, hi⟩
[GOAL]
case intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : RankCondition R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
J : Set M
v : Basis ι R M
hJ : span R J = ⊤
this : Nontrivial R
val✝ : Infinite ↑J
S : ↑J → Set ι := fun j => ↑(↑v.repr ↑j).support
S' : ↑J → Set M := fun j => ↑v '' S j
b : M
hb : b ∈ range ↑v
i : ι
hi : ↑v i = b
⊢ b ∈ ⋃ (j : ↑J), S' j
[PROOFSTEP]
have : span R J ≤ comap v.repr.toLinearMap (Finsupp.supported R R (⋃ j, S j)) :=
  span_le.2 fun j hj x hx => ⟨_, ⟨⟨j, hj⟩, rfl⟩, hx⟩
[GOAL]
case intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : RankCondition R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
J : Set M
v : Basis ι R M
hJ : span R J = ⊤
this✝ : Nontrivial R
val✝ : Infinite ↑J
S : ↑J → Set ι := fun j => ↑(↑v.repr ↑j).support
S' : ↑J → Set M := fun j => ↑v '' S j
b : M
hb : b ∈ range ↑v
i : ι
hi : ↑v i = b
this : span R J ≤ comap (↑v.repr) (Finsupp.supported R R (⋃ (j : ↑J), S j))
⊢ b ∈ ⋃ (j : ↑J), S' j
[PROOFSTEP]
rw [hJ] at this 
[GOAL]
case intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : RankCondition R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
J : Set M
v : Basis ι R M
hJ : span R J = ⊤
this✝ : Nontrivial R
val✝ : Infinite ↑J
S : ↑J → Set ι := fun j => ↑(↑v.repr ↑j).support
S' : ↑J → Set M := fun j => ↑v '' S j
b : M
hb : b ∈ range ↑v
i : ι
hi : ↑v i = b
this : ⊤ ≤ comap (↑v.repr) (Finsupp.supported R R (⋃ (j : ↑J), S j))
⊢ b ∈ ⋃ (j : ↑J), S' j
[PROOFSTEP]
replace : v.repr (v i) ∈ Finsupp.supported R R (⋃ j, S j) := this trivial
[GOAL]
case intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : RankCondition R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
J : Set M
v : Basis ι R M
hJ : span R J = ⊤
this✝ : Nontrivial R
val✝ : Infinite ↑J
S : ↑J → Set ι := fun j => ↑(↑v.repr ↑j).support
S' : ↑J → Set M := fun j => ↑v '' S j
b : M
hb : b ∈ range ↑v
i : ι
hi : ↑v i = b
this : ↑v.repr (↑v i) ∈ Finsupp.supported R R (⋃ (j : ↑J), S j)
⊢ b ∈ ⋃ (j : ↑J), S' j
[PROOFSTEP]
rw [v.repr_self, Finsupp.mem_supported, Finsupp.support_single_ne_zero _ one_ne_zero] at this 
[GOAL]
case intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : RankCondition R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
J : Set M
v : Basis ι R M
hJ : span R J = ⊤
this✝ : Nontrivial R
val✝ : Infinite ↑J
S : ↑J → Set ι := fun j => ↑(↑v.repr ↑j).support
S' : ↑J → Set M := fun j => ↑v '' S j
b : M
hb : b ∈ range ↑v
i : ι
hi : ↑v i = b
this : ↑{i} ⊆ ⋃ (j : ↑J), S j
⊢ b ∈ ⋃ (j : ↑J), S' j
[PROOFSTEP]
subst b
[GOAL]
case intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : RankCondition R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
J : Set M
v : Basis ι R M
hJ : span R J = ⊤
this✝ : Nontrivial R
val✝ : Infinite ↑J
S : ↑J → Set ι := fun j => ↑(↑v.repr ↑j).support
S' : ↑J → Set M := fun j => ↑v '' S j
i : ι
this : ↑{i} ⊆ ⋃ (j : ↑J), S j
hb : ↑v i ∈ range ↑v
⊢ ↑v i ∈ ⋃ (j : ↑J), S' j
[PROOFSTEP]
rcases mem_iUnion.1 (this (Finset.mem_singleton_self _)) with ⟨j, hj⟩
[GOAL]
case intro.intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : RankCondition R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
J : Set M
v : Basis ι R M
hJ : span R J = ⊤
this✝ : Nontrivial R
val✝ : Infinite ↑J
S : ↑J → Set ι := fun j => ↑(↑v.repr ↑j).support
S' : ↑J → Set M := fun j => ↑v '' S j
i : ι
this : ↑{i} ⊆ ⋃ (j : ↑J), S j
hb : ↑v i ∈ range ↑v
j : ↑J
hj : i ∈ S j
⊢ ↑v i ∈ ⋃ (j : ↑J), S' j
[PROOFSTEP]
exact mem_iUnion.2 ⟨j, (mem_image _ _ _).2 ⟨i, hj, rfl⟩⟩
[GOAL]
case inr
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : RankCondition R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
J : Set M
v : Basis ι R M
hJ : span R J = ⊤
this : Nontrivial R
val✝ : Infinite ↑J
S : ↑J → Set ι := fun j => ↑(↑v.repr ↑j).support
S' : ↑J → Set M := fun j => ↑v '' S j
hs : range ↑v ⊆ ⋃ (j : ↑J), S' j
⊢ #↑(range ↑v) ≤ #↑J
[PROOFSTEP]
refine' le_of_not_lt fun IJ => _
[GOAL]
case inr
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : RankCondition R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
J : Set M
v : Basis ι R M
hJ : span R J = ⊤
this : Nontrivial R
val✝ : Infinite ↑J
S : ↑J → Set ι := fun j => ↑(↑v.repr ↑j).support
S' : ↑J → Set M := fun j => ↑v '' S j
hs : range ↑v ⊆ ⋃ (j : ↑J), S' j
IJ : #↑J < #↑(range ↑v)
⊢ False
[PROOFSTEP]
suffices #(⋃ j, S' j) < #(range v) by exact not_le_of_lt this ⟨Set.embeddingOfSubset _ _ hs⟩
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : RankCondition R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
J : Set M
v : Basis ι R M
hJ : span R J = ⊤
this✝ : Nontrivial R
val✝ : Infinite ↑J
S : ↑J → Set ι := fun j => ↑(↑v.repr ↑j).support
S' : ↑J → Set M := fun j => ↑v '' S j
hs : range ↑v ⊆ ⋃ (j : ↑J), S' j
IJ : #↑J < #↑(range ↑v)
this : #↑(⋃ (j : ↑J), S' j) < #↑(range ↑v)
⊢ False
[PROOFSTEP]
exact not_le_of_lt this ⟨Set.embeddingOfSubset _ _ hs⟩
[GOAL]
case inr
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : RankCondition R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
J : Set M
v : Basis ι R M
hJ : span R J = ⊤
this : Nontrivial R
val✝ : Infinite ↑J
S : ↑J → Set ι := fun j => ↑(↑v.repr ↑j).support
S' : ↑J → Set M := fun j => ↑v '' S j
hs : range ↑v ⊆ ⋃ (j : ↑J), S' j
IJ : #↑J < #↑(range ↑v)
⊢ #↑(⋃ (j : ↑J), S' j) < #↑(range ↑v)
[PROOFSTEP]
refine' lt_of_le_of_lt (le_trans Cardinal.mk_iUnion_le_sum_mk (Cardinal.sum_le_sum _ (fun _ => ℵ₀) _)) _
[GOAL]
case inr.refine'_1
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : RankCondition R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
J : Set M
v : Basis ι R M
hJ : span R J = ⊤
this : Nontrivial R
val✝ : Infinite ↑J
S : ↑J → Set ι := fun j => ↑(↑v.repr ↑j).support
S' : ↑J → Set M := fun j => ↑v '' S j
hs : range ↑v ⊆ ⋃ (j : ↑J), S' j
IJ : #↑J < #↑(range ↑v)
⊢ ∀ (i : ↑J), #↑(S' i) ≤ (fun x => ℵ₀) i
[PROOFSTEP]
exact fun j => (Cardinal.lt_aleph0_of_finite _).le
[GOAL]
case inr.refine'_2
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : RankCondition R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
J : Set M
v : Basis ι R M
hJ : span R J = ⊤
this : Nontrivial R
val✝ : Infinite ↑J
S : ↑J → Set ι := fun j => ↑(↑v.repr ↑j).support
S' : ↑J → Set M := fun j => ↑v '' S j
hs : range ↑v ⊆ ⋃ (j : ↑J), S' j
IJ : #↑J < #↑(range ↑v)
⊢ (sum fun x => ℵ₀) < #↑(range ↑v)
[PROOFSTEP]
simpa
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁵ : Ring R
inst✝⁴ : StrongRankCondition R
M : Type v
inst✝³ : AddCommGroup M
inst✝² : Module R M
ι : Type u_2
inst✝¹ : Fintype ι
v : ι → M
i : LinearIndependent R v
w : Set M
inst✝ : Fintype ↑w
s : range v ≤ ↑(span R w)
⊢ Fintype.card ι ≤ Fintype.card ↑w
[PROOFSTEP]
fapply card_le_of_injective' R
[GOAL]
case f
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁵ : Ring R
inst✝⁴ : StrongRankCondition R
M : Type v
inst✝³ : AddCommGroup M
inst✝² : Module R M
ι : Type u_2
inst✝¹ : Fintype ι
v : ι → M
i : LinearIndependent R v
w : Set M
inst✝ : Fintype ↑w
s : range v ≤ ↑(span R w)
⊢ (ι →₀ R) →ₗ[R] ↑w →₀ R
[PROOFSTEP]
apply Finsupp.total
[GOAL]
case f.v
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁵ : Ring R
inst✝⁴ : StrongRankCondition R
M : Type v
inst✝³ : AddCommGroup M
inst✝² : Module R M
ι : Type u_2
inst✝¹ : Fintype ι
v : ι → M
i : LinearIndependent R v
w : Set M
inst✝ : Fintype ↑w
s : range v ≤ ↑(span R w)
⊢ ι → ↑w →₀ R
[PROOFSTEP]
exact fun i => Span.repr R w ⟨v i, s (mem_range_self i)⟩
[GOAL]
case i
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁵ : Ring R
inst✝⁴ : StrongRankCondition R
M : Type v
inst✝³ : AddCommGroup M
inst✝² : Module R M
ι : Type u_2
inst✝¹ : Fintype ι
v : ι → M
i : LinearIndependent R v
w : Set M
inst✝ : Fintype ↑w
s : range v ≤ ↑(span R w)
⊢ Injective ↑(Finsupp.total ι (↑w →₀ R) R fun i => Span.repr R w { val := v i, property := (_ : v i ∈ ↑(span R w)) })
[PROOFSTEP]
intro f g h
[GOAL]
case i
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁵ : Ring R
inst✝⁴ : StrongRankCondition R
M : Type v
inst✝³ : AddCommGroup M
inst✝² : Module R M
ι : Type u_2
inst✝¹ : Fintype ι
v : ι → M
i : LinearIndependent R v
w : Set M
inst✝ : Fintype ↑w
s : range v ≤ ↑(span R w)
f g : ι →₀ R
h :
  ↑(Finsupp.total ι (↑w →₀ R) R fun i => Span.repr R w { val := v i, property := (_ : v i ∈ ↑(span R w)) }) f =
    ↑(Finsupp.total ι (↑w →₀ R) R fun i => Span.repr R w { val := v i, property := (_ : v i ∈ ↑(span R w)) }) g
⊢ f = g
[PROOFSTEP]
apply_fun Finsupp.total w M R (↑) at h 
[GOAL]
case i
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁵ : Ring R
inst✝⁴ : StrongRankCondition R
M : Type v
inst✝³ : AddCommGroup M
inst✝² : Module R M
ι : Type u_2
inst✝¹ : Fintype ι
v : ι → M
i : LinearIndependent R v
w : Set M
inst✝ : Fintype ↑w
s : range v ≤ ↑(span R w)
f g : ι →₀ R
h :
  ↑(Finsupp.total (↑w) M R Subtype.val)
      (↑(Finsupp.total ι (↑w →₀ R) R fun i => Span.repr R w { val := v i, property := (_ : v i ∈ ↑(span R w)) }) f) =
    ↑(Finsupp.total (↑w) M R Subtype.val)
      (↑(Finsupp.total ι (↑w →₀ R) R fun i => Span.repr R w { val := v i, property := (_ : v i ∈ ↑(span R w)) }) g)
⊢ f = g
[PROOFSTEP]
simp only [Finsupp.total_total, Submodule.coe_mk, Span.finsupp_total_repr] at h 
[GOAL]
case i
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁵ : Ring R
inst✝⁴ : StrongRankCondition R
M : Type v
inst✝³ : AddCommGroup M
inst✝² : Module R M
ι : Type u_2
inst✝¹ : Fintype ι
v : ι → M
i : LinearIndependent R v
w : Set M
inst✝ : Fintype ↑w
s : range v ≤ ↑(span R w)
f g : ι →₀ R
h : ↑(Finsupp.total ι M R fun b => v b) f = ↑(Finsupp.total ι M R fun b => v b) g
⊢ f = g
[PROOFSTEP]
rw [← sub_eq_zero, ← LinearMap.map_sub] at h 
[GOAL]
case i
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁵ : Ring R
inst✝⁴ : StrongRankCondition R
M : Type v
inst✝³ : AddCommGroup M
inst✝² : Module R M
ι : Type u_2
inst✝¹ : Fintype ι
v : ι → M
i : LinearIndependent R v
w : Set M
inst✝ : Fintype ↑w
s : range v ≤ ↑(span R w)
f g : ι →₀ R
h✝ : ↑(Finsupp.total ι M R fun b => v b) f = ↑(Finsupp.total ι M R fun b => v b) g
h : ↑(Finsupp.total ι M R fun b => v b) (f - g) = 0
⊢ f = g
[PROOFSTEP]
exact sub_eq_zero.mp (linearIndependent_iff.mp i _ h)
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁴ : Ring R
inst✝³ : StrongRankCondition R
M : Type v
inst✝² : AddCommGroup M
inst✝¹ : Module R M
ι : Type u_2
v : ι → M
i : LinearIndependent R v
w : Set M
inst✝ : Fintype ↑w
s : range v ≤ ↑(span R w)
t : Finset ι
⊢ Finset.card t ≤ Fintype.card ↑w
[PROOFSTEP]
let v' := fun x : (t : Set ι) => v x
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁴ : Ring R
inst✝³ : StrongRankCondition R
M : Type v
inst✝² : AddCommGroup M
inst✝¹ : Module R M
ι : Type u_2
v : ι → M
i : LinearIndependent R v
w : Set M
inst✝ : Fintype ↑w
s : range v ≤ ↑(span R w)
t : Finset ι
v' : ↑↑t → M := fun x => v ↑x
⊢ Finset.card t ≤ Fintype.card ↑w
[PROOFSTEP]
have i' : LinearIndependent R v' := i.comp _ Subtype.val_injective
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁴ : Ring R
inst✝³ : StrongRankCondition R
M : Type v
inst✝² : AddCommGroup M
inst✝¹ : Module R M
ι : Type u_2
v : ι → M
i : LinearIndependent R v
w : Set M
inst✝ : Fintype ↑w
s : range v ≤ ↑(span R w)
t : Finset ι
v' : ↑↑t → M := fun x => v ↑x
i' : LinearIndependent R v'
⊢ Finset.card t ≤ Fintype.card ↑w
[PROOFSTEP]
have s' : range v' ≤ span R w := (range_comp_subset_range _ _).trans s
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁴ : Ring R
inst✝³ : StrongRankCondition R
M : Type v
inst✝² : AddCommGroup M
inst✝¹ : Module R M
ι : Type u_2
v : ι → M
i : LinearIndependent R v
w : Set M
inst✝ : Fintype ↑w
s : range v ≤ ↑(span R w)
t : Finset ι
v' : ↑↑t → M := fun x => v ↑x
i' : LinearIndependent R v'
s' : range v' ≤ ↑(span R w)
⊢ Finset.card t ≤ Fintype.card ↑w
[PROOFSTEP]
simpa using linearIndependent_le_span_aux' v' i' w s'
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁴ : Ring R
inst✝³ : StrongRankCondition R
M : Type v
inst✝² : AddCommGroup M
inst✝¹ : Module R M
ι : Type u_2
v : ι → M
i : LinearIndependent R v
w : Set M
inst✝ : Fintype ↑w
s : range v ≤ ↑(span R w)
⊢ #ι ≤ ↑(Fintype.card ↑w)
[PROOFSTEP]
haveI : Fintype ι := linearIndependentFintypeOfLeSpanFintype v i w s
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁴ : Ring R
inst✝³ : StrongRankCondition R
M : Type v
inst✝² : AddCommGroup M
inst✝¹ : Module R M
ι : Type u_2
v : ι → M
i : LinearIndependent R v
w : Set M
inst✝ : Fintype ↑w
s : range v ≤ ↑(span R w)
this : Fintype ι
⊢ #ι ≤ ↑(Fintype.card ↑w)
[PROOFSTEP]
rw [Cardinal.mk_fintype]
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁴ : Ring R
inst✝³ : StrongRankCondition R
M : Type v
inst✝² : AddCommGroup M
inst✝¹ : Module R M
ι : Type u_2
v : ι → M
i : LinearIndependent R v
w : Set M
inst✝ : Fintype ↑w
s : range v ≤ ↑(span R w)
this : Fintype ι
⊢ ↑(Fintype.card ι) ≤ ↑(Fintype.card ↑w)
[PROOFSTEP]
simp only [Cardinal.natCast_le]
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁴ : Ring R
inst✝³ : StrongRankCondition R
M : Type v
inst✝² : AddCommGroup M
inst✝¹ : Module R M
ι : Type u_2
v : ι → M
i : LinearIndependent R v
w : Set M
inst✝ : Fintype ↑w
s : range v ≤ ↑(span R w)
this : Fintype ι
⊢ Fintype.card ι ≤ Fintype.card ↑w
[PROOFSTEP]
exact linearIndependent_le_span_aux' v i w s
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁴ : Ring R
inst✝³ : StrongRankCondition R
M : Type v
inst✝² : AddCommGroup M
inst✝¹ : Module R M
ι : Type u_2
v : ι → M
i : LinearIndependent R v
w : Set M
inst✝ : Fintype ↑w
s : span R w = ⊤
⊢ #ι ≤ ↑(Fintype.card ↑w)
[PROOFSTEP]
apply linearIndependent_le_span' v i w
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁴ : Ring R
inst✝³ : StrongRankCondition R
M : Type v
inst✝² : AddCommGroup M
inst✝¹ : Module R M
ι : Type u_2
v : ι → M
i : LinearIndependent R v
w : Set M
inst✝ : Fintype ↑w
s : span R w = ⊤
⊢ range v ≤ ↑(span R w)
[PROOFSTEP]
rw [s]
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁴ : Ring R
inst✝³ : StrongRankCondition R
M : Type v
inst✝² : AddCommGroup M
inst✝¹ : Module R M
ι : Type u_2
v : ι → M
i : LinearIndependent R v
w : Set M
inst✝ : Fintype ↑w
s : span R w = ⊤
⊢ range v ≤ ↑⊤
[PROOFSTEP]
exact le_top
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : StrongRankCondition R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
ι : Type u_2
v : ι → M
i : LinearIndependent R v
w : Finset M
s : span R ↑w = ⊤
⊢ #ι ≤ ↑(Finset.card w)
[PROOFSTEP]
simpa only [Finset.coe_sort_coe, Fintype.card_coe] using linearIndependent_le_span v i w s
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁴ : Ring R
inst✝³ : StrongRankCondition R
M : Type v
inst✝² : AddCommGroup M
inst✝¹ : Module R M
ι : Type u_2
b : Basis ι R M
inst✝ : Infinite ι
κ : Type u_2
v : κ → M
i : LinearIndependent R v
⊢ #κ ≤ #ι
[PROOFSTEP]
classical
by_contra h
rw [not_le, ← Cardinal.mk_finset_of_infinite ι] at h 
let Φ := fun k : κ => (b.repr (v k)).support
obtain ⟨s, w : Infinite ↑(Φ ⁻¹' { s })⟩ := Cardinal.exists_infinite_fiber Φ h (by infer_instance)
let v' := fun k : Φ ⁻¹' { s } => v k
have i' : LinearIndependent R v' := i.comp _ Subtype.val_injective
have w' : Fintype (Φ ⁻¹' { s }) :=
  by
  apply linearIndependentFintypeOfLeSpanFintype v' i' (s.image b)
  rintro m ⟨⟨p, ⟨rfl⟩⟩, rfl⟩
  simp only [SetLike.mem_coe, Subtype.coe_mk, Finset.coe_image]
  apply Basis.mem_span_repr_support
exact w.false
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁴ : Ring R
inst✝³ : StrongRankCondition R
M : Type v
inst✝² : AddCommGroup M
inst✝¹ : Module R M
ι : Type u_2
b : Basis ι R M
inst✝ : Infinite ι
κ : Type u_2
v : κ → M
i : LinearIndependent R v
⊢ #κ ≤ #ι
[PROOFSTEP]
by_contra h
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁴ : Ring R
inst✝³ : StrongRankCondition R
M : Type v
inst✝² : AddCommGroup M
inst✝¹ : Module R M
ι : Type u_2
b : Basis ι R M
inst✝ : Infinite ι
κ : Type u_2
v : κ → M
i : LinearIndependent R v
h : ¬#κ ≤ #ι
⊢ False
[PROOFSTEP]
rw [not_le, ← Cardinal.mk_finset_of_infinite ι] at h 
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁴ : Ring R
inst✝³ : StrongRankCondition R
M : Type v
inst✝² : AddCommGroup M
inst✝¹ : Module R M
ι : Type u_2
b : Basis ι R M
inst✝ : Infinite ι
κ : Type u_2
v : κ → M
i : LinearIndependent R v
h : #(Finset ι) < #κ
⊢ False
[PROOFSTEP]
let Φ := fun k : κ => (b.repr (v k)).support
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁴ : Ring R
inst✝³ : StrongRankCondition R
M : Type v
inst✝² : AddCommGroup M
inst✝¹ : Module R M
ι : Type u_2
b : Basis ι R M
inst✝ : Infinite ι
κ : Type u_2
v : κ → M
i : LinearIndependent R v
h : #(Finset ι) < #κ
Φ : κ → Finset ι := fun k => (↑b.repr (v k)).support
⊢ False
[PROOFSTEP]
obtain ⟨s, w : Infinite ↑(Φ ⁻¹' { s })⟩ := Cardinal.exists_infinite_fiber Φ h (by infer_instance)
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁴ : Ring R
inst✝³ : StrongRankCondition R
M : Type v
inst✝² : AddCommGroup M
inst✝¹ : Module R M
ι : Type u_2
b : Basis ι R M
inst✝ : Infinite ι
κ : Type u_2
v : κ → M
i : LinearIndependent R v
h : #(Finset ι) < #κ
Φ : κ → Finset ι := fun k => (↑b.repr (v k)).support
⊢ Infinite (Finset ι)
[PROOFSTEP]
infer_instance
[GOAL]
case intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁴ : Ring R
inst✝³ : StrongRankCondition R
M : Type v
inst✝² : AddCommGroup M
inst✝¹ : Module R M
ι : Type u_2
b : Basis ι R M
inst✝ : Infinite ι
κ : Type u_2
v : κ → M
i : LinearIndependent R v
h : #(Finset ι) < #κ
Φ : κ → Finset ι := fun k => (↑b.repr (v k)).support
s : Finset ι
w : Infinite ↑(Φ ⁻¹' {s})
⊢ False
[PROOFSTEP]
let v' := fun k : Φ ⁻¹' { s } => v k
[GOAL]
case intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁴ : Ring R
inst✝³ : StrongRankCondition R
M : Type v
inst✝² : AddCommGroup M
inst✝¹ : Module R M
ι : Type u_2
b : Basis ι R M
inst✝ : Infinite ι
κ : Type u_2
v : κ → M
i : LinearIndependent R v
h : #(Finset ι) < #κ
Φ : κ → Finset ι := fun k => (↑b.repr (v k)).support
s : Finset ι
w : Infinite ↑(Φ ⁻¹' {s})
v' : ↑(Φ ⁻¹' {s}) → M := fun k => v ↑k
⊢ False
[PROOFSTEP]
have i' : LinearIndependent R v' := i.comp _ Subtype.val_injective
[GOAL]
case intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁴ : Ring R
inst✝³ : StrongRankCondition R
M : Type v
inst✝² : AddCommGroup M
inst✝¹ : Module R M
ι : Type u_2
b : Basis ι R M
inst✝ : Infinite ι
κ : Type u_2
v : κ → M
i : LinearIndependent R v
h : #(Finset ι) < #κ
Φ : κ → Finset ι := fun k => (↑b.repr (v k)).support
s : Finset ι
w : Infinite ↑(Φ ⁻¹' {s})
v' : ↑(Φ ⁻¹' {s}) → M := fun k => v ↑k
i' : LinearIndependent R v'
⊢ False
[PROOFSTEP]
have w' : Fintype (Φ ⁻¹' { s }) :=
  by
  apply linearIndependentFintypeOfLeSpanFintype v' i' (s.image b)
  rintro m ⟨⟨p, ⟨rfl⟩⟩, rfl⟩
  simp only [SetLike.mem_coe, Subtype.coe_mk, Finset.coe_image]
  apply Basis.mem_span_repr_support
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁴ : Ring R
inst✝³ : StrongRankCondition R
M : Type v
inst✝² : AddCommGroup M
inst✝¹ : Module R M
ι : Type u_2
b : Basis ι R M
inst✝ : Infinite ι
κ : Type u_2
v : κ → M
i : LinearIndependent R v
h : #(Finset ι) < #κ
Φ : κ → Finset ι := fun k => (↑b.repr (v k)).support
s : Finset ι
w : Infinite ↑(Φ ⁻¹' {s})
v' : ↑(Φ ⁻¹' {s}) → M := fun k => v ↑k
i' : LinearIndependent R v'
⊢ Fintype ↑(Φ ⁻¹' {s})
[PROOFSTEP]
apply linearIndependentFintypeOfLeSpanFintype v' i' (s.image b)
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁴ : Ring R
inst✝³ : StrongRankCondition R
M : Type v
inst✝² : AddCommGroup M
inst✝¹ : Module R M
ι : Type u_2
b : Basis ι R M
inst✝ : Infinite ι
κ : Type u_2
v : κ → M
i : LinearIndependent R v
h : #(Finset ι) < #κ
Φ : κ → Finset ι := fun k => (↑b.repr (v k)).support
s : Finset ι
w : Infinite ↑(Φ ⁻¹' {s})
v' : ↑(Φ ⁻¹' {s}) → M := fun k => v ↑k
i' : LinearIndependent R v'
⊢ range v' ≤ ↑(span R ↑(Finset.image (↑b) s))
[PROOFSTEP]
rintro m ⟨⟨p, ⟨rfl⟩⟩, rfl⟩
[GOAL]
case intro.mk.refl
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁴ : Ring R
inst✝³ : StrongRankCondition R
M : Type v
inst✝² : AddCommGroup M
inst✝¹ : Module R M
ι : Type u_2
b : Basis ι R M
inst✝ : Infinite ι
κ : Type u_2
v : κ → M
i : LinearIndependent R v
h : #(Finset ι) < #κ
Φ : κ → Finset ι := fun k => (↑b.repr (v k)).support
p : κ
w : Infinite ↑(Φ ⁻¹' {Φ p})
v' : ↑(Φ ⁻¹' {Φ p}) → M := fun k => v ↑k
i' : LinearIndependent R v'
⊢ v' { val := p, property := (_ : Φ p = Φ p) } ∈ ↑(span R ↑(Finset.image (↑b) (Φ p)))
[PROOFSTEP]
simp only [SetLike.mem_coe, Subtype.coe_mk, Finset.coe_image]
[GOAL]
case intro.mk.refl
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁴ : Ring R
inst✝³ : StrongRankCondition R
M : Type v
inst✝² : AddCommGroup M
inst✝¹ : Module R M
ι : Type u_2
b : Basis ι R M
inst✝ : Infinite ι
κ : Type u_2
v : κ → M
i : LinearIndependent R v
h : #(Finset ι) < #κ
Φ : κ → Finset ι := fun k => (↑b.repr (v k)).support
p : κ
w : Infinite ↑(Φ ⁻¹' {Φ p})
v' : ↑(Φ ⁻¹' {Φ p}) → M := fun k => v ↑k
i' : LinearIndependent R v'
⊢ v p ∈ span R (↑b '' ↑(↑b.repr (v p)).support)
[PROOFSTEP]
apply Basis.mem_span_repr_support
[GOAL]
case intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁴ : Ring R
inst✝³ : StrongRankCondition R
M : Type v
inst✝² : AddCommGroup M
inst✝¹ : Module R M
ι : Type u_2
b : Basis ι R M
inst✝ : Infinite ι
κ : Type u_2
v : κ → M
i : LinearIndependent R v
h : #(Finset ι) < #κ
Φ : κ → Finset ι := fun k => (↑b.repr (v k)).support
s : Finset ι
w : Infinite ↑(Φ ⁻¹' {s})
v' : ↑(Φ ⁻¹' {s}) → M := fun k => v ↑k
i' : LinearIndependent R v'
w' : Fintype ↑(Φ ⁻¹' {s})
⊢ False
[PROOFSTEP]
exact w.false
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : StrongRankCondition R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
ι : Type u_2
b : Basis ι R M
κ : Type u_2
v : κ → M
i : LinearIndependent R v
⊢ #κ ≤ #ι
[PROOFSTEP]
classical
  -- We split into cases depending on whether `ι` is infinite.
cases fintypeOrInfinite ι
· rw [Cardinal.mk_fintype ι]
    -- When `ι` is finite, we have `linearIndependent_le_span`,
  haveI : Nontrivial R := nontrivial_of_invariantBasisNumber R
  rw [Fintype.card_congr (Equiv.ofInjective b b.injective)]
  exact linearIndependent_le_span v i (range b) b.span_eq
·
  -- and otherwise we have `linearIndependent_le_infinite_basis`.exact linearIndependent_le_infinite_basis b v i
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : StrongRankCondition R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
ι : Type u_2
b : Basis ι R M
κ : Type u_2
v : κ → M
i : LinearIndependent R v
⊢ #κ ≤ #ι
[PROOFSTEP]
cases fintypeOrInfinite ι
[GOAL]
case inl
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : StrongRankCondition R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
ι : Type u_2
b : Basis ι R M
κ : Type u_2
v : κ → M
i : LinearIndependent R v
val✝ : Fintype ι
⊢ #κ ≤ #ι
[PROOFSTEP]
rw [Cardinal.mk_fintype ι]
  -- When `ι` is finite, we have `linearIndependent_le_span`,
[GOAL]
case inl
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : StrongRankCondition R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
ι : Type u_2
b : Basis ι R M
κ : Type u_2
v : κ → M
i : LinearIndependent R v
val✝ : Fintype ι
⊢ #κ ≤ ↑(Fintype.card ι)
[PROOFSTEP]
haveI : Nontrivial R := nontrivial_of_invariantBasisNumber R
[GOAL]
case inl
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : StrongRankCondition R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
ι : Type u_2
b : Basis ι R M
κ : Type u_2
v : κ → M
i : LinearIndependent R v
val✝ : Fintype ι
this : Nontrivial R
⊢ #κ ≤ ↑(Fintype.card ι)
[PROOFSTEP]
rw [Fintype.card_congr (Equiv.ofInjective b b.injective)]
[GOAL]
case inl
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : StrongRankCondition R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
ι : Type u_2
b : Basis ι R M
κ : Type u_2
v : κ → M
i : LinearIndependent R v
val✝ : Fintype ι
this : Nontrivial R
⊢ #κ ≤ ↑(Fintype.card ↑(range ↑b))
[PROOFSTEP]
exact linearIndependent_le_span v i (range b) b.span_eq
[GOAL]
case inr
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : StrongRankCondition R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
ι : Type u_2
b : Basis ι R M
κ : Type u_2
v : κ → M
i : LinearIndependent R v
val✝ : Infinite ι
⊢ #κ ≤ #ι
[PROOFSTEP]
exact linearIndependent_le_infinite_basis b v i
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R✝ : Type u
inst✝⁵ : Ring R✝
inst✝⁴ : StrongRankCondition R✝
M : Type v
inst✝³ : AddCommGroup M
inst✝² : Module R✝ M
R : Type u_2
inst✝¹ : Ring R
inst✝ : StrongRankCondition R
n m : ℕ
v : Fin m → Fin n → R
h : LinearIndependent R v
⊢ m ≤ n
[PROOFSTEP]
simpa using linearIndependent_le_basis (Pi.basisFun R (Fin n)) v h
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁴ : Ring R
inst✝³ : StrongRankCondition R
M : Type v
inst✝² : AddCommGroup M
inst✝¹ : Module R M
ι : Type u_2
b : Basis ι R M
inst✝ : Infinite ι
κ : Type u_2
v : κ → M
i : LinearIndependent R v
m : LinearIndependent.Maximal i
⊢ #κ = #ι
[PROOFSTEP]
apply le_antisymm
[GOAL]
case a
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁴ : Ring R
inst✝³ : StrongRankCondition R
M : Type v
inst✝² : AddCommGroup M
inst✝¹ : Module R M
ι : Type u_2
b : Basis ι R M
inst✝ : Infinite ι
κ : Type u_2
v : κ → M
i : LinearIndependent R v
m : LinearIndependent.Maximal i
⊢ #κ ≤ #ι
[PROOFSTEP]
exact linearIndependent_le_basis b v i
[GOAL]
case a
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁴ : Ring R
inst✝³ : StrongRankCondition R
M : Type v
inst✝² : AddCommGroup M
inst✝¹ : Module R M
ι : Type u_2
b : Basis ι R M
inst✝ : Infinite ι
κ : Type u_2
v : κ → M
i : LinearIndependent R v
m : LinearIndependent.Maximal i
⊢ #ι ≤ #κ
[PROOFSTEP]
haveI : Nontrivial R := nontrivial_of_invariantBasisNumber R
[GOAL]
case a
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁴ : Ring R
inst✝³ : StrongRankCondition R
M : Type v
inst✝² : AddCommGroup M
inst✝¹ : Module R M
ι : Type u_2
b : Basis ι R M
inst✝ : Infinite ι
κ : Type u_2
v : κ → M
i : LinearIndependent R v
m : LinearIndependent.Maximal i
this : Nontrivial R
⊢ #ι ≤ #κ
[PROOFSTEP]
exact infinite_basis_le_maximal_linearIndependent b v i m
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : StrongRankCondition R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
ι : Type v
v : Basis ι R M
⊢ #ι = Module.rank R M
[PROOFSTEP]
haveI := nontrivial_of_invariantBasisNumber R
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : StrongRankCondition R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
ι : Type v
v : Basis ι R M
this : Nontrivial R
⊢ #ι = Module.rank R M
[PROOFSTEP]
rw [Module.rank_def]
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : StrongRankCondition R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
ι : Type v
v : Basis ι R M
this : Nontrivial R
⊢ #ι = ⨆ (ι : { s // LinearIndependent R Subtype.val }), #↑↑ι
[PROOFSTEP]
apply le_antisymm
[GOAL]
case a
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : StrongRankCondition R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
ι : Type v
v : Basis ι R M
this : Nontrivial R
⊢ #ι ≤ ⨆ (ι : { s // LinearIndependent R Subtype.val }), #↑↑ι
[PROOFSTEP]
trans
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : StrongRankCondition R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
ι : Type v
v : Basis ι R M
this : Nontrivial R
⊢ #ι ≤ ?m.374465
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : StrongRankCondition R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
ι : Type v
v : Basis ι R M
this : Nontrivial R
⊢ ?m.374465 ≤ ⨆ (ι : { s // LinearIndependent R Subtype.val }), #↑↑ι
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : StrongRankCondition R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
ι : Type v
v : Basis ι R M
this : Nontrivial R
⊢ Cardinal.{v}
[PROOFSTEP]
swap
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : StrongRankCondition R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
ι : Type v
v : Basis ι R M
this : Nontrivial R
⊢ ?m.374465 ≤ ⨆ (ι : { s // LinearIndependent R Subtype.val }), #↑↑ι
[PROOFSTEP]
apply le_ciSup (Cardinal.bddAbove_range.{v, v} _)
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : StrongRankCondition R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
ι : Type v
v : Basis ι R M
this : Nontrivial R
⊢ { s // LinearIndependent R Subtype.val }
[PROOFSTEP]
exact
  ⟨Set.range v, by
    convert v.reindexRange.linearIndependent
    ext
    simp⟩
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : StrongRankCondition R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
ι : Type v
v : Basis ι R M
this : Nontrivial R
⊢ LinearIndependent R Subtype.val
[PROOFSTEP]
convert v.reindexRange.linearIndependent
[GOAL]
case h.e'_4
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : StrongRankCondition R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
ι : Type v
v : Basis ι R M
this : Nontrivial R
⊢ Subtype.val = ↑(reindexRange v)
[PROOFSTEP]
ext
[GOAL]
case h.e'_4.h
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : StrongRankCondition R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
ι : Type v
v : Basis ι R M
this : Nontrivial R
x✝ : { x // x ∈ range ↑v }
⊢ ↑x✝ = ↑(reindexRange v) x✝
[PROOFSTEP]
simp
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : StrongRankCondition R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
ι : Type v
v : Basis ι R M
this : Nontrivial R
⊢ #ι ≤ #↑↑{ val := range ↑v, property := (_ : LinearIndependent R Subtype.val) }
[PROOFSTEP]
exact (Cardinal.mk_range_eq v v.injective).ge
[GOAL]
case a
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : StrongRankCondition R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
ι : Type v
v : Basis ι R M
this : Nontrivial R
⊢ ⨆ (ι : { s // LinearIndependent R Subtype.val }), #↑↑ι ≤ #ι
[PROOFSTEP]
apply ciSup_le'
[GOAL]
case a.h
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : StrongRankCondition R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
ι : Type v
v : Basis ι R M
this : Nontrivial R
⊢ ∀ (i : { s // LinearIndependent R Subtype.val }), #↑↑i ≤ #ι
[PROOFSTEP]
rintro ⟨s, li⟩
[GOAL]
case a.h.mk
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : StrongRankCondition R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
ι : Type v
v : Basis ι R M
this : Nontrivial R
s : Set M
li : LinearIndependent R Subtype.val
⊢ #↑↑{ val := s, property := li } ≤ #ι
[PROOFSTEP]
apply linearIndependent_le_basis v _ li
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁴ : Ring R
inst✝³ : StrongRankCondition R
M : Type v
inst✝² : AddCommGroup M
inst✝¹ : Module R M
ι : Type w
inst✝ : Fintype ι
h : Basis ι R M
⊢ Module.rank R M = ↑(Fintype.card ι)
[PROOFSTEP]
classical
haveI := nontrivial_of_invariantBasisNumber R
rw [← h.mk_range_eq_rank, Cardinal.mk_fintype, Set.card_range_of_injective h.injective]
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁴ : Ring R
inst✝³ : StrongRankCondition R
M : Type v
inst✝² : AddCommGroup M
inst✝¹ : Module R M
ι : Type w
inst✝ : Fintype ι
h : Basis ι R M
⊢ Module.rank R M = ↑(Fintype.card ι)
[PROOFSTEP]
haveI := nontrivial_of_invariantBasisNumber R
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁴ : Ring R
inst✝³ : StrongRankCondition R
M : Type v
inst✝² : AddCommGroup M
inst✝¹ : Module R M
ι : Type w
inst✝ : Fintype ι
h : Basis ι R M
this : Nontrivial R
⊢ Module.rank R M = ↑(Fintype.card ι)
[PROOFSTEP]
rw [← h.mk_range_eq_rank, Cardinal.mk_fintype, Set.card_range_of_injective h.injective]
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι'✝ : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁵ : Ring R
inst✝⁴ : StrongRankCondition R
M : Type v
inst✝³ : AddCommGroup M
inst✝² : Module R M
ι : Type u_2
inst✝¹ : Fintype ι
b : Basis ι R M
ι' : Type u_3
inst✝ : Fintype ι'
v : ι' → M
hv : LinearIndependent R v
⊢ Fintype.card ι' ≤ Fintype.card ι
[PROOFSTEP]
letI := nontrivial_of_invariantBasisNumber R
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι'✝ : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁵ : Ring R
inst✝⁴ : StrongRankCondition R
M : Type v
inst✝³ : AddCommGroup M
inst✝² : Module R M
ι : Type u_2
inst✝¹ : Fintype ι
b : Basis ι R M
ι' : Type u_3
inst✝ : Fintype ι'
v : ι' → M
hv : LinearIndependent R v
this : Nontrivial R := nontrivial_of_invariantBasisNumber R
⊢ Fintype.card ι' ≤ Fintype.card ι
[PROOFSTEP]
simpa [rank_eq_card_basis b, Cardinal.mk_fintype] using cardinal_lift_le_rank_of_linearIndependent' hv
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : StrongRankCondition R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
v : Basis ι R M
⊢ lift #ι = lift (Module.rank R M)
[PROOFSTEP]
haveI := nontrivial_of_invariantBasisNumber R
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : StrongRankCondition R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
v : Basis ι R M
this : Nontrivial R
⊢ lift #ι = lift (Module.rank R M)
[PROOFSTEP]
rw [← v.mk_range_eq_rank, Cardinal.mk_range_eq_of_injective v.injective]
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι✝ : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : StrongRankCondition R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
ι : Type u_2
b : Basis ι R M
h : Module.rank R M < ℵ₀
⊢ Nonempty (Fintype ι)
[PROOFSTEP]
rwa [← Cardinal.lift_lt, ← b.mk_eq_rank, Cardinal.lift_aleph0, Cardinal.lift_lt_aleph0,
  Cardinal.lt_aleph0_iff_fintype] at h 
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : StrongRankCondition R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
v : ι → M
hv : LinearIndependent R v
⊢ Module.rank R { x // x ∈ span R (range v) } = #↑(range v)
[PROOFSTEP]
haveI := nontrivial_of_invariantBasisNumber R
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : StrongRankCondition R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
v : ι → M
hv : LinearIndependent R v
this : Nontrivial R
⊢ Module.rank R { x // x ∈ span R (range v) } = #↑(range v)
[PROOFSTEP]
rw [← Cardinal.lift_inj, ← (Basis.span hv).mk_eq_rank,
  Cardinal.mk_range_eq_of_injective (@LinearIndependent.injective ι R M v _ _ _ _ hv)]
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : StrongRankCondition R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
s : Set M
hs : LinearIndependent R fun x => ↑x
⊢ Module.rank R { x // x ∈ span R s } = #↑s
[PROOFSTEP]
rw [← @setOf_mem_eq _ s, ← Subtype.range_coe_subtype]
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : StrongRankCondition R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
s : Set M
hs : LinearIndependent R fun x => ↑x
⊢ Module.rank R { x // x ∈ span R (range Subtype.val) } = #↑(range Subtype.val)
[PROOFSTEP]
exact rank_span hs
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝⁵ : Ring R
inst✝⁴ : StrongRankCondition R
M : Type v
inst✝³ : AddCommGroup M
inst✝² : Module R M
inst✝¹ : IsDomain R
inst✝ : Fintype ι
b : Basis ι R M
P : Submodule R M → Sort u_2
ih :
  (N : Submodule R M) →
    ((N' : Submodule R M) → N' ≤ N → (x : M) → x ∈ N → (∀ (c : R) (y : M), y ∈ N' → c • x + y = 0 → c = 0) → P N') → P N
N : Submodule R M
m✝ : ℕ
hs : Fin m✝ → { x // x ∈ N }
hli : LinearIndependent R (Subtype.val ∘ hs)
⊢ m✝ ≤ Fintype.card ι
[PROOFSTEP]
simpa using b.card_le_card_of_linearIndependent hli
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R✝ : Type u
inst✝¹⁰ : Ring R✝
inst✝⁹ : StrongRankCondition R✝
M : Type v
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R✝ M
R : Type u_2
S : Type u_3
inst✝⁶ : CommRing R
inst✝⁵ : StrongRankCondition R
inst✝⁴ : Ring S
inst✝³ : IsDomain S
inst✝² : Algebra R S
n : Type u_4
m : Type u_5
inst✝¹ : Fintype n
inst✝ : Fintype m
b : Basis n R S
I : Ideal S
hI : I ≠ ⊥
c : Basis m R { x // x ∈ I }
⊢ Fintype.card m = Fintype.card n
[PROOFSTEP]
obtain ⟨a, ha⟩ := Submodule.nonzero_mem_of_bot_lt (bot_lt_iff_ne_bot.mpr hI)
[GOAL]
case intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R✝ : Type u
inst✝¹⁰ : Ring R✝
inst✝⁹ : StrongRankCondition R✝
M : Type v
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R✝ M
R : Type u_2
S : Type u_3
inst✝⁶ : CommRing R
inst✝⁵ : StrongRankCondition R
inst✝⁴ : Ring S
inst✝³ : IsDomain S
inst✝² : Algebra R S
n : Type u_4
m : Type u_5
inst✝¹ : Fintype n
inst✝ : Fintype m
b : Basis n R S
I : Ideal S
hI : I ≠ ⊥
c : Basis m R { x // x ∈ I }
a : { x // x ∈ I }
ha : a ≠ 0
⊢ Fintype.card m = Fintype.card n
[PROOFSTEP]
have : LinearIndependent R fun i => b i • a :=
  by
  have hb := b.linearIndependent
  rw [Fintype.linearIndependent_iff] at hb ⊢
  intro g hg
  apply hb g
  simp only [← smul_assoc, ← Finset.sum_smul, smul_eq_zero] at hg 
  exact hg.resolve_right ha
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R✝ : Type u
inst✝¹⁰ : Ring R✝
inst✝⁹ : StrongRankCondition R✝
M : Type v
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R✝ M
R : Type u_2
S : Type u_3
inst✝⁶ : CommRing R
inst✝⁵ : StrongRankCondition R
inst✝⁴ : Ring S
inst✝³ : IsDomain S
inst✝² : Algebra R S
n : Type u_4
m : Type u_5
inst✝¹ : Fintype n
inst✝ : Fintype m
b : Basis n R S
I : Ideal S
hI : I ≠ ⊥
c : Basis m R { x // x ∈ I }
a : { x // x ∈ I }
ha : a ≠ 0
⊢ LinearIndependent R fun i => ↑b i • a
[PROOFSTEP]
have hb := b.linearIndependent
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R✝ : Type u
inst✝¹⁰ : Ring R✝
inst✝⁹ : StrongRankCondition R✝
M : Type v
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R✝ M
R : Type u_2
S : Type u_3
inst✝⁶ : CommRing R
inst✝⁵ : StrongRankCondition R
inst✝⁴ : Ring S
inst✝³ : IsDomain S
inst✝² : Algebra R S
n : Type u_4
m : Type u_5
inst✝¹ : Fintype n
inst✝ : Fintype m
b : Basis n R S
I : Ideal S
hI : I ≠ ⊥
c : Basis m R { x // x ∈ I }
a : { x // x ∈ I }
ha : a ≠ 0
hb : LinearIndependent R ↑b
⊢ LinearIndependent R fun i => ↑b i • a
[PROOFSTEP]
rw [Fintype.linearIndependent_iff] at hb ⊢
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R✝ : Type u
inst✝¹⁰ : Ring R✝
inst✝⁹ : StrongRankCondition R✝
M : Type v
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R✝ M
R : Type u_2
S : Type u_3
inst✝⁶ : CommRing R
inst✝⁵ : StrongRankCondition R
inst✝⁴ : Ring S
inst✝³ : IsDomain S
inst✝² : Algebra R S
n : Type u_4
m : Type u_5
inst✝¹ : Fintype n
inst✝ : Fintype m
b : Basis n R S
I : Ideal S
hI : I ≠ ⊥
c : Basis m R { x // x ∈ I }
a : { x // x ∈ I }
ha : a ≠ 0
hb✝ : LinearIndependent R ↑b
hb : ∀ (g : n → R), ∑ i : n, g i • ↑b i = 0 → ∀ (i : n), g i = 0
⊢ ∀ (g : n → R), ∑ i : n, g i • ↑b i • a = 0 → ∀ (i : n), g i = 0
[PROOFSTEP]
intro g hg
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R✝ : Type u
inst✝¹⁰ : Ring R✝
inst✝⁹ : StrongRankCondition R✝
M : Type v
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R✝ M
R : Type u_2
S : Type u_3
inst✝⁶ : CommRing R
inst✝⁵ : StrongRankCondition R
inst✝⁴ : Ring S
inst✝³ : IsDomain S
inst✝² : Algebra R S
n : Type u_4
m : Type u_5
inst✝¹ : Fintype n
inst✝ : Fintype m
b : Basis n R S
I : Ideal S
hI : I ≠ ⊥
c : Basis m R { x // x ∈ I }
a : { x // x ∈ I }
ha : a ≠ 0
hb✝ : LinearIndependent R ↑b
hb : ∀ (g : n → R), ∑ i : n, g i • ↑b i = 0 → ∀ (i : n), g i = 0
g : n → R
hg : ∑ i : n, g i • ↑b i • a = 0
⊢ ∀ (i : n), g i = 0
[PROOFSTEP]
apply hb g
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R✝ : Type u
inst✝¹⁰ : Ring R✝
inst✝⁹ : StrongRankCondition R✝
M : Type v
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R✝ M
R : Type u_2
S : Type u_3
inst✝⁶ : CommRing R
inst✝⁵ : StrongRankCondition R
inst✝⁴ : Ring S
inst✝³ : IsDomain S
inst✝² : Algebra R S
n : Type u_4
m : Type u_5
inst✝¹ : Fintype n
inst✝ : Fintype m
b : Basis n R S
I : Ideal S
hI : I ≠ ⊥
c : Basis m R { x // x ∈ I }
a : { x // x ∈ I }
ha : a ≠ 0
hb✝ : LinearIndependent R ↑b
hb : ∀ (g : n → R), ∑ i : n, g i • ↑b i = 0 → ∀ (i : n), g i = 0
g : n → R
hg : ∑ i : n, g i • ↑b i • a = 0
⊢ ∑ i : n, g i • ↑b i = 0
[PROOFSTEP]
simp only [← smul_assoc, ← Finset.sum_smul, smul_eq_zero] at hg 
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R✝ : Type u
inst✝¹⁰ : Ring R✝
inst✝⁹ : StrongRankCondition R✝
M : Type v
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R✝ M
R : Type u_2
S : Type u_3
inst✝⁶ : CommRing R
inst✝⁵ : StrongRankCondition R
inst✝⁴ : Ring S
inst✝³ : IsDomain S
inst✝² : Algebra R S
n : Type u_4
m : Type u_5
inst✝¹ : Fintype n
inst✝ : Fintype m
b : Basis n R S
I : Ideal S
hI : I ≠ ⊥
c : Basis m R { x // x ∈ I }
a : { x // x ∈ I }
ha : a ≠ 0
hb✝ : LinearIndependent R ↑b
hb : ∀ (g : n → R), ∑ i : n, g i • ↑b i = 0 → ∀ (i : n), g i = 0
g : n → R
hg : ∑ i : n, g i • ↑b i = 0 ∨ a = 0
⊢ ∑ i : n, g i • ↑b i = 0
[PROOFSTEP]
exact hg.resolve_right ha
[GOAL]
case intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R✝ : Type u
inst✝¹⁰ : Ring R✝
inst✝⁹ : StrongRankCondition R✝
M : Type v
inst✝⁸ : AddCommGroup M
inst✝⁷ : Module R✝ M
R : Type u_2
S : Type u_3
inst✝⁶ : CommRing R
inst✝⁵ : StrongRankCondition R
inst✝⁴ : Ring S
inst✝³ : IsDomain S
inst✝² : Algebra R S
n : Type u_4
m : Type u_5
inst✝¹ : Fintype n
inst✝ : Fintype m
b : Basis n R S
I : Ideal S
hI : I ≠ ⊥
c : Basis m R { x // x ∈ I }
a : { x // x ∈ I }
ha : a ≠ 0
this : LinearIndependent R fun i => ↑b i • a
⊢ Fintype.card m = Fintype.card n
[PROOFSTEP]
exact
  le_antisymm
    (b.card_le_card_of_linearIndependent
      (c.linearIndependent.map' (Submodule.subtype I)
        ((LinearMap.ker_eq_bot (f := (Submodule.subtype I : I →ₗ[R] S))).mpr Subtype.coe_injective)))
    (c.card_le_card_of_linearIndependent this)
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
R : Type u
inst✝³ : Ring R
inst✝² : StrongRankCondition R
M : Type v
inst✝¹ : AddCommGroup M
inst✝ : Module R M
⊢ Module.rank R R = 1
[PROOFSTEP]
rw [← Cardinal.lift_inj, ← (Basis.singleton PUnit R).mk_eq_rank, Cardinal.mk_punit]
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : Ring K
inst✝⁹ : StrongRankCondition K
inst✝⁸ : AddCommGroup V
inst✝⁷ : Module K V
inst✝⁶ : Module.Free K V
inst✝⁵ : AddCommGroup V'
inst✝⁴ : Module K V'
inst✝³ : Module.Free K V'
inst✝² : AddCommGroup V₁
inst✝¹ : Module K V₁
inst✝ : Module.Free K V₁
cnd : lift (Module.rank K V) = lift (Module.rank K V')
⊢ Nonempty (V ≃ₗ[K] V')
[PROOFSTEP]
obtain ⟨⟨_, B⟩⟩ := Module.Free.exists_basis (R := K) (M := V)
[GOAL]
case intro.mk
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : Ring K
inst✝⁹ : StrongRankCondition K
inst✝⁸ : AddCommGroup V
inst✝⁷ : Module K V
inst✝⁶ : Module.Free K V
inst✝⁵ : AddCommGroup V'
inst✝⁴ : Module K V'
inst✝³ : Module.Free K V'
inst✝² : AddCommGroup V₁
inst✝¹ : Module K V₁
inst✝ : Module.Free K V₁
cnd : lift (Module.rank K V) = lift (Module.rank K V')
fst✝ : Type v
B : Basis fst✝ K V
⊢ Nonempty (V ≃ₗ[K] V')
[PROOFSTEP]
obtain ⟨⟨_, B'⟩⟩ := Module.Free.exists_basis (R := K) (M := V')
[GOAL]
case intro.mk.intro.mk
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : Ring K
inst✝⁹ : StrongRankCondition K
inst✝⁸ : AddCommGroup V
inst✝⁷ : Module K V
inst✝⁶ : Module.Free K V
inst✝⁵ : AddCommGroup V'
inst✝⁴ : Module K V'
inst✝³ : Module.Free K V'
inst✝² : AddCommGroup V₁
inst✝¹ : Module K V₁
inst✝ : Module.Free K V₁
cnd : lift (Module.rank K V) = lift (Module.rank K V')
fst✝¹ : Type v
B : Basis fst✝¹ K V
fst✝ : Type v'
B' : Basis fst✝ K V'
⊢ Nonempty (V ≃ₗ[K] V')
[PROOFSTEP]
have : Cardinal.lift.{v', v} #_ = Cardinal.lift.{v, v'} #_ := by rw [B.mk_eq_rank'', cnd, B'.mk_eq_rank'']
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : Ring K
inst✝⁹ : StrongRankCondition K
inst✝⁸ : AddCommGroup V
inst✝⁷ : Module K V
inst✝⁶ : Module.Free K V
inst✝⁵ : AddCommGroup V'
inst✝⁴ : Module K V'
inst✝³ : Module.Free K V'
inst✝² : AddCommGroup V₁
inst✝¹ : Module K V₁
inst✝ : Module.Free K V₁
cnd : lift (Module.rank K V) = lift (Module.rank K V')
fst✝¹ : Type v
B : Basis fst✝¹ K V
fst✝ : Type v'
B' : Basis fst✝ K V'
⊢ lift #?m.460093 = lift #?m.460095
[PROOFSTEP]
rw [B.mk_eq_rank'', cnd, B'.mk_eq_rank'']
[GOAL]
case intro.mk.intro.mk
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : Ring K
inst✝⁹ : StrongRankCondition K
inst✝⁸ : AddCommGroup V
inst✝⁷ : Module K V
inst✝⁶ : Module.Free K V
inst✝⁵ : AddCommGroup V'
inst✝⁴ : Module K V'
inst✝³ : Module.Free K V'
inst✝² : AddCommGroup V₁
inst✝¹ : Module K V₁
inst✝ : Module.Free K V₁
cnd : lift (Module.rank K V) = lift (Module.rank K V')
fst✝¹ : Type v
B : Basis fst✝¹ K V
fst✝ : Type v'
B' : Basis fst✝ K V'
this : lift #fst✝¹ = lift #fst✝
⊢ Nonempty (V ≃ₗ[K] V')
[PROOFSTEP]
exact (Cardinal.lift_mk_eq.{v, v', 0}.1 this).map (B.equiv B')
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : Ring K
inst✝⁹ : StrongRankCondition K
inst✝⁸ : AddCommGroup V
inst✝⁷ : Module K V
inst✝⁶ : Module.Free K V
inst✝⁵ : AddCommGroup V'
inst✝⁴ : Module K V'
inst✝³ : Module.Free K V'
inst✝² : AddCommGroup V₁
inst✝¹ : Module K V₁
inst✝ : Module.Free K V₁
⊢ Module.rank K (V × V') = lift (Module.rank K V) + lift (Module.rank K V')
[PROOFSTEP]
simpa [rank_eq_card_chooseBasisIndex K V, rank_eq_card_chooseBasisIndex K V', lift_umax, lift_umax'] using
  ((chooseBasis K V).prod (chooseBasis K V')).mk_eq_rank.symm
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : Ring K
inst✝⁹ : StrongRankCondition K
inst✝⁸ : AddCommGroup V
inst✝⁷ : Module K V
inst✝⁶ : Module.Free K V
inst✝⁵ : AddCommGroup V'
inst✝⁴ : Module K V'
inst✝³ : Module.Free K V'
inst✝² : AddCommGroup V₁
inst✝¹ : Module K V₁
inst✝ : Module.Free K V₁
⊢ Module.rank K (V × V₁) = Module.rank K V + Module.rank K V₁
[PROOFSTEP]
simp
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁴ : Ring K
inst✝¹³ : StrongRankCondition K
inst✝¹² : AddCommGroup V
inst✝¹¹ : Module K V
inst✝¹⁰ : Module.Free K V
inst✝⁹ : AddCommGroup V'
inst✝⁸ : Module K V'
inst✝⁷ : Module.Free K V'
inst✝⁶ : AddCommGroup V₁
inst✝⁵ : Module K V₁
inst✝⁴ : Module.Free K V₁
inst✝³ : (i : η) → AddCommGroup (φ i)
inst✝² : (i : η) → Module K (φ i)
inst✝¹ : ∀ (i : η), Module.Free K (φ i)
inst✝ : Finite η
⊢ Module.rank K ((i : η) → φ i) = sum fun i => Module.rank K (φ i)
[PROOFSTEP]
cases nonempty_fintype η
[GOAL]
case intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁴ : Ring K
inst✝¹³ : StrongRankCondition K
inst✝¹² : AddCommGroup V
inst✝¹¹ : Module K V
inst✝¹⁰ : Module.Free K V
inst✝⁹ : AddCommGroup V'
inst✝⁸ : Module K V'
inst✝⁷ : Module.Free K V'
inst✝⁶ : AddCommGroup V₁
inst✝⁵ : Module K V₁
inst✝⁴ : Module.Free K V₁
inst✝³ : (i : η) → AddCommGroup (φ i)
inst✝² : (i : η) → Module K (φ i)
inst✝¹ : ∀ (i : η), Module.Free K (φ i)
inst✝ : Finite η
val✝ : Fintype η
⊢ Module.rank K ((i : η) → φ i) = sum fun i => Module.rank K (φ i)
[PROOFSTEP]
let B i := chooseBasis K (φ i)
[GOAL]
case intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁴ : Ring K
inst✝¹³ : StrongRankCondition K
inst✝¹² : AddCommGroup V
inst✝¹¹ : Module K V
inst✝¹⁰ : Module.Free K V
inst✝⁹ : AddCommGroup V'
inst✝⁸ : Module K V'
inst✝⁷ : Module.Free K V'
inst✝⁶ : AddCommGroup V₁
inst✝⁵ : Module K V₁
inst✝⁴ : Module.Free K V₁
inst✝³ : (i : η) → AddCommGroup (φ i)
inst✝² : (i : η) → Module K (φ i)
inst✝¹ : ∀ (i : η), Module.Free K (φ i)
inst✝ : Finite η
val✝ : Fintype η
B : (i : η) → Basis (ChooseBasisIndex K (φ i)) K (φ i) := fun i => chooseBasis K (φ i)
⊢ Module.rank K ((i : η) → φ i) = sum fun i => Module.rank K (φ i)
[PROOFSTEP]
let b : Basis _ K (∀ i, φ i) := Pi.basis fun i => B i
[GOAL]
case intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁴ : Ring K
inst✝¹³ : StrongRankCondition K
inst✝¹² : AddCommGroup V
inst✝¹¹ : Module K V
inst✝¹⁰ : Module.Free K V
inst✝⁹ : AddCommGroup V'
inst✝⁸ : Module K V'
inst✝⁷ : Module.Free K V'
inst✝⁶ : AddCommGroup V₁
inst✝⁵ : Module K V₁
inst✝⁴ : Module.Free K V₁
inst✝³ : (i : η) → AddCommGroup (φ i)
inst✝² : (i : η) → Module K (φ i)
inst✝¹ : ∀ (i : η), Module.Free K (φ i)
inst✝ : Finite η
val✝ : Fintype η
B : (i : η) → Basis (ChooseBasisIndex K (φ i)) K (φ i) := fun i => chooseBasis K (φ i)
b : Basis ((j : η) × ChooseBasisIndex K (φ j)) K ((i : η) → φ i) := Pi.basis fun i => B i
⊢ Module.rank K ((i : η) → φ i) = sum fun i => Module.rank K (φ i)
[PROOFSTEP]
simp [← b.mk_eq_rank'', fun i => (B i).mk_eq_rank'']
[GOAL]
K : Type u
V✝ V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η✝ : Type u₁'
φ : η✝ → Type u_1
inst✝¹⁸ : Ring K
inst✝¹⁷ : StrongRankCondition K
inst✝¹⁶ : AddCommGroup V✝
inst✝¹⁵ : Module K V✝
inst✝¹⁴ : Module.Free K V✝
inst✝¹³ : AddCommGroup V'
inst✝¹² : Module K V'
inst✝¹¹ : Module.Free K V'
inst✝¹⁰ : AddCommGroup V₁
inst✝⁹ : Module K V₁
inst✝⁸ : Module.Free K V₁
inst✝⁷ : (i : η✝) → AddCommGroup (φ i)
inst✝⁶ : (i : η✝) → Module K (φ i)
inst✝⁵ : ∀ (i : η✝), Module.Free K (φ i)
inst✝⁴ : Fintype η✝
V η : Type u
inst✝³ : Fintype η
inst✝² : AddCommGroup V
inst✝¹ : Module K V
inst✝ : Module.Free K V
⊢ Module.rank K (η → V) = ↑(Fintype.card η) * Module.rank K V
[PROOFSTEP]
rw [rank_pi, Cardinal.sum_const', Cardinal.mk_fintype]
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁴ : Ring K
inst✝¹³ : StrongRankCondition K
inst✝¹² : AddCommGroup V
inst✝¹¹ : Module K V
inst✝¹⁰ : Module.Free K V
inst✝⁹ : AddCommGroup V'
inst✝⁸ : Module K V'
inst✝⁷ : Module.Free K V'
inst✝⁶ : AddCommGroup V₁
inst✝⁵ : Module K V₁
inst✝⁴ : Module.Free K V₁
inst✝³ : (i : η) → AddCommGroup (φ i)
inst✝² : (i : η) → Module K (φ i)
inst✝¹ : ∀ (i : η), Module.Free K (φ i)
inst✝ : Fintype η
⊢ Module.rank K (η → V) = ↑(Fintype.card η) * lift (Module.rank K V)
[PROOFSTEP]
rw [rank_pi, Cardinal.sum_const, Cardinal.mk_fintype, Cardinal.lift_natCast]
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁴ : Ring K
inst✝¹³ : StrongRankCondition K
inst✝¹² : AddCommGroup V
inst✝¹¹ : Module K V
inst✝¹⁰ : Module.Free K V
inst✝⁹ : AddCommGroup V'
inst✝⁸ : Module K V'
inst✝⁷ : Module.Free K V'
inst✝⁶ : AddCommGroup V₁
inst✝⁵ : Module K V₁
inst✝⁴ : Module.Free K V₁
inst✝³ : (i : η) → AddCommGroup (φ i)
inst✝² : (i : η) → Module K (φ i)
inst✝¹ : ∀ (i : η), Module.Free K (φ i)
inst✝ : Fintype η
⊢ Module.rank K (η → K) = ↑(Fintype.card η)
[PROOFSTEP]
rw [rank_fun_eq_lift_mul, rank_self, Cardinal.lift_one, mul_one, Cardinal.natCast_inj]
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁴ : Ring K
inst✝¹³ : StrongRankCondition K
inst✝¹² : AddCommGroup V
inst✝¹¹ : Module K V
inst✝¹⁰ : Module.Free K V
inst✝⁹ : AddCommGroup V'
inst✝⁸ : Module K V'
inst✝⁷ : Module.Free K V'
inst✝⁶ : AddCommGroup V₁
inst✝⁵ : Module K V₁
inst✝⁴ : Module.Free K V₁
inst✝³ : (i : η) → AddCommGroup (φ i)
inst✝² : (i : η) → Module K (φ i)
inst✝¹ : ∀ (i : η), Module.Free K (φ i)
inst✝ : Fintype η
n : ℕ
⊢ Module.rank K (Fin n → K) = ↑n
[PROOFSTEP]
simp [rank_fun']
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : Ring K
inst✝⁹ : StrongRankCondition K
inst✝⁸ : AddCommGroup V
inst✝⁷ : Module K V
inst✝⁶ : Module.Free K V
inst✝⁵ : AddCommGroup V'
inst✝⁴ : Module K V'
inst✝³ : Module.Free K V'
inst✝² : AddCommGroup V₁
inst✝¹ : Module K V₁
inst✝ : Module.Free K V₁
n : ℕ
hn : Module.rank K V = ↑n
⊢ V ≃ₗ[K] Fin n → K
[PROOFSTEP]
haveI := nontrivial_of_invariantBasisNumber K
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : Ring K
inst✝⁹ : StrongRankCondition K
inst✝⁸ : AddCommGroup V
inst✝⁷ : Module K V
inst✝⁶ : Module.Free K V
inst✝⁵ : AddCommGroup V'
inst✝⁴ : Module K V'
inst✝³ : Module.Free K V'
inst✝² : AddCommGroup V₁
inst✝¹ : Module K V₁
inst✝ : Module.Free K V₁
n : ℕ
hn : Module.rank K V = ↑n
this : Nontrivial K
⊢ V ≃ₗ[K] Fin n → K
[PROOFSTEP]
have : Cardinal.lift.{u} (n : Cardinal.{v}) = Cardinal.lift.{v} (n : Cardinal.{u}) := by simp
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : Ring K
inst✝⁹ : StrongRankCondition K
inst✝⁸ : AddCommGroup V
inst✝⁷ : Module K V
inst✝⁶ : Module.Free K V
inst✝⁵ : AddCommGroup V'
inst✝⁴ : Module K V'
inst✝³ : Module.Free K V'
inst✝² : AddCommGroup V₁
inst✝¹ : Module K V₁
inst✝ : Module.Free K V₁
n : ℕ
hn : Module.rank K V = ↑n
this : Nontrivial K
⊢ lift ↑n = lift ↑n
[PROOFSTEP]
simp
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : Ring K
inst✝⁹ : StrongRankCondition K
inst✝⁸ : AddCommGroup V
inst✝⁷ : Module K V
inst✝⁶ : Module.Free K V
inst✝⁵ : AddCommGroup V'
inst✝⁴ : Module K V'
inst✝³ : Module.Free K V'
inst✝² : AddCommGroup V₁
inst✝¹ : Module K V₁
inst✝ : Module.Free K V₁
n : ℕ
hn : Module.rank K V = ↑n
this✝ : Nontrivial K
this : lift ↑n = lift ↑n
⊢ V ≃ₗ[K] Fin n → K
[PROOFSTEP]
have hn := Cardinal.lift_inj.{v, u}.2 hn
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : Ring K
inst✝⁹ : StrongRankCondition K
inst✝⁸ : AddCommGroup V
inst✝⁷ : Module K V
inst✝⁶ : Module.Free K V
inst✝⁵ : AddCommGroup V'
inst✝⁴ : Module K V'
inst✝³ : Module.Free K V'
inst✝² : AddCommGroup V₁
inst✝¹ : Module K V₁
inst✝ : Module.Free K V₁
n : ℕ
hn✝ : Module.rank K V = ↑n
this✝ : Nontrivial K
this : lift ↑n = lift ↑n
hn : lift (Module.rank K V) = lift ↑n
⊢ V ≃ₗ[K] Fin n → K
[PROOFSTEP]
rw [this] at hn 
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : Ring K
inst✝⁹ : StrongRankCondition K
inst✝⁸ : AddCommGroup V
inst✝⁷ : Module K V
inst✝⁶ : Module.Free K V
inst✝⁵ : AddCommGroup V'
inst✝⁴ : Module K V'
inst✝³ : Module.Free K V'
inst✝² : AddCommGroup V₁
inst✝¹ : Module K V₁
inst✝ : Module.Free K V₁
n : ℕ
hn✝ : Module.rank K V = ↑n
this✝ : Nontrivial K
this : lift ↑n = lift ↑n
hn : lift (Module.rank K V) = lift ↑n
⊢ V ≃ₗ[K] Fin n → K
[PROOFSTEP]
rw [← @rank_fin_fun K _ _ n] at hn 
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : Ring K
inst✝⁹ : StrongRankCondition K
inst✝⁸ : AddCommGroup V
inst✝⁷ : Module K V
inst✝⁶ : Module.Free K V
inst✝⁵ : AddCommGroup V'
inst✝⁴ : Module K V'
inst✝³ : Module.Free K V'
inst✝² : AddCommGroup V₁
inst✝¹ : Module K V₁
inst✝ : Module.Free K V₁
n : ℕ
hn✝ : Module.rank K V = ↑n
this✝ : Nontrivial K
this : lift ↑n = lift ↑n
hn : lift (Module.rank K V) = lift (Module.rank K (Fin n → K))
⊢ V ≃ₗ[K] Fin n → K
[PROOFSTEP]
haveI : Module.Free K (Fin n → K) := Module.Free.pi _ _
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : Ring K
inst✝⁹ : StrongRankCondition K
inst✝⁸ : AddCommGroup V
inst✝⁷ : Module K V
inst✝⁶ : Module.Free K V
inst✝⁵ : AddCommGroup V'
inst✝⁴ : Module K V'
inst✝³ : Module.Free K V'
inst✝² : AddCommGroup V₁
inst✝¹ : Module K V₁
inst✝ : Module.Free K V₁
n : ℕ
hn✝ : Module.rank K V = ↑n
this✝¹ : Nontrivial K
this✝ : lift ↑n = lift ↑n
hn : lift (Module.rank K V) = lift (Module.rank K (Fin n → K))
this : Module.Free K (Fin n → K)
⊢ V ≃ₗ[K] Fin n → K
[PROOFSTEP]
exact Classical.choice (nonempty_linearEquiv_of_lift_rank_eq hn)
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V'
inst✝² : Module K V'
inst✝¹ : AddCommGroup V₁
inst✝ : Module K V₁
s : Set V
⊢ Module.rank K { x // x ∈ span K s } ≤ #↑s
[PROOFSTEP]
obtain ⟨b, hb, hsab, hlib⟩ := exists_linearIndependent K s
[GOAL]
case intro.intro.intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V'
inst✝² : Module K V'
inst✝¹ : AddCommGroup V₁
inst✝ : Module K V₁
s b : Set V
hb : b ⊆ s
hsab : span K b = span K s
hlib : LinearIndependent K Subtype.val
⊢ Module.rank K { x // x ∈ span K s } ≤ #↑s
[PROOFSTEP]
convert Cardinal.mk_le_mk_of_subset hb
[GOAL]
case h.e'_3
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V'
inst✝² : Module K V'
inst✝¹ : AddCommGroup V₁
inst✝ : Module K V₁
s b : Set V
hb : b ⊆ s
hsab : span K b = span K s
hlib : LinearIndependent K Subtype.val
⊢ Module.rank K { x // x ∈ span K s } = #↑b
[PROOFSTEP]
rw [← hsab, rank_span_set hlib]
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V'
inst✝² : Module K V'
inst✝¹ : AddCommGroup V₁
inst✝ : Module K V₁
s : Finset V
⊢ #↑↑s = ↑(Finset.card s)
[PROOFSTEP]
rw [Finset.coe_sort_coe, Cardinal.mk_coe_finset]
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V'
inst✝² : Module K V'
inst✝¹ : AddCommGroup V₁
inst✝ : Module K V₁
p : Submodule K V
⊢ Module.rank K (V ⧸ p) + Module.rank K { x // x ∈ p } = Module.rank K V
[PROOFSTEP]
classical
let ⟨f⟩ := quotient_prod_linearEquiv p
exact rank_prod'.symm.trans f.rank_eq
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V'
inst✝² : Module K V'
inst✝¹ : AddCommGroup V₁
inst✝ : Module K V₁
p : Submodule K V
⊢ Module.rank K (V ⧸ p) + Module.rank K { x // x ∈ p } = Module.rank K V
[PROOFSTEP]
let ⟨f⟩ := quotient_prod_linearEquiv p
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V'
inst✝² : Module K V'
inst✝¹ : AddCommGroup V₁
inst✝ : Module K V₁
p : Submodule K V
f : ((V ⧸ p) × { x // x ∈ p }) ≃ₗ[K] V
⊢ Module.rank K (V ⧸ p) + Module.rank K { x // x ∈ p } = Module.rank K V
[PROOFSTEP]
exact rank_prod'.symm.trans f.rank_eq
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V'
inst✝² : Module K V'
inst✝¹ : AddCommGroup V₁
inst✝ : Module K V₁
f : V →ₗ[K] V₁
⊢ Module.rank K { x // x ∈ LinearMap.range f } + Module.rank K { x // x ∈ LinearMap.ker f } = Module.rank K V
[PROOFSTEP]
haveI := fun p : Submodule K V => Classical.decEq (V ⧸ p)
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V'
inst✝² : Module K V'
inst✝¹ : AddCommGroup V₁
inst✝ : Module K V₁
f : V →ₗ[K] V₁
this : (p : Submodule K V) → DecidableEq (V ⧸ p)
⊢ Module.rank K { x // x ∈ LinearMap.range f } + Module.rank K { x // x ∈ LinearMap.ker f } = Module.rank K V
[PROOFSTEP]
rw [← f.quotKerEquivRange.rank_eq, rank_quotient_add_rank]
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V'
inst✝² : Module K V'
inst✝¹ : AddCommGroup V₁
inst✝ : Module K V₁
f : V →ₗ[K] V₁
h : Surjective ↑f
⊢ Module.rank K V = Module.rank K V₁ + Module.rank K { x // x ∈ LinearMap.ker f }
[PROOFSTEP]
rw [← rank_range_add_rank_ker f, ← rank_range_of_surjective f h]
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V'
inst✝² : Module K V'
inst✝¹ : AddCommGroup V₁
inst✝ : Module K V₁
n : ℕ
v : Fin n → V
hv : LinearIndependent K v
h : ↑n < Module.rank K V
⊢ ∃ x, LinearIndependent K (Fin.cons x v)
[PROOFSTEP]
have A : Submodule.span K (range v) ≠ ⊤ := by
  intro H
  rw [← rank_top, ← H] at h 
  have : Module.rank K (Submodule.span K (range v)) ≤ n :=
    by
    have := Cardinal.mk_range_le_lift (f := v)
    simp only [Cardinal.lift_id'] at this 
    exact (rank_span_le _).trans (this.trans (by simp))
  exact lt_irrefl _ (h.trans_le this)
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V'
inst✝² : Module K V'
inst✝¹ : AddCommGroup V₁
inst✝ : Module K V₁
n : ℕ
v : Fin n → V
hv : LinearIndependent K v
h : ↑n < Module.rank K V
⊢ span K (range v) ≠ ⊤
[PROOFSTEP]
intro H
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V'
inst✝² : Module K V'
inst✝¹ : AddCommGroup V₁
inst✝ : Module K V₁
n : ℕ
v : Fin n → V
hv : LinearIndependent K v
h : ↑n < Module.rank K V
H : span K (range v) = ⊤
⊢ False
[PROOFSTEP]
rw [← rank_top, ← H] at h 
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V'
inst✝² : Module K V'
inst✝¹ : AddCommGroup V₁
inst✝ : Module K V₁
n : ℕ
v : Fin n → V
hv : LinearIndependent K v
h : ↑n < Module.rank K { x // x ∈ span K (range v) }
H : span K (range v) = ⊤
⊢ False
[PROOFSTEP]
have : Module.rank K (Submodule.span K (range v)) ≤ n :=
  by
  have := Cardinal.mk_range_le_lift (f := v)
  simp only [Cardinal.lift_id'] at this 
  exact (rank_span_le _).trans (this.trans (by simp))
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V'
inst✝² : Module K V'
inst✝¹ : AddCommGroup V₁
inst✝ : Module K V₁
n : ℕ
v : Fin n → V
hv : LinearIndependent K v
h : ↑n < Module.rank K { x // x ∈ span K (range v) }
H : span K (range v) = ⊤
⊢ Module.rank K { x // x ∈ span K (range v) } ≤ ↑n
[PROOFSTEP]
have := Cardinal.mk_range_le_lift (f := v)
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V'
inst✝² : Module K V'
inst✝¹ : AddCommGroup V₁
inst✝ : Module K V₁
n : ℕ
v : Fin n → V
hv : LinearIndependent K v
h : ↑n < Module.rank K { x // x ∈ span K (range v) }
H : span K (range v) = ⊤
this : lift #↑(range v) ≤ lift #(Fin n)
⊢ Module.rank K { x // x ∈ span K (range v) } ≤ ↑n
[PROOFSTEP]
simp only [Cardinal.lift_id'] at this 
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V'
inst✝² : Module K V'
inst✝¹ : AddCommGroup V₁
inst✝ : Module K V₁
n : ℕ
v : Fin n → V
hv : LinearIndependent K v
h : ↑n < Module.rank K { x // x ∈ span K (range v) }
H : span K (range v) = ⊤
this : #↑(range v) ≤ lift #(Fin n)
⊢ Module.rank K { x // x ∈ span K (range v) } ≤ ↑n
[PROOFSTEP]
exact (rank_span_le _).trans (this.trans (by simp))
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V'
inst✝² : Module K V'
inst✝¹ : AddCommGroup V₁
inst✝ : Module K V₁
n : ℕ
v : Fin n → V
hv : LinearIndependent K v
h : ↑n < Module.rank K { x // x ∈ span K (range v) }
H : span K (range v) = ⊤
this : #↑(range v) ≤ lift #(Fin n)
⊢ lift #(Fin n) ≤ ↑n
[PROOFSTEP]
simp
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V'
inst✝² : Module K V'
inst✝¹ : AddCommGroup V₁
inst✝ : Module K V₁
n : ℕ
v : Fin n → V
hv : LinearIndependent K v
h : ↑n < Module.rank K { x // x ∈ span K (range v) }
H : span K (range v) = ⊤
this : Module.rank K { x // x ∈ span K (range v) } ≤ ↑n
⊢ False
[PROOFSTEP]
exact lt_irrefl _ (h.trans_le this)
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V'
inst✝² : Module K V'
inst✝¹ : AddCommGroup V₁
inst✝ : Module K V₁
n : ℕ
v : Fin n → V
hv : LinearIndependent K v
h : ↑n < Module.rank K V
A : span K (range v) ≠ ⊤
⊢ ∃ x, LinearIndependent K (Fin.cons x v)
[PROOFSTEP]
obtain ⟨x, hx⟩ : ∃ x, x ∉ Submodule.span K (range v) :=
  by
  contrapose! A
  exact Iff.mpr Submodule.eq_top_iff' A
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V'
inst✝² : Module K V'
inst✝¹ : AddCommGroup V₁
inst✝ : Module K V₁
n : ℕ
v : Fin n → V
hv : LinearIndependent K v
h : ↑n < Module.rank K V
A : span K (range v) ≠ ⊤
⊢ ∃ x, ¬x ∈ span K (range v)
[PROOFSTEP]
contrapose! A
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V'
inst✝² : Module K V'
inst✝¹ : AddCommGroup V₁
inst✝ : Module K V₁
n : ℕ
v : Fin n → V
hv : LinearIndependent K v
h : ↑n < Module.rank K V
A : ∀ (x : V), x ∈ span K (range v)
⊢ span K (range v) = ⊤
[PROOFSTEP]
exact Iff.mpr Submodule.eq_top_iff' A
[GOAL]
case intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V'
inst✝² : Module K V'
inst✝¹ : AddCommGroup V₁
inst✝ : Module K V₁
n : ℕ
v : Fin n → V
hv : LinearIndependent K v
h : ↑n < Module.rank K V
A : span K (range v) ≠ ⊤
x : V
hx : ¬x ∈ span K (range v)
⊢ ∃ x, LinearIndependent K (Fin.cons x v)
[PROOFSTEP]
exact ⟨x, linearIndependent_fin_cons.2 ⟨hv, hx⟩⟩
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V'
inst✝² : Module K V'
inst✝¹ : AddCommGroup V₁
inst✝ : Module K V₁
n : ℕ
v : Fin n → V
hv : LinearIndependent K v
h : ↑n < Module.rank K V
⊢ ∃ x, LinearIndependent K (Fin.snoc v x)
[PROOFSTEP]
simpa [linearIndependent_fin_cons, ← linearIndependent_fin_snoc] using exists_linear_independent_cons_of_lt_rank hv h
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V'
inst✝² : Module K V'
inst✝¹ : AddCommGroup V₁
inst✝ : Module K V₁
h : 1 < Module.rank K V
x : V
hx : x ≠ 0
⊢ ∃ y, LinearIndependent K ![x, y]
[PROOFSTEP]
obtain ⟨y, hy⟩ := exists_linear_independent_snoc_of_lt_rank (linearIndependent_unique ![x] hx) h
[GOAL]
case intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V'
inst✝² : Module K V'
inst✝¹ : AddCommGroup V₁
inst✝ : Module K V₁
h : 1 < Module.rank K V
x : V
hx : x ≠ 0
y : V
hy : LinearIndependent K (Fin.snoc ![x] y)
⊢ ∃ y, LinearIndependent K ![x, y]
[PROOFSTEP]
have : Fin.snoc ![x] y = ![x, y] := Iff.mp List.ofFn_inj rfl
[GOAL]
case intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V'
inst✝² : Module K V'
inst✝¹ : AddCommGroup V₁
inst✝ : Module K V₁
h : 1 < Module.rank K V
x : V
hx : x ≠ 0
y : V
hy : LinearIndependent K (Fin.snoc ![x] y)
this : Fin.snoc ![x] y = ![x, y]
⊢ ∃ y, LinearIndependent K ![x, y]
[PROOFSTEP]
rw [this] at hy 
[GOAL]
case intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V'
inst✝² : Module K V'
inst✝¹ : AddCommGroup V₁
inst✝ : Module K V₁
h : 1 < Module.rank K V
x : V
hx : x ≠ 0
y : V
hy : LinearIndependent K ![x, y]
this : Fin.snoc ![x] y = ![x, y]
⊢ ∃ y, LinearIndependent K ![x, y]
[PROOFSTEP]
exact ⟨y, hy⟩
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : DivisionRing K
inst✝⁹ : AddCommGroup V
inst✝⁸ : Module K V
inst✝⁷ : AddCommGroup V'
inst✝⁶ : Module K V'
inst✝⁵ : AddCommGroup V₁
inst✝⁴ : Module K V₁
inst✝³ : AddCommGroup V₂
inst✝² : Module K V₂
inst✝¹ : AddCommGroup V₃
inst✝ : Module K V₃
db : V₂ →ₗ[K] V
eb : V₃ →ₗ[K] V
cd : V₁ →ₗ[K] V₂
ce : V₁ →ₗ[K] V₃
hde : ⊤ ≤ LinearMap.range db ⊔ LinearMap.range eb
hgd : ker cd = ⊥
eq : LinearMap.comp db cd = LinearMap.comp eb ce
eq₂ : ∀ (d : V₂) (e : V₃), ↑db d = ↑eb e → ∃ c, ↑cd c = d ∧ ↑ce c = e
⊢ Module.rank K V + Module.rank K V₁ = Module.rank K V₂ + Module.rank K V₃
[PROOFSTEP]
have hf : Surjective (coprod db eb) := by rwa [← range_eq_top, range_coprod, eq_top_iff]
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : DivisionRing K
inst✝⁹ : AddCommGroup V
inst✝⁸ : Module K V
inst✝⁷ : AddCommGroup V'
inst✝⁶ : Module K V'
inst✝⁵ : AddCommGroup V₁
inst✝⁴ : Module K V₁
inst✝³ : AddCommGroup V₂
inst✝² : Module K V₂
inst✝¹ : AddCommGroup V₃
inst✝ : Module K V₃
db : V₂ →ₗ[K] V
eb : V₃ →ₗ[K] V
cd : V₁ →ₗ[K] V₂
ce : V₁ →ₗ[K] V₃
hde : ⊤ ≤ LinearMap.range db ⊔ LinearMap.range eb
hgd : ker cd = ⊥
eq : LinearMap.comp db cd = LinearMap.comp eb ce
eq₂ : ∀ (d : V₂) (e : V₃), ↑db d = ↑eb e → ∃ c, ↑cd c = d ∧ ↑ce c = e
⊢ Surjective ↑(coprod db eb)
[PROOFSTEP]
rwa [← range_eq_top, range_coprod, eq_top_iff]
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : DivisionRing K
inst✝⁹ : AddCommGroup V
inst✝⁸ : Module K V
inst✝⁷ : AddCommGroup V'
inst✝⁶ : Module K V'
inst✝⁵ : AddCommGroup V₁
inst✝⁴ : Module K V₁
inst✝³ : AddCommGroup V₂
inst✝² : Module K V₂
inst✝¹ : AddCommGroup V₃
inst✝ : Module K V₃
db : V₂ →ₗ[K] V
eb : V₃ →ₗ[K] V
cd : V₁ →ₗ[K] V₂
ce : V₁ →ₗ[K] V₃
hde : ⊤ ≤ LinearMap.range db ⊔ LinearMap.range eb
hgd : ker cd = ⊥
eq : LinearMap.comp db cd = LinearMap.comp eb ce
eq₂ : ∀ (d : V₂) (e : V₃), ↑db d = ↑eb e → ∃ c, ↑cd c = d ∧ ↑ce c = e
hf : Surjective ↑(coprod db eb)
⊢ Module.rank K V + Module.rank K V₁ = Module.rank K V₂ + Module.rank K V₃
[PROOFSTEP]
conv =>
  rhs
  rw [← rank_prod', rank_eq_of_surjective _ hf]
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : DivisionRing K
inst✝⁹ : AddCommGroup V
inst✝⁸ : Module K V
inst✝⁷ : AddCommGroup V'
inst✝⁶ : Module K V'
inst✝⁵ : AddCommGroup V₁
inst✝⁴ : Module K V₁
inst✝³ : AddCommGroup V₂
inst✝² : Module K V₂
inst✝¹ : AddCommGroup V₃
inst✝ : Module K V₃
db : V₂ →ₗ[K] V
eb : V₃ →ₗ[K] V
cd : V₁ →ₗ[K] V₂
ce : V₁ →ₗ[K] V₃
hde : ⊤ ≤ LinearMap.range db ⊔ LinearMap.range eb
hgd : ker cd = ⊥
eq : LinearMap.comp db cd = LinearMap.comp eb ce
eq₂ : ∀ (d : V₂) (e : V₃), ↑db d = ↑eb e → ∃ c, ↑cd c = d ∧ ↑ce c = e
hf : Surjective ↑(coprod db eb)
| Module.rank K V + Module.rank K V₁ = Module.rank K V₂ + Module.rank K V₃
[PROOFSTEP]
  rhs
  rw [← rank_prod', rank_eq_of_surjective _ hf]
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : DivisionRing K
inst✝⁹ : AddCommGroup V
inst✝⁸ : Module K V
inst✝⁷ : AddCommGroup V'
inst✝⁶ : Module K V'
inst✝⁵ : AddCommGroup V₁
inst✝⁴ : Module K V₁
inst✝³ : AddCommGroup V₂
inst✝² : Module K V₂
inst✝¹ : AddCommGroup V₃
inst✝ : Module K V₃
db : V₂ →ₗ[K] V
eb : V₃ →ₗ[K] V
cd : V₁ →ₗ[K] V₂
ce : V₁ →ₗ[K] V₃
hde : ⊤ ≤ LinearMap.range db ⊔ LinearMap.range eb
hgd : ker cd = ⊥
eq : LinearMap.comp db cd = LinearMap.comp eb ce
eq₂ : ∀ (d : V₂) (e : V₃), ↑db d = ↑eb e → ∃ c, ↑cd c = d ∧ ↑ce c = e
hf : Surjective ↑(coprod db eb)
| Module.rank K V + Module.rank K V₁ = Module.rank K V₂ + Module.rank K V₃
[PROOFSTEP]
  rhs
  rw [← rank_prod', rank_eq_of_surjective _ hf]
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : DivisionRing K
inst✝⁹ : AddCommGroup V
inst✝⁸ : Module K V
inst✝⁷ : AddCommGroup V'
inst✝⁶ : Module K V'
inst✝⁵ : AddCommGroup V₁
inst✝⁴ : Module K V₁
inst✝³ : AddCommGroup V₂
inst✝² : Module K V₂
inst✝¹ : AddCommGroup V₃
inst✝ : Module K V₃
db : V₂ →ₗ[K] V
eb : V₃ →ₗ[K] V
cd : V₁ →ₗ[K] V₂
ce : V₁ →ₗ[K] V₃
hde : ⊤ ≤ LinearMap.range db ⊔ LinearMap.range eb
hgd : ker cd = ⊥
eq : LinearMap.comp db cd = LinearMap.comp eb ce
eq₂ : ∀ (d : V₂) (e : V₃), ↑db d = ↑eb e → ∃ c, ↑cd c = d ∧ ↑ce c = e
hf : Surjective ↑(coprod db eb)
| Module.rank K V + Module.rank K V₁ = Module.rank K V₂ + Module.rank K V₃
[PROOFSTEP]
rhs
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : DivisionRing K
inst✝⁹ : AddCommGroup V
inst✝⁸ : Module K V
inst✝⁷ : AddCommGroup V'
inst✝⁶ : Module K V'
inst✝⁵ : AddCommGroup V₁
inst✝⁴ : Module K V₁
inst✝³ : AddCommGroup V₂
inst✝² : Module K V₂
inst✝¹ : AddCommGroup V₃
inst✝ : Module K V₃
db : V₂ →ₗ[K] V
eb : V₃ →ₗ[K] V
cd : V₁ →ₗ[K] V₂
ce : V₁ →ₗ[K] V₃
hde : ⊤ ≤ LinearMap.range db ⊔ LinearMap.range eb
hgd : ker cd = ⊥
eq : LinearMap.comp db cd = LinearMap.comp eb ce
eq₂ : ∀ (d : V₂) (e : V₃), ↑db d = ↑eb e → ∃ c, ↑cd c = d ∧ ↑ce c = e
hf : Surjective ↑(coprod db eb)
| Module.rank K V₂ + Module.rank K V₃
[PROOFSTEP]
rw [← rank_prod', rank_eq_of_surjective _ hf]
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : DivisionRing K
inst✝⁹ : AddCommGroup V
inst✝⁸ : Module K V
inst✝⁷ : AddCommGroup V'
inst✝⁶ : Module K V'
inst✝⁵ : AddCommGroup V₁
inst✝⁴ : Module K V₁
inst✝³ : AddCommGroup V₂
inst✝² : Module K V₂
inst✝¹ : AddCommGroup V₃
inst✝ : Module K V₃
db : V₂ →ₗ[K] V
eb : V₃ →ₗ[K] V
cd : V₁ →ₗ[K] V₂
ce : V₁ →ₗ[K] V₃
hde : ⊤ ≤ LinearMap.range db ⊔ LinearMap.range eb
hgd : ker cd = ⊥
eq : LinearMap.comp db cd = LinearMap.comp eb ce
eq₂ : ∀ (d : V₂) (e : V₃), ↑db d = ↑eb e → ∃ c, ↑cd c = d ∧ ↑ce c = e
hf : Surjective ↑(coprod db eb)
⊢ Module.rank K V + Module.rank K V₁ = Module.rank K V + Module.rank K { x // x ∈ ker (coprod db eb) }
[PROOFSTEP]
congr 1
[GOAL]
case e_a
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : DivisionRing K
inst✝⁹ : AddCommGroup V
inst✝⁸ : Module K V
inst✝⁷ : AddCommGroup V'
inst✝⁶ : Module K V'
inst✝⁵ : AddCommGroup V₁
inst✝⁴ : Module K V₁
inst✝³ : AddCommGroup V₂
inst✝² : Module K V₂
inst✝¹ : AddCommGroup V₃
inst✝ : Module K V₃
db : V₂ →ₗ[K] V
eb : V₃ →ₗ[K] V
cd : V₁ →ₗ[K] V₂
ce : V₁ →ₗ[K] V₃
hde : ⊤ ≤ LinearMap.range db ⊔ LinearMap.range eb
hgd : ker cd = ⊥
eq : LinearMap.comp db cd = LinearMap.comp eb ce
eq₂ : ∀ (d : V₂) (e : V₃), ↑db d = ↑eb e → ∃ c, ↑cd c = d ∧ ↑ce c = e
hf : Surjective ↑(coprod db eb)
⊢ Module.rank K V₁ = Module.rank K { x // x ∈ ker (coprod db eb) }
[PROOFSTEP]
apply LinearEquiv.rank_eq
[GOAL]
case e_a.f
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : DivisionRing K
inst✝⁹ : AddCommGroup V
inst✝⁸ : Module K V
inst✝⁷ : AddCommGroup V'
inst✝⁶ : Module K V'
inst✝⁵ : AddCommGroup V₁
inst✝⁴ : Module K V₁
inst✝³ : AddCommGroup V₂
inst✝² : Module K V₂
inst✝¹ : AddCommGroup V₃
inst✝ : Module K V₃
db : V₂ →ₗ[K] V
eb : V₃ →ₗ[K] V
cd : V₁ →ₗ[K] V₂
ce : V₁ →ₗ[K] V₃
hde : ⊤ ≤ LinearMap.range db ⊔ LinearMap.range eb
hgd : ker cd = ⊥
eq : LinearMap.comp db cd = LinearMap.comp eb ce
eq₂ : ∀ (d : V₂) (e : V₃), ↑db d = ↑eb e → ∃ c, ↑cd c = d ∧ ↑ce c = e
hf : Surjective ↑(coprod db eb)
⊢ V₁ ≃ₗ[K] { x // x ∈ ker (coprod db eb) }
[PROOFSTEP]
let L : V₁ →ₗ[K] ker (coprod db eb) := by
  -- Porting note: this is needed to avoid a timeout
  refine' LinearMap.codRestrict _ (prod cd (-ce)) _
  · intro c
    simp only [add_eq_zero_iff_eq_neg, LinearMap.prod_apply, mem_ker, Pi.prod, coprod_apply, neg_neg, map_neg,
      neg_apply]
    exact LinearMap.ext_iff.1 eq c
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : DivisionRing K
inst✝⁹ : AddCommGroup V
inst✝⁸ : Module K V
inst✝⁷ : AddCommGroup V'
inst✝⁶ : Module K V'
inst✝⁵ : AddCommGroup V₁
inst✝⁴ : Module K V₁
inst✝³ : AddCommGroup V₂
inst✝² : Module K V₂
inst✝¹ : AddCommGroup V₃
inst✝ : Module K V₃
db : V₂ →ₗ[K] V
eb : V₃ →ₗ[K] V
cd : V₁ →ₗ[K] V₂
ce : V₁ →ₗ[K] V₃
hde : ⊤ ≤ LinearMap.range db ⊔ LinearMap.range eb
hgd : ker cd = ⊥
eq : LinearMap.comp db cd = LinearMap.comp eb ce
eq₂ : ∀ (d : V₂) (e : V₃), ↑db d = ↑eb e → ∃ c, ↑cd c = d ∧ ↑ce c = e
hf : Surjective ↑(coprod db eb)
⊢ V₁ →ₗ[K] { x // x ∈ ker (coprod db eb) }
[PROOFSTEP]
refine' LinearMap.codRestrict _ (prod cd (-ce)) _
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : DivisionRing K
inst✝⁹ : AddCommGroup V
inst✝⁸ : Module K V
inst✝⁷ : AddCommGroup V'
inst✝⁶ : Module K V'
inst✝⁵ : AddCommGroup V₁
inst✝⁴ : Module K V₁
inst✝³ : AddCommGroup V₂
inst✝² : Module K V₂
inst✝¹ : AddCommGroup V₃
inst✝ : Module K V₃
db : V₂ →ₗ[K] V
eb : V₃ →ₗ[K] V
cd : V₁ →ₗ[K] V₂
ce : V₁ →ₗ[K] V₃
hde : ⊤ ≤ LinearMap.range db ⊔ LinearMap.range eb
hgd : ker cd = ⊥
eq : LinearMap.comp db cd = LinearMap.comp eb ce
eq₂ : ∀ (d : V₂) (e : V₃), ↑db d = ↑eb e → ∃ c, ↑cd c = d ∧ ↑ce c = e
hf : Surjective ↑(coprod db eb)
⊢ ∀ (c : V₁), ↑(LinearMap.prod cd (-ce)) c ∈ ker (coprod db eb)
[PROOFSTEP]
intro c
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : DivisionRing K
inst✝⁹ : AddCommGroup V
inst✝⁸ : Module K V
inst✝⁷ : AddCommGroup V'
inst✝⁶ : Module K V'
inst✝⁵ : AddCommGroup V₁
inst✝⁴ : Module K V₁
inst✝³ : AddCommGroup V₂
inst✝² : Module K V₂
inst✝¹ : AddCommGroup V₃
inst✝ : Module K V₃
db : V₂ →ₗ[K] V
eb : V₃ →ₗ[K] V
cd : V₁ →ₗ[K] V₂
ce : V₁ →ₗ[K] V₃
hde : ⊤ ≤ LinearMap.range db ⊔ LinearMap.range eb
hgd : ker cd = ⊥
eq : LinearMap.comp db cd = LinearMap.comp eb ce
eq₂ : ∀ (d : V₂) (e : V₃), ↑db d = ↑eb e → ∃ c, ↑cd c = d ∧ ↑ce c = e
hf : Surjective ↑(coprod db eb)
c : V₁
⊢ ↑(LinearMap.prod cd (-ce)) c ∈ ker (coprod db eb)
[PROOFSTEP]
simp only [add_eq_zero_iff_eq_neg, LinearMap.prod_apply, mem_ker, Pi.prod, coprod_apply, neg_neg, map_neg, neg_apply]
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : DivisionRing K
inst✝⁹ : AddCommGroup V
inst✝⁸ : Module K V
inst✝⁷ : AddCommGroup V'
inst✝⁶ : Module K V'
inst✝⁵ : AddCommGroup V₁
inst✝⁴ : Module K V₁
inst✝³ : AddCommGroup V₂
inst✝² : Module K V₂
inst✝¹ : AddCommGroup V₃
inst✝ : Module K V₃
db : V₂ →ₗ[K] V
eb : V₃ →ₗ[K] V
cd : V₁ →ₗ[K] V₂
ce : V₁ →ₗ[K] V₃
hde : ⊤ ≤ LinearMap.range db ⊔ LinearMap.range eb
hgd : ker cd = ⊥
eq : LinearMap.comp db cd = LinearMap.comp eb ce
eq₂ : ∀ (d : V₂) (e : V₃), ↑db d = ↑eb e → ∃ c, ↑cd c = d ∧ ↑ce c = e
hf : Surjective ↑(coprod db eb)
c : V₁
⊢ ↑db (↑cd c) = ↑eb (↑ce c)
[PROOFSTEP]
exact LinearMap.ext_iff.1 eq c
[GOAL]
case e_a.f
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : DivisionRing K
inst✝⁹ : AddCommGroup V
inst✝⁸ : Module K V
inst✝⁷ : AddCommGroup V'
inst✝⁶ : Module K V'
inst✝⁵ : AddCommGroup V₁
inst✝⁴ : Module K V₁
inst✝³ : AddCommGroup V₂
inst✝² : Module K V₂
inst✝¹ : AddCommGroup V₃
inst✝ : Module K V₃
db : V₂ →ₗ[K] V
eb : V₃ →ₗ[K] V
cd : V₁ →ₗ[K] V₂
ce : V₁ →ₗ[K] V₃
hde : ⊤ ≤ LinearMap.range db ⊔ LinearMap.range eb
hgd : ker cd = ⊥
eq : LinearMap.comp db cd = LinearMap.comp eb ce
eq₂ : ∀ (d : V₂) (e : V₃), ↑db d = ↑eb e → ∃ c, ↑cd c = d ∧ ↑ce c = e
hf : Surjective ↑(coprod db eb)
L : V₁ →ₗ[K] { x // x ∈ ker (coprod db eb) } :=
  LinearMap.codRestrict (ker (coprod db eb)) (LinearMap.prod cd (-ce))
    (_ : ∀ (c : V₁), ↑(LinearMap.prod cd (-ce)) c ∈ ker (coprod db eb))
⊢ V₁ ≃ₗ[K] { x // x ∈ ker (coprod db eb) }
[PROOFSTEP]
refine' LinearEquiv.ofBijective L ⟨_, _⟩
[GOAL]
case e_a.f.refine'_1
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : DivisionRing K
inst✝⁹ : AddCommGroup V
inst✝⁸ : Module K V
inst✝⁷ : AddCommGroup V'
inst✝⁶ : Module K V'
inst✝⁵ : AddCommGroup V₁
inst✝⁴ : Module K V₁
inst✝³ : AddCommGroup V₂
inst✝² : Module K V₂
inst✝¹ : AddCommGroup V₃
inst✝ : Module K V₃
db : V₂ →ₗ[K] V
eb : V₃ →ₗ[K] V
cd : V₁ →ₗ[K] V₂
ce : V₁ →ₗ[K] V₃
hde : ⊤ ≤ LinearMap.range db ⊔ LinearMap.range eb
hgd : ker cd = ⊥
eq : LinearMap.comp db cd = LinearMap.comp eb ce
eq₂ : ∀ (d : V₂) (e : V₃), ↑db d = ↑eb e → ∃ c, ↑cd c = d ∧ ↑ce c = e
hf : Surjective ↑(coprod db eb)
L : V₁ →ₗ[K] { x // x ∈ ker (coprod db eb) } :=
  LinearMap.codRestrict (ker (coprod db eb)) (LinearMap.prod cd (-ce))
    (_ : ∀ (c : V₁), ↑(LinearMap.prod cd (-ce)) c ∈ ker (coprod db eb))
⊢ Injective ↑L
[PROOFSTEP]
rw [← ker_eq_bot, ker_codRestrict, ker_prod, hgd, bot_inf_eq]
[GOAL]
case e_a.f.refine'_2
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : DivisionRing K
inst✝⁹ : AddCommGroup V
inst✝⁸ : Module K V
inst✝⁷ : AddCommGroup V'
inst✝⁶ : Module K V'
inst✝⁵ : AddCommGroup V₁
inst✝⁴ : Module K V₁
inst✝³ : AddCommGroup V₂
inst✝² : Module K V₂
inst✝¹ : AddCommGroup V₃
inst✝ : Module K V₃
db : V₂ →ₗ[K] V
eb : V₃ →ₗ[K] V
cd : V₁ →ₗ[K] V₂
ce : V₁ →ₗ[K] V₃
hde : ⊤ ≤ LinearMap.range db ⊔ LinearMap.range eb
hgd : ker cd = ⊥
eq : LinearMap.comp db cd = LinearMap.comp eb ce
eq₂ : ∀ (d : V₂) (e : V₃), ↑db d = ↑eb e → ∃ c, ↑cd c = d ∧ ↑ce c = e
hf : Surjective ↑(coprod db eb)
L : V₁ →ₗ[K] { x // x ∈ ker (coprod db eb) } :=
  LinearMap.codRestrict (ker (coprod db eb)) (LinearMap.prod cd (-ce))
    (_ : ∀ (c : V₁), ↑(LinearMap.prod cd (-ce)) c ∈ ker (coprod db eb))
⊢ Surjective ↑L
[PROOFSTEP]
rw [← range_eq_top, eq_top_iff, range_codRestrict, ← map_le_iff_le_comap, Submodule.map_top, range_subtype]
[GOAL]
case e_a.f.refine'_2
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : DivisionRing K
inst✝⁹ : AddCommGroup V
inst✝⁸ : Module K V
inst✝⁷ : AddCommGroup V'
inst✝⁶ : Module K V'
inst✝⁵ : AddCommGroup V₁
inst✝⁴ : Module K V₁
inst✝³ : AddCommGroup V₂
inst✝² : Module K V₂
inst✝¹ : AddCommGroup V₃
inst✝ : Module K V₃
db : V₂ →ₗ[K] V
eb : V₃ →ₗ[K] V
cd : V₁ →ₗ[K] V₂
ce : V₁ →ₗ[K] V₃
hde : ⊤ ≤ LinearMap.range db ⊔ LinearMap.range eb
hgd : ker cd = ⊥
eq : LinearMap.comp db cd = LinearMap.comp eb ce
eq₂ : ∀ (d : V₂) (e : V₃), ↑db d = ↑eb e → ∃ c, ↑cd c = d ∧ ↑ce c = e
hf : Surjective ↑(coprod db eb)
L : V₁ →ₗ[K] { x // x ∈ ker (coprod db eb) } :=
  LinearMap.codRestrict (ker (coprod db eb)) (LinearMap.prod cd (-ce))
    (_ : ∀ (c : V₁), ↑(LinearMap.prod cd (-ce)) c ∈ ker (coprod db eb))
⊢ ker (coprod db eb) ≤ LinearMap.range (LinearMap.prod cd (-ce))
[PROOFSTEP]
rintro ⟨d, e⟩
[GOAL]
case e_a.f.refine'_2.mk
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : DivisionRing K
inst✝⁹ : AddCommGroup V
inst✝⁸ : Module K V
inst✝⁷ : AddCommGroup V'
inst✝⁶ : Module K V'
inst✝⁵ : AddCommGroup V₁
inst✝⁴ : Module K V₁
inst✝³ : AddCommGroup V₂
inst✝² : Module K V₂
inst✝¹ : AddCommGroup V₃
inst✝ : Module K V₃
db : V₂ →ₗ[K] V
eb : V₃ →ₗ[K] V
cd : V₁ →ₗ[K] V₂
ce : V₁ →ₗ[K] V₃
hde : ⊤ ≤ LinearMap.range db ⊔ LinearMap.range eb
hgd : ker cd = ⊥
eq : LinearMap.comp db cd = LinearMap.comp eb ce
eq₂ : ∀ (d : V₂) (e : V₃), ↑db d = ↑eb e → ∃ c, ↑cd c = d ∧ ↑ce c = e
hf : Surjective ↑(coprod db eb)
L : V₁ →ₗ[K] { x // x ∈ ker (coprod db eb) } :=
  LinearMap.codRestrict (ker (coprod db eb)) (LinearMap.prod cd (-ce))
    (_ : ∀ (c : V₁), ↑(LinearMap.prod cd (-ce)) c ∈ ker (coprod db eb))
d : V₂
e : V₃
⊢ (d, e) ∈ ker (coprod db eb) → (d, e) ∈ LinearMap.range (LinearMap.prod cd (-ce))
[PROOFSTEP]
have h := eq₂ d (-e)
[GOAL]
case e_a.f.refine'_2.mk
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : DivisionRing K
inst✝⁹ : AddCommGroup V
inst✝⁸ : Module K V
inst✝⁷ : AddCommGroup V'
inst✝⁶ : Module K V'
inst✝⁵ : AddCommGroup V₁
inst✝⁴ : Module K V₁
inst✝³ : AddCommGroup V₂
inst✝² : Module K V₂
inst✝¹ : AddCommGroup V₃
inst✝ : Module K V₃
db : V₂ →ₗ[K] V
eb : V₃ →ₗ[K] V
cd : V₁ →ₗ[K] V₂
ce : V₁ →ₗ[K] V₃
hde : ⊤ ≤ LinearMap.range db ⊔ LinearMap.range eb
hgd : ker cd = ⊥
eq : LinearMap.comp db cd = LinearMap.comp eb ce
eq₂ : ∀ (d : V₂) (e : V₃), ↑db d = ↑eb e → ∃ c, ↑cd c = d ∧ ↑ce c = e
hf : Surjective ↑(coprod db eb)
L : V₁ →ₗ[K] { x // x ∈ ker (coprod db eb) } :=
  LinearMap.codRestrict (ker (coprod db eb)) (LinearMap.prod cd (-ce))
    (_ : ∀ (c : V₁), ↑(LinearMap.prod cd (-ce)) c ∈ ker (coprod db eb))
d : V₂
e : V₃
h : ↑db d = ↑eb (-e) → ∃ c, ↑cd c = d ∧ ↑ce c = -e
⊢ (d, e) ∈ ker (coprod db eb) → (d, e) ∈ LinearMap.range (LinearMap.prod cd (-ce))
[PROOFSTEP]
simp only [add_eq_zero_iff_eq_neg, LinearMap.prod_apply, mem_ker, SetLike.mem_coe, Prod.mk.inj_iff, coprod_apply,
  map_neg, neg_apply, LinearMap.mem_range, Pi.prod] at h ⊢
[GOAL]
case e_a.f.refine'_2.mk
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : DivisionRing K
inst✝⁹ : AddCommGroup V
inst✝⁸ : Module K V
inst✝⁷ : AddCommGroup V'
inst✝⁶ : Module K V'
inst✝⁵ : AddCommGroup V₁
inst✝⁴ : Module K V₁
inst✝³ : AddCommGroup V₂
inst✝² : Module K V₂
inst✝¹ : AddCommGroup V₃
inst✝ : Module K V₃
db : V₂ →ₗ[K] V
eb : V₃ →ₗ[K] V
cd : V₁ →ₗ[K] V₂
ce : V₁ →ₗ[K] V₃
hde : ⊤ ≤ LinearMap.range db ⊔ LinearMap.range eb
hgd : ker cd = ⊥
eq : LinearMap.comp db cd = LinearMap.comp eb ce
eq₂ : ∀ (d : V₂) (e : V₃), ↑db d = ↑eb e → ∃ c, ↑cd c = d ∧ ↑ce c = e
hf : Surjective ↑(coprod db eb)
L : V₁ →ₗ[K] { x // x ∈ ker (coprod db eb) } :=
  LinearMap.codRestrict (ker (coprod db eb)) (LinearMap.prod cd (-ce))
    (_ : ∀ (c : V₁), ↑(LinearMap.prod cd (-ce)) c ∈ ker (coprod db eb))
d : V₂
e : V₃
h : ↑db d = -↑eb e → ∃ c, ↑cd c = d ∧ ↑ce c = -e
⊢ ↑db d = -↑eb e → ∃ y, ↑cd y = d ∧ -↑ce y = e
[PROOFSTEP]
intro hde
[GOAL]
case e_a.f.refine'_2.mk
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : DivisionRing K
inst✝⁹ : AddCommGroup V
inst✝⁸ : Module K V
inst✝⁷ : AddCommGroup V'
inst✝⁶ : Module K V'
inst✝⁵ : AddCommGroup V₁
inst✝⁴ : Module K V₁
inst✝³ : AddCommGroup V₂
inst✝² : Module K V₂
inst✝¹ : AddCommGroup V₃
inst✝ : Module K V₃
db : V₂ →ₗ[K] V
eb : V₃ →ₗ[K] V
cd : V₁ →ₗ[K] V₂
ce : V₁ →ₗ[K] V₃
hde✝ : ⊤ ≤ LinearMap.range db ⊔ LinearMap.range eb
hgd : ker cd = ⊥
eq : LinearMap.comp db cd = LinearMap.comp eb ce
eq₂ : ∀ (d : V₂) (e : V₃), ↑db d = ↑eb e → ∃ c, ↑cd c = d ∧ ↑ce c = e
hf : Surjective ↑(coprod db eb)
L : V₁ →ₗ[K] { x // x ∈ ker (coprod db eb) } :=
  LinearMap.codRestrict (ker (coprod db eb)) (LinearMap.prod cd (-ce))
    (_ : ∀ (c : V₁), ↑(LinearMap.prod cd (-ce)) c ∈ ker (coprod db eb))
d : V₂
e : V₃
h : ↑db d = -↑eb e → ∃ c, ↑cd c = d ∧ ↑ce c = -e
hde : ↑db d = -↑eb e
⊢ ∃ y, ↑cd y = d ∧ -↑ce y = e
[PROOFSTEP]
rcases h hde with ⟨c, h₁, h₂⟩
[GOAL]
case e_a.f.refine'_2.mk.intro.intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : DivisionRing K
inst✝⁹ : AddCommGroup V
inst✝⁸ : Module K V
inst✝⁷ : AddCommGroup V'
inst✝⁶ : Module K V'
inst✝⁵ : AddCommGroup V₁
inst✝⁴ : Module K V₁
inst✝³ : AddCommGroup V₂
inst✝² : Module K V₂
inst✝¹ : AddCommGroup V₃
inst✝ : Module K V₃
db : V₂ →ₗ[K] V
eb : V₃ →ₗ[K] V
cd : V₁ →ₗ[K] V₂
ce : V₁ →ₗ[K] V₃
hde✝ : ⊤ ≤ LinearMap.range db ⊔ LinearMap.range eb
hgd : ker cd = ⊥
eq : LinearMap.comp db cd = LinearMap.comp eb ce
eq₂ : ∀ (d : V₂) (e : V₃), ↑db d = ↑eb e → ∃ c, ↑cd c = d ∧ ↑ce c = e
hf : Surjective ↑(coprod db eb)
L : V₁ →ₗ[K] { x // x ∈ ker (coprod db eb) } :=
  LinearMap.codRestrict (ker (coprod db eb)) (LinearMap.prod cd (-ce))
    (_ : ∀ (c : V₁), ↑(LinearMap.prod cd (-ce)) c ∈ ker (coprod db eb))
d : V₂
e : V₃
h : ↑db d = -↑eb e → ∃ c, ↑cd c = d ∧ ↑ce c = -e
hde : ↑db d = -↑eb e
c : V₁
h₁ : ↑cd c = d
h₂ : ↑ce c = -e
⊢ ∃ y, ↑cd y = d ∧ -↑ce y = e
[PROOFSTEP]
refine' ⟨c, h₁, _⟩
[GOAL]
case e_a.f.refine'_2.mk.intro.intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : DivisionRing K
inst✝⁹ : AddCommGroup V
inst✝⁸ : Module K V
inst✝⁷ : AddCommGroup V'
inst✝⁶ : Module K V'
inst✝⁵ : AddCommGroup V₁
inst✝⁴ : Module K V₁
inst✝³ : AddCommGroup V₂
inst✝² : Module K V₂
inst✝¹ : AddCommGroup V₃
inst✝ : Module K V₃
db : V₂ →ₗ[K] V
eb : V₃ →ₗ[K] V
cd : V₁ →ₗ[K] V₂
ce : V₁ →ₗ[K] V₃
hde✝ : ⊤ ≤ LinearMap.range db ⊔ LinearMap.range eb
hgd : ker cd = ⊥
eq : LinearMap.comp db cd = LinearMap.comp eb ce
eq₂ : ∀ (d : V₂) (e : V₃), ↑db d = ↑eb e → ∃ c, ↑cd c = d ∧ ↑ce c = e
hf : Surjective ↑(coprod db eb)
L : V₁ →ₗ[K] { x // x ∈ ker (coprod db eb) } :=
  LinearMap.codRestrict (ker (coprod db eb)) (LinearMap.prod cd (-ce))
    (_ : ∀ (c : V₁), ↑(LinearMap.prod cd (-ce)) c ∈ ker (coprod db eb))
d : V₂
e : V₃
h : ↑db d = -↑eb e → ∃ c, ↑cd c = d ∧ ↑ce c = -e
hde : ↑db d = -↑eb e
c : V₁
h₁ : ↑cd c = d
h₂ : ↑ce c = -e
⊢ -↑ce c = e
[PROOFSTEP]
rw [h₂, _root_.neg_neg]
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : DivisionRing K
inst✝⁹ : AddCommGroup V
inst✝⁸ : Module K V
inst✝⁷ : AddCommGroup V'
inst✝⁶ : Module K V'
inst✝⁵ : AddCommGroup V₁
inst✝⁴ : Module K V₁
inst✝³ : AddCommGroup V₂
inst✝² : Module K V₂
inst✝¹ : AddCommGroup V₃
inst✝ : Module K V₃
s t : Submodule K V
⊢ ⊤ ≤ LinearMap.range (ofLe (_ : s ≤ s ⊔ t)) ⊔ LinearMap.range (ofLe (_ : t ≤ s ⊔ t))
[PROOFSTEP]
rw [← map_le_map_iff' (ker_subtype <| s ⊔ t), Submodule.map_sup, Submodule.map_top, ← LinearMap.range_comp, ←
  LinearMap.range_comp, subtype_comp_ofLe, subtype_comp_ofLe, range_subtype, range_subtype, range_subtype]
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : DivisionRing K
inst✝⁹ : AddCommGroup V
inst✝⁸ : Module K V
inst✝⁷ : AddCommGroup V'
inst✝⁶ : Module K V'
inst✝⁵ : AddCommGroup V₁
inst✝⁴ : Module K V₁
inst✝³ : AddCommGroup V₂
inst✝² : Module K V₂
inst✝¹ : AddCommGroup V₃
inst✝ : Module K V₃
s t : Submodule K V
⊢ LinearMap.comp (ofLe (_ : s ≤ s ⊔ t)) (ofLe (_ : s ⊓ t ≤ s)) =
    LinearMap.comp (ofLe (_ : t ≤ s ⊔ t)) (ofLe (_ : s ⊓ t ≤ t))
[PROOFSTEP]
ext ⟨x, hx⟩
[GOAL]
case h.mk.a
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : DivisionRing K
inst✝⁹ : AddCommGroup V
inst✝⁸ : Module K V
inst✝⁷ : AddCommGroup V'
inst✝⁶ : Module K V'
inst✝⁵ : AddCommGroup V₁
inst✝⁴ : Module K V₁
inst✝³ : AddCommGroup V₂
inst✝² : Module K V₂
inst✝¹ : AddCommGroup V₃
inst✝ : Module K V₃
s t : Submodule K V
x : V
hx : x ∈ s ⊓ t
⊢ ↑(↑(LinearMap.comp (ofLe (_ : s ≤ s ⊔ t)) (ofLe (_ : s ⊓ t ≤ s))) { val := x, property := hx }) =
    ↑(↑(LinearMap.comp (ofLe (_ : t ≤ s ⊔ t)) (ofLe (_ : s ⊓ t ≤ t))) { val := x, property := hx })
[PROOFSTEP]
rfl
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : DivisionRing K
inst✝⁹ : AddCommGroup V
inst✝⁸ : Module K V
inst✝⁷ : AddCommGroup V'
inst✝⁶ : Module K V'
inst✝⁵ : AddCommGroup V₁
inst✝⁴ : Module K V₁
inst✝³ : AddCommGroup V₂
inst✝² : Module K V₂
inst✝¹ : AddCommGroup V₃
inst✝ : Module K V₃
s t : Submodule K V
⊢ ∀ (d : { x // x ∈ s }) (e : { x // x ∈ t }),
    ↑(ofLe (_ : s ≤ s ⊔ t)) d = ↑(ofLe (_ : t ≤ s ⊔ t)) e →
      ∃ c, ↑(ofLe (_ : s ⊓ t ≤ s)) c = d ∧ ↑(ofLe (_ : s ⊓ t ≤ t)) c = e
[PROOFSTEP]
rintro ⟨b₁, hb₁⟩ ⟨b₂, hb₂⟩ eq
[GOAL]
case mk.mk
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : DivisionRing K
inst✝⁹ : AddCommGroup V
inst✝⁸ : Module K V
inst✝⁷ : AddCommGroup V'
inst✝⁶ : Module K V'
inst✝⁵ : AddCommGroup V₁
inst✝⁴ : Module K V₁
inst✝³ : AddCommGroup V₂
inst✝² : Module K V₂
inst✝¹ : AddCommGroup V₃
inst✝ : Module K V₃
s t : Submodule K V
b₁ : V
hb₁ : b₁ ∈ s
b₂ : V
hb₂ : b₂ ∈ t
eq : ↑(ofLe (_ : s ≤ s ⊔ t)) { val := b₁, property := hb₁ } = ↑(ofLe (_ : t ≤ s ⊔ t)) { val := b₂, property := hb₂ }
⊢ ∃ c,
    ↑(ofLe (_ : s ⊓ t ≤ s)) c = { val := b₁, property := hb₁ } ∧
      ↑(ofLe (_ : s ⊓ t ≤ t)) c = { val := b₂, property := hb₂ }
[PROOFSTEP]
obtain rfl : b₁ = b₂ := congr_arg Subtype.val eq
[GOAL]
case mk.mk
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : DivisionRing K
inst✝⁹ : AddCommGroup V
inst✝⁸ : Module K V
inst✝⁷ : AddCommGroup V'
inst✝⁶ : Module K V'
inst✝⁵ : AddCommGroup V₁
inst✝⁴ : Module K V₁
inst✝³ : AddCommGroup V₂
inst✝² : Module K V₂
inst✝¹ : AddCommGroup V₃
inst✝ : Module K V₃
s t : Submodule K V
b₁ : V
hb₁ : b₁ ∈ s
hb₂ : b₁ ∈ t
eq : ↑(ofLe (_ : s ≤ s ⊔ t)) { val := b₁, property := hb₁ } = ↑(ofLe (_ : t ≤ s ⊔ t)) { val := b₁, property := hb₂ }
⊢ ∃ c,
    ↑(ofLe (_ : s ⊓ t ≤ s)) c = { val := b₁, property := hb₁ } ∧
      ↑(ofLe (_ : s ⊓ t ≤ t)) c = { val := b₁, property := hb₂ }
[PROOFSTEP]
exact ⟨⟨b₁, hb₁, hb₂⟩, rfl, rfl⟩
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : DivisionRing K
inst✝⁹ : AddCommGroup V
inst✝⁸ : Module K V
inst✝⁷ : AddCommGroup V'
inst✝⁶ : Module K V'
inst✝⁵ : AddCommGroup V₁
inst✝⁴ : Module K V₁
inst✝³ : AddCommGroup V₂
inst✝² : Module K V₂
inst✝¹ : AddCommGroup V₃
inst✝ : Module K V₃
s t : Submodule K V
⊢ Module.rank K { x // x ∈ s ⊔ t } ≤ Module.rank K { x // x ∈ s } + Module.rank K { x // x ∈ t }
[PROOFSTEP]
rw [← Submodule.rank_sup_add_rank_inf_eq]
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : DivisionRing K
inst✝⁹ : AddCommGroup V
inst✝⁸ : Module K V
inst✝⁷ : AddCommGroup V'
inst✝⁶ : Module K V'
inst✝⁵ : AddCommGroup V₁
inst✝⁴ : Module K V₁
inst✝³ : AddCommGroup V₂
inst✝² : Module K V₂
inst✝¹ : AddCommGroup V₃
inst✝ : Module K V₃
s t : Submodule K V
⊢ Module.rank K { x // x ∈ s ⊔ t } ≤ Module.rank K { x // x ∈ s ⊔ t } + Module.rank K { x // x ∈ s ⊓ t }
[PROOFSTEP]
exact self_le_add_right _ _
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
c : Cardinal.{v}
⊢ c ≤ Module.rank K V ↔ ∃ s, #↑s = c ∧ LinearIndependent K Subtype.val
[PROOFSTEP]
constructor
[GOAL]
case mp
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
c : Cardinal.{v}
⊢ c ≤ Module.rank K V → ∃ s, #↑s = c ∧ LinearIndependent K Subtype.val
[PROOFSTEP]
intro h
[GOAL]
case mp
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
c : Cardinal.{v}
h : c ≤ Module.rank K V
⊢ ∃ s, #↑s = c ∧ LinearIndependent K Subtype.val
[PROOFSTEP]
let t := Basis.ofVectorSpace K V
[GOAL]
case mp
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
c : Cardinal.{v}
h : c ≤ Module.rank K V
t : Basis (↑(ofVectorSpaceIndex K V)) K V := ofVectorSpace K V
⊢ ∃ s, #↑s = c ∧ LinearIndependent K Subtype.val
[PROOFSTEP]
rw [← t.mk_eq_rank'', Cardinal.le_mk_iff_exists_subset] at h 
[GOAL]
case mp
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
c : Cardinal.{v}
h : ∃ p, p ⊆ ofVectorSpaceIndex K V ∧ #↑p = c
t : Basis (↑(ofVectorSpaceIndex K V)) K V := ofVectorSpace K V
⊢ ∃ s, #↑s = c ∧ LinearIndependent K Subtype.val
[PROOFSTEP]
rcases h with ⟨s, hst, hsc⟩
[GOAL]
case mp.intro.intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
c : Cardinal.{v}
t : Basis (↑(ofVectorSpaceIndex K V)) K V := ofVectorSpace K V
s : Set V
hst : s ⊆ ofVectorSpaceIndex K V
hsc : #↑s = c
⊢ ∃ s, #↑s = c ∧ LinearIndependent K Subtype.val
[PROOFSTEP]
exact ⟨s, hsc, (ofVectorSpaceIndex.linearIndependent K V).mono hst⟩
[GOAL]
case mpr
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
c : Cardinal.{v}
⊢ (∃ s, #↑s = c ∧ LinearIndependent K Subtype.val) → c ≤ Module.rank K V
[PROOFSTEP]
rintro ⟨s, rfl, si⟩
[GOAL]
case mpr.intro.intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
s : Set V
si : LinearIndependent K Subtype.val
⊢ #↑s ≤ Module.rank K V
[PROOFSTEP]
exact cardinal_le_rank_of_linearIndependent si
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
n : ℕ
⊢ ↑n ≤ Module.rank K V ↔ ∃ s, Finset.card s = n ∧ LinearIndependent K Subtype.val
[PROOFSTEP]
simp only [le_rank_iff_exists_linearIndependent, Cardinal.mk_set_eq_nat_iff_finset]
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
n : ℕ
⊢ (∃ s, (∃ t, ↑t = s ∧ Finset.card t = n) ∧ LinearIndependent K Subtype.val) ↔
    ∃ s, Finset.card s = n ∧ LinearIndependent K Subtype.val
[PROOFSTEP]
constructor
[GOAL]
case mp
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
n : ℕ
⊢ (∃ s, (∃ t, ↑t = s ∧ Finset.card t = n) ∧ LinearIndependent K Subtype.val) →
    ∃ s, Finset.card s = n ∧ LinearIndependent K Subtype.val
[PROOFSTEP]
rintro ⟨s, ⟨t, rfl, rfl⟩, si⟩
[GOAL]
case mp.intro.intro.intro.intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
t : Finset V
si : LinearIndependent K Subtype.val
⊢ ∃ s, Finset.card s = Finset.card t ∧ LinearIndependent K Subtype.val
[PROOFSTEP]
exact ⟨t, rfl, si⟩
[GOAL]
case mpr
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
n : ℕ
⊢ (∃ s, Finset.card s = n ∧ LinearIndependent K Subtype.val) →
    ∃ s, (∃ t, ↑t = s ∧ Finset.card t = n) ∧ LinearIndependent K Subtype.val
[PROOFSTEP]
rintro ⟨s, rfl, si⟩
[GOAL]
case mpr.intro.intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
s : Finset V
si : LinearIndependent K Subtype.val
⊢ ∃ s_1, (∃ t, ↑t = s_1 ∧ Finset.card t = Finset.card s) ∧ LinearIndependent K Subtype.val
[PROOFSTEP]
exact ⟨s, ⟨s, rfl, rfl⟩, si⟩
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
⊢ Module.rank K V ≤ 1 ↔ ∃ v₀, ∀ (v : V), ∃ r, r • v₀ = v
[PROOFSTEP]
let b := Basis.ofVectorSpace K V
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
b : Basis (↑(ofVectorSpaceIndex K V)) K V := ofVectorSpace K V
⊢ Module.rank K V ≤ 1 ↔ ∃ v₀, ∀ (v : V), ∃ r, r • v₀ = v
[PROOFSTEP]
constructor
[GOAL]
case mp
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
b : Basis (↑(ofVectorSpaceIndex K V)) K V := ofVectorSpace K V
⊢ Module.rank K V ≤ 1 → ∃ v₀, ∀ (v : V), ∃ r, r • v₀ = v
[PROOFSTEP]
intro hd
[GOAL]
case mp
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
b : Basis (↑(ofVectorSpaceIndex K V)) K V := ofVectorSpace K V
hd : Module.rank K V ≤ 1
⊢ ∃ v₀, ∀ (v : V), ∃ r, r • v₀ = v
[PROOFSTEP]
rw [← b.mk_eq_rank'', Cardinal.le_one_iff_subsingleton, subsingleton_coe] at hd 
[GOAL]
case mp
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
b : Basis (↑(ofVectorSpaceIndex K V)) K V := ofVectorSpace K V
hd : Set.Subsingleton (ofVectorSpaceIndex K V)
⊢ ∃ v₀, ∀ (v : V), ∃ r, r • v₀ = v
[PROOFSTEP]
rcases eq_empty_or_nonempty (ofVectorSpaceIndex K V) with (hb | ⟨⟨v₀, hv₀⟩⟩)
[GOAL]
case mp.inl
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
b : Basis (↑(ofVectorSpaceIndex K V)) K V := ofVectorSpace K V
hd : Set.Subsingleton (ofVectorSpaceIndex K V)
hb : ofVectorSpaceIndex K V = ∅
⊢ ∃ v₀, ∀ (v : V), ∃ r, r • v₀ = v
[PROOFSTEP]
use 0
[GOAL]
case h
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
b : Basis (↑(ofVectorSpaceIndex K V)) K V := ofVectorSpace K V
hd : Set.Subsingleton (ofVectorSpaceIndex K V)
hb : ofVectorSpaceIndex K V = ∅
⊢ ∀ (v : V), ∃ r, r • 0 = v
[PROOFSTEP]
have h' : ∀ v : V, v = 0 := by simpa [hb, Submodule.eq_bot_iff] using b.span_eq.symm
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
b : Basis (↑(ofVectorSpaceIndex K V)) K V := ofVectorSpace K V
hd : Set.Subsingleton (ofVectorSpaceIndex K V)
hb : ofVectorSpaceIndex K V = ∅
⊢ ∀ (v : V), v = 0
[PROOFSTEP]
simpa [hb, Submodule.eq_bot_iff] using b.span_eq.symm
[GOAL]
case h
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
b : Basis (↑(ofVectorSpaceIndex K V)) K V := ofVectorSpace K V
hd : Set.Subsingleton (ofVectorSpaceIndex K V)
hb : ofVectorSpaceIndex K V = ∅
h' : ∀ (v : V), v = 0
⊢ ∀ (v : V), ∃ r, r • 0 = v
[PROOFSTEP]
intro v
[GOAL]
case h
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
b : Basis (↑(ofVectorSpaceIndex K V)) K V := ofVectorSpace K V
hd : Set.Subsingleton (ofVectorSpaceIndex K V)
hb : ofVectorSpaceIndex K V = ∅
h' : ∀ (v : V), v = 0
v : V
⊢ ∃ r, r • 0 = v
[PROOFSTEP]
simp [h' v]
[GOAL]
case mp.inr.intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
b : Basis (↑(ofVectorSpaceIndex K V)) K V := ofVectorSpace K V
hd : Set.Subsingleton (ofVectorSpaceIndex K V)
v₀ : V
hv₀ : v₀ ∈ ofVectorSpaceIndex K V
⊢ ∃ v₀, ∀ (v : V), ∃ r, r • v₀ = v
[PROOFSTEP]
use v₀
[GOAL]
case h
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
b : Basis (↑(ofVectorSpaceIndex K V)) K V := ofVectorSpace K V
hd : Set.Subsingleton (ofVectorSpaceIndex K V)
v₀ : V
hv₀ : v₀ ∈ ofVectorSpaceIndex K V
⊢ ∀ (v : V), ∃ r, r • v₀ = v
[PROOFSTEP]
have h' : (K ∙ v₀) = ⊤ := by simpa [hd.eq_singleton_of_mem hv₀] using b.span_eq
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
b : Basis (↑(ofVectorSpaceIndex K V)) K V := ofVectorSpace K V
hd : Set.Subsingleton (ofVectorSpaceIndex K V)
v₀ : V
hv₀ : v₀ ∈ ofVectorSpaceIndex K V
⊢ span K {v₀} = ⊤
[PROOFSTEP]
simpa [hd.eq_singleton_of_mem hv₀] using b.span_eq
[GOAL]
case h
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
b : Basis (↑(ofVectorSpaceIndex K V)) K V := ofVectorSpace K V
hd : Set.Subsingleton (ofVectorSpaceIndex K V)
v₀ : V
hv₀ : v₀ ∈ ofVectorSpaceIndex K V
h' : span K {v₀} = ⊤
⊢ ∀ (v : V), ∃ r, r • v₀ = v
[PROOFSTEP]
intro v
[GOAL]
case h
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
b : Basis (↑(ofVectorSpaceIndex K V)) K V := ofVectorSpace K V
hd : Set.Subsingleton (ofVectorSpaceIndex K V)
v₀ : V
hv₀ : v₀ ∈ ofVectorSpaceIndex K V
h' : span K {v₀} = ⊤
v : V
⊢ ∃ r, r • v₀ = v
[PROOFSTEP]
have hv : v ∈ (⊤ : Submodule K V) := mem_top
[GOAL]
case h
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
b : Basis (↑(ofVectorSpaceIndex K V)) K V := ofVectorSpace K V
hd : Set.Subsingleton (ofVectorSpaceIndex K V)
v₀ : V
hv₀ : v₀ ∈ ofVectorSpaceIndex K V
h' : span K {v₀} = ⊤
v : V
hv : v ∈ ⊤
⊢ ∃ r, r • v₀ = v
[PROOFSTEP]
rwa [← h', mem_span_singleton] at hv 
[GOAL]
case mpr
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
b : Basis (↑(ofVectorSpaceIndex K V)) K V := ofVectorSpace K V
⊢ (∃ v₀, ∀ (v : V), ∃ r, r • v₀ = v) → Module.rank K V ≤ 1
[PROOFSTEP]
rintro ⟨v₀, hv₀⟩
[GOAL]
case mpr.intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
b : Basis (↑(ofVectorSpaceIndex K V)) K V := ofVectorSpace K V
v₀ : V
hv₀ : ∀ (v : V), ∃ r, r • v₀ = v
⊢ Module.rank K V ≤ 1
[PROOFSTEP]
have h : (K ∙ v₀) = ⊤ := by
  ext
  simp [mem_span_singleton, hv₀]
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
b : Basis (↑(ofVectorSpaceIndex K V)) K V := ofVectorSpace K V
v₀ : V
hv₀ : ∀ (v : V), ∃ r, r • v₀ = v
⊢ span K {v₀} = ⊤
[PROOFSTEP]
ext
[GOAL]
case h
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
b : Basis (↑(ofVectorSpaceIndex K V)) K V := ofVectorSpace K V
v₀ : V
hv₀ : ∀ (v : V), ∃ r, r • v₀ = v
x✝ : V
⊢ x✝ ∈ span K {v₀} ↔ x✝ ∈ ⊤
[PROOFSTEP]
simp [mem_span_singleton, hv₀]
[GOAL]
case mpr.intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
b : Basis (↑(ofVectorSpaceIndex K V)) K V := ofVectorSpace K V
v₀ : V
hv₀ : ∀ (v : V), ∃ r, r • v₀ = v
h : span K {v₀} = ⊤
⊢ Module.rank K V ≤ 1
[PROOFSTEP]
rw [← rank_top, ← h]
[GOAL]
case mpr.intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
b : Basis (↑(ofVectorSpaceIndex K V)) K V := ofVectorSpace K V
v₀ : V
hv₀ : ∀ (v : V), ∃ r, r • v₀ = v
h : span K {v₀} = ⊤
⊢ Module.rank K { x // x ∈ span K {v₀} } ≤ 1
[PROOFSTEP]
refine' (rank_span_le _).trans_eq _
[GOAL]
case mpr.intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
b : Basis (↑(ofVectorSpaceIndex K V)) K V := ofVectorSpace K V
v₀ : V
hv₀ : ∀ (v : V), ∃ r, r • v₀ = v
h : span K {v₀} = ⊤
⊢ #↑{v₀} = 1
[PROOFSTEP]
simp
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
s : Submodule K V
⊢ Module.rank K { x // x ∈ s } ≤ 1 ↔ ∃ v₀, v₀ ∈ s ∧ s ≤ span K {v₀}
[PROOFSTEP]
simp_rw [rank_le_one_iff, le_span_singleton_iff]
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
s : Submodule K V
⊢ (∃ v₀, ∀ (v : { x // x ∈ s }), ∃ r, r • v₀ = v) ↔ ∃ v₀, v₀ ∈ s ∧ ∀ (v : V), v ∈ s → ∃ r, r • v₀ = v
[PROOFSTEP]
constructor
[GOAL]
case mp
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
s : Submodule K V
⊢ (∃ v₀, ∀ (v : { x // x ∈ s }), ∃ r, r • v₀ = v) → ∃ v₀, v₀ ∈ s ∧ ∀ (v : V), v ∈ s → ∃ r, r • v₀ = v
[PROOFSTEP]
rintro ⟨⟨v₀, hv₀⟩, h⟩
[GOAL]
case mp.intro.mk
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
s : Submodule K V
v₀ : V
hv₀ : v₀ ∈ s
h : ∀ (v : { x // x ∈ s }), ∃ r, r • { val := v₀, property := hv₀ } = v
⊢ ∃ v₀, v₀ ∈ s ∧ ∀ (v : V), v ∈ s → ∃ r, r • v₀ = v
[PROOFSTEP]
use v₀, hv₀
[GOAL]
case right
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
s : Submodule K V
v₀ : V
hv₀ : v₀ ∈ s
h : ∀ (v : { x // x ∈ s }), ∃ r, r • { val := v₀, property := hv₀ } = v
⊢ ∀ (v : V), v ∈ s → ∃ r, r • v₀ = v
[PROOFSTEP]
intro v hv
[GOAL]
case right
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
s : Submodule K V
v₀ : V
hv₀ : v₀ ∈ s
h : ∀ (v : { x // x ∈ s }), ∃ r, r • { val := v₀, property := hv₀ } = v
v : V
hv : v ∈ s
⊢ ∃ r, r • v₀ = v
[PROOFSTEP]
obtain ⟨r, hr⟩ := h ⟨v, hv⟩
[GOAL]
case right.intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
s : Submodule K V
v₀ : V
hv₀ : v₀ ∈ s
h : ∀ (v : { x // x ∈ s }), ∃ r, r • { val := v₀, property := hv₀ } = v
v : V
hv : v ∈ s
r : K
hr : r • { val := v₀, property := hv₀ } = { val := v, property := hv }
⊢ ∃ r, r • v₀ = v
[PROOFSTEP]
use r
[GOAL]
case h
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
s : Submodule K V
v₀ : V
hv₀ : v₀ ∈ s
h : ∀ (v : { x // x ∈ s }), ∃ r, r • { val := v₀, property := hv₀ } = v
v : V
hv : v ∈ s
r : K
hr : r • { val := v₀, property := hv₀ } = { val := v, property := hv }
⊢ r • v₀ = v
[PROOFSTEP]
simp_rw [Subtype.ext_iff, coe_smul] at hr 
[GOAL]
case h
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
s : Submodule K V
v₀ : V
hv₀ : v₀ ∈ s
h : ∀ (v : { x // x ∈ s }), ∃ r, r • { val := v₀, property := hv₀ } = v
v : V
hv : v ∈ s
r : K
hr : r • v₀ = v
⊢ r • v₀ = v
[PROOFSTEP]
exact hr
[GOAL]
case mpr
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
s : Submodule K V
⊢ (∃ v₀, v₀ ∈ s ∧ ∀ (v : V), v ∈ s → ∃ r, r • v₀ = v) → ∃ v₀, ∀ (v : { x // x ∈ s }), ∃ r, r • v₀ = v
[PROOFSTEP]
rintro ⟨v₀, hv₀, h⟩
[GOAL]
case mpr.intro.intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
s : Submodule K V
v₀ : V
hv₀ : v₀ ∈ s
h : ∀ (v : V), v ∈ s → ∃ r, r • v₀ = v
⊢ ∃ v₀, ∀ (v : { x // x ∈ s }), ∃ r, r • v₀ = v
[PROOFSTEP]
use⟨v₀, hv₀⟩
[GOAL]
case h
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
s : Submodule K V
v₀ : V
hv₀ : v₀ ∈ s
h : ∀ (v : V), v ∈ s → ∃ r, r • v₀ = v
⊢ ∀ (v : { x // x ∈ s }), ∃ r, r • { val := v₀, property := hv₀ } = v
[PROOFSTEP]
rintro ⟨v, hv⟩
[GOAL]
case h.mk
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
s : Submodule K V
v₀ : V
hv₀ : v₀ ∈ s
h : ∀ (v : V), v ∈ s → ∃ r, r • v₀ = v
v : V
hv : v ∈ s
⊢ ∃ r, r • { val := v₀, property := hv₀ } = { val := v, property := hv }
[PROOFSTEP]
obtain ⟨r, hr⟩ := h v hv
[GOAL]
case h.mk.intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
s : Submodule K V
v₀ : V
hv₀ : v₀ ∈ s
h : ∀ (v : V), v ∈ s → ∃ r, r • v₀ = v
v : V
hv : v ∈ s
r : K
hr : r • v₀ = v
⊢ ∃ r, r • { val := v₀, property := hv₀ } = { val := v, property := hv }
[PROOFSTEP]
use r
[GOAL]
case h
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
s : Submodule K V
v₀ : V
hv₀ : v₀ ∈ s
h : ∀ (v : V), v ∈ s → ∃ r, r • v₀ = v
v : V
hv : v ∈ s
r : K
hr : r • v₀ = v
⊢ r • { val := v₀, property := hv₀ } = { val := v, property := hv }
[PROOFSTEP]
simp_rw [Subtype.ext_iff, coe_smul]
[GOAL]
case h
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
s : Submodule K V
v₀ : V
hv₀ : v₀ ∈ s
h : ∀ (v : V), v ∈ s → ∃ r, r • v₀ = v
v : V
hv : v ∈ s
r : K
hr : r • v₀ = v
⊢ r • v₀ = v
[PROOFSTEP]
exact hr
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
s : Submodule K V
⊢ Module.rank K { x // x ∈ s } ≤ 1 ↔ ∃ v₀, s ≤ span K {v₀}
[PROOFSTEP]
rw [rank_submodule_le_one_iff]
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
s : Submodule K V
⊢ (∃ v₀, v₀ ∈ s ∧ s ≤ span K {v₀}) ↔ ∃ v₀, s ≤ span K {v₀}
[PROOFSTEP]
constructor
[GOAL]
case mp
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
s : Submodule K V
⊢ (∃ v₀, v₀ ∈ s ∧ s ≤ span K {v₀}) → ∃ v₀, s ≤ span K {v₀}
[PROOFSTEP]
rintro ⟨v₀, _, h⟩
[GOAL]
case mp.intro.intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
s : Submodule K V
v₀ : V
left✝ : v₀ ∈ s
h : s ≤ span K {v₀}
⊢ ∃ v₀, s ≤ span K {v₀}
[PROOFSTEP]
exact ⟨v₀, h⟩
[GOAL]
case mpr
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
s : Submodule K V
⊢ (∃ v₀, s ≤ span K {v₀}) → ∃ v₀, v₀ ∈ s ∧ s ≤ span K {v₀}
[PROOFSTEP]
rintro ⟨v₀, h⟩
[GOAL]
case mpr.intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
s : Submodule K V
v₀ : V
h : s ≤ span K {v₀}
⊢ ∃ v₀, v₀ ∈ s ∧ s ≤ span K {v₀}
[PROOFSTEP]
by_cases hw : ∃ w : V, w ∈ s ∧ w ≠ 0
[GOAL]
case pos
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
s : Submodule K V
v₀ : V
h : s ≤ span K {v₀}
hw : ∃ w, w ∈ s ∧ w ≠ 0
⊢ ∃ v₀, v₀ ∈ s ∧ s ≤ span K {v₀}
[PROOFSTEP]
rcases hw with ⟨w, hw, hw0⟩
[GOAL]
case pos.intro.intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
s : Submodule K V
v₀ : V
h : s ≤ span K {v₀}
w : V
hw : w ∈ s
hw0 : w ≠ 0
⊢ ∃ v₀, v₀ ∈ s ∧ s ≤ span K {v₀}
[PROOFSTEP]
use w, hw
[GOAL]
case right
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
s : Submodule K V
v₀ : V
h : s ≤ span K {v₀}
w : V
hw : w ∈ s
hw0 : w ≠ 0
⊢ s ≤ span K {w}
[PROOFSTEP]
rcases mem_span_singleton.1 (h hw) with ⟨r', rfl⟩
[GOAL]
case right.intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
s : Submodule K V
v₀ : V
h : s ≤ span K {v₀}
r' : K
hw : r' • v₀ ∈ s
hw0 : r' • v₀ ≠ 0
⊢ s ≤ span K {r' • v₀}
[PROOFSTEP]
have h0 : r' ≠ 0 := by
  rintro rfl
  simp at hw0 
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
s : Submodule K V
v₀ : V
h : s ≤ span K {v₀}
r' : K
hw : r' • v₀ ∈ s
hw0 : r' • v₀ ≠ 0
⊢ r' ≠ 0
[PROOFSTEP]
rintro rfl
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
s : Submodule K V
v₀ : V
h : s ≤ span K {v₀}
hw : 0 • v₀ ∈ s
hw0 : 0 • v₀ ≠ 0
⊢ False
[PROOFSTEP]
simp at hw0 
[GOAL]
case right.intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
s : Submodule K V
v₀ : V
h : s ≤ span K {v₀}
r' : K
hw : r' • v₀ ∈ s
hw0 : r' • v₀ ≠ 0
h0 : r' ≠ 0
⊢ s ≤ span K {r' • v₀}
[PROOFSTEP]
rwa [span_singleton_smul_eq (IsUnit.mk0 _ h0) _]
[GOAL]
case neg
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
s : Submodule K V
v₀ : V
h : s ≤ span K {v₀}
hw : ¬∃ w, w ∈ s ∧ w ≠ 0
⊢ ∃ v₀, v₀ ∈ s ∧ s ≤ span K {v₀}
[PROOFSTEP]
push_neg at hw 
[GOAL]
case neg
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
s : Submodule K V
v₀ : V
h : s ≤ span K {v₀}
hw : ∀ (w : V), w ∈ s → w = 0
⊢ ∃ v₀, v₀ ∈ s ∧ s ≤ span K {v₀}
[PROOFSTEP]
rw [← Submodule.eq_bot_iff] at hw 
[GOAL]
case neg
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
s : Submodule K V
v₀ : V
h : s ≤ span K {v₀}
hw : s = ⊥
⊢ ∃ v₀, v₀ ∈ s ∧ s ≤ span K {v₀}
[PROOFSTEP]
simp [hw]
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
W : Submodule K V
⊢ Module.rank K { x // x ∈ W } ≤ 1 ↔ IsPrincipal W
[PROOFSTEP]
simp only [rank_le_one_iff, Submodule.IsPrincipal_iff, le_antisymm_iff, le_span_singleton_iff,
  span_singleton_le_iff_mem]
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
W : Submodule K V
⊢ (∃ v₀, ∀ (v : { x // x ∈ W }), ∃ r, r • v₀ = v) ↔ ∃ a, (∀ (v : V), v ∈ W → ∃ r, r • a = v) ∧ a ∈ W
[PROOFSTEP]
constructor
[GOAL]
case mp
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
W : Submodule K V
⊢ (∃ v₀, ∀ (v : { x // x ∈ W }), ∃ r, r • v₀ = v) → ∃ a, (∀ (v : V), v ∈ W → ∃ r, r • a = v) ∧ a ∈ W
[PROOFSTEP]
rintro ⟨⟨m, hm⟩, hm'⟩
[GOAL]
case mp.intro.mk
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
W : Submodule K V
m : V
hm : m ∈ W
hm' : ∀ (v : { x // x ∈ W }), ∃ r, r • { val := m, property := hm } = v
⊢ ∃ a, (∀ (v : V), v ∈ W → ∃ r, r • a = v) ∧ a ∈ W
[PROOFSTEP]
choose f hf using hm'
[GOAL]
case mp.intro.mk
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
W : Submodule K V
m : V
hm : m ∈ W
f : { x // x ∈ W } → K
hf : ∀ (v : { x // x ∈ W }), f v • { val := m, property := hm } = v
⊢ ∃ a, (∀ (v : V), v ∈ W → ∃ r, r • a = v) ∧ a ∈ W
[PROOFSTEP]
exact ⟨m, ⟨fun v hv => ⟨f ⟨v, hv⟩, congr_arg ((↑) : W → V) (hf ⟨v, hv⟩)⟩, hm⟩⟩
[GOAL]
case mpr
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
W : Submodule K V
⊢ (∃ a, (∀ (v : V), v ∈ W → ∃ r, r • a = v) ∧ a ∈ W) → ∃ v₀, ∀ (v : { x // x ∈ W }), ∃ r, r • v₀ = v
[PROOFSTEP]
rintro ⟨a, ⟨h, ha⟩⟩
[GOAL]
case mpr.intro.intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
W : Submodule K V
a : V
h : ∀ (v : V), v ∈ W → ∃ r, r • a = v
ha : a ∈ W
⊢ ∃ v₀, ∀ (v : { x // x ∈ W }), ∃ r, r • v₀ = v
[PROOFSTEP]
choose f hf using h
[GOAL]
case mpr.intro.intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
W : Submodule K V
a : V
ha : a ∈ W
f : (v : V) → v ∈ W → K
hf : ∀ (v : V) (a_1 : v ∈ W), f v a_1 • a = v
⊢ ∃ v₀, ∀ (v : { x // x ∈ W }), ∃ r, r • v₀ = v
[PROOFSTEP]
exact ⟨⟨a, ha⟩, fun v => ⟨f v.1 v.2, Subtype.ext (hf v.1 v.2)⟩⟩
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
⊢ Module.rank K V ≤ 1 ↔ IsPrincipal ⊤
[PROOFSTEP]
rw [← Submodule.rank_le_one_iff_isPrincipal, rank_top]
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁷ : Ring K
inst✝⁶ : AddCommGroup V
inst✝⁵ : Module K V
inst✝⁴ : AddCommGroup V₁
inst✝³ : Module K V₁
inst✝² : AddCommGroup V'
inst✝¹ : Module K V'
inst✝ : Nontrivial K
⊢ rank 0 = 0
[PROOFSTEP]
rw [rank, LinearMap.range_zero, rank_bot]
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁸ : Ring K
inst✝⁷ : AddCommGroup V
inst✝⁶ : Module K V
inst✝⁵ : AddCommGroup V₁
inst✝⁴ : Module K V₁
inst✝³ : AddCommGroup V'
inst✝² : Module K V'
inst✝¹ : AddCommGroup V''
inst✝ : Module K V''
g : V →ₗ[K] V'
f : V' →ₗ[K] V''
⊢ rank (comp f g) ≤ rank f
[PROOFSTEP]
refine' rank_le_of_submodule _ _ _
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁸ : Ring K
inst✝⁷ : AddCommGroup V
inst✝⁶ : Module K V
inst✝⁵ : AddCommGroup V₁
inst✝⁴ : Module K V₁
inst✝³ : AddCommGroup V'
inst✝² : Module K V'
inst✝¹ : AddCommGroup V''
inst✝ : Module K V''
g : V →ₗ[K] V'
f : V' →ₗ[K] V''
⊢ range (comp f g) ≤ range f
[PROOFSTEP]
rw [LinearMap.range_comp]
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁸ : Ring K
inst✝⁷ : AddCommGroup V
inst✝⁶ : Module K V
inst✝⁵ : AddCommGroup V₁
inst✝⁴ : Module K V₁
inst✝³ : AddCommGroup V'
inst✝² : Module K V'
inst✝¹ : AddCommGroup V''
inst✝ : Module K V''
g : V →ₗ[K] V'
f : V' →ₗ[K] V''
⊢ Submodule.map f (range g) ≤ range f
[PROOFSTEP]
exact LinearMap.map_le_range
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁸ : Ring K
inst✝⁷ : AddCommGroup V
inst✝⁶ : Module K V
inst✝⁵ : AddCommGroup V₁
inst✝⁴ : Module K V₁
inst✝³ : AddCommGroup V'
inst✝² : Module K V'
inst✝¹ : AddCommGroup V''
inst✝ : Module K V''
g : V →ₗ[K] V'
f : V' →ₗ[K] V''
⊢ lift (rank (comp f g)) ≤ lift (rank g)
[PROOFSTEP]
rw [rank, rank, LinearMap.range_comp]
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁸ : Ring K
inst✝⁷ : AddCommGroup V
inst✝⁶ : Module K V
inst✝⁵ : AddCommGroup V₁
inst✝⁴ : Module K V₁
inst✝³ : AddCommGroup V'
inst✝² : Module K V'
inst✝¹ : AddCommGroup V''
inst✝ : Module K V''
g : V →ₗ[K] V'
f : V' →ₗ[K] V''
⊢ lift (Module.rank K { x // x ∈ Submodule.map f (range g) }) ≤ lift (Module.rank K { x // x ∈ range g })
[PROOFSTEP]
exact lift_rank_map_le _ _
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : Ring K
inst✝⁹ : AddCommGroup V
inst✝⁸ : Module K V
inst✝⁷ : AddCommGroup V₁
inst✝⁶ : Module K V₁
inst✝⁵ : AddCommGroup V'
inst✝⁴ : Module K V'
inst✝³ : AddCommGroup V''
inst✝² : Module K V''
inst✝¹ : AddCommGroup V'₁
inst✝ : Module K V'₁
g : V →ₗ[K] V'
f : V' →ₗ[K] V'₁
⊢ rank (comp f g) ≤ rank g
[PROOFSTEP]
simpa only [Cardinal.lift_id] using lift_rank_comp_le_right g f
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝¹⁰ : Ring K
inst✝⁹ : AddCommGroup V
inst✝⁸ : Module K V
inst✝⁷ : AddCommGroup V₁
inst✝⁶ : Module K V₁
inst✝⁵ : AddCommGroup V'
inst✝⁴ : Module K V'
inst✝³ : AddCommGroup V''
inst✝² : Module K V''
inst✝¹ : AddCommGroup V'₁
inst✝ : Module K V'₁
g : V →ₗ[K] V'
f : V' →ₗ[K] V'₁
⊢ rank (comp f g) ≤ min (rank f) (rank g)
[PROOFSTEP]
simpa only [Cardinal.lift_id] using lift_rank_comp_le g f
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
f g : V →ₗ[K] V'
⊢ rank (f + g) ≤ Module.rank K { x // x ∈ range f ⊔ range g }
[PROOFSTEP]
refine' rank_le_of_submodule _ _ _
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
f g : V →ₗ[K] V'
⊢ range (f + g) ≤ range f ⊔ range g
[PROOFSTEP]
exact
  LinearMap.range_le_iff_comap.2 <|
    eq_top_iff'.2 fun x =>
      show f x + g x ∈ (LinearMap.range f ⊔ LinearMap.range g : Submodule K V') from
        mem_sup.2 ⟨_, ⟨x, rfl⟩, _, ⟨x, rfl⟩, rfl⟩
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
c : Cardinal.{v'}
f : V →ₗ[K] V'
⊢ c ≤ rank f ↔ ∃ s, lift #↑s = lift c ∧ LinearIndependent K fun x => ↑f ↑x
[PROOFSTEP]
rcases f.rangeRestrict.exists_rightInverse_of_surjective f.range_rangeRestrict with ⟨g, hg⟩
[GOAL]
case intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
c : Cardinal.{v'}
f : V →ₗ[K] V'
g : { x // x ∈ range f } →ₗ[K] V
hg : comp (rangeRestrict f) g = id
⊢ c ≤ rank f ↔ ∃ s, lift #↑s = lift c ∧ LinearIndependent K fun x => ↑f ↑x
[PROOFSTEP]
have fg : LeftInverse f.rangeRestrict g := LinearMap.congr_fun hg
[GOAL]
case intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
c : Cardinal.{v'}
f : V →ₗ[K] V'
g : { x // x ∈ range f } →ₗ[K] V
hg : comp (rangeRestrict f) g = id
fg : LeftInverse ↑(rangeRestrict f) ↑g
⊢ c ≤ rank f ↔ ∃ s, lift #↑s = lift c ∧ LinearIndependent K fun x => ↑f ↑x
[PROOFSTEP]
refine' ⟨fun h => _, _⟩
[GOAL]
case intro.refine'_1
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
c : Cardinal.{v'}
f : V →ₗ[K] V'
g : { x // x ∈ range f } →ₗ[K] V
hg : comp (rangeRestrict f) g = id
fg : LeftInverse ↑(rangeRestrict f) ↑g
h : c ≤ rank f
⊢ ∃ s, lift #↑s = lift c ∧ LinearIndependent K fun x => ↑f ↑x
[PROOFSTEP]
rcases _root_.le_rank_iff_exists_linearIndependent.1 h with ⟨s, rfl, si⟩
[GOAL]
case intro.refine'_1.intro.intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
f : V →ₗ[K] V'
g : { x // x ∈ range f } →ₗ[K] V
hg : comp (rangeRestrict f) g = id
fg : LeftInverse ↑(rangeRestrict f) ↑g
s : Set { x // x ∈ range f }
si : LinearIndependent K Subtype.val
h : #↑s ≤ rank f
⊢ ∃ s_1, lift #↑s_1 = lift #↑s ∧ LinearIndependent K fun x => ↑f ↑x
[PROOFSTEP]
refine' ⟨g '' s, Cardinal.mk_image_eq_lift _ _ fg.injective, _⟩
[GOAL]
case intro.refine'_1.intro.intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
f : V →ₗ[K] V'
g : { x // x ∈ range f } →ₗ[K] V
hg : comp (rangeRestrict f) g = id
fg : LeftInverse ↑(rangeRestrict f) ↑g
s : Set { x // x ∈ range f }
si : LinearIndependent K Subtype.val
h : #↑s ≤ rank f
⊢ LinearIndependent K fun x => ↑f ↑x
[PROOFSTEP]
replace fg : ∀ x, f (g x) = x
[GOAL]
case fg
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
f : V →ₗ[K] V'
g : { x // x ∈ range f } →ₗ[K] V
hg : comp (rangeRestrict f) g = id
fg : LeftInverse ↑(rangeRestrict f) ↑g
s : Set { x // x ∈ range f }
si : LinearIndependent K Subtype.val
h : #↑s ≤ rank f
⊢ ∀ (x : { x // x ∈ range f }), ↑f (↑g x) = ↑x
[PROOFSTEP]
intro x
[GOAL]
case fg
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
f : V →ₗ[K] V'
g : { x // x ∈ range f } →ₗ[K] V
hg : comp (rangeRestrict f) g = id
fg : LeftInverse ↑(rangeRestrict f) ↑g
s : Set { x // x ∈ range f }
si : LinearIndependent K Subtype.val
h : #↑s ≤ rank f
x : { x // x ∈ range f }
⊢ ↑f (↑g x) = ↑x
[PROOFSTEP]
convert congr_arg Subtype.val (fg x)
[GOAL]
case intro.refine'_1.intro.intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
f : V →ₗ[K] V'
g : { x // x ∈ range f } →ₗ[K] V
hg : comp (rangeRestrict f) g = id
s : Set { x // x ∈ range f }
si : LinearIndependent K Subtype.val
h : #↑s ≤ rank f
fg : ∀ (x : { x // x ∈ range f }), ↑f (↑g x) = ↑x
⊢ LinearIndependent K fun x => ↑f ↑x
[PROOFSTEP]
replace si : LinearIndependent K fun x : s => f (g x)
[GOAL]
case si
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
f : V →ₗ[K] V'
g : { x // x ∈ range f } →ₗ[K] V
hg : comp (rangeRestrict f) g = id
s : Set { x // x ∈ range f }
si : LinearIndependent K Subtype.val
h : #↑s ≤ rank f
fg : ∀ (x : { x // x ∈ range f }), ↑f (↑g x) = ↑x
⊢ LinearIndependent K fun x => ↑f (↑g ↑x)
[PROOFSTEP]
simpa only [fg] using si.map' _ (ker_subtype _)
[GOAL]
case intro.refine'_1.intro.intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
f : V →ₗ[K] V'
g : { x // x ∈ range f } →ₗ[K] V
hg : comp (rangeRestrict f) g = id
s : Set { x // x ∈ range f }
h : #↑s ≤ rank f
fg : ∀ (x : { x // x ∈ range f }), ↑f (↑g x) = ↑x
si : LinearIndependent K fun x => ↑f (↑g ↑x)
⊢ LinearIndependent K fun x => ↑f ↑x
[PROOFSTEP]
exact si.image_of_comp s g f
[GOAL]
case intro.refine'_2
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
c : Cardinal.{v'}
f : V →ₗ[K] V'
g : { x // x ∈ range f } →ₗ[K] V
hg : comp (rangeRestrict f) g = id
fg : LeftInverse ↑(rangeRestrict f) ↑g
⊢ (∃ s, lift #↑s = lift c ∧ LinearIndependent K fun x => ↑f ↑x) → c ≤ rank f
[PROOFSTEP]
rintro ⟨s, hsc, si⟩
[GOAL]
case intro.refine'_2.intro.intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
c : Cardinal.{v'}
f : V →ₗ[K] V'
g : { x // x ∈ range f } →ₗ[K] V
hg : comp (rangeRestrict f) g = id
fg : LeftInverse ↑(rangeRestrict f) ↑g
s : Set V
hsc : lift #↑s = lift c
si : LinearIndependent K fun x => ↑f ↑x
⊢ c ≤ rank f
[PROOFSTEP]
have : LinearIndependent K fun x : s => f.rangeRestrict x := LinearIndependent.of_comp f.range.subtype (by convert si)
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
c : Cardinal.{v'}
f : V →ₗ[K] V'
g : { x // x ∈ range f } →ₗ[K] V
hg : comp (rangeRestrict f) g = id
fg : LeftInverse ↑(rangeRestrict f) ↑g
s : Set V
hsc : lift #↑s = lift c
si : LinearIndependent K fun x => ↑f ↑x
⊢ LinearIndependent K (↑(Submodule.subtype (range f)) ∘ fun x => ↑(rangeRestrict f) ↑x)
[PROOFSTEP]
convert si
[GOAL]
case intro.refine'_2.intro.intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
c : Cardinal.{v'}
f : V →ₗ[K] V'
g : { x // x ∈ range f } →ₗ[K] V
hg : comp (rangeRestrict f) g = id
fg : LeftInverse ↑(rangeRestrict f) ↑g
s : Set V
hsc : lift #↑s = lift c
si : LinearIndependent K fun x => ↑f ↑x
this : LinearIndependent K fun x => ↑(rangeRestrict f) ↑x
⊢ c ≤ rank f
[PROOFSTEP]
convert cardinal_le_rank_of_linearIndependent this.image
[GOAL]
case h.e'_3
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
c : Cardinal.{v'}
f : V →ₗ[K] V'
g : { x // x ∈ range f } →ₗ[K] V
hg : comp (rangeRestrict f) g = id
fg : LeftInverse ↑(rangeRestrict f) ↑g
s : Set V
hsc : lift #↑s = lift c
si : LinearIndependent K fun x => ↑f ↑x
this : LinearIndependent K fun x => ↑(rangeRestrict f) ↑x
⊢ c = #↑(↑(rangeRestrict f) '' s)
[PROOFSTEP]
rw [← Cardinal.lift_inj, ← hsc, Cardinal.mk_image_eq_of_injOn_lift]
[GOAL]
case h.e'_3.h
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
c : Cardinal.{v'}
f : V →ₗ[K] V'
g : { x // x ∈ range f } →ₗ[K] V
hg : comp (rangeRestrict f) g = id
fg : LeftInverse ↑(rangeRestrict f) ↑g
s : Set V
hsc : lift #↑s = lift c
si : LinearIndependent K fun x => ↑f ↑x
this : LinearIndependent K fun x => ↑(rangeRestrict f) ↑x
⊢ InjOn (↑(rangeRestrict f)) s
[PROOFSTEP]
exact injOn_iff_injective.2 this.injective
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
n : ℕ
f : V →ₗ[K] V'
⊢ ↑n ≤ rank f ↔ ∃ s, Finset.card s = n ∧ LinearIndependent K fun x => ↑f ↑x
[PROOFSTEP]
simp only [le_rank_iff_exists_linearIndependent, Cardinal.lift_natCast, Cardinal.lift_eq_nat_iff,
  Cardinal.mk_set_eq_nat_iff_finset]
[GOAL]
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
n : ℕ
f : V →ₗ[K] V'
⊢ (∃ s, (∃ t, ↑t = s ∧ Finset.card t = n) ∧ LinearIndependent K fun x => ↑f ↑x) ↔
    ∃ s, Finset.card s = n ∧ LinearIndependent K fun x => ↑f ↑x
[PROOFSTEP]
constructor
[GOAL]
case mp
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
n : ℕ
f : V →ₗ[K] V'
⊢ (∃ s, (∃ t, ↑t = s ∧ Finset.card t = n) ∧ LinearIndependent K fun x => ↑f ↑x) →
    ∃ s, Finset.card s = n ∧ LinearIndependent K fun x => ↑f ↑x
[PROOFSTEP]
rintro ⟨s, ⟨t, rfl, rfl⟩, si⟩
[GOAL]
case mp.intro.intro.intro.intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
f : V →ₗ[K] V'
t : Finset V
si : LinearIndependent K fun x => ↑f ↑x
⊢ ∃ s, Finset.card s = Finset.card t ∧ LinearIndependent K fun x => ↑f ↑x
[PROOFSTEP]
exact ⟨t, rfl, si⟩
[GOAL]
case mpr
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
n : ℕ
f : V →ₗ[K] V'
⊢ (∃ s, Finset.card s = n ∧ LinearIndependent K fun x => ↑f ↑x) →
    ∃ s, (∃ t, ↑t = s ∧ Finset.card t = n) ∧ LinearIndependent K fun x => ↑f ↑x
[PROOFSTEP]
rintro ⟨s, rfl, si⟩
[GOAL]
case mpr.intro.intro
K : Type u
V V₁ V₂ V₃ : Type v
V' V'₁ : Type v'
V'' : Type v''
ι : Type w
ι' : Type w'
η : Type u₁'
φ : η → Type u_1
inst✝⁶ : DivisionRing K
inst✝⁵ : AddCommGroup V
inst✝⁴ : Module K V
inst✝³ : AddCommGroup V₁
inst✝² : Module K V₁
inst✝¹ : AddCommGroup V'
inst✝ : Module K V'
f : V →ₗ[K] V'
s : Finset V
si : LinearIndependent K fun x => ↑f ↑x
⊢ ∃ s_1, (∃ t, ↑t = s_1 ∧ Finset.card t = Finset.card s) ∧ LinearIndependent K fun x => ↑f ↑x
[PROOFSTEP]
exact ⟨s, ⟨s, rfl, rfl⟩, si⟩
