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

Proof steps:
state_before: ι : Type u'
ι' : Type u_1
R : Type u_2
K : Type u_3
M : Type u_4
M' : Type u_5
M'' : Type u_6
V : Type u
V' : Type u_7
v : ι → M
inst✝⁶ : Semiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
a b : R
x y : M
s : Set M
li : LinearIndependent (ι := { x // x ∈ s }) R Subtype.val
t : Finset ↑s
⊢ LinearIndependent R Subtype.val
state_after: ι : Type u'
ι' : Type u_1
R : Type u_2
K : Type u_3
M : Type u_4
M' : Type u_5
M'' : Type u_6
V : Type u
V' : Type u_7
v : ι → M
inst✝⁶ : Semiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
a b : R
x y : M
s : Set M
li : LinearIndependent (ι := { x // x ∈ s }) R Subtype.val
t : Finset ↑s
f : { x // x ∈ Finset.map (Embedding.subtype s) t } → ↑s := fun x => ⟨↑x, ⋯⟩
⊢ LinearIndependent R Subtype.val
tactic: let f : t.map (Embedding.subtype s) → s := fun x =>
    ⟨x.1, by
      obtain ⟨x, h⟩ := x
      rw [Finset.mem_map] at h
      obtain ⟨a, _ha, rfl⟩ := h
      simp only [Subtype.coe_prop, Embedding.coe_subtype]⟩
state_before: ι : Type u'
ι' : Type u_1
R : Type u_2
K : Type u_3
M : Type u_4
M' : Type u_5
M'' : Type u_6
V : Type u
V' : Type u_7
v : ι → M
inst✝⁶ : Semiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
a b : R
x y : M
s : Set M
li : LinearIndependent (ι := { x // x ∈ s }) R Subtype.val
t : Finset ↑s
f : { x // x ∈ Finset.map (Embedding.subtype s) t } → ↑s := fun x => ⟨↑x, ⋯⟩
⊢ LinearIndependent R Subtype.val
state_after: ι : Type u'
ι' : Type u_1
R : Type u_2
K : Type u_3
M : Type u_4
M' : Type u_5
M'' : Type u_6
V : Type u
V' : Type u_7
v : ι → M
inst✝⁶ : Semiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
a b : R
x y : M
s : Set M
li : LinearIndependent (ι := { x // x ∈ s }) R Subtype.val
t : Finset ↑s
f : { x // x ∈ Finset.map (Embedding.subtype s) t } → ↑s := fun x => ⟨↑x, ⋯⟩
⊢ Injective f
tactic: convert LinearIndependent.comp li f ?_
state_before: ι : Type u'
ι' : Type u_1
R : Type u_2
K : Type u_3
M : Type u_4
M' : Type u_5
M'' : Type u_6
V : Type u
V' : Type u_7
v : ι → M
inst✝⁶ : Semiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
a b : R
x y : M
s : Set M
li : LinearIndependent (ι := { x // x ∈ s }) R Subtype.val
t : Finset ↑s
f : { x // x ∈ Finset.map (Embedding.subtype s) t } → ↑s := fun x => ⟨↑x, ⋯⟩
⊢ Injective f
state_after: case mk.mk
ι : Type u'
ι' : Type u_1
R : Type u_2
K : Type u_3
M : Type u_4
M' : Type u_5
M'' : Type u_6
V : Type u
V' : Type u_7
v : ι → M
inst✝⁶ : Semiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
a b : R
x✝ y✝ : M
s : Set M
li : LinearIndependent (ι := { x // x ∈ s }) R Subtype.val
t : Finset ↑s
f : { x // x ∈ Finset.map (Embedding.subtype s) t } → ↑s := fun x => ⟨↑x, ⋯⟩
x : M
hx : x ∈ Finset.map (Embedding.subtype s) t
y : M
hy : y ∈ Finset.map (Embedding.subtype s) t
⊢ f ⟨x, hx⟩ = f ⟨y, hy⟩ → ⟨x, hx⟩ = ⟨y, hy⟩
tactic: rintro ⟨x, hx⟩ ⟨y, hy⟩
state_before: case mk.mk
ι : Type u'
ι' : Type u_1
R : Type u_2
K : Type u_3
M : Type u_4
M' : Type u_5
M'' : Type u_6
V : Type u
V' : Type u_7
v : ι → M
inst✝⁶ : Semiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
a b : R
x✝ y✝ : M
s : Set M
li : LinearIndependent (ι := { x // x ∈ s }) R Subtype.val
t : Finset ↑s
f : { x // x ∈ Finset.map (Embedding.subtype s) t } → ↑s := fun x => ⟨↑x, ⋯⟩
x : M
hx : x ∈ Finset.map (Embedding.subtype s) t
y : M
hy : y ∈ Finset.map (Embedding.subtype s) t
⊢ f ⟨x, hx⟩ = f ⟨y, hy⟩ → ⟨x, hx⟩ = ⟨y, hy⟩
state_after: case mk.mk
ι : Type u'
ι' : Type u_1
R : Type u_2
K : Type u_3
M : Type u_4
M' : Type u_5
M'' : Type u_6
V : Type u
V' : Type u_7
v : ι → M
inst✝⁶ : Semiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
a b : R
x✝ y✝ : M
s : Set M
li : LinearIndependent (ι := { x // x ∈ s }) R Subtype.val
t : Finset ↑s
f : { x // x ∈ Finset.map (Embedding.subtype s) t } → ↑s := fun x => ⟨↑x, ⋯⟩
x : M
hx✝ : x ∈ Finset.map (Embedding.subtype s) t
hx : ∃ a ∈ t, (Embedding.subtype s) a = x
y : M
hy✝ : y ∈ Finset.map (Embedding.subtype s) t
hy : ∃ a ∈ t, (Embedding.subtype s) a = y
⊢ f ⟨x, hx✝⟩ = f ⟨y, hy✝⟩ → ⟨x, hx✝⟩ = ⟨y, hy✝⟩
tactic: rw [Finset.mem_map] at hx hy
state_before: case mk.mk
ι : Type u'
ι' : Type u_1
R : Type u_2
K : Type u_3
M : Type u_4
M' : Type u_5
M'' : Type u_6
V : Type u
V' : Type u_7
v : ι → M
inst✝⁶ : Semiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
a b : R
x✝ y✝ : M
s : Set M
li : LinearIndependent (ι := { x // x ∈ s }) R Subtype.val
t : Finset ↑s
f : { x // x ∈ Finset.map (Embedding.subtype s) t } → ↑s := fun x => ⟨↑x, ⋯⟩
x : M
hx✝ : x ∈ Finset.map (Embedding.subtype s) t
hx : ∃ a ∈ t, (Embedding.subtype s) a = x
y : M
hy✝ : y ∈ Finset.map (Embedding.subtype s) t
hy : ∃ a ∈ t, (Embedding.subtype s) a = y
⊢ f ⟨x, hx✝⟩ = f ⟨y, hy✝⟩ → ⟨x, hx✝⟩ = ⟨y, hy✝⟩
state_after: case mk.mk.intro.intro
ι : Type u'
ι' : Type u_1
R : Type u_2
K : Type u_3
M : Type u_4
M' : Type u_5
M'' : Type u_6
V : Type u
V' : Type u_7
v : ι → M
inst✝⁶ : Semiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
a✝ b : R
x y✝ : M
s : Set M
li : LinearIndependent (ι := { x // x ∈ s }) R Subtype.val
t : Finset ↑s
f : { x // x ∈ Finset.map (Embedding.subtype s) t } → ↑s := fun x => ⟨↑x, ⋯⟩
y : M
hy✝ : y ∈ Finset.map (Embedding.subtype s) t
hy : ∃ a ∈ t, (Embedding.subtype s) a = y
a : Subtype s
_ha : a ∈ t
hx : (Embedding.subtype s) a ∈ Finset.map (Embedding.subtype s) t
⊢ f ⟨(Embedding.subtype s) a, hx⟩ = f ⟨y, hy✝⟩ → ⟨(Embedding.subtype s) a, hx⟩ = ⟨y, hy✝⟩
tactic: obtain ⟨a, _ha, rfl⟩ := hx
state_before: case mk.mk.intro.intro
ι : Type u'
ι' : Type u_1
R : Type u_2
K : Type u_3
M : Type u_4
M' : Type u_5
M'' : Type u_6
V : Type u
V' : Type u_7
v : ι → M
inst✝⁶ : Semiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
a✝ b : R
x y✝ : M
s : Set M
li : LinearIndependent (ι := { x // x ∈ s }) R Subtype.val
t : Finset ↑s
f : { x // x ∈ Finset.map (Embedding.subtype s) t } → ↑s := fun x => ⟨↑x, ⋯⟩
y : M
hy✝ : y ∈ Finset.map (Embedding.subtype s) t
hy : ∃ a ∈ t, (Embedding.subtype s) a = y
a : Subtype s
_ha : a ∈ t
hx : (Embedding.subtype s) a ∈ Finset.map (Embedding.subtype s) t
⊢ f ⟨(Embedding.subtype s) a, hx⟩ = f ⟨y, hy✝⟩ → ⟨(Embedding.subtype s) a, hx⟩ = ⟨y, hy✝⟩
state_after: case mk.mk.intro.intro.intro.intro
ι : Type u'
ι' : Type u_1
R : Type u_2
K : Type u_3
M : Type u_4
M' : Type u_5
M'' : Type u_6
V : Type u
V' : Type u_7
v : ι → M
inst✝⁶ : Semiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
a✝ b✝ : R
x y : M
s : Set M
li : LinearIndependent (ι := { x // x ∈ s }) R Subtype.val
t : Finset ↑s
f : { x // x ∈ Finset.map (Embedding.subtype s) t } → ↑s := fun x => ⟨↑x, ⋯⟩
a : Subtype s
_ha : a ∈ t
hx : (Embedding.subtype s) a ∈ Finset.map (Embedding.subtype s) t
b : Subtype s
_hb : b ∈ t
hy : (Embedding.subtype s) b ∈ Finset.map (Embedding.subtype s) t
⊢ f ⟨(Embedding.subtype s) a, hx⟩ = f ⟨(Embedding.subtype s) b, hy⟩ →
    ⟨(Embedding.subtype s) a, hx⟩ = ⟨(Embedding.subtype s) b, hy⟩
tactic: obtain ⟨b, _hb, rfl⟩ := hy
state_before: case mk.mk.intro.intro.intro.intro
ι : Type u'
ι' : Type u_1
R : Type u_2
K : Type u_3
M : Type u_4
M' : Type u_5
M'' : Type u_6
V : Type u
V' : Type u_7
v : ι → M
inst✝⁶ : Semiring R
inst✝⁵ : AddCommMonoid M
inst✝⁴ : AddCommMonoid M'
inst✝³ : AddCommMonoid M''
inst✝² : Module R M
inst✝¹ : Module R M'
inst✝ : Module R M''
a✝ b✝ : R
x y : M
s : Set M
li : LinearIndependent (ι := { x // x ∈ s }) R Subtype.val
t : Finset ↑s
f : { x // x ∈ Finset.map (Embedding.subtype s) t } → ↑s := fun x => ⟨↑x, ⋯⟩
a : Subtype s
_ha : a ∈ t
hx : (Embedding.subtype s) a ∈ Finset.map (Embedding.subtype s) t
b : Subtype s
_hb : b ∈ t
hy : (Embedding.subtype s) b ∈ Finset.map (Embedding.subtype s) t
⊢ f ⟨(Embedding.subtype s) a, hx⟩ = f ⟨(Embedding.subtype s) b, hy⟩ →
    ⟨(Embedding.subtype s) a, hx⟩ = ⟨(Embedding.subtype s) b, hy⟩
state_after: no goals
tactic: simp only [f, imp_self, Subtype.mk_eq_mk]