Theorem: linearIndependent_iff_card_eq_finrank_span
File: Mathlib/LinearAlgebra/Dimension/DivisionRing.lean

tactic: constructor
state_before: K R : 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
ι : Type u_2
inst✝ : Fintype ι
b : ι → V
⊢ LinearIndependent K b ↔ Fintype.card ι = Set.finrank K (range b)
state_after: case mp
K R : 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
ι : Type u_2
inst✝ : Fintype ι
b : ι → V
⊢ LinearIndependent K b → Fintype.card ι = Set.finrank K (range b)

case mpr
K R : 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
ι : Type u_2
inst✝ : Fintype ι
b : ι → V
⊢ Fintype.card ι = Set.finrank K (range b) → LinearIndependent K b

tactic: intro h
state_before: case mp
K R : 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
ι : Type u_2
inst✝ : Fintype ι
b : ι → V
⊢ LinearIndependent K b → Fintype.card ι = Set.finrank K (range b)
state_after: case mp
K R : 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
ι : Type u_2
inst✝ : Fintype ι
b : ι → V
h : LinearIndependent K b
⊢ Fintype.card ι = Set.finrank K (range b)

tactic: exact (finrank_span_eq_card h).symm
state_before: case mp
K R : 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
ι : Type u_2
inst✝ : Fintype ι
b : ι → V
h : LinearIndependent K b
⊢ Fintype.card ι = Set.finrank K (range b)
state_after: no goals

tactic: intro hc
state_before: case mpr
K R : 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
ι : Type u_2
inst✝ : Fintype ι
b : ι → V
⊢ Fintype.card ι = Set.finrank K (range b) → LinearIndependent K b
state_after: case mpr
K R : 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
ι : Type u_2
inst✝ : Fintype ι
b : ι → V
hc : Fintype.card ι = Set.finrank K (range b)
⊢ LinearIndependent K b

tactic: let f := Submodule.subtype (span K (Set.range b))
state_before: case mpr
K R : 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
ι : Type u_2
inst✝ : Fintype ι
b : ι → V
hc : Fintype.card ι = Set.finrank K (range b)
⊢ LinearIndependent K b
state_after: case mpr
K R : 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
ι : Type u_2
inst✝ : Fintype ι
b : ι → V
hc : Fintype.card ι = Set.finrank K (range b)
f : ↥(span K (range b)) →ₗ[K] V := (span K (range b)).subtype
⊢ LinearIndependent K b

tactic: let b' : ι → span K (Set.range b) := fun i =>
  ⟨b i, mem_span.2 fun p hp => hp (Set.mem_range_self _)⟩
state_before: case mpr
K R : 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
ι : Type u_2
inst✝ : Fintype ι
b : ι → V
hc : Fintype.card ι = Set.finrank K (range b)
f : ↥(span K (range b)) →ₗ[K] V := (span K (range b)).subtype
⊢ LinearIndependent K b
state_after: case mpr
K R : 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
ι : Type u_2
inst✝ : Fintype ι
b : ι → V
hc : Fintype.card ι = Set.finrank K (range b)
f : ↥(span K (range b)) →ₗ[K] V := (span K (range b)).subtype
b' : ι → ↥(span K (range b)) := fun i => ⟨b i, ⋯⟩
⊢ LinearIndependent K b

tactic: have hs : ⊤ ≤ span K (Set.range b') := by
  intro x
  have h : span K (f '' Set.range b') = map f (span K (Set.range b')) := span_image f
  have hf : f '' Set.range b' = Set.range b := by
    ext x
    simp [f, Set.mem_image, Set.mem_range]
  rw [hf] at h
  have hx : (x : V) ∈ span K (Set.range b) := x.property
  conv at hx =>
    arg 2
    rw [h]
  simpa [f, mem_map] using hx
