Theorem: Submodule.toLinearPMap_graph_eq
File: Mathlib/LinearAlgebra/LinearPMap.lean

tactic: ext x
state_before: R : Type u_1
inst✝⁶ : Ring R
E : Type u_3
inst✝⁵ : AddCommGroup E
inst✝⁴ : Module R E
F : Type u_2
inst✝³ : AddCommGroup F
inst✝² : Module R F
G : Type ?u.666279
inst✝¹ : AddCommGroup G
inst✝ : Module R G
g : Submodule R (E × F)
hg : ∀ (x : E × F), x ∈ g → x.fst = 0 → x.snd = 0
⊢ LinearPMap.graph (toLinearPMap g hg) = g

tactic: constructor <;> intro hx
state_before: case h
R : Type u_1
inst✝⁶ : Ring R
E : Type u_3
inst✝⁵ : AddCommGroup E
inst✝⁴ : Module R E
F : Type u_2
inst✝³ : AddCommGroup F
inst✝² : Module R F
G : Type ?u.666279
inst✝¹ : AddCommGroup G
inst✝ : Module R G
g : Submodule R (E × F)
hg : ∀ (x : E × F), x ∈ g → x.fst = 0 → x.snd = 0
x : E × F
⊢ x ∈ LinearPMap.graph (toLinearPMap g hg) ↔ x ∈ g

tactic: rw [LinearPMap.mem_graph_iff]
state_before: case h.mpr
R : Type u_1
inst✝⁶ : Ring R
E : Type u_3
inst✝⁵ : AddCommGroup E
inst✝⁴ : Module R E
F : Type u_2
inst✝³ : AddCommGroup F
inst✝² : Module R F
G : Type ?u.666279
inst✝¹ : AddCommGroup G
inst✝ : Module R G
g : Submodule R (E × F)
hg : ∀ (x : E × F), x ∈ g → x.fst = 0 → x.snd = 0
x : E × F
hx : x ∈ g
⊢ x ∈ LinearPMap.graph (toLinearPMap g hg)

tactic: cases' x with x_fst x_snd
state_before: case h.mpr
R : Type u_1
inst✝⁶ : Ring R
E : Type u_3
inst✝⁵ : AddCommGroup E
inst✝⁴ : Module R E
F : Type u_2
inst✝³ : AddCommGroup F
inst✝² : Module R F
G : Type ?u.666279
inst✝¹ : AddCommGroup G
inst✝ : Module R G
g : Submodule R (E × F)
hg : ∀ (x : E × F), x ∈ g → x.fst = 0 → x.snd = 0
x : E × F
hx : x ∈ g
⊢ ∃ y, ↑y = x.fst ∧ ↑(toLinearPMap g hg) y = x.snd

tactic: have hx_fst : x_fst ∈ g.map (LinearMap.fst R E F) := by
  simp only [mem_map, LinearMap.fst_apply, Prod.exists, exists_and_right, exists_eq_right]
  exact ⟨x_snd, hx⟩
state_before: case h.mpr.mk
R : Type u_1
inst✝⁶ : Ring R
E : Type u_3
inst✝⁵ : AddCommGroup E
inst✝⁴ : Module R E
F : Type u_2
inst✝³ : AddCommGroup F
inst✝² : Module R F
G : Type ?u.666279
inst✝¹ : AddCommGroup G
inst✝ : Module R G
g : Submodule R (E × F)
hg : ∀ (x : E × F), x ∈ g → x.fst = 0 → x.snd = 0
x_fst : E
x_snd : F
hx : (x_fst, x_snd) ∈ g
⊢ ∃ y, ↑y = (x_fst, x_snd).fst ∧ ↑(toLinearPMap g hg) y = (x_fst, x_snd).snd

tactic: refine' ⟨⟨x_fst, hx_fst⟩, Subtype.coe_mk x_fst hx_fst, _⟩
state_before: case h.mpr.mk
R : Type u_1
inst✝⁶ : Ring R
E : Type u_3
inst✝⁵ : AddCommGroup E
inst✝⁴ : Module R E
F : Type u_2
inst✝³ : AddCommGroup F
inst✝² : Module R F
G : Type ?u.666279
inst✝¹ : AddCommGroup G
inst✝ : Module R G
g : Submodule R (E × F)
hg : ∀ (x : E × F), x ∈ g → x.fst = 0 → x.snd = 0
x_fst : E
x_snd : F
hx : (x_fst, x_snd) ∈ g
hx_fst : x_fst ∈ map (LinearMap.fst R E F) g
⊢ ∃ y, ↑y = (x_fst, x_snd).fst ∧ ↑(toLinearPMap g hg) y = (x_fst, x_snd).snd

