Theorem: ENNReal.limsup_toReal_eq
File: Mathlib/Topology/Instances/ENNReal.lean

Proof steps:
state_before: α : Type u_1
β : Type u_2
γ : Type u_3
ι✝ : Type u_4
ι : Type u_5
F : Filter ι
inst✝ : F.NeBot
b : ℝ≥0∞
b_ne_top : b ≠ ⊤
xs : ι → ℝ≥0∞
le_b : ∀ᶠ (i : ι) in F, xs i ≤ b
⊢ limsup (fun i => (xs i).toReal) F = (limsup xs F).toReal
state_after: α : Type u_1
β : Type u_2
γ : Type u_3
ι✝ : Type u_4
ι : Type u_5
F : Filter ι
inst✝ : F.NeBot
b : ℝ≥0∞
b_ne_top : b ≠ ⊤
xs : ι → ℝ≥0∞
le_b : ∀ᶠ (i : ι) in F, xs i ≤ b
aux : ∀ᶠ (i : ι) in F, (xs i).toReal = b.truncateToReal (xs i)
⊢ limsup (fun i => (xs i).toReal) F = (limsup xs F).toReal
tactic: have aux : ∀ᶠ i in F, (xs i).toReal = ENNReal.truncateToReal b (xs i) := by
    filter_upwards [le_b] with i i_le_b
    simp only [truncateToReal_eq_toReal b_ne_top i_le_b, implies_true]
state_before: α : Type u_1
β : Type u_2
γ : Type u_3
ι✝ : Type u_4
ι : Type u_5
F : Filter ι
inst✝ : F.NeBot
b : ℝ≥0∞
b_ne_top : b ≠ ⊤
xs : ι → ℝ≥0∞
le_b : ∀ᶠ (i : ι) in F, xs i ≤ b
aux : ∀ᶠ (i : ι) in F, (xs i).toReal = b.truncateToReal (xs i)
⊢ limsup (fun i => (xs i).toReal) F = (limsup xs F).toReal
state_after: α : Type u_1
β : Type u_2
γ : Type u_3
ι✝ : Type u_4
ι : Type u_5
F : Filter ι
inst✝ : F.NeBot
b : ℝ≥0∞
b_ne_top : b ≠ ⊤
xs : ι → ℝ≥0∞
le_b : ∀ᶠ (i : ι) in F, xs i ≤ b
aux : ∀ᶠ (i : ι) in F, (xs i).toReal = b.truncateToReal (xs i)
aux' : (limsup xs F).toReal = b.truncateToReal (limsup xs F)
⊢ limsup (fun i => (xs i).toReal) F = (limsup xs F).toReal
tactic: have aux' : (F.limsup xs).toReal = ENNReal.truncateToReal b (F.limsup xs) := by
    rw [truncateToReal_eq_toReal b_ne_top (limsup_le_of_le ⟨0, by simp⟩ le_b)]
