Theorem: ContinuousLinearMap.tendsto_birkhoffAverage_orthogonalProjection
File: Mathlib/Analysis/InnerProductSpace/MeanErgodic.lean

tactic: apply (f : E →ₗ[𝕜] E).tendsto_birkhoffAverage_of_ker_subset_closure (f.lipschitz.weaken hf)
state_before: 𝕜 : Type u_1
E : Type u_2
inst✝³ : RCLike 𝕜
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
inst✝ : CompleteSpace E
f : E →L[𝕜] E
hf : ‖f‖ ≤ 1
x : E
⊢ Tendsto (fun x_1 => birkhoffAverage 𝕜 (⇑f) _root_.id x_1 x) atTop
    (𝓝 ↑((orthogonalProjection (LinearMap.eqLocus f 1)) x))
state_after: case hg_proj
𝕜 : Type u_1
E : Type u_2
inst✝³ : RCLike 𝕜
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
inst✝ : CompleteSpace E
f : E →L[𝕜] E
hf : ‖f‖ ≤ 1
x : E
⊢ ∀ (x : ↥(LinearMap.eqLocus (↑f) 1)), (orthogonalProjection (LinearMap.eqLocus f 1)) ↑x = x

case hg_ker
𝕜 : Type u_1
E : Type u_2
inst✝³ : RCLike 𝕜
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
inst✝ : CompleteSpace E
f : E →L[𝕜] E
hf : ‖f‖ ≤ 1
x : E
⊢ ↑(LinearMap.ker (orthogonalProjection (LinearMap.eqLocus f 1))) ⊆ closure ↑(LinearMap.range (↑f - 1))

tactic: exact orthogonalProjection_mem_subspace_eq_self (K := LinearMap.eqLocus f 1)
state_before: case hg_proj
𝕜 : Type u_1
E : Type u_2
inst✝³ : RCLike 𝕜
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
inst✝ : CompleteSpace E
f : E →L[𝕜] E
hf : ‖f‖ ≤ 1
x : E
⊢ ∀ (x : ↥(LinearMap.eqLocus (↑f) 1)), (orthogonalProjection (LinearMap.eqLocus f 1)) ↑x = x
state_after: no goals

tactic: clear x
state_before: case hg_ker
𝕜 : Type u_1
E : Type u_2
inst✝³ : RCLike 𝕜
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
inst✝ : CompleteSpace E
f : E →L[𝕜] E
hf : ‖f‖ ≤ 1
x : E
⊢ ↑(LinearMap.ker (orthogonalProjection (LinearMap.eqLocus f 1))) ⊆ closure ↑(LinearMap.range (↑f - 1))
state_after: case hg_ker
𝕜 : Type u_1
E : Type u_2
inst✝³ : RCLike 𝕜
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
inst✝ : CompleteSpace E
f : E →L[𝕜] E
hf : ‖f‖ ≤ 1
⊢ ↑(LinearMap.ker (orthogonalProjection (LinearMap.eqLocus f 1))) ⊆ closure ↑(LinearMap.range (↑f - 1))

tactic: rw [ker_orthogonalProjection, ← Submodule.topologicalClosure_coe, SetLike.coe_subset_coe,
  ← Submodule.orthogonal_orthogonal_eq_closure]
state_before: case hg_ker
𝕜 : Type u_1
E : Type u_2
inst✝³ : RCLike 𝕜
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
inst✝ : CompleteSpace E
f : E →L[𝕜] E
hf : ‖f‖ ≤ 1
⊢ ↑(LinearMap.ker (orthogonalProjection (LinearMap.eqLocus f 1))) ⊆ closure ↑(LinearMap.range (↑f - 1))
state_after: case hg_ker
𝕜 : Type u_1
E : Type u_2
inst✝³ : RCLike 𝕜
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
inst✝ : CompleteSpace E
f : E →L[𝕜] E
hf : ‖f‖ ≤ 1
⊢ (LinearMap.eqLocus f 1)ᗮ ≤ (LinearMap.range (↑f - 1))ᗮᗮ

