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

tactic: have : ∀ a : s, ∀ b : V, (_root_.orthogonalProjection s.direction) b = 0 →
    reflection s (reflection s (b +ᵥ (a : P))) = b +ᵥ (a : P) := by
  intro _ _ h
  simp [reflection, 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
⊢ (reflection s) ((reflection s) p) = p
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
this :
  ∀ (a : ↥s) (b : V),
    (_root_.orthogonalProjection s.direction) b = 0 → (reflection s) ((reflection s) (b +ᵥ ↑a)) = b +ᵥ ↑a
⊢ (reflection s) ((reflection s) p) = p

tactic: rw [← vsub_vadd p (orthogonalProjection s 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
this :
  ∀ (a : ↥s) (b : V),
    (_root_.orthogonalProjection s.direction) b = 0 → (reflection s) ((reflection s) (b +ᵥ ↑a)) = b +ᵥ ↑a
⊢ (reflection s) ((reflection s) p) = p
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
this :
  ∀ (a : ↥s) (b : V),
    (_root_.orthogonalProjection s.direction) b = 0 → (reflection s) ((reflection s) (b +ᵥ ↑a)) = b +ᵥ ↑a
⊢ (reflection s) ((reflection s) (p -ᵥ ↑((orthogonalProjection s) p) +ᵥ ↑((orthogonalProjection s) p))) =
    p -ᵥ ↑((orthogonalProjection s) p) +ᵥ ↑((orthogonalProjection s) p)

tactic: exact this (orthogonalProjection s p) _ (orthogonalProjection_vsub_orthogonalProjection s 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
this :
  ∀ (a : ↥s) (b : V),
    (_root_.orthogonalProjection s.direction) b = 0 → (reflection s) ((reflection s) (b +ᵥ ↑a)) = b +ᵥ ↑a
⊢ (reflection s) ((reflection s) (p -ᵥ ↑((orthogonalProjection s) p) +ᵥ ↑((orthogonalProjection s) p))) =
    p -ᵥ ↑((orthogonalProjection s) p) +ᵥ ↑((orthogonalProjection s) p)
state_after: no goals

tactic: intro _ _ 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
⊢ ∀ (a : ↥s) (b : V),
    (_root_.orthogonalProjection s.direction) b = 0 → (reflection s) ((reflection s) (b +ᵥ ↑a)) = b +ᵥ ↑a
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
a✝ : ↥s
b✝ : V
h : (_root_.orthogonalProjection s.direction) b✝ = 0
⊢ (reflection s) ((reflection s) (b✝ +ᵥ ↑a✝)) = b✝ +ᵥ ↑a✝

tactic: simp [reflection, 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
a✝ : ↥s
b✝ : V
h : (_root_.orthogonalProjection s.direction) b✝ = 0
⊢ (reflection s) ((reflection s) (b✝ +ᵥ ↑a✝)) = b✝ +ᵥ ↑a✝
state_after: no goals