tactic: exact (existsUnique_from_graph @hg hx_fst).unique (valFromGraph_mem hg hx_fst) hx
state_before: case h.mpr.mk
R : Type u_1
inst✝⁶ : Ring R
E : Type u_3
inst✝⁵ : AddCommGroup E
inst✝⁴ : Module R E
F : Type u_2
inst✝³ : AddCommGroup F
inst✝² : Module R F
G : Type ?u.666279
inst✝¹ : AddCommGroup G
inst✝ : Module R G
g : Submodule R (E × F)
hg : ∀ (x : E × F), x ∈ g → x.fst = 0 → x.snd = 0
x_fst : E
x_snd : F
hx : (x_fst, x_snd) ∈ g
hx_fst : x_fst ∈ map (LinearMap.fst R E F) g
⊢ ↑(toLinearPMap g hg) { val := x_fst, property := hx_fst } = (x_fst, x_snd).snd

tactic: rw [LinearPMap.mem_graph_iff] at hx
state_before: case h.mp
R : Type u_1
inst✝⁶ : Ring R
E : Type u_3
inst✝⁵ : AddCommGroup E
inst✝⁴ : Module R E
F : Type u_2
inst✝³ : AddCommGroup F
inst✝² : Module R F
G : Type ?u.666279
inst✝¹ : AddCommGroup G
inst✝ : Module R G
g : Submodule R (E × F)
hg : ∀ (x : E × F), x ∈ g → x.fst = 0 → x.snd = 0
x : E × F
hx : x ∈ LinearPMap.graph (toLinearPMap g hg)
⊢ x ∈ g

tactic: rcases hx with ⟨y, hx1, hx2⟩
state_before: case h.mp
R : Type u_1
inst✝⁶ : Ring R
E : Type u_3
inst✝⁵ : AddCommGroup E
inst✝⁴ : Module R E
F : Type u_2
inst✝³ : AddCommGroup F
inst✝² : Module R F
G : Type ?u.666279
inst✝¹ : AddCommGroup G
inst✝ : Module R G
g : Submodule R (E × F)
hg : ∀ (x : E × F), x ∈ g → x.fst = 0 → x.snd = 0
x : E × F
hx : ∃ y, ↑y = x.fst ∧ ↑(toLinearPMap g hg) y = x.snd
⊢ x ∈ g

tactic: convert g.mem_graph_toLinearPMap hg y using 1
state_before: case h.mp.intro.intro
R : Type u_1
inst✝⁶ : Ring R
E : Type u_3
inst✝⁵ : AddCommGroup E
inst✝⁴ : Module R E
F : Type u_2
inst✝³ : AddCommGroup F
inst✝² : Module R F
G : Type ?u.666279
inst✝¹ : AddCommGroup G
inst✝ : Module R G
g : Submodule R (E × F)
hg : ∀ (x : E × F), x ∈ g → x.fst = 0 → x.snd = 0
x : E × F
y : { x // x ∈ (toLinearPMap g hg).domain }
hx1 : ↑y = x.fst
hx2 : ↑(toLinearPMap g hg) y = x.snd
⊢ x ∈ g

tactic: exact Prod.ext hx1.symm hx2.symm
state_before: case h.e'_4
R : Type u_1
inst✝⁶ : Ring R
E : Type u_3
inst✝⁵ : AddCommGroup E
inst✝⁴ : Module R E
F : Type u_2
inst✝³ : AddCommGroup F
inst✝² : Module R F
G : Type ?u.666279
inst✝¹ : AddCommGroup G
inst✝ : Module R G
g : Submodule R (E × F)
hg : ∀ (x : E × F), x ∈ g → x.fst = 0 → x.snd = 0
x : E × F
y : { x // x ∈ (toLinearPMap g hg).domain }
hx1 : ↑y = x.fst
hx2 : ↑(toLinearPMap g hg) y = x.snd
⊢ x = (↑y, ↑(toLinearPMap g hg) y)

tactic: simp only [mem_map, LinearMap.fst_apply, Prod.exists, exists_and_right, exists_eq_right]
state_before: R : Type u_1
inst✝⁶ : Ring R
E : Type u_3
inst✝⁵ : AddCommGroup E
inst✝⁴ : Module R E
F : Type u_2
inst✝³ : AddCommGroup F
inst✝² : Module R F
G : Type ?u.666279
inst✝¹ : AddCommGroup G
inst✝ : Module R G
g : Submodule R (E × F)
hg : ∀ (x : E × F), x ∈ g → x.fst = 0 → x.snd = 0
x_fst : E
x_snd : F
hx : (x_fst, x_snd) ∈ g
⊢ x_fst ∈ map (LinearMap.fst R E F) g

tactic: exact ⟨x_snd, hx⟩
state_before: R : Type u_1
inst✝⁶ : Ring R
E : Type u_3
inst✝⁵ : AddCommGroup E
inst✝⁴ : Module R E
F : Type u_2
inst✝³ : AddCommGroup F
inst✝² : Module R F
G : Type ?u.666279
inst✝¹ : AddCommGroup G
inst✝ : Module R G
g : Submodule R (E × F)
hg : ∀ (x : E × F), x ∈ g → x.fst = 0 → x.snd = 0
x_fst : E
x_snd : F
hx : (x_fst, x_snd) ∈ g
⊢ ∃ x, (x_fst, x) ∈ g