Theorem: EuclideanGeometry.orthogonalProjection_vadd_eq_self
File: Mathlib/Geometry/Euclidean/Basic.lean

tactic: have h := vsub_orthogonalProjection_mem_direction_orthogonal s (v +ᵥ p)
state_before: V : Type u_1
P : Type u_2
inst✝⁵ : NormedAddCommGroup V
inst✝⁴ : InnerProductSpace ℝ V
inst✝³ : MetricSpace P
inst✝² : NormedAddTorsor V P
s : AffineSubspace ℝ P
inst✝¹ : Nonempty ↥s
inst✝ : HasOrthogonalProjection s.direction
p : P
hp : p ∈ s
v : V
hv : v ∈ s.directionᗮ
⊢ (orthogonalProjection s) (v +ᵥ p) = ⟨p, hp⟩
state_after: V : Type u_1
P : Type u_2
inst✝⁵ : NormedAddCommGroup V
inst✝⁴ : InnerProductSpace ℝ V
inst✝³ : MetricSpace P
inst✝² : NormedAddTorsor V P
s : AffineSubspace ℝ P
inst✝¹ : Nonempty ↥s
inst✝ : HasOrthogonalProjection s.direction
p : P
hp : p ∈ s
v : V
hv : v ∈ s.directionᗮ
h : v +ᵥ p -ᵥ ↑((orthogonalProjection s) (v +ᵥ p)) ∈ s.directionᗮ
⊢ (orthogonalProjection s) (v +ᵥ p) = ⟨p, hp⟩

tactic: rw [vadd_vsub_assoc, Submodule.add_mem_iff_right _ hv] at h
state_before: V : Type u_1
P : Type u_2
inst✝⁵ : NormedAddCommGroup V
inst✝⁴ : InnerProductSpace ℝ V
inst✝³ : MetricSpace P
inst✝² : NormedAddTorsor V P
s : AffineSubspace ℝ P
inst✝¹ : Nonempty ↥s
inst✝ : HasOrthogonalProjection s.direction
p : P
hp : p ∈ s
v : V
hv : v ∈ s.directionᗮ
h : v +ᵥ p -ᵥ ↑((orthogonalProjection s) (v +ᵥ p)) ∈ s.directionᗮ
⊢ (orthogonalProjection s) (v +ᵥ p) = ⟨p, hp⟩
state_after: V : Type u_1
P : Type u_2
inst✝⁵ : NormedAddCommGroup V
inst✝⁴ : InnerProductSpace ℝ V
inst✝³ : MetricSpace P
inst✝² : NormedAddTorsor V P
s : AffineSubspace ℝ P
inst✝¹ : Nonempty ↥s
inst✝ : HasOrthogonalProjection s.direction
p : P
hp : p ∈ s
v : V
hv : v ∈ s.directionᗮ
h : p -ᵥ ↑((orthogonalProjection s) (v +ᵥ p)) ∈ s.directionᗮ
⊢ (orthogonalProjection s) (v +ᵥ p) = ⟨p, hp⟩

tactic: refine (eq_of_vsub_eq_zero ?_).symm
state_before: V : Type u_1
P : Type u_2
inst✝⁵ : NormedAddCommGroup V
inst✝⁴ : InnerProductSpace ℝ V
inst✝³ : MetricSpace P
inst✝² : NormedAddTorsor V P
s : AffineSubspace ℝ P
inst✝¹ : Nonempty ↥s
inst✝ : HasOrthogonalProjection s.direction
p : P
hp : p ∈ s
v : V
hv : v ∈ s.directionᗮ
h : p -ᵥ ↑((orthogonalProjection s) (v +ᵥ p)) ∈ s.directionᗮ
⊢ (orthogonalProjection s) (v +ᵥ p) = ⟨p, hp⟩
state_after: V : Type u_1
P : Type u_2
inst✝⁵ : NormedAddCommGroup V
inst✝⁴ : InnerProductSpace ℝ V
inst✝³ : MetricSpace P
inst✝² : NormedAddTorsor V P
s : AffineSubspace ℝ P
inst✝¹ : Nonempty ↥s
inst✝ : HasOrthogonalProjection s.direction
p : P
hp : p ∈ s
v : V
hv : v ∈ s.directionᗮ
h : p -ᵥ ↑((orthogonalProjection s) (v +ᵥ p)) ∈ s.directionᗮ
⊢ ⟨p, hp⟩ -ᵥ (orthogonalProjection s) (v +ᵥ p) = 0

