Theorem: LinearMap.isProj_iff_idempotent
File: Mathlib/LinearAlgebra/Projection.lean

tactic: constructor
state_before: R : Type ?u.424574
inst✝⁹ : Ring R
E : Type ?u.424580
inst✝⁸ : AddCommGroup E
inst✝⁷ : Module R E
F : Type ?u.425139
inst✝⁶ : AddCommGroup F
inst✝⁵ : Module R F
G : Type ?u.425655
inst✝⁴ : AddCommGroup G
inst✝³ : Module R G
p q : Submodule R E
S : Type u_1
inst✝² : Semiring S
M : Type u_2
inst✝¹ : AddCommMonoid M
inst✝ : Module S M
m : Submodule S M
f : M →ₗ[S] M
⊢ (∃ p, IsProj p f) ↔ comp f f = f

tactic: intro h
state_before: case mp
R : Type ?u.424574
inst✝⁹ : Ring R
E : Type ?u.424580
inst✝⁸ : AddCommGroup E
inst✝⁷ : Module R E
F : Type ?u.425139
inst✝⁶ : AddCommGroup F
inst✝⁵ : Module R F
G : Type ?u.425655
inst✝⁴ : AddCommGroup G
inst✝³ : Module R G
p q : Submodule R E
S : Type u_1
inst✝² : Semiring S
M : Type u_2
inst✝¹ : AddCommMonoid M
inst✝ : Module S M
m : Submodule S M
f : M →ₗ[S] M
⊢ (∃ p, IsProj p f) → comp f f = f

tactic: obtain ⟨p, hp⟩ := h
state_before: case mp
R : Type ?u.424574
inst✝⁹ : Ring R
E : Type ?u.424580
inst✝⁸ : AddCommGroup E
inst✝⁷ : Module R E
F : Type ?u.425139
inst✝⁶ : AddCommGroup F
inst✝⁵ : Module R F
G : Type ?u.425655
inst✝⁴ : AddCommGroup G
inst✝³ : Module R G
p q : Submodule R E
S : Type u_1
inst✝² : Semiring S
M : Type u_2
inst✝¹ : AddCommMonoid M
inst✝ : Module S M
m : Submodule S M
f : M →ₗ[S] M
h : ∃ p, IsProj p f
⊢ comp f f = f

tactic: ext x
state_before: case mp.intro
R : Type ?u.424574
inst✝⁹ : Ring R
E : Type ?u.424580
inst✝⁸ : AddCommGroup E
inst✝⁷ : Module R E
F : Type ?u.425139
inst✝⁶ : AddCommGroup F
inst✝⁵ : Module R F
G : Type ?u.425655
inst✝⁴ : AddCommGroup G
inst✝³ : Module R G
p✝ q : Submodule R E
S : Type u_1
inst✝² : Semiring S
M : Type u_2
inst✝¹ : AddCommMonoid M
inst✝ : Module S M
m : Submodule S M
f : M →ₗ[S] M
p : Submodule S M
hp : IsProj p f
⊢ comp f f = f

tactic: rw [comp_apply]
state_before: case mp.intro.h
R : Type ?u.424574
inst✝⁹ : Ring R
E : Type ?u.424580
inst✝⁸ : AddCommGroup E
inst✝⁷ : Module R E
F : Type ?u.425139
inst✝⁶ : AddCommGroup F
inst✝⁵ : Module R F
G : Type ?u.425655
inst✝⁴ : AddCommGroup G
inst✝³ : Module R G
p✝ q : Submodule R E
S : Type u_1
inst✝² : Semiring S
M : Type u_2
inst✝¹ : AddCommMonoid M
inst✝ : Module S M
m : Submodule S M
f : M →ₗ[S] M
p : Submodule S M
hp : IsProj p f
x : M
⊢ ↑(comp f f) x = ↑f x

tactic: exact hp.map_id (f x) (hp.map_mem x)
state_before: case mp.intro.h
R : Type ?u.424574
inst✝⁹ : Ring R
E : Type ?u.424580
inst✝⁸ : AddCommGroup E
inst✝⁷ : Module R E
F : Type ?u.425139
inst✝⁶ : AddCommGroup F
inst✝⁵ : Module R F
G : Type ?u.425655
inst✝⁴ : AddCommGroup G
inst✝³ : Module R G
p✝ q : Submodule R E
S : Type u_1
inst✝² : Semiring S
M : Type u_2
inst✝¹ : AddCommMonoid M
inst✝ : Module S M
m : Submodule S M
f : M →ₗ[S] M
p : Submodule S M
hp : IsProj p f
x : M
⊢ ↑f (↑f x) = ↑f x

tactic: intro h
state_before: case mpr
R : Type ?u.424574
inst✝⁹ : Ring R
E : Type ?u.424580
inst✝⁸ : AddCommGroup E
inst✝⁷ : Module R E
F : Type ?u.425139
inst✝⁶ : AddCommGroup F
inst✝⁵ : Module R F
G : Type ?u.425655
inst✝⁴ : AddCommGroup G
inst✝³ : Module R G
p q : Submodule R E
S : Type u_1
inst✝² : Semiring S
M : Type u_2
inst✝¹ : AddCommMonoid M
inst✝ : Module S M
m : Submodule S M
f : M →ₗ[S] M
⊢ comp f f = f → ∃ p, IsProj p f