tactic: refine Submodule.orthogonal_le fun x hx ↦ eq_of_norm_le_re_inner_eq_norm_sq (𝕜 := 𝕜) ?_ ?_
state_before: case hg_ker
𝕜 : Type u_1
E : Type u_2
inst✝³ : RCLike 𝕜
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
inst✝ : CompleteSpace E
f : E →L[𝕜] E
hf : ‖f‖ ≤ 1
⊢ (LinearMap.eqLocus f 1)ᗮ ≤ (LinearMap.range (↑f - 1))ᗮᗮ
state_after: case hg_ker.refine_1
𝕜 : Type u_1
E : Type u_2
inst✝³ : RCLike 𝕜
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
inst✝ : CompleteSpace E
f : E →L[𝕜] E
hf : ‖f‖ ≤ 1
x : E
hx : x ∈ (LinearMap.range (↑f - 1))ᗮ
⊢ ‖f x‖ ≤ ‖1 x‖

case hg_ker.refine_2
𝕜 : Type u_1
E : Type u_2
inst✝³ : RCLike 𝕜
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
inst✝ : CompleteSpace E
f : E →L[𝕜] E
hf : ‖f‖ ≤ 1
x : E
hx : x ∈ (LinearMap.range (↑f - 1))ᗮ
⊢ RCLike.re ⟪f x, 1 x⟫_𝕜 = ‖1 x‖ ^ 2

tactic: simpa using f.le_of_opNorm_le hf x
state_before: case hg_ker.refine_1
𝕜 : Type u_1
E : Type u_2
inst✝³ : RCLike 𝕜
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
inst✝ : CompleteSpace E
f : E →L[𝕜] E
hf : ‖f‖ ≤ 1
x : E
hx : x ∈ (LinearMap.range (↑f - 1))ᗮ
⊢ ‖f x‖ ≤ ‖1 x‖
state_after: no goals

tactic: have : ∀ y, ⟪f y, x⟫ = ⟪y, x⟫ := by
  simpa [Submodule.mem_orthogonal, inner_sub_left, sub_eq_zero] using hx
state_before: case hg_ker.refine_2
𝕜 : Type u_1
E : Type u_2
inst✝³ : RCLike 𝕜
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
inst✝ : CompleteSpace E
f : E →L[𝕜] E
hf : ‖f‖ ≤ 1
x : E
hx : x ∈ (LinearMap.range (↑f - 1))ᗮ
⊢ RCLike.re ⟪f x, 1 x⟫_𝕜 = ‖1 x‖ ^ 2
state_after: case hg_ker.refine_2
𝕜 : Type u_1
E : Type u_2
inst✝³ : RCLike 𝕜
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
inst✝ : CompleteSpace E
f : E →L[𝕜] E
hf : ‖f‖ ≤ 1
x : E
hx : x ∈ (LinearMap.range (↑f - 1))ᗮ
this : ∀ (y : E), ⟪f y, x⟫_𝕜 = ⟪y, x⟫_𝕜
⊢ RCLike.re ⟪f x, 1 x⟫_𝕜 = ‖1 x‖ ^ 2

tactic: simp [this, ← norm_sq_eq_inner]
state_before: case hg_ker.refine_2
𝕜 : Type u_1
E : Type u_2
inst✝³ : RCLike 𝕜
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
inst✝ : CompleteSpace E
f : E →L[𝕜] E
hf : ‖f‖ ≤ 1
x : E
hx : x ∈ (LinearMap.range (↑f - 1))ᗮ
this : ∀ (y : E), ⟪f y, x⟫_𝕜 = ⟪y, x⟫_𝕜
⊢ RCLike.re ⟪f x, 1 x⟫_𝕜 = ‖1 x‖ ^ 2
state_after: no goals

tactic: simpa [Submodule.mem_orthogonal, inner_sub_left, sub_eq_zero] using hx
state_before: 𝕜 : Type u_1
E : Type u_2
inst✝³ : RCLike 𝕜
inst✝² : NormedAddCommGroup E
inst✝¹ : InnerProductSpace 𝕜 E
inst✝ : CompleteSpace E
f : E →L[𝕜] E
hf : ‖f‖ ≤ 1
x : E
hx : x ∈ (LinearMap.range (↑f - 1))ᗮ
⊢ ∀ (y : E), ⟪f y, x⟫_𝕜 = ⟪y, x⟫_𝕜
state_after: no goals