-- Mathlib/Analysis/InnerProductSpace/Projection.lean
theorem eq_orthogonalProjectionFn_of_mem_of_inner_eq_zero {u v : E} (hvm : v ∈ K)
    (hvo : ∀ w ∈ K, ⟪u - v, w⟫ = 0) : orthogonalProjectionFn K u = v

Proof state:
𝕜 : Type u_1
E : Type u_2
inst✝³ : RCLike 𝕜
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
K : Submodule 𝕜 E
inst✝ : HasOrthogonalProjection K
u v : E
hvm : v ∈ K
hvo : ∀ w ∈ K, ⟪u - v, w⟫_𝕜 = 0
hvs : orthogonalProjectionFn K u - v ∈ K
huo : ⟪u - orthogonalProjectionFn K u, orthogonalProjectionFn K u - v⟫_𝕜 = 0
huv : ⟪u - v, orthogonalProjectionFn K u - v⟫_𝕜 = 0
⊢ ⟪orthogonalProjectionFn K u - v, orthogonalProjectionFn K u - v⟫_𝕜 = 0

Tactic:
have houv : ⟪u - v - (u - orthogonalProjectionFn K u), orthogonalProjectionFn K u - v⟫ = 0 := by
  rw [inner_sub_left, huo, huv, sub_zero]

Result:
𝕜 : Type u_1
E : Type u_2
inst✝³ : RCLike 𝕜
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
K : Submodule 𝕜 E
inst✝ : HasOrthogonalProjection K
u v : E
hvm : v ∈ K
hvo : ∀ w ∈ K, ⟪u - v, w⟫_𝕜 = 0
hvs : orthogonalProjectionFn K u - v ∈ K
huo : ⟪u - orthogonalProjectionFn K u, orthogonalProjectionFn K u - v⟫_𝕜 = 0
huv : ⟪u - v, orthogonalProjectionFn K u - v⟫_𝕜 = 0
houv : ⟪u - v - (u - orthogonalProjectionFn K u), orthogonalProjectionFn K u - v⟫_𝕜 = 0
⊢ ⟪orthogonalProjectionFn K u - v, orthogonalProjectionFn K u - v⟫_𝕜 = 0

Proof state:
𝕜 : Type u_1
E : Type u_2
inst✝³ : RCLike 𝕜
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
K : Submodule 𝕜 E
inst✝ : HasOrthogonalProjection K
u v : E
hvm : v ∈ K
hvo : ∀ w ∈ K, ⟪u - v, w⟫_𝕜 = 0
hvs : orthogonalProjectionFn K u - v ∈ K
huo : ⟪u - orthogonalProjectionFn K u, orthogonalProjectionFn K u - v⟫_𝕜 = 0
huv : ⟪u - v, orthogonalProjectionFn K u - v⟫_𝕜 = 0
houv : ⟪u - v - (u - orthogonalProjectionFn K u), orthogonalProjectionFn K u - v⟫_𝕜 = 0
⊢ ⟪orthogonalProjectionFn K u - v, orthogonalProjectionFn K u - v⟫_𝕜 = 0

Tactic:
rwa [sub_sub_sub_cancel_left] at houv

Result:
no goals

Proof state:
𝕜 : Type u_1
E : Type u_2
inst✝³ : RCLike 𝕜
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
K : Submodule 𝕜 E
inst✝ : HasOrthogonalProjection K
u v : E
hvm : v ∈ K
hvo : ∀ w ∈ K, ⟪u - v, w⟫_𝕜 = 0
⊢ orthogonalProjectionFn K u = v

Tactic:
rw [← sub_eq_zero, ← @inner_self_eq_zero 𝕜]

Result:
𝕜 : Type u_1
E : Type u_2
inst✝³ : RCLike 𝕜
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
K : Submodule 𝕜 E
inst✝ : HasOrthogonalProjection K
u v : E
hvm : v ∈ K
hvo : ∀ w ∈ K, ⟪u - v, w⟫_𝕜 = 0
⊢ ⟪orthogonalProjectionFn K u - v, orthogonalProjectionFn K u - v⟫_𝕜 = 0

Proof state:
𝕜 : Type u_1
E : Type u_2
inst✝³ : RCLike 𝕜
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
K : Submodule 𝕜 E
inst✝ : HasOrthogonalProjection K
u v : E
hvm : v ∈ K
hvo : ∀ w ∈ K, ⟪u - v, w⟫_𝕜 = 0
hvs : orthogonalProjectionFn K u - v ∈ K
huo : ⟪u - orthogonalProjectionFn K u, orthogonalProjectionFn K u - v⟫_𝕜 = 0
⊢ ⟪orthogonalProjectionFn K u - v, orthogonalProjectionFn K u - v⟫_𝕜 = 0