tactic: use range f
state_before: case mpr
R : Type ?u.424574
inst✝⁹ : Ring R
E : Type ?u.424580
inst✝⁸ : AddCommGroup E
inst✝⁷ : Module R E
F : Type ?u.425139
inst✝⁶ : AddCommGroup F
inst✝⁵ : Module R F
G : Type ?u.425655
inst✝⁴ : AddCommGroup G
inst✝³ : Module R G
p q : Submodule R E
S : Type u_1
inst✝² : Semiring S
M : Type u_2
inst✝¹ : AddCommMonoid M
inst✝ : Module S M
m : Submodule S M
f : M →ₗ[S] M
h : comp f f = f
⊢ ∃ p, IsProj p f

tactic: constructor
state_before: case mpr
R : Type ?u.424574
inst✝⁹ : Ring R
E : Type ?u.424580
inst✝⁸ : AddCommGroup E
inst✝⁷ : Module R E
F : Type ?u.425139
inst✝⁶ : AddCommGroup F
inst✝⁵ : Module R F
G : Type ?u.425655
inst✝⁴ : AddCommGroup G
inst✝³ : Module R G
p q : Submodule R E
S : Type u_1
inst✝² : Semiring S
M : Type u_2
inst✝¹ : AddCommMonoid M
inst✝ : Module S M
m : Submodule S M
f : M →ₗ[S] M
h : comp f f = f
⊢ IsProj (range f) f

tactic: intro x
state_before: case mpr.map_mem
R : Type ?u.424574
inst✝⁹ : Ring R
E : Type ?u.424580
inst✝⁸ : AddCommGroup E
inst✝⁷ : Module R E
F : Type ?u.425139
inst✝⁶ : AddCommGroup F
inst✝⁵ : Module R F
G : Type ?u.425655
inst✝⁴ : AddCommGroup G
inst✝³ : Module R G
p q : Submodule R E
S : Type u_1
inst✝² : Semiring S
M : Type u_2
inst✝¹ : AddCommMonoid M
inst✝ : Module S M
m : Submodule S M
f : M →ₗ[S] M
h : comp f f = f
⊢ ∀ (x : M), ↑f x ∈ range f

tactic: exact mem_range_self f x
state_before: case mpr.map_mem
R : Type ?u.424574
inst✝⁹ : Ring R
E : Type ?u.424580
inst✝⁸ : AddCommGroup E
inst✝⁷ : Module R E
F : Type ?u.425139
inst✝⁶ : AddCommGroup F
inst✝⁵ : Module R F
G : Type ?u.425655
inst✝⁴ : AddCommGroup G
inst✝³ : Module R G
p q : Submodule R E
S : Type u_1
inst✝² : Semiring S
M : Type u_2
inst✝¹ : AddCommMonoid M
inst✝ : Module S M
m : Submodule S M
f : M →ₗ[S] M
h : comp f f = f
x : M
⊢ ↑f x ∈ range f

tactic: intro x hx
state_before: case mpr.map_id
R : Type ?u.424574
inst✝⁹ : Ring R
E : Type ?u.424580
inst✝⁸ : AddCommGroup E
inst✝⁷ : Module R E
F : Type ?u.425139
inst✝⁶ : AddCommGroup F
inst✝⁵ : Module R F
G : Type ?u.425655
inst✝⁴ : AddCommGroup G
inst✝³ : Module R G
p q : Submodule R E
S : Type u_1
inst✝² : Semiring S
M : Type u_2
inst✝¹ : AddCommMonoid M
inst✝ : Module S M
m : Submodule S M
f : M →ₗ[S] M
h : comp f f = f
⊢ ∀ (x : M), x ∈ range f → ↑f x = x

tactic: obtain ⟨y, hy⟩ := mem_range.1 hx
state_before: case mpr.map_id
R : Type ?u.424574
inst✝⁹ : Ring R
E : Type ?u.424580
inst✝⁸ : AddCommGroup E
inst✝⁷ : Module R E
F : Type ?u.425139
inst✝⁶ : AddCommGroup F
inst✝⁵ : Module R F
G : Type ?u.425655
inst✝⁴ : AddCommGroup G
inst✝³ : Module R G
p q : Submodule R E
S : Type u_1
inst✝² : Semiring S
M : Type u_2
inst✝¹ : AddCommMonoid M
inst✝ : Module S M
m : Submodule S M
f : M →ₗ[S] M
h : comp f f = f
x : M
hx : x ∈ range f
⊢ ↑f x = x

tactic: rw [← hy, ← comp_apply, h]
state_before: case mpr.map_id.intro
R : Type ?u.424574
inst✝⁹ : Ring R
E : Type ?u.424580
inst✝⁸ : AddCommGroup E
inst✝⁷ : Module R E
F : Type ?u.425139
inst✝⁶ : AddCommGroup F
inst✝⁵ : Module R F
G : Type ?u.425655
inst✝⁴ : AddCommGroup G
inst✝³ : Module R G
p q : Submodule R E
S : Type u_1
inst✝² : Semiring S
M : Type u_2
inst✝¹ : AddCommMonoid M
inst✝ : Module S M
m : Submodule S M
f : M →ₗ[S] M
h : comp f f = f
x : M
hx : x ∈ range f
y : M
hy : ↑f y = x
⊢ ↑f x = x