tactic: ext
state_before: V : Type u_1
P : Type u_2
inst✝⁵ : NormedAddCommGroup V
inst✝⁴ : InnerProductSpace ℝ V
inst✝³ : MetricSpace P
inst✝² : NormedAddTorsor V P
s : AffineSubspace ℝ P
inst✝¹ : Nonempty ↥s
inst✝ : HasOrthogonalProjection s.direction
p : P
hp : p ∈ s
v : V
hv : v ∈ s.directionᗮ
h : p -ᵥ ↑((orthogonalProjection s) (v +ᵥ p)) ∈ s.directionᗮ
⊢ ⟨p, hp⟩ -ᵥ (orthogonalProjection s) (v +ᵥ p) = 0
state_after: case a
V : Type u_1
P : Type u_2
inst✝⁵ : NormedAddCommGroup V
inst✝⁴ : InnerProductSpace ℝ V
inst✝³ : MetricSpace P
inst✝² : NormedAddTorsor V P
s : AffineSubspace ℝ P
inst✝¹ : Nonempty ↥s
inst✝ : HasOrthogonalProjection s.direction
p : P
hp : p ∈ s
v : V
hv : v ∈ s.directionᗮ
h : p -ᵥ ↑((orthogonalProjection s) (v +ᵥ p)) ∈ s.directionᗮ
⊢ ↑(⟨p, hp⟩ -ᵥ (orthogonalProjection s) (v +ᵥ p)) = ↑0

tactic: refine Submodule.disjoint_def.1 s.direction.orthogonal_disjoint _ ?_ h
state_before: case a
V : Type u_1
P : Type u_2
inst✝⁵ : NormedAddCommGroup V
inst✝⁴ : InnerProductSpace ℝ V
inst✝³ : MetricSpace P
inst✝² : NormedAddTorsor V P
s : AffineSubspace ℝ P
inst✝¹ : Nonempty ↥s
inst✝ : HasOrthogonalProjection s.direction
p : P
hp : p ∈ s
v : V
hv : v ∈ s.directionᗮ
h : p -ᵥ ↑((orthogonalProjection s) (v +ᵥ p)) ∈ s.directionᗮ
⊢ ↑(⟨p, hp⟩ -ᵥ (orthogonalProjection s) (v +ᵥ p)) = ↑0
state_after: case a
V : Type u_1
P : Type u_2
inst✝⁵ : NormedAddCommGroup V
inst✝⁴ : InnerProductSpace ℝ V
inst✝³ : MetricSpace P
inst✝² : NormedAddTorsor V P
s : AffineSubspace ℝ P
inst✝¹ : Nonempty ↥s
inst✝ : HasOrthogonalProjection s.direction
p : P
hp : p ∈ s
v : V
hv : v ∈ s.directionᗮ
h : p -ᵥ ↑((orthogonalProjection s) (v +ᵥ p)) ∈ s.directionᗮ
⊢ ↑(⟨p, hp⟩ -ᵥ (orthogonalProjection s) (v +ᵥ p)) ∈ s.direction

tactic: exact (_ : s.direction).2
state_before: case a
V : Type u_1
P : Type u_2
inst✝⁵ : NormedAddCommGroup V
inst✝⁴ : InnerProductSpace ℝ V
inst✝³ : MetricSpace P
inst✝² : NormedAddTorsor V P
s : AffineSubspace ℝ P
inst✝¹ : Nonempty ↥s
inst✝ : HasOrthogonalProjection s.direction
p : P
hp : p ∈ s
v : V
hv : v ∈ s.directionᗮ
h : p -ᵥ ↑((orthogonalProjection s) (v +ᵥ p)) ∈ s.directionᗮ
⊢ ↑(⟨p, hp⟩ -ᵥ (orthogonalProjection s) (v +ᵥ p)) ∈ s.direction
state_after: no goals