-- Mathlib/LinearAlgebra/LinearPMap.lean
theorem inverse_apply_eq {y : (inverse f).domain} {x : f.domain} (hxy : f x = y) :
    (inverse f) y = x

Proof state:
case intro.e_a
R : Type u_1
inst✝⁴ : Ring R
E : Type u_2
inst✝³ : AddCommGroup E
inst✝² : Module R E
F : Type u_3
inst✝¹ : AddCommGroup F
inst✝ : Module R F
f : E →ₗ.[R] F
hf : LinearMap.ker f.toFun = ⊥
y : ↥f.inverse.domain
x : ↥f.domain
hxy : ↑f x = ↑y
hx : ↑f x ∈ f.inverse.domain
h : ↑f.inverse ⟨↑f x, ⋯⟩ = ↑x
⊢ y = ⟨↑f x, ⋯⟩

Tactic:
simp only [hxy, Subtype.coe_eta]

Result:
no goals

Proof state:
case intro
R : Type u_1
inst✝⁴ : Ring R
E : Type u_2
inst✝³ : AddCommGroup E
inst✝² : Module R E
F : Type u_3
inst✝¹ : AddCommGroup F
inst✝ : Module R F
f : E →ₗ.[R] F
hf : LinearMap.ker f.toFun = ⊥
y : ↥f.inverse.domain
x : ↥f.domain
hxy : ↑f x = ↑y
hx : ↑f x ∈ f.inverse.domain
h : ↑f.inverse ⟨↑f x, ⋯⟩ = ↑x
⊢ ↑f.inverse y = ↑f.inverse ⟨↑f x, ⋯⟩

Tactic:
congr

Result:
case intro.e_a
R : Type u_1
inst✝⁴ : Ring R
E : Type u_2
inst✝³ : AddCommGroup E
inst✝² : Module R E
F : Type u_3
inst✝¹ : AddCommGroup F
inst✝ : Module R F
f : E →ₗ.[R] F
hf : LinearMap.ker f.toFun = ⊥
y : ↥f.inverse.domain
x : ↥f.domain
hxy : ↑f x = ↑y
hx : ↑f x ∈ f.inverse.domain
h : ↑f.inverse ⟨↑f x, ⋯⟩ = ↑x
⊢ y = ⟨↑f x, ⋯⟩

Proof state:
R : Type u_1
inst✝⁴ : Ring R
E : Type u_2
inst✝³ : AddCommGroup E
inst✝² : Module R E
F : Type u_3
inst✝¹ : AddCommGroup F
inst✝ : Module R F
f : E →ₗ.[R] F
hf : LinearMap.ker f.toFun = ⊥
y : ↥f.inverse.domain
x : ↥f.domain
hxy : ↑f x = ↑y
this : ∃ (x_1 : ↑f x ∈ f.inverse.domain), ↑f.inverse ⟨↑f x, ⋯⟩ = ↑x
⊢ ↑f.inverse y = ↑x

Tactic:
rcases this with ⟨hx, h⟩

Result:
case intro
R : Type u_1
inst✝⁴ : Ring R
E : Type u_2
inst✝³ : AddCommGroup E
inst✝² : Module R E
F : Type u_3
inst✝¹ : AddCommGroup F
inst✝ : Module R F
f : E →ₗ.[R] F
hf : LinearMap.ker f.toFun = ⊥
y : ↥f.inverse.domain
x : ↥f.domain
hxy : ↑f x = ↑y
hx : ↑f x ∈ f.inverse.domain
h : ↑f.inverse ⟨↑f x, ⋯⟩ = ↑x
⊢ ↑f.inverse y = ↑x

Proof state:
R : Type u_1
inst✝⁴ : Ring R
E : Type u_2
inst✝³ : AddCommGroup E
inst✝² : Module R E
F : Type u_3
inst✝¹ : AddCommGroup F
inst✝ : Module R F
f : E →ₗ.[R] F
hf : LinearMap.ker f.toFun = ⊥
y : ↥f.inverse.domain
x : ↥f.domain
hxy : ↑f x = ↑y
⊢ ↑f.inverse y = ↑x

Tactic:
have := mem_inverse_graph hf x

Result:
R : Type u_1
inst✝⁴ : Ring R
E : Type u_2
inst✝³ : AddCommGroup E
inst✝² : Module R E
F : Type u_3
inst✝¹ : AddCommGroup F
inst✝ : Module R F
f : E →ₗ.[R] F
hf : LinearMap.ker f.toFun = ⊥
y : ↥f.inverse.domain
x : ↥f.domain
hxy : ↑f x = ↑y
this : (↑f x, ↑x) ∈ f.inverse.graph
⊢ ↑f.inverse y = ↑x

Proof state:
R : Type u_1
inst✝⁴ : Ring R
E : Type u_2
inst✝³ : AddCommGroup E
inst✝² : Module R E
F : Type u_3
inst✝¹ : AddCommGroup F
inst✝ : Module R F
f : E →ₗ.[R] F
hf : LinearMap.ker f.toFun = ⊥
y : ↥f.inverse.domain
x : ↥f.domain
hxy : ↑f x = ↑y
this : (↑f x, ↑x) ∈ f.inverse.graph
⊢ ↑f.inverse y = ↑x

Tactic:
simp only [mem_graph_iff, Subtype.exists, exists_and_left, exists_eq_left] at this

Result:
R : Type u_1
inst✝⁴ : Ring R
E : Type u_2
inst✝³ : AddCommGroup E
inst✝² : Module R E
F : Type u_3
inst✝¹ : AddCommGroup F
inst✝ : Module R F
f : E →ₗ.[R] F
hf : LinearMap.ker f.toFun = ⊥
y : ↥f.inverse.domain
x : ↥f.domain
hxy : ↑f x = ↑y
this : ∃ (x_1 : ↑f x ∈ f.inverse.domain), ↑f.inverse ⟨↑f x, ⋯⟩ = ↑x
⊢ ↑f.inverse y = ↑x

Proof state:
case intro
R : Type u_1
inst✝⁴ : Ring R
E : Type u_2
inst✝³ : AddCommGroup E
inst✝² : Module R E
F : Type u_3
inst✝¹ : AddCommGroup F
inst✝ : Module R F
f : E →ₗ.[R] F
hf : LinearMap.ker f.toFun = ⊥
y : ↥f.inverse.domain
x : ↥f.domain
hxy : ↑f x = ↑y
hx : ↑f x ∈ f.inverse.domain
h : ↑f.inverse ⟨↑f x, ⋯⟩ = ↑x
⊢ ↑f.inverse y = ↑x

Tactic:
rw [← h]

Result:
case intro
R : Type u_1
inst✝⁴ : Ring R
E : Type u_2
inst✝³ : AddCommGroup E
inst✝² : Module R E
F : Type u_3
inst✝¹ : AddCommGroup F
inst✝ : Module R F
f : E →ₗ.[R] F
hf : LinearMap.ker f.toFun = ⊥
y : ↥f.inverse.domain
x : ↥f.domain
hxy : ↑f x = ↑y
hx : ↑f x ∈ f.inverse.domain
h : ↑f.inverse ⟨↑f x, ⋯⟩ = ↑x
⊢ ↑f.inverse y = ↑f.inverse ⟨↑f x, ⋯⟩