Theorem: surjective_of_linearIndependent_of_span
File: Mathlib/LinearAlgebra/LinearIndependent.lean

tactic: intro i
state_before: ι : Type u'
ι' : Type u_3
R : Type u_1
K : Type ?u.522813
M : Type u_2
M' : Type ?u.522819
M'' : Type ?u.522822
V : Type u
V' : Type ?u.522827
v : ι → M
inst✝⁷ : Ring R
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup M'
inst✝⁴ : AddCommGroup M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
a b : R
x y : M
inst✝ : Nontrivial R
hv : LinearIndependent R v
f : ι' ↪ ι
hss : range v ⊆ ↑(span R (range (v ∘ ↑f)))
⊢ Surjective ↑f

tactic: let repr : (span R (range (v ∘ f)) : Type _) → ι' →₀ R := (hv.comp f f.injective).repr
state_before: ι : Type u'
ι' : Type u_3
R : Type u_1
K : Type ?u.522813
M : Type u_2
M' : Type ?u.522819
M'' : Type ?u.522822
V : Type u
V' : Type ?u.522827
v : ι → M
inst✝⁷ : Ring R
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup M'
inst✝⁴ : AddCommGroup M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
a b : R
x y : M
inst✝ : Nontrivial R
hv : LinearIndependent R v
f : ι' ↪ ι
hss : range v ⊆ ↑(span R (range (v ∘ ↑f)))
i : ι
⊢ ∃ a, ↑f a = i

