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

tactic: have liminf_le : F.liminf xs ≤ b := by
  apply liminf_le_of_le ⟨0, by simp⟩
  intro y h
  obtain ⟨i, hi⟩ := (Eventually.and h le_b).exists
  exact hi.1.trans hi.2
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
⊢ liminf (fun i => (xs i).toReal) F = (liminf 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
liminf_le : liminf xs F ≤ b
⊢ liminf (fun i => (xs i).toReal) F = (liminf 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
liminf_le : liminf xs F ≤ b
⊢ liminf (fun i => (xs i).toReal) F = (liminf 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
liminf_le : liminf xs F ≤ b
aux : ∀ᶠ (i : ι) in F, (xs i).toReal = b.truncateToReal (xs i)
⊢ liminf (fun i => (xs i).toReal) F = (liminf xs F).toReal

tactic: have aux' : (F.liminf xs).toReal = ENNReal.truncateToReal b (F.liminf xs) := by
  rw [truncateToReal_eq_toReal b_ne_top liminf_le]
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
liminf_le : liminf xs F ≤ b
aux : ∀ᶠ (i : ι) in F, (xs i).toReal = b.truncateToReal (xs i)
⊢ liminf (fun i => (xs i).toReal) F = (liminf 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
liminf_le : liminf xs F ≤ b
aux : ∀ᶠ (i : ι) in F, (xs i).toReal = b.truncateToReal (xs i)
aux' : (liminf xs F).toReal = b.truncateToReal (liminf xs F)
⊢ liminf (fun i => (xs i).toReal) F = (liminf xs F).toReal

tactic: simp_rw [liminf_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
liminf_le : liminf xs F ≤ b
aux : ∀ᶠ (i : ι) in F, (xs i).toReal = b.truncateToReal (xs i)
aux' : (liminf xs F).toReal = b.truncateToReal (liminf xs F)
⊢ liminf (fun i => (xs i).toReal) F = (liminf 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
liminf_le : liminf xs F ≤ b
aux : ∀ᶠ (i : ι) in F, (xs i).toReal = b.truncateToReal (xs i)
aux' : (liminf xs F).toReal = b.truncateToReal (liminf xs F)
⊢ liminf (fun a => b.truncateToReal (xs a)) F = b.truncateToReal (liminf xs F)

tactic: have key := Monotone.map_liminf_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⟩ ⟨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
liminf_le : liminf xs F ≤ b
aux : ∀ᶠ (i : ι) in F, (xs i).toReal = b.truncateToReal (xs i)
aux' : (liminf xs F).toReal = b.truncateToReal (liminf xs F)
⊢ liminf (fun a => b.truncateToReal (xs a)) F = b.truncateToReal (liminf 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
liminf_le : liminf xs F ≤ b
aux : ∀ᶠ (i : ι) in F, (xs i).toReal = b.truncateToReal (xs i)
aux' : (liminf xs F).toReal = b.truncateToReal (liminf xs F)
key : b.truncateToReal (liminf xs F) = liminf (b.truncateToReal ∘ xs) F
⊢ liminf (fun a => b.truncateToReal (xs a)) F = b.truncateToReal (liminf 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
liminf_le : liminf xs F ≤ b
aux : ∀ᶠ (i : ι) in F, (xs i).toReal = b.truncateToReal (xs i)
aux' : (liminf xs F).toReal = b.truncateToReal (liminf xs F)
key : b.truncateToReal (liminf xs F) = liminf (b.truncateToReal ∘ xs) F
⊢ liminf (fun a => b.truncateToReal (xs a)) F = b.truncateToReal (liminf 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
liminf_le : liminf xs F ≤ b
aux : ∀ᶠ (i : ι) in F, (xs i).toReal = b.truncateToReal (xs i)
aux' : (liminf xs F).toReal = b.truncateToReal (liminf xs F)
key : b.truncateToReal (liminf xs F) = liminf (b.truncateToReal ∘ xs) F
⊢ liminf (fun a => b.truncateToReal (xs a)) F = liminf (b.truncateToReal ∘ xs) F

tactic: rfl
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
liminf_le : liminf xs F ≤ b
aux : ∀ᶠ (i : ι) in F, (xs i).toReal = b.truncateToReal (xs i)
aux' : (liminf xs F).toReal = b.truncateToReal (liminf xs F)
key : b.truncateToReal (liminf xs F) = liminf (b.truncateToReal ∘ xs) F
⊢ liminf (fun a => b.truncateToReal (xs a)) F = liminf (b.truncateToReal ∘ xs) F
state_after: no goals

tactic: apply liminf_le_of_le ⟨0, 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
⊢ liminf xs F ≤ b
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
⊢ ∀ (b_1 : ℝ≥0∞), (∀ᶠ (n : ι) in F, b_1 ≤ xs n) → b_1 ≤ b

tactic: intro y h
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
⊢ ∀ (b_1 : ℝ≥0∞), (∀ᶠ (n : ι) in F, b_1 ≤ xs n) → b_1 ≤ b
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
y : ℝ≥0∞
h : ∀ᶠ (n : ι) in F, y ≤ xs n
⊢ y ≤ b

tactic: obtain ⟨i, hi⟩ := (Eventually.and h le_b).exists
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
y : ℝ≥0∞
h : ∀ᶠ (n : ι) in F, y ≤ xs n
⊢ y ≤ b
state_after: case intro
α : 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
y : ℝ≥0∞
h : ∀ᶠ (n : ι) in F, y ≤ xs n
i : ι
hi : y ≤ xs i ∧ xs i ≤ b
⊢ y ≤ b

tactic: exact hi.1.trans hi.2
state_before: case intro
α : 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
y : ℝ≥0∞
h : ∀ᶠ (n : ι) in F, y ≤ xs n
i : ι
hi : y ≤ xs i ∧ xs i ≤ b
⊢ y ≤ b
state_after: no goals

tactic: 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
⊢ ∀ᶠ (x : ℝ≥0∞) in map xs F, (fun x x_1 => x ≥ x_1) x 0
state_after: no goals

tactic: filter_upwards [le_b] with i i_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
liminf_le : liminf xs F ≤ b
⊢ ∀ᶠ (i : ι) in F, (xs i).toReal = b.truncateToReal (xs i)
state_after: case h
α : 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
liminf_le : liminf xs F ≤ b
i : ι
i_le_b : xs i ≤ b
⊢ (xs i).toReal = b.truncateToReal (xs i)

tactic: simp only [truncateToReal_eq_toReal b_ne_top i_le_b, implies_true]
state_before: case h
α : 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
liminf_le : liminf xs F ≤ b
i : ι
i_le_b : xs i ≤ b
⊢ (xs i).toReal = b.truncateToReal (xs i)
state_after: no goals

tactic: rw [truncateToReal_eq_toReal b_ne_top liminf_le]
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
liminf_le : liminf xs F ≤ b
aux : ∀ᶠ (i : ι) in F, (xs i).toReal = b.truncateToReal (xs i)
⊢ (liminf xs F).toReal = b.truncateToReal (liminf xs F)
state_after: no goals

tactic: simpa only [eventually_map] using 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
liminf_le : liminf xs F ≤ b
aux : ∀ᶠ (i : ι) in F, (xs i).toReal = b.truncateToReal (xs i)
aux' : (liminf xs F).toReal = b.truncateToReal (liminf xs F)
⊢ ∀ᶠ (x : ℝ≥0∞) in map xs F, (fun x x_1 => x ≤ x_1) x b
state_after: no goals

tactic: 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
liminf_le : liminf xs F ≤ b
aux : ∀ᶠ (i : ι) in F, (xs i).toReal = b.truncateToReal (xs i)
aux' : (liminf xs F).toReal = b.truncateToReal (liminf xs F)
⊢ ∀ (x : ℝ≥0∞), (fun x x_1 => x ≥ x_1) x 0
state_after: no goals