Theorem: LinearMap.funLeft_surjective_of_injective
File: Mathlib/LinearAlgebra/Basic.lean

tactic: intro g
state_before: R : Type u_4
R₁ : Type ?u.2320959
R₂ : Type ?u.2320962
R₃ : Type ?u.2320965
R₄ : Type ?u.2320968
S : Type ?u.2320971
K : Type ?u.2320974
K₂ : Type ?u.2320977
M : Type u_3
M' : Type ?u.2320983
M₁ : Type ?u.2320986
M₂ : Type ?u.2320989
M₃ : Type ?u.2320992
M₄ : Type ?u.2320995
N : Type ?u.2320998
N₂ : Type ?u.2321001
ι : Type ?u.2321004
V : Type ?u.2321007
V₂ : Type ?u.2321010
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
m : Type u_1
n : Type u_2
p : Type ?u.2321051
f : m → n
hf : Injective f
⊢ Surjective ↑(funLeft R M f)

tactic: refine' ⟨fun x => if h : ∃ y, f y = x then g h.choose else 0, _⟩
state_before: R : Type u_4
R₁ : Type ?u.2320959
R₂ : Type ?u.2320962
R₃ : Type ?u.2320965
R₄ : Type ?u.2320968
S : Type ?u.2320971
K : Type ?u.2320974
K₂ : Type ?u.2320977
M : Type u_3
M' : Type ?u.2320983
M₁ : Type ?u.2320986
M₂ : Type ?u.2320989
M₃ : Type ?u.2320992
M₄ : Type ?u.2320995
N : Type ?u.2320998
N₂ : Type ?u.2321001
ι : Type ?u.2321004
V : Type ?u.2321007
V₂ : Type ?u.2321010
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
m : Type u_1
n : Type u_2
p : Type ?u.2321051
f : m → n
hf : Injective f
g : m → M
⊢ ∃ a, ↑(funLeft R M f) a = g

tactic: ext
state_before: R : Type u_4
R₁ : Type ?u.2320959
R₂ : Type ?u.2320962
R₃ : Type ?u.2320965
R₄ : Type ?u.2320968
S : Type ?u.2320971
K : Type ?u.2320974
K₂ : Type ?u.2320977
M : Type u_3
M' : Type ?u.2320983
M₁ : Type ?u.2320986
M₂ : Type ?u.2320989
M₃ : Type ?u.2320992
M₄ : Type ?u.2320995
N : Type ?u.2320998
N₂ : Type ?u.2321001
ι : Type ?u.2321004
V : Type ?u.2321007
V₂ : Type ?u.2321010
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
m : Type u_1
n : Type u_2
p : Type ?u.2321051
f : m → n
hf : Injective f
g : m → M
⊢ (↑(funLeft R M f) fun x => if h : ∃ y, f y = x then g (Exists.choose h) else 0) = g

tactic: dsimp only [funLeft_apply]
state_before: case h
R : Type u_4
R₁ : Type ?u.2320959
R₂ : Type ?u.2320962
R₃ : Type ?u.2320965
R₄ : Type ?u.2320968
S : Type ?u.2320971
K : Type ?u.2320974
K₂ : Type ?u.2320977
M : Type u_3
M' : Type ?u.2320983
M₁ : Type ?u.2320986
M₂ : Type ?u.2320989
M₃ : Type ?u.2320992
M₄ : Type ?u.2320995
N : Type ?u.2320998
N₂ : Type ?u.2321001
ι : Type ?u.2321004
V : Type ?u.2321007
V₂ : Type ?u.2321010
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
m : Type u_1
n : Type u_2
p : Type ?u.2321051
f : m → n
hf : Injective f
g : m → M
x✝ : m
⊢ ↑(funLeft R M f) (fun x => if h : ∃ y, f y = x then g (Exists.choose h) else 0) x✝ = g x✝

tactic: split_ifs with w
state_before: case h
R : Type u_4
R₁ : Type ?u.2320959
R₂ : Type ?u.2320962
R₃ : Type ?u.2320965
R₄ : Type ?u.2320968
S : Type ?u.2320971
K : Type ?u.2320974
K₂ : Type ?u.2320977
M : Type u_3
M' : Type ?u.2320983
M₁ : Type ?u.2320986
M₂ : Type ?u.2320989
M₃ : Type ?u.2320992
M₄ : Type ?u.2320995
N : Type ?u.2320998
N₂ : Type ?u.2321001
ι : Type ?u.2321004
V : Type ?u.2321007
V₂ : Type ?u.2321010
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
m : Type u_1
n : Type u_2
p : Type ?u.2321051
f : m → n
hf : Injective f
g : m → M
x✝ : m
⊢ (if h : ∃ y, f y = f x✝ then g (Exists.choose h) else 0) = g x✝

tactic: congr
state_before: case h.inl
R : Type u_4
R₁ : Type ?u.2320959
R₂ : Type ?u.2320962
R₃ : Type ?u.2320965
R₄ : Type ?u.2320968
S : Type ?u.2320971
K : Type ?u.2320974
K₂ : Type ?u.2320977
M : Type u_3
M' : Type ?u.2320983
M₁ : Type ?u.2320986
M₂ : Type ?u.2320989
M₃ : Type ?u.2320992
M₄ : Type ?u.2320995
N : Type ?u.2320998
N₂ : Type ?u.2321001
ι : Type ?u.2321004
V : Type ?u.2321007
V₂ : Type ?u.2321010
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
m : Type u_1
n : Type u_2
p : Type ?u.2321051
f : m → n
hf : Injective f
g : m → M
x✝ : m
w : ∃ y, f y = f x✝
⊢ g (Exists.choose w) = g x✝

tactic: exact hf w.choose_spec
state_before: case h.inl.e_a
R : Type u_4
R₁ : Type ?u.2320959
R₂ : Type ?u.2320962
R₃ : Type ?u.2320965
R₄ : Type ?u.2320968
S : Type ?u.2320971
K : Type ?u.2320974
K₂ : Type ?u.2320977
M : Type u_3
M' : Type ?u.2320983
M₁ : Type ?u.2320986
M₂ : Type ?u.2320989
M₃ : Type ?u.2320992
M₄ : Type ?u.2320995
N : Type ?u.2320998
N₂ : Type ?u.2321001
ι : Type ?u.2321004
V : Type ?u.2321007
V₂ : Type ?u.2321010
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
m : Type u_1
n : Type u_2
p : Type ?u.2321051
f : m → n
hf : Injective f
g : m → M
x✝ : m
w : ∃ y, f y = f x✝
⊢ Exists.choose w = x✝

tactic: simp only [not_true, exists_apply_eq_apply] at w
state_before: case h.inr
R : Type u_4
R₁ : Type ?u.2320959
R₂ : Type ?u.2320962
R₃ : Type ?u.2320965
R₄ : Type ?u.2320968
S : Type ?u.2320971
K : Type ?u.2320974
K₂ : Type ?u.2320977
M : Type u_3
M' : Type ?u.2320983
M₁ : Type ?u.2320986
M₂ : Type ?u.2320989
M₃ : Type ?u.2320992
M₄ : Type ?u.2320995
N : Type ?u.2320998
N₂ : Type ?u.2321001
ι : Type ?u.2321004
V : Type ?u.2321007
V₂ : Type ?u.2321010
inst✝² : Semiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
m : Type u_1
n : Type u_2
p : Type ?u.2321051
f : m → n
hf : Injective f
g : m → M
x✝ : m
w : ¬∃ y, f y = f x✝
⊢ 0 = g x✝