tactic: let l := (repr ⟨v i, hss (mem_range_self i)⟩).mapDomain f
state_before: ι : Type u'
ι' : Type u_3
R : Type u_1
K : Type ?u.522813
M : Type u_2
M' : Type ?u.522819
M'' : Type ?u.522822
V : Type u
V' : Type ?u.522827
v : ι → M
inst✝⁷ : Ring R
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup M'
inst✝⁴ : AddCommGroup M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
a b : R
x y : M
inst✝ : Nontrivial R
hv : LinearIndependent R v
f : ι' ↪ ι
hss : range v ⊆ ↑(span R (range (v ∘ ↑f)))
i : ι
repr : { x // x ∈ span R (range (v ∘ ↑f)) } → ι' →₀ R := ↑(LinearIndependent.repr (_ : LinearIndependent R (v ∘ ↑f)))
⊢ ∃ a, ↑f a = i

tactic: have h_total_l : Finsupp.total ι M R v l = v i := by
  dsimp only []
  rw [Finsupp.total_mapDomain]
  rw [(hv.comp f f.injective).total_repr]
state_before: ι : Type u'
ι' : Type u_3
R : Type u_1
K : Type ?u.522813
M : Type u_2
M' : Type ?u.522819
M'' : Type ?u.522822
V : Type u
V' : Type ?u.522827
v : ι → M
inst✝⁷ : Ring R
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup M'
inst✝⁴ : AddCommGroup M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
a b : R
x y : M
inst✝ : Nontrivial R
hv : LinearIndependent R v
f : ι' ↪ ι
hss : range v ⊆ ↑(span R (range (v ∘ ↑f)))
i : ι
repr : { x // x ∈ span R (range (v ∘ ↑f)) } → ι' →₀ R := ↑(LinearIndependent.repr (_ : LinearIndependent R (v ∘ ↑f)))
l : ι →₀ R := Finsupp.mapDomain (↑f) (repr { val := v i, property := (_ : v i ∈ ↑(span R (range (v ∘ ↑f)))) })
⊢ ∃ a, ↑f a = i

tactic: have h_total_eq : (Finsupp.total ι M R v) l = (Finsupp.total ι M R v) (Finsupp.single i 1) := by
  rw [h_total_l, Finsupp.total_single, one_smul]
state_before: ι : Type u'
ι' : Type u_3
R : Type u_1
K : Type ?u.522813
M : Type u_2
M' : Type ?u.522819
M'' : Type ?u.522822
V : Type u
V' : Type ?u.522827
v : ι → M
inst✝⁷ : Ring R
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup M'
inst✝⁴ : AddCommGroup M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
a b : R
x y : M
inst✝ : Nontrivial R
hv : LinearIndependent R v
f : ι' ↪ ι
hss : range v ⊆ ↑(span R (range (v ∘ ↑f)))
i : ι
repr : { x // x ∈ span R (range (v ∘ ↑f)) } → ι' →₀ R := ↑(LinearIndependent.repr (_ : LinearIndependent R (v ∘ ↑f)))
l : ι →₀ R := Finsupp.mapDomain (↑f) (repr { val := v i, property := (_ : v i ∈ ↑(span R (range (v ∘ ↑f)))) })
h_total_l : ↑(Finsupp.total ι M R v) l = v i
⊢ ∃ a, ↑f a = i

tactic: have l_eq : l = _ := LinearMap.ker_eq_bot.1 hv h_total_eq
state_before: ι : Type u'
ι' : Type u_3
R : Type u_1
K : Type ?u.522813
M : Type u_2
M' : Type ?u.522819
M'' : Type ?u.522822
V : Type u
V' : Type ?u.522827
v : ι → M
inst✝⁷ : Ring R
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup M'
inst✝⁴ : AddCommGroup M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
a b : R
x y : M
inst✝ : Nontrivial R
hv : LinearIndependent R v
f : ι' ↪ ι
hss : range v ⊆ ↑(span R (range (v ∘ ↑f)))
i : ι
repr : { x // x ∈ span R (range (v ∘ ↑f)) } → ι' →₀ R := ↑(LinearIndependent.repr (_ : LinearIndependent R (v ∘ ↑f)))
l : ι →₀ R := Finsupp.mapDomain (↑f) (repr { val := v i, property := (_ : v i ∈ ↑(span R (range (v ∘ ↑f)))) })
h_total_l : ↑(Finsupp.total ι M R v) l = v i
h_total_eq : ↑(Finsupp.total ι M R v) l = ↑(Finsupp.total ι M R v) (Finsupp.single i 1)
⊢ ∃ a, ↑f a = i

tactic: dsimp only [] at l_eq
state_before: ι : Type u'
ι' : Type u_3
R : Type u_1
K : Type ?u.522813
M : Type u_2
M' : Type ?u.522819
M'' : Type ?u.522822
V : Type u
V' : Type ?u.522827
v : ι → M
inst✝⁷ : Ring R
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup M'
inst✝⁴ : AddCommGroup M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
a b : R
x y : M
inst✝ : Nontrivial R
hv : LinearIndependent R v
f : ι' ↪ ι
hss : range v ⊆ ↑(span R (range (v ∘ ↑f)))
i : ι
repr : { x // x ∈ span R (range (v ∘ ↑f)) } → ι' →₀ R := ↑(LinearIndependent.repr (_ : LinearIndependent R (v ∘ ↑f)))
l : ι →₀ R := Finsupp.mapDomain (↑f) (repr { val := v i, property := (_ : v i ∈ ↑(span R (range (v ∘ ↑f)))) })
h_total_l : ↑(Finsupp.total ι M R v) l = v i
h_total_eq : ↑(Finsupp.total ι M R v) l = ↑(Finsupp.total ι M R v) (Finsupp.single i 1)
l_eq : l = Finsupp.single i 1
⊢ ∃ a, ↑f a = i

tactic: rw [← Finsupp.embDomain_eq_mapDomain] at l_eq
state_before: ι : Type u'
ι' : Type u_3
R : Type u_1
K : Type ?u.522813
M : Type u_2
M' : Type ?u.522819
M'' : Type ?u.522822
V : Type u
V' : Type ?u.522827
v : ι → M
inst✝⁷ : Ring R
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup M'
inst✝⁴ : AddCommGroup M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
a b : R
x y : M
inst✝ : Nontrivial R
hv : LinearIndependent R v
f : ι' ↪ ι
hss : range v ⊆ ↑(span R (range (v ∘ ↑f)))
i : ι
repr : { x // x ∈ span R (range (v ∘ ↑f)) } → ι' →₀ R := ↑(LinearIndependent.repr (_ : LinearIndependent R (v ∘ ↑f)))
l : ι →₀ R := Finsupp.mapDomain (↑f) (repr { val := v i, property := (_ : v i ∈ ↑(span R (range (v ∘ ↑f)))) })
h_total_l : ↑(Finsupp.total ι M R v) l = v i
h_total_eq : ↑(Finsupp.total ι M R v) l = ↑(Finsupp.total ι M R v) (Finsupp.single i 1)
l_eq :
  Finsupp.mapDomain (↑f)
      (↑(LinearIndependent.repr (_ : LinearIndependent R (v ∘ ↑f)))
        { val := v i, property := (_ : v i ∈ ↑(span R (range (v ∘ ↑f)))) }) =
    Finsupp.single i 1
⊢ ∃ a, ↑f a = i

tactic: rcases Finsupp.single_of_embDomain_single (repr ⟨v i, _⟩) f i (1 : R) zero_ne_one.symm l_eq with
  ⟨i', hi'⟩
state_before: ι : Type u'
ι' : Type u_3
R : Type u_1
K : Type ?u.522813
M : Type u_2
M' : Type ?u.522819
M'' : Type ?u.522822
V : Type u
V' : Type ?u.522827
v : ι → M
inst✝⁷ : Ring R
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup M'
inst✝⁴ : AddCommGroup M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
a b : R
x y : M
inst✝ : Nontrivial R
hv : LinearIndependent R v
f : ι' ↪ ι
hss : range v ⊆ ↑(span R (range (v ∘ ↑f)))
i : ι
repr : { x // x ∈ span R (range (v ∘ ↑f)) } → ι' →₀ R := ↑(LinearIndependent.repr (_ : LinearIndependent R (v ∘ ↑f)))
l : ι →₀ R := Finsupp.mapDomain (↑f) (repr { val := v i, property := (_ : v i ∈ ↑(span R (range (v ∘ ↑f)))) })
h_total_l : ↑(Finsupp.total ι M R v) l = v i
h_total_eq : ↑(Finsupp.total ι M R v) l = ↑(Finsupp.total ι M R v) (Finsupp.single i 1)
l_eq :
  Finsupp.embDomain f
      (↑(LinearIndependent.repr (_ : LinearIndependent R (v ∘ ↑f)))
        { val := v i, property := (_ : v i ∈ ↑(span R (range (v ∘ ↑f)))) }) =
    Finsupp.single i 1
⊢ ∃ a, ↑f a = i

tactic: use i'
state_before: case intro
ι : Type u'
ι' : Type u_3
R : Type u_1
K : Type ?u.522813
M : Type u_2
M' : Type ?u.522819
M'' : Type ?u.522822
V : Type u
V' : Type ?u.522827
v : ι → M
inst✝⁷ : Ring R
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup M'
inst✝⁴ : AddCommGroup M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
a b : R
x y : M
inst✝ : Nontrivial R
hv : LinearIndependent R v
f : ι' ↪ ι
hss : range v ⊆ ↑(span R (range (v ∘ ↑f)))
i : ι
repr : { x // x ∈ span R (range (v ∘ ↑f)) } → ι' →₀ R := ↑(LinearIndependent.repr (_ : LinearIndependent R (v ∘ ↑f)))
l : ι →₀ R := Finsupp.mapDomain (↑f) (repr { val := v i, property := (_ : v i ∈ ↑(span R (range (v ∘ ↑f)))) })
h_total_l : ↑(Finsupp.total ι M R v) l = v i
h_total_eq : ↑(Finsupp.total ι M R v) l = ↑(Finsupp.total ι M R v) (Finsupp.single i 1)
l_eq :
  Finsupp.embDomain f
      (↑(LinearIndependent.repr (_ : LinearIndependent R (v ∘ ↑f)))
        { val := v i, property := (_ : v i ∈ ↑(span R (range (v ∘ ↑f)))) }) =
    Finsupp.single i 1
i' : ι'
hi' : repr { val := v i, property := (_ : v i ∈ ↑(span R (range (v ∘ ↑f)))) } = Finsupp.single i' 1 ∧ ↑f i' = i
⊢ ∃ a, ↑f a = i

tactic: exact hi'.2
state_before: case intro
ι : Type u'
ι' : Type u_3
R : Type u_1
K : Type ?u.522813
M : Type u_2
M' : Type ?u.522819
M'' : Type ?u.522822
V : Type u
V' : Type ?u.522827
v : ι → M
inst✝⁷ : Ring R
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup M'
inst✝⁴ : AddCommGroup M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
a b : R
x y : M
inst✝ : Nontrivial R
hv : LinearIndependent R v
f : ι' ↪ ι
hss : range v ⊆ ↑(span R (range (v ∘ ↑f)))
i : ι
repr : { x // x ∈ span R (range (v ∘ ↑f)) } → ι' →₀ R := ↑(LinearIndependent.repr (_ : LinearIndependent R (v ∘ ↑f)))
l : ι →₀ R := Finsupp.mapDomain (↑f) (repr { val := v i, property := (_ : v i ∈ ↑(span R (range (v ∘ ↑f)))) })
h_total_l : ↑(Finsupp.total ι M R v) l = v i
h_total_eq : ↑(Finsupp.total ι M R v) l = ↑(Finsupp.total ι M R v) (Finsupp.single i 1)
l_eq :
  Finsupp.embDomain f
      (↑(LinearIndependent.repr (_ : LinearIndependent R (v ∘ ↑f)))
        { val := v i, property := (_ : v i ∈ ↑(span R (range (v ∘ ↑f)))) }) =
    Finsupp.single i 1
i' : ι'
hi' : repr { val := v i, property := (_ : v i ∈ ↑(span R (range (v ∘ ↑f)))) } = Finsupp.single i' 1 ∧ ↑f i' = i
⊢ ↑f i' = i

tactic: dsimp only []
state_before: ι : Type u'
ι' : Type u_3
R : Type u_1
K : Type ?u.522813
M : Type u_2
M' : Type ?u.522819
M'' : Type ?u.522822
V : Type u
V' : Type ?u.522827
v : ι → M
inst✝⁷ : Ring R
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup M'
inst✝⁴ : AddCommGroup M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
a b : R
x y : M
inst✝ : Nontrivial R
hv : LinearIndependent R v
f : ι' ↪ ι
hss : range v ⊆ ↑(span R (range (v ∘ ↑f)))
i : ι
repr : { x // x ∈ span R (range (v ∘ ↑f)) } → ι' →₀ R := ↑(LinearIndependent.repr (_ : LinearIndependent R (v ∘ ↑f)))
l : ι →₀ R := Finsupp.mapDomain (↑f) (repr { val := v i, property := (_ : v i ∈ ↑(span R (range (v ∘ ↑f)))) })
⊢ ↑(Finsupp.total ι M R v) l = v i

tactic: rw [Finsupp.total_mapDomain]
state_before: ι : Type u'
ι' : Type u_3
R : Type u_1
K : Type ?u.522813
M : Type u_2
M' : Type ?u.522819
M'' : Type ?u.522822
V : Type u
V' : Type ?u.522827
v : ι → M
inst✝⁷ : Ring R
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup M'
inst✝⁴ : AddCommGroup M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
a b : R
x y : M
inst✝ : Nontrivial R
hv : LinearIndependent R v
f : ι' ↪ ι
hss : range v ⊆ ↑(span R (range (v ∘ ↑f)))
i : ι
repr : { x // x ∈ span R (range (v ∘ ↑f)) } → ι' →₀ R := ↑(LinearIndependent.repr (_ : LinearIndependent R (v ∘ ↑f)))
l : ι →₀ R := Finsupp.mapDomain (↑f) (repr { val := v i, property := (_ : v i ∈ ↑(span R (range (v ∘ ↑f)))) })
⊢ ↑(Finsupp.total ι M R v)
      (Finsupp.mapDomain (↑f)
        (↑(LinearIndependent.repr (_ : LinearIndependent R (v ∘ ↑f)))
          { val := v i, property := (_ : v i ∈ ↑(span R (range (v ∘ ↑f)))) })) =
    v i

tactic: rw [(hv.comp f f.injective).total_repr]
state_before: ι : Type u'
ι' : Type u_3
R : Type u_1
K : Type ?u.522813
M : Type u_2
M' : Type ?u.522819
M'' : Type ?u.522822
V : Type u
V' : Type ?u.522827
v : ι → M
inst✝⁷ : Ring R
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup M'
inst✝⁴ : AddCommGroup M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
a b : R
x y : M
inst✝ : Nontrivial R
hv : LinearIndependent R v
f : ι' ↪ ι
hss : range v ⊆ ↑(span R (range (v ∘ ↑f)))
i : ι
repr : { x // x ∈ span R (range (v ∘ ↑f)) } → ι' →₀ R := ↑(LinearIndependent.repr (_ : LinearIndependent R (v ∘ ↑f)))
l : ι →₀ R := Finsupp.mapDomain (↑f) (repr { val := v i, property := (_ : v i ∈ ↑(span R (range (v ∘ ↑f)))) })
⊢ ↑(Finsupp.total ι' M R (v ∘ ↑f))
      (↑(LinearIndependent.repr (_ : LinearIndependent R (v ∘ ↑f)))
        { val := v i, property := (_ : v i ∈ ↑(span R (range (v ∘ ↑f)))) }) =
    v i

tactic: rw [h_total_l, Finsupp.total_single, one_smul]
state_before: ι : Type u'
ι' : Type u_3
R : Type u_1
K : Type ?u.522813
M : Type u_2
M' : Type ?u.522819
M'' : Type ?u.522822
V : Type u
V' : Type ?u.522827
v : ι → M
inst✝⁷ : Ring R
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup M'
inst✝⁴ : AddCommGroup M''
inst✝³ : Module R M
inst✝² : Module R M'
inst✝¹ : Module R M''
a b : R
x y : M
inst✝ : Nontrivial R
hv : LinearIndependent R v
f : ι' ↪ ι
hss : range v ⊆ ↑(span R (range (v ∘ ↑f)))
i : ι
repr : { x // x ∈ span R (range (v ∘ ↑f)) } → ι' →₀ R := ↑(LinearIndependent.repr (_ : LinearIndependent R (v ∘ ↑f)))
l : ι →₀ R := Finsupp.mapDomain (↑f) (repr { val := v i, property := (_ : v i ∈ ↑(span R (range (v ∘ ↑f)))) })
h_total_l : ↑(Finsupp.total ι M R v) l = v i
⊢ ↑(Finsupp.total ι M R v) l = ↑(Finsupp.total ι M R v) (Finsupp.single i 1)