Tactic:
have huv : ⟪u - v, orthogonalProjectionFn K u - v⟫ = 0 := hvo _ hvs

Result:
𝕜 : Type u_1
E : Type u_2
inst✝³ : RCLike 𝕜
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
K : Submodule 𝕜 E
inst✝ : HasOrthogonalProjection K
u v : E
hvm : v ∈ K
hvo : ∀ w ∈ K, ⟪u - v, w⟫_𝕜 = 0
hvs : orthogonalProjectionFn K u - v ∈ K
huo : ⟪u - orthogonalProjectionFn K u, orthogonalProjectionFn K u - v⟫_𝕜 = 0
huv : ⟪u - v, orthogonalProjectionFn K u - v⟫_𝕜 = 0
⊢ ⟪orthogonalProjectionFn K u - v, orthogonalProjectionFn K u - v⟫_𝕜 = 0

Proof state:
𝕜 : Type u_1
E : Type u_2
inst✝³ : RCLike 𝕜
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
K : Submodule 𝕜 E
inst✝ : HasOrthogonalProjection K
u v : E
hvm : v ∈ K
hvo : ∀ w ∈ K, ⟪u - v, w⟫_𝕜 = 0
hvs : orthogonalProjectionFn K u - v ∈ K
huo : ⟪u - orthogonalProjectionFn K u, orthogonalProjectionFn K u - v⟫_𝕜 = 0
huv : ⟪u - v, orthogonalProjectionFn K u - v⟫_𝕜 = 0
⊢ ⟪u - v - (u - orthogonalProjectionFn K u), orthogonalProjectionFn K u - v⟫_𝕜 = 0

Tactic:
rw [inner_sub_left, huo, huv, sub_zero]

Result:
no goals

Proof state:
𝕜 : Type u_1
E : Type u_2
inst✝³ : RCLike 𝕜
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
K : Submodule 𝕜 E
inst✝ : HasOrthogonalProjection K
u v : E
hvm : v ∈ K
hvo : ∀ w ∈ K, ⟪u - v, w⟫_𝕜 = 0
hvs : orthogonalProjectionFn K u - v ∈ K
⊢ ⟪orthogonalProjectionFn K u - v, orthogonalProjectionFn K u - v⟫_𝕜 = 0

Tactic:
have huo : ⟪u - orthogonalProjectionFn K u, orthogonalProjectionFn K u - v⟫ = 0 :=
  orthogonalProjectionFn_inner_eq_zero u _ hvs

Result:
𝕜 : Type u_1
E : Type u_2
inst✝³ : RCLike 𝕜
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
K : Submodule 𝕜 E
inst✝ : HasOrthogonalProjection K
u v : E
hvm : v ∈ K
hvo : ∀ w ∈ K, ⟪u - v, w⟫_𝕜 = 0
hvs : orthogonalProjectionFn K u - v ∈ K
huo : ⟪u - orthogonalProjectionFn K u, orthogonalProjectionFn K u - v⟫_𝕜 = 0
⊢ ⟪orthogonalProjectionFn K u - v, orthogonalProjectionFn K u - v⟫_𝕜 = 0

Proof state:
𝕜 : Type u_1
E : Type u_2
inst✝³ : RCLike 𝕜
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
K : Submodule 𝕜 E
inst✝ : HasOrthogonalProjection K
u v : E
hvm : v ∈ K
hvo : ∀ w ∈ K, ⟪u - v, w⟫_𝕜 = 0
⊢ ⟪orthogonalProjectionFn K u - v, orthogonalProjectionFn K u - v⟫_𝕜 = 0

Tactic:
have hvs : orthogonalProjectionFn K u - v ∈ K :=
  Submodule.sub_mem K (orthogonalProjectionFn_mem u) hvm

Result:
𝕜 : Type u_1
E : Type u_2
inst✝³ : RCLike 𝕜
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
K : Submodule 𝕜 E
inst✝ : HasOrthogonalProjection K
u v : E
hvm : v ∈ K
hvo : ∀ w ∈ K, ⟪u - v, w⟫_𝕜 = 0
hvs : orthogonalProjectionFn K u - v ∈ K
⊢ ⟪orthogonalProjectionFn K u - v, orthogonalProjectionFn K u - v⟫_𝕜 = 0