state_before: case mpr
K R : 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
ι : Type u_2
inst✝ : Fintype ι
b : ι → V
hc : Fintype.card ι = Set.finrank K (range b)
f : ↥(span K (range b)) →ₗ[K] V := (span K (range b)).subtype
b' : ι → ↥(span K (range b)) := fun i => ⟨b i, ⋯⟩
⊢ LinearIndependent K b
state_after: case mpr
K R : 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
ι : Type u_2
inst✝ : Fintype ι
b : ι → V
hc : Fintype.card ι = Set.finrank K (range b)
f : ↥(span K (range b)) →ₗ[K] V := (span K (range b)).subtype
b' : ι → ↥(span K (range b)) := fun i => ⟨b i, ⋯⟩
hs : ⊤ ≤ span K (range b')
⊢ LinearIndependent K b

tactic: have hi : LinearMap.ker f = ⊥ := ker_subtype _
state_before: case mpr
K R : 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
ι : Type u_2
inst✝ : Fintype ι
b : ι → V
hc : Fintype.card ι = Set.finrank K (range b)
f : ↥(span K (range b)) →ₗ[K] V := (span K (range b)).subtype
b' : ι → ↥(span K (range b)) := fun i => ⟨b i, ⋯⟩
hs : ⊤ ≤ span K (range b')
⊢ LinearIndependent K b
state_after: case mpr
K R : 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
ι : Type u_2
inst✝ : Fintype ι
b : ι → V
hc : Fintype.card ι = Set.finrank K (range b)
f : ↥(span K (range b)) →ₗ[K] V := (span K (range b)).subtype
b' : ι → ↥(span K (range b)) := fun i => ⟨b i, ⋯⟩
hs : ⊤ ≤ span K (range b')
hi : LinearMap.ker f = ⊥
⊢ LinearIndependent K b

tactic: convert (linearIndependent_of_top_le_span_of_card_eq_finrank hs hc).map' _ hi
state_before: case mpr
K R : 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
ι : Type u_2
inst✝ : Fintype ι
b : ι → V
hc : Fintype.card ι = Set.finrank K (range b)
f : ↥(span K (range b)) →ₗ[K] V := (span K (range b)).subtype
b' : ι → ↥(span K (range b)) := fun i => ⟨b i, ⋯⟩
hs : ⊤ ≤ span K (range b')
hi : LinearMap.ker f = ⊥
⊢ LinearIndependent K b
state_after: no goals

tactic: intro x
state_before: K R : 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
ι : Type u_2
inst✝ : Fintype ι
b : ι → V
hc : Fintype.card ι = Set.finrank K (range b)
f : ↥(span K (range b)) →ₗ[K] V := (span K (range b)).subtype
b' : ι → ↥(span K (range b)) := fun i => ⟨b i, ⋯⟩
⊢ ⊤ ≤ span K (range b')
state_after: K R : 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
ι : Type u_2
inst✝ : Fintype ι
b : ι → V
hc : Fintype.card ι = Set.finrank K (range b)
f : ↥(span K (range b)) →ₗ[K] V := (span K (range b)).subtype
b' : ι → ↥(span K (range b)) := fun i => ⟨b i, ⋯⟩
x : ↥(span K (range b))
⊢ x ∈ ⊤ → x ∈ span K (range b')

tactic: have h : span K (f '' Set.range b') = map f (span K (Set.range b')) := span_image f
state_before: K R : 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
ι : Type u_2
inst✝ : Fintype ι
b : ι → V
hc : Fintype.card ι = Set.finrank K (range b)
f : ↥(span K (range b)) →ₗ[K] V := (span K (range b)).subtype
b' : ι → ↥(span K (range b)) := fun i => ⟨b i, ⋯⟩
x : ↥(span K (range b))
⊢ x ∈ ⊤ → x ∈ span K (range b')
state_after: K R : 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
ι : Type u_2
inst✝ : Fintype ι
b : ι → V
hc : Fintype.card ι = Set.finrank K (range b)
f : ↥(span K (range b)) →ₗ[K] V := (span K (range b)).subtype
b' : ι → ↥(span K (range b)) := fun i => ⟨b i, ⋯⟩
x : ↥(span K (range b))
h : span K (⇑f '' range b') = Submodule.map f (span K (range b'))
⊢ x ∈ ⊤ → x ∈ span K (range b')

tactic: have hf : f '' Set.range b' = Set.range b := by
  ext x
  simp [f, Set.mem_image, Set.mem_range]
state_before: K R : 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
ι : Type u_2
inst✝ : Fintype ι
b : ι → V
hc : Fintype.card ι = Set.finrank K (range b)
f : ↥(span K (range b)) →ₗ[K] V := (span K (range b)).subtype
b' : ι → ↥(span K (range b)) := fun i => ⟨b i, ⋯⟩
x : ↥(span K (range b))
h : span K (⇑f '' range b') = Submodule.map f (span K (range b'))
⊢ x ∈ ⊤ → x ∈ span K (range b')
state_after: K R : 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
ι : Type u_2
inst✝ : Fintype ι
b : ι → V
hc : Fintype.card ι = Set.finrank K (range b)
f : ↥(span K (range b)) →ₗ[K] V := (span K (range b)).subtype
b' : ι → ↥(span K (range b)) := fun i => ⟨b i, ⋯⟩
x : ↥(span K (range b))
h : span K (⇑f '' range b') = Submodule.map f (span K (range b'))
hf : ⇑f '' range b' = range b
⊢ x ∈ ⊤ → x ∈ span K (range b')

tactic: rw [hf] at h
state_before: K R : 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
ι : Type u_2
inst✝ : Fintype ι
b : ι → V
hc : Fintype.card ι = Set.finrank K (range b)
f : ↥(span K (range b)) →ₗ[K] V := (span K (range b)).subtype
b' : ι → ↥(span K (range b)) := fun i => ⟨b i, ⋯⟩
x : ↥(span K (range b))
h : span K (⇑f '' range b') = Submodule.map f (span K (range b'))
hf : ⇑f '' range b' = range b
⊢ x ∈ ⊤ → x ∈ span K (range b')
state_after: K R : 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
ι : Type u_2
inst✝ : Fintype ι
b : ι → V
hc : Fintype.card ι = Set.finrank K (range b)
f : ↥(span K (range b)) →ₗ[K] V := (span K (range b)).subtype
b' : ι → ↥(span K (range b)) := fun i => ⟨b i, ⋯⟩
x : ↥(span K (range b))
h : span K (range b) = Submodule.map f (span K (range b'))
hf : ⇑f '' range b' = range b
⊢ x ∈ ⊤ → x ∈ span K (range b')

tactic: have hx : (x : V) ∈ span K (Set.range b) := x.property
state_before: K R : 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
ι : Type u_2
inst✝ : Fintype ι
b : ι → V
hc : Fintype.card ι = Set.finrank K (range b)
f : ↥(span K (range b)) →ₗ[K] V := (span K (range b)).subtype
b' : ι → ↥(span K (range b)) := fun i => ⟨b i, ⋯⟩
x : ↥(span K (range b))
h : span K (range b) = Submodule.map f (span K (range b'))
hf : ⇑f '' range b' = range b
⊢ x ∈ ⊤ → x ∈ span K (range b')
state_after: K R : 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
ι : Type u_2
inst✝ : Fintype ι
b : ι → V
hc : Fintype.card ι = Set.finrank K (range b)
f : ↥(span K (range b)) →ₗ[K] V := (span K (range b)).subtype
b' : ι → ↥(span K (range b)) := fun i => ⟨b i, ⋯⟩
x : ↥(span K (range b))
h : span K (range b) = Submodule.map f (span K (range b'))
hf : ⇑f '' range b' = range b
hx : ↑x ∈ span K (range b)
⊢ x ∈ ⊤ → x ∈ span K (range b')

tactic: conv at hx =>
  arg 2
  rw [h]
state_before: K R : 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
ι : Type u_2
inst✝ : Fintype ι
b : ι → V
hc : Fintype.card ι = Set.finrank K (range b)
f : ↥(span K (range b)) →ₗ[K] V := (span K (range b)).subtype
b' : ι → ↥(span K (range b)) := fun i => ⟨b i, ⋯⟩
x : ↥(span K (range b))
h : span K (range b) = Submodule.map f (span K (range b'))
hf : ⇑f '' range b' = range b
hx : ↑x ∈ span K (range b)
⊢ x ∈ ⊤ → x ∈ span K (range b')
state_after: K R : 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
ι : Type u_2
inst✝ : Fintype ι
b : ι → V
hc : Fintype.card ι = Set.finrank K (range b)
f : ↥(span K (range b)) →ₗ[K] V := (span K (range b)).subtype
b' : ι → ↥(span K (range b)) := fun i => ⟨b i, ⋯⟩
x : ↥(span K (range b))
h : span K (range b) = Submodule.map f (span K (range b'))
hf : ⇑f '' range b' = range b
hx : ↑x ∈ Submodule.map f (span K (range b'))
⊢ x ∈ ⊤ → x ∈ span K (range b')

tactic: simpa [f, mem_map] using hx
state_before: K R : 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
ι : Type u_2
inst✝ : Fintype ι
b : ι → V
hc : Fintype.card ι = Set.finrank K (range b)
f : ↥(span K (range b)) →ₗ[K] V := (span K (range b)).subtype
b' : ι → ↥(span K (range b)) := fun i => ⟨b i, ⋯⟩
x : ↥(span K (range b))
h : span K (range b) = Submodule.map f (span K (range b'))
hf : ⇑f '' range b' = range b
hx : ↑x ∈ Submodule.map f (span K (range b'))
⊢ x ∈ ⊤ → x ∈ span K (range b')
state_after: no goals

tactic: ext x
state_before: K R : 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
ι : Type u_2
inst✝ : Fintype ι
b : ι → V
hc : Fintype.card ι = Set.finrank K (range b)
f : ↥(span K (range b)) →ₗ[K] V := (span K (range b)).subtype
b' : ι → ↥(span K (range b)) := fun i => ⟨b i, ⋯⟩
x : ↥(span K (range b))
h : span K (⇑f '' range b') = Submodule.map f (span K (range b'))
⊢ ⇑f '' range b' = range b
state_after: case h
K R : 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
ι : Type u_2
inst✝ : Fintype ι
b : ι → V
hc : Fintype.card ι = Set.finrank K (range b)
f : ↥(span K (range b)) →ₗ[K] V := (span K (range b)).subtype
b' : ι → ↥(span K (range b)) := fun i => ⟨b i, ⋯⟩
x✝ : ↥(span K (range b))
h : span K (⇑f '' range b') = Submodule.map f (span K (range b'))
x : V
⊢ x ∈ ⇑f '' range b' ↔ x ∈ range b

tactic: simp [f, Set.mem_image, Set.mem_range]
state_before: case h
K R : 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
ι : Type u_2
inst✝ : Fintype ι
b : ι → V
hc : Fintype.card ι = Set.finrank K (range b)
f : ↥(span K (range b)) →ₗ[K] V := (span K (range b)).subtype
b' : ι → ↥(span K (range b)) := fun i => ⟨b i, ⋯⟩
x✝ : ↥(span K (range b))
h : span K (⇑f '' range b') = Submodule.map f (span K (range b'))
x : V
⊢ x ∈ ⇑f '' range b' ↔ x ∈ range b
state_after: no goals