state_before: α : Type u_1
β : Type u_2
γ : Type u_3
ι✝ : Type u_4
ι : Type u_5
F : Filter ι
inst✝ : F.NeBot
b : ℝ≥0∞
b_ne_top : b ≠ ⊤
xs : ι → ℝ≥0∞
le_b : ∀ᶠ (i : ι) in F, xs i ≤ b
aux : ∀ᶠ (i : ι) in F, (xs i).toReal = b.truncateToReal (xs i)
aux' : (limsup xs F).toReal = b.truncateToReal (limsup xs F)
⊢ limsup (fun i => (xs i).toReal) F = (limsup xs F).toReal
state_after: α : Type u_1
β : Type u_2
γ : Type u_3
ι✝ : Type u_4
ι : Type u_5
F : Filter ι
inst✝ : F.NeBot
b : ℝ≥0∞
b_ne_top : b ≠ ⊤
xs : ι → ℝ≥0∞
le_b : ∀ᶠ (i : ι) in F, xs i ≤ b
aux : ∀ᶠ (i : ι) in F, (xs i).toReal = b.truncateToReal (xs i)
aux' : (limsup xs F).toReal = b.truncateToReal (limsup xs F)
⊢ limsup (fun a => b.truncateToReal (xs a)) F = b.truncateToReal (limsup xs F)
tactic: simp_rw [limsup_congr aux, aux']
state_before: α : Type u_1
β : Type u_2
γ : Type u_3
ι✝ : Type u_4
ι : Type u_5
F : Filter ι
inst✝ : F.NeBot
b : ℝ≥0∞
b_ne_top : b ≠ ⊤
xs : ι → ℝ≥0∞
le_b : ∀ᶠ (i : ι) in F, xs i ≤ b
aux : ∀ᶠ (i : ι) in F, (xs i).toReal = b.truncateToReal (xs i)
aux' : (limsup xs F).toReal = b.truncateToReal (limsup xs F)
⊢ limsup (fun a => b.truncateToReal (xs a)) F = b.truncateToReal (limsup xs F)
state_after: α : Type u_1
β : Type u_2
γ : Type u_3
ι✝ : Type u_4
ι : Type u_5
F : Filter ι
inst✝ : F.NeBot
b : ℝ≥0∞
b_ne_top : b ≠ ⊤
xs : ι → ℝ≥0∞
le_b : ∀ᶠ (i : ι) in F, xs i ≤ b
aux : ∀ᶠ (i : ι) in F, (xs i).toReal = b.truncateToReal (xs i)
aux' : (limsup xs F).toReal = b.truncateToReal (limsup xs F)
key : b.truncateToReal (limsup xs F) = limsup (b.truncateToReal ∘ xs) F
⊢ limsup (fun a => b.truncateToReal (xs a)) F = b.truncateToReal (limsup xs F)
tactic: have key := Monotone.map_limsup_of_continuousAt (F := F) (monotone_truncateToReal b_ne_top) xs
          (continuous_truncateToReal b_ne_top).continuousAt
          ⟨b, by simpa only [eventually_map] using le_b⟩
          (IsBoundedUnder.isCoboundedUnder_le ⟨0, eventually_of_forall (by simp)⟩)
state_before: α : Type u_1
β : Type u_2
γ : Type u_3
ι✝ : Type u_4
ι : Type u_5
F : Filter ι
inst✝ : F.NeBot
b : ℝ≥0∞
b_ne_top : b ≠ ⊤
xs : ι → ℝ≥0∞
le_b : ∀ᶠ (i : ι) in F, xs i ≤ b
aux : ∀ᶠ (i : ι) in F, (xs i).toReal = b.truncateToReal (xs i)
aux' : (limsup xs F).toReal = b.truncateToReal (limsup xs F)
key : b.truncateToReal (limsup xs F) = limsup (b.truncateToReal ∘ xs) F
⊢ limsup (fun a => b.truncateToReal (xs a)) F = b.truncateToReal (limsup xs F)
state_after: α : Type u_1
β : Type u_2
γ : Type u_3
ι✝ : Type u_4
ι : Type u_5
F : Filter ι
inst✝ : F.NeBot
b : ℝ≥0∞
b_ne_top : b ≠ ⊤
xs : ι → ℝ≥0∞
le_b : ∀ᶠ (i : ι) in F, xs i ≤ b
aux : ∀ᶠ (i : ι) in F, (xs i).toReal = b.truncateToReal (xs i)
aux' : (limsup xs F).toReal = b.truncateToReal (limsup xs F)
key : b.truncateToReal (limsup xs F) = limsup (b.truncateToReal ∘ xs) F
⊢ limsup (fun a => b.truncateToReal (xs a)) F = limsup (b.truncateToReal ∘ xs) F
tactic: rw [key]
state_before: α : Type u_1
β : Type u_2
γ : Type u_3
ι✝ : Type u_4
ι : Type u_5
F : Filter ι
inst✝ : F.NeBot
b : ℝ≥0∞
b_ne_top : b ≠ ⊤
xs : ι → ℝ≥0∞
le_b : ∀ᶠ (i : ι) in F, xs i ≤ b
aux : ∀ᶠ (i : ι) in F, (xs i).toReal = b.truncateToReal (xs i)
aux' : (limsup xs F).toReal = b.truncateToReal (limsup xs F)
key : b.truncateToReal (limsup xs F) = limsup (b.truncateToReal ∘ xs) F
⊢ limsup (fun a => b.truncateToReal (xs a)) F = limsup (b.truncateToReal ∘ xs) F
state_after: no goals
tactic: rfl