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

tactic: let f : t ↪ s :=
  ⟨fun x => ⟨x.1, h x.2⟩, fun a b hab => Subtype.coe_injective (Subtype.mk.inj hab)⟩
state_before: ι : Type u'
ι' : Type ?u.605779
R : Type u_1
K : Type ?u.605785
M : Type u_2
M' : Type ?u.605791
M'' : Type ?u.605794
V : Type u
V' : Type ?u.605799
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
s t : Set M
hs : LinearIndependent R fun x => ↑x
h : t ⊆ s
hst : s ⊆ ↑(span R t)
⊢ s = t

tactic: have h_surj : Surjective f := by
  apply surjective_of_linearIndependent_of_span hs f _
  convert hst <;> simp [comp]
state_before: ι : Type u'
ι' : Type ?u.605779
R : Type u_1
K : Type ?u.605785
M : Type u_2
M' : Type ?u.605791
M'' : Type ?u.605794
V : Type u
V' : Type ?u.605799
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
s t : Set M
hs : LinearIndependent R fun x => ↑x
h : t ⊆ s
hst : s ⊆ ↑(span R t)
f : ↑t ↪ ↑s :=
  { toFun := fun x => { val := ↑x, property := (_ : ↑x ∈ s) },
    inj' :=
      (_ :
        ∀ (a b : ↑t),
          (fun x => { val := ↑x, property := (_ : ↑x ∈ s) }) a = (fun x => { val := ↑x, property := (_ : ↑x ∈ s) }) b →
            a = b) }
⊢ s = t

tactic: show s = t
state_before: ι : Type u'
ι' : Type ?u.605779
R : Type u_1
K : Type ?u.605785
M : Type u_2
M' : Type ?u.605791
M'' : Type ?u.605794
V : Type u
V' : Type ?u.605799
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
s t : Set M
hs : LinearIndependent R fun x => ↑x
h : t ⊆ s
hst : s ⊆ ↑(span R t)
f : ↑t ↪ ↑s :=
  { toFun := fun x => { val := ↑x, property := (_ : ↑x ∈ s) },
    inj' :=
      (_ :
        ∀ (a b : ↑t),
          (fun x => { val := ↑x, property := (_ : ↑x ∈ s) }) a = (fun x => { val := ↑x, property := (_ : ↑x ∈ s) }) b →
            a = b) }
h_surj : Surjective ↑f
⊢ s = t

tactic: apply surjective_of_linearIndependent_of_span hs f _
state_before: ι : Type u'
ι' : Type ?u.605779
R : Type u_1
K : Type ?u.605785
M : Type u_2
M' : Type ?u.605791
M'' : Type ?u.605794
V : Type u
V' : Type ?u.605799
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
s t : Set M
hs : LinearIndependent R fun x => ↑x
h : t ⊆ s
hst : s ⊆ ↑(span R t)
f : ↑t ↪ ↑s :=
  { toFun := fun x => { val := ↑x, property := (_ : ↑x ∈ s) },
    inj' :=
      (_ :
        ∀ (a b : ↑t),
          (fun x => { val := ↑x, property := (_ : ↑x ∈ s) }) a = (fun x => { val := ↑x, property := (_ : ↑x ∈ s) }) b →
            a = b) }
⊢ Surjective ↑f

tactic: convert hst <;> simp [comp]
state_before: ι : Type u'
ι' : Type ?u.605779
R : Type u_1
K : Type ?u.605785
M : Type u_2
M' : Type ?u.605791
M'' : Type ?u.605794
V : Type u
V' : Type ?u.605799
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
s t : Set M
hs : LinearIndependent R fun x => ↑x
h : t ⊆ s
hst : s ⊆ ↑(span R t)
f : ↑t ↪ ↑s :=
  { toFun := fun x => { val := ↑x, property := (_ : ↑x ∈ s) },
    inj' :=
      (_ :
        ∀ (a b : ↑t),
          (fun x => { val := ↑x, property := (_ : ↑x ∈ s) }) a = (fun x => { val := ↑x, property := (_ : ↑x ∈ s) }) b →
            a = b) }
⊢ (range fun x => ↑x) ⊆ ↑(span R (range ((fun x => ↑x) ∘ ↑f)))

tactic: apply Subset.antisymm _ h
state_before: ι : Type u'
ι' : Type ?u.605779
R : Type u_1
K : Type ?u.605785
M : Type u_2
M' : Type ?u.605791
M'' : Type ?u.605794
V : Type u
V' : Type ?u.605799
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
s t : Set M
hs : LinearIndependent R fun x => ↑x
h : t ⊆ s
hst : s ⊆ ↑(span R t)
f : ↑t ↪ ↑s :=
  { toFun := fun x => { val := ↑x, property := (_ : ↑x ∈ s) },
    inj' :=
      (_ :
        ∀ (a b : ↑t),
          (fun x => { val := ↑x, property := (_ : ↑x ∈ s) }) a = (fun x => { val := ↑x, property := (_ : ↑x ∈ s) }) b →
            a = b) }
h_surj : Surjective ↑f
⊢ s = t

tactic: intro x hx
state_before: ι : Type u'
ι' : Type ?u.605779
R : Type u_1
K : Type ?u.605785
M : Type u_2
M' : Type ?u.605791
M'' : Type ?u.605794
V : Type u
V' : Type ?u.605799
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
s t : Set M
hs : LinearIndependent R fun x => ↑x
h : t ⊆ s
hst : s ⊆ ↑(span R t)
f : ↑t ↪ ↑s :=
  { toFun := fun x => { val := ↑x, property := (_ : ↑x ∈ s) },
    inj' :=
      (_ :
        ∀ (a b : ↑t),
          (fun x => { val := ↑x, property := (_ : ↑x ∈ s) }) a = (fun x => { val := ↑x, property := (_ : ↑x ∈ s) }) b →
            a = b) }
h_surj : Surjective ↑f
⊢ s ⊆ t

tactic: rcases h_surj ⟨x, hx⟩ with ⟨y, hy⟩
state_before: ι : Type u'
ι' : Type ?u.605779
R : Type u_1
K : Type ?u.605785
M : Type u_2
M' : Type ?u.605791
M'' : Type ?u.605794
V : Type u
V' : Type ?u.605799
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
s t : Set M
hs : LinearIndependent R fun x => ↑x
h : t ⊆ s
hst : s ⊆ ↑(span R t)
f : ↑t ↪ ↑s :=
  { toFun := fun x => { val := ↑x, property := (_ : ↑x ∈ s) },
    inj' :=
      (_ :
        ∀ (a b : ↑t),
          (fun x => { val := ↑x, property := (_ : ↑x ∈ s) }) a = (fun x => { val := ↑x, property := (_ : ↑x ∈ s) }) b →
            a = b) }
h_surj : Surjective ↑f
x : M
hx : x ∈ s
⊢ x ∈ t

tactic: convert y.mem
state_before: case intro
ι : Type u'
ι' : Type ?u.605779
R : Type u_1
K : Type ?u.605785
M : Type u_2
M' : Type ?u.605791
M'' : Type ?u.605794
V : Type u
V' : Type ?u.605799
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
s t : Set M
hs : LinearIndependent R fun x => ↑x
h : t ⊆ s
hst : s ⊆ ↑(span R t)
f : ↑t ↪ ↑s :=
  { toFun := fun x => { val := ↑x, property := (_ : ↑x ∈ s) },
    inj' :=
      (_ :
        ∀ (a b : ↑t),
          (fun x => { val := ↑x, property := (_ : ↑x ∈ s) }) a = (fun x => { val := ↑x, property := (_ : ↑x ∈ s) }) b →
            a = b) }
h_surj : Surjective ↑f
x : M
hx : x ∈ s
y : ↑t
hy : ↑f y = { val := x, property := hx }
⊢ x ∈ t

tactic: rw [← Subtype.mk.inj hy]
state_before: case h.e'_4
ι : Type u'
ι' : Type ?u.605779
R : Type u_1
K : Type ?u.605785
M : Type u_2
M' : Type ?u.605791
M'' : Type ?u.605794
V : Type u
V' : Type ?u.605799
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
s t : Set M
hs : LinearIndependent R fun x => ↑x
h : t ⊆ s
hst : s ⊆ ↑(span R t)
f : ↑t ↪ ↑s :=
  { toFun := fun x => { val := ↑x, property := (_ : ↑x ∈ s) },
    inj' :=
      (_ :
        ∀ (a b : ↑t),
          (fun x => { val := ↑x, property := (_ : ↑x ∈ s) }) a = (fun x => { val := ↑x, property := (_ : ↑x ∈ s) }) b →
            a = b) }
h_surj : Surjective ↑f
x : M
hx : x ∈ s
y : ↑t
hy : ↑f y = { val := x, property := hx }
⊢ x = ↑y