Theorem: EReal.limsup_add_le_add_limsup
File: Mathlib/Topology/Instances/EReal.lean

Proof steps:
state_before: α✝ : Type u_1
inst✝ : TopologicalSpace α✝
α : Type u_2
f : Filter α
u v : α → EReal
a b : EReal
h : limsup u f ≠ ⊥ ∨ limsup v f ≠ ⊤
h' : limsup u f ≠ ⊤ ∨ limsup v f ≠ ⊥
⊢ limsup (u + v) f ≤ limsup u f + limsup v f
state_after: case inl
α✝ : Type u_1
inst✝ : TopologicalSpace α✝
α : Type u_2
f : Filter α
u v : α → EReal
a b : EReal
h : limsup u f ≠ ⊥ ∨ limsup v f ≠ ⊤
h' : limsup u f ≠ ⊤ ∨ limsup v f ≠ ⊥
u_bot : limsup u f = ⊥
⊢ limsup (u + v) f ≤ limsup u f + limsup v f

case inr
α✝ : Type u_1
inst✝ : TopologicalSpace α✝
α : Type u_2
f : Filter α
u v : α → EReal
a b : EReal
h : limsup u f ≠ ⊥ ∨ limsup v f ≠ ⊤
h' : limsup u f ≠ ⊤ ∨ limsup v f ≠ ⊥
u_nbot : ⊥ < limsup u f
⊢ limsup (u + v) f ≤ limsup u f + limsup v f
tactic: rcases eq_bot_or_bot_lt (limsup u f) with (u_bot | u_nbot)
state_before: case inr
α✝ : Type u_1
inst✝ : TopologicalSpace α✝
α : Type u_2
f : Filter α
u v : α → EReal
a b : EReal
h : limsup u f ≠ ⊥ ∨ limsup v f ≠ ⊤
h' : limsup u f ≠ ⊤ ∨ limsup v f ≠ ⊥
u_nbot : ⊥ < limsup u f
⊢ limsup (u + v) f ≤ limsup u f + limsup v f
state_after: case inr.inl
α✝ : Type u_1
inst✝ : TopologicalSpace α✝
α : Type u_2
f : Filter α
u v : α → EReal
a b : EReal
h : limsup u f ≠ ⊥ ∨ limsup v f ≠ ⊤
h' : limsup u f ≠ ⊤ ∨ limsup v f ≠ ⊥
u_nbot : ⊥ < limsup u f
v_bot : limsup v f = ⊥
⊢ limsup (u + v) f ≤ limsup u f + limsup v f

case inr.inr
α✝ : Type u_1
inst✝ : TopologicalSpace α✝
α : Type u_2
f : Filter α
u v : α → EReal
a b : EReal
h : limsup u f ≠ ⊥ ∨ limsup v f ≠ ⊤
h' : limsup u f ≠ ⊤ ∨ limsup v f ≠ ⊥
u_nbot : ⊥ < limsup u f
v_nbot : ⊥ < limsup v f
⊢ limsup (u + v) f ≤ limsup u f + limsup v f
tactic: rcases eq_bot_or_bot_lt (limsup v f) with (v_bot | v_nbot)
state_before: case inr.inr
α✝ : Type u_1
inst✝ : TopologicalSpace α✝
α : Type u_2
f : Filter α
u v : α → EReal
a b : EReal
h : limsup u f ≠ ⊥ ∨ limsup v f ≠ ⊤
h' : limsup u f ≠ ⊤ ∨ limsup v f ≠ ⊥
u_nbot : ⊥ < limsup u f
v_nbot : ⊥ < limsup v f
⊢ limsup (u + v) f ≤ limsup u f + limsup v f
state_after: case inr.inr.inl
α✝ : Type u_1
inst✝ : TopologicalSpace α✝
α : Type u_2
f : Filter α
u v : α → EReal
a b : EReal
h : limsup u f ≠ ⊥ ∨ limsup v f ≠ ⊤
h' : limsup u f ≠ ⊤ ∨ limsup v f ≠ ⊥
u_nbot : ⊥ < limsup u f
v_nbot : ⊥ < limsup v f
v_top : limsup v f = ⊤
⊢ limsup (u + v) f ≤ limsup u f + limsup v f

case inr.inr.inr
α✝ : Type u_1
inst✝ : TopologicalSpace α✝
α : Type u_2
f : Filter α
u v : α → EReal
a b : EReal
h : limsup u f ≠ ⊥ ∨ limsup v f ≠ ⊤
h' : limsup u f ≠ ⊤ ∨ limsup v f ≠ ⊥
u_nbot : ⊥ < limsup u f
v_nbot : ⊥ < limsup v f
v_ntop : limsup v f < ⊤
⊢ limsup (u + v) f ≤ limsup u f + limsup v f
tactic: rcases eq_top_or_lt_top (limsup v f) with (v_top | v_ntop)
state_before: case inr.inr.inr
α✝ : Type u_1
inst✝ : TopologicalSpace α✝
α : Type u_2
f : Filter α
u v : α → EReal
a b : EReal
h : limsup u f ≠ ⊥ ∨ limsup v f ≠ ⊤
h' : limsup u f ≠ ⊤ ∨ limsup v f ≠ ⊥
u_nbot : ⊥ < limsup u f
v_nbot : ⊥ < limsup v f
v_ntop : limsup v f < ⊤
⊢ limsup (u + v) f ≤ limsup u f + limsup v f
state_after: case inr.inr.inr
α✝ : Type u_1
inst✝ : TopologicalSpace α✝
α : Type u_2
f : Filter α
u v : α → EReal
a b : EReal
h : limsup u f ≠ ⊥ ∨ limsup v f ≠ ⊤
h' : limsup u f ≠ ⊤ ∨ limsup v f ≠ ⊥
u_nbot : ⊥ < limsup u f
v_nbot : ⊥ < limsup v f
v_ntop : limsup v f < ⊤
limsup_v_real : ↑(limsup v f).toReal = limsup v f
⊢ limsup (u + v) f ≤ limsup u f + limsup v f
tactic: have limsup_v_real := coe_toReal (ne_of_lt v_ntop) (ne_of_gt v_nbot)
state_before: case inr.inr.inr
α✝ : Type u_1
inst✝ : TopologicalSpace α✝
α : Type u_2
f : Filter α
u v : α → EReal
a b : EReal
h : limsup u f ≠ ⊥ ∨ limsup v f ≠ ⊤
h' : limsup u f ≠ ⊤ ∨ limsup v f ≠ ⊥
u_nbot : ⊥ < limsup u f
v_nbot : ⊥ < limsup v f
v_ntop : limsup v f < ⊤
limsup_v_real : ↑(limsup v f).toReal = limsup v f
⊢ limsup (u + v) f ≤ limsup u f + limsup v f
state_after: case inr.inr.inr
α✝ : Type u_1
inst✝ : TopologicalSpace α✝
α : Type u_2
f : Filter α
u v : α → EReal
a b : EReal
h : limsup u f ≠ ⊥ ∨ limsup v f ≠ ⊤
h' : limsup u f ≠ ⊤ ∨ limsup v f ≠ ⊥
u_nbot : ⊥ < limsup u f
v_nbot : ⊥ < limsup v f
v_ntop : limsup v f < ⊤
limsup_v_real : ↑(limsup v f).toReal = limsup v f
⊢ ∀ (z : ℝ), limsup u f + limsup v f < ↑z → limsup (u + v) f ≤ ↑z
tactic: apply (le_iff_le_forall_real_gt _ _).1
state_before: case inr.inr.inr
α✝ : Type u_1
inst✝ : TopologicalSpace α✝
α : Type u_2
f : Filter α
u v : α → EReal
a b : EReal
h : limsup u f ≠ ⊥ ∨ limsup v f ≠ ⊤
h' : limsup u f ≠ ⊤ ∨ limsup v f ≠ ⊥
u_nbot : ⊥ < limsup u f
v_nbot : ⊥ < limsup v f
v_ntop : limsup v f < ⊤
limsup_v_real : ↑(limsup v f).toReal = limsup v f
⊢ ∀ (z : ℝ), limsup u f + limsup v f < ↑z → limsup (u + v) f ≤ ↑z
state_after: case inr.inr.inr
α✝ : Type u_1
inst✝ : TopologicalSpace α✝
α : Type u_2
f : Filter α
u v : α → EReal
a b : EReal
h : limsup u f ≠ ⊥ ∨ limsup v f ≠ ⊤
h' : limsup u f ≠ ⊤ ∨ limsup v f ≠ ⊥
u_nbot : ⊥ < limsup u f
v_nbot : ⊥ < limsup v f
v_ntop : limsup v f < ⊤
limsup_v_real : ↑(limsup v f).toReal = limsup v f
x : ℝ
hx : limsup u f + limsup v f < ↑x
⊢ limsup (u + v) f ≤ ↑x
tactic: intros x hx
state_before: case inr.inr.inr
α✝ : Type u_1
inst✝ : TopologicalSpace α✝
α : Type u_2
f : Filter α
u v : α → EReal
a b : EReal
h : limsup u f ≠ ⊥ ∨ limsup v f ≠ ⊤
h' : limsup u f ≠ ⊤ ∨ limsup v f ≠ ⊥
u_nbot : ⊥ < limsup u f
v_nbot : ⊥ < limsup v f
v_ntop : limsup v f < ⊤
limsup_v_real : ↑(limsup v f).toReal = limsup v f
x : ℝ
hx : limsup u f + limsup v f < ↑x
⊢ limsup (u + v) f ≤ ↑x
state_after: case inr.inr.inr.intro.intro
α✝ : Type u_1
inst✝ : TopologicalSpace α✝
α : Type u_2
f : Filter α
u v : α → EReal
a b : EReal
h : limsup u f ≠ ⊥ ∨ limsup v f ≠ ⊤
h' : limsup u f ≠ ⊤ ∨ limsup v f ≠ ⊥
u_nbot : ⊥ < limsup u f
v_nbot : ⊥ < limsup v f
v_ntop : limsup v f < ⊤
limsup_v_real : ↑(limsup v f).toReal = limsup v f
x : ℝ
hx : limsup u f + limsup v f < ↑x
y : ℝ
sum_lt_y : limsup u f + limsup v f < ↑y
y_lt_x : ↑y < ↑x
⊢ limsup (u + v) f ≤ ↑x
tactic: rcases lt_iff_exists_real_btwn.1 hx with ⟨y, ⟨sum_lt_y, y_lt_x⟩⟩
state_before: case inr.inr.inr.intro.intro
α✝ : Type u_1
inst✝ : TopologicalSpace α✝
α : Type u_2
f : Filter α
u v : α → EReal
a b : EReal
h : limsup u f ≠ ⊥ ∨ limsup v f ≠ ⊤
h' : limsup u f ≠ ⊤ ∨ limsup v f ≠ ⊥
u_nbot : ⊥ < limsup u f
v_nbot : ⊥ < limsup v f
v_ntop : limsup v f < ⊤
limsup_v_real : ↑(limsup v f).toReal = limsup v f
x : ℝ
hx : limsup u f + limsup v f < ↑x
y : ℝ
sum_lt_y : limsup u f + limsup v f < ↑y
y_lt_x : ↑y < ↑x
⊢ limsup (u + v) f ≤ ↑x
state_after: case inr.inr.inr.intro.intro
α✝ : Type u_1
inst✝ : TopologicalSpace α✝
α : Type u_2
f : Filter α
u v : α → EReal
a b : EReal
h : limsup u f ≠ ⊥ ∨ limsup v f ≠ ⊤
h' : limsup u f ≠ ⊤ ∨ limsup v f ≠ ⊥
u_nbot : ⊥ < limsup u f
v_nbot : ⊥ < limsup v f
v_ntop : limsup v f < ⊤
limsup_v_real : ↑(limsup v f).toReal = limsup v f
x : ℝ
hx : limsup u f + limsup v f < ↑x
y : ℝ
sum_lt_y : limsup u f + limsup v f < ↑y
y_lt_x : ↑y < ↑x
key₁ : limsup u f < ↑y - limsup v f
⊢ limsup (u + v) f ≤ ↑x
tactic: have key₁ : limsup u f < (y - limsup v f) := by
    apply lt_of_eq_of_lt _ (sub_lt_sub_of_lt_of_le sum_lt_y (le_of_eq (Eq.refl (limsup v f)))
      (ne_of_gt v_nbot) (ne_of_lt v_ntop))
    rw [← limsup_v_real, add_sub_cancel_right]
state_before: case inr.inr.inr.intro.intro
α✝ : Type u_1
inst✝ : TopologicalSpace α✝
α : Type u_2
f : Filter α
u v : α → EReal
a b : EReal
h : limsup u f ≠ ⊥ ∨ limsup v f ≠ ⊤
h' : limsup u f ≠ ⊤ ∨ limsup v f ≠ ⊥
u_nbot : ⊥ < limsup u f
v_nbot : ⊥ < limsup v f
v_ntop : limsup v f < ⊤
limsup_v_real : ↑(limsup v f).toReal = limsup v f
x : ℝ
hx : limsup u f + limsup v f < ↑x
y : ℝ
sum_lt_y : limsup u f + limsup v f < ↑y
y_lt_x : ↑y < ↑x
key₁ : limsup u f < ↑y - limsup v f
⊢ limsup (u + v) f ≤ ↑x
state_after: case inr.inr.inr.intro.intro
α✝ : Type u_1
inst✝ : TopologicalSpace α✝
α : Type u_2
f : Filter α
u v : α → EReal
a b : EReal
h : limsup u f ≠ ⊥ ∨ limsup v f ≠ ⊤
h' : limsup u f ≠ ⊤ ∨ limsup v f ≠ ⊥
u_nbot : ⊥ < limsup u f
v_nbot : ⊥ < limsup v f
v_ntop : limsup v f < ⊤
limsup_v_real : ↑(limsup v f).toReal = limsup v f
x : ℝ
hx : limsup u f + limsup v f < ↑x
y : ℝ
sum_lt_y : limsup u f + limsup v f < ↑y
y_lt_x : ↑y < ↑x
key₁ : limsup u f < ↑y - limsup v f
key₂ : limsup v f < limsup v f + ↑x - ↑y
⊢ limsup (u + v) f ≤ ↑x
tactic: have key₂ : limsup v f < limsup v f + x - y := by
    rw [← limsup_v_real]; norm_cast; norm_cast at y_lt_x; linarith
state_before: case inr.inr.inr.intro.intro
α✝ : Type u_1
inst✝ : TopologicalSpace α✝
α : Type u_2
f : Filter α
u v : α → EReal
a b : EReal
h : limsup u f ≠ ⊥ ∨ limsup v f ≠ ⊤
h' : limsup u f ≠ ⊤ ∨ limsup v f ≠ ⊥
u_nbot : ⊥ < limsup u f
v_nbot : ⊥ < limsup v f
v_ntop : limsup v f < ⊤
limsup_v_real : ↑(limsup v f).toReal = limsup v f
x : ℝ
hx : limsup u f + limsup v f < ↑x
y : ℝ
sum_lt_y : limsup u f + limsup v f < ↑y
y_lt_x : ↑y < ↑x
key₁ : limsup u f < ↑y - limsup v f
key₂ : limsup v f < limsup v f + ↑x - ↑y
⊢ limsup (u + v) f ≤ ↑x
state_after: case inr.inr.inr.intro.intro
α✝ : Type u_1
inst✝ : TopologicalSpace α✝
α : Type u_2
f : Filter α
u v : α → EReal
a b : EReal
h : limsup u f ≠ ⊥ ∨ limsup v f ≠ ⊤
h' : limsup u f ≠ ⊤ ∨ limsup v f ≠ ⊥
u_nbot : ⊥ < limsup u f
v_nbot : ⊥ < limsup v f
v_ntop : limsup v f < ⊤
limsup_v_real : ↑(limsup v f).toReal = limsup v f
x : ℝ
hx : limsup u f + limsup v f < ↑x
y : ℝ
sum_lt_y : limsup u f + limsup v f < ↑y
y_lt_x : ↑y < ↑x
key₁ : limsup u f < ↑y - limsup v f
key₂ : limsup v f < limsup v f + ↑x - ↑y
⊢ ↑y - limsup v f + (limsup v f + ↑x - ↑y) = ↑x
tactic: apply le_of_le_of_eq (limsup_add_le_of_lt key₁ key₂)
state_before: case inr.inr.inr.intro.intro
α✝ : Type u_1
inst✝ : TopologicalSpace α✝
α : Type u_2
f : Filter α
u v : α → EReal
a b : EReal
h : limsup u f ≠ ⊥ ∨ limsup v f ≠ ⊤
h' : limsup u f ≠ ⊤ ∨ limsup v f ≠ ⊥
u_nbot : ⊥ < limsup u f
v_nbot : ⊥ < limsup v f
v_ntop : limsup v f < ⊤
limsup_v_real : ↑(limsup v f).toReal = limsup v f
x : ℝ
hx : limsup u f + limsup v f < ↑x
y : ℝ
sum_lt_y : limsup u f + limsup v f < ↑y
y_lt_x : ↑y < ↑x
key₁ : limsup u f < ↑y - limsup v f
key₂ : limsup v f < limsup v f + ↑x - ↑y
⊢ ↑y - limsup v f + (limsup v f + ↑x - ↑y) = ↑x
state_after: case inr.inr.inr.intro.intro
α✝ : Type u_1
inst✝ : TopologicalSpace α✝
α : Type u_2
f : Filter α
u v : α → EReal
a b : EReal
h : limsup u f ≠ ⊥ ∨ limsup v f ≠ ⊤
h' : limsup u f ≠ ⊤ ∨ limsup v f ≠ ⊥
u_nbot : ⊥ < limsup u f
v_nbot : ⊥ < limsup v f
v_ntop : limsup v f < ⊤
limsup_v_real : ↑(limsup v f).toReal = limsup v f
x : ℝ
hx : limsup u f + limsup v f < ↑x
y : ℝ
sum_lt_y : limsup u f + limsup v f < ↑y
y_lt_x : ↑y < ↑x
key₁ : limsup u f < ↑y - limsup v f
key₂ : limsup v f < limsup v f + ↑x - ↑y
⊢ ↑y - ↑(limsup v f).toReal + (↑(limsup v f).toReal + ↑x - ↑y) = ↑x
tactic: rw [← limsup_v_real]
state_before: case inr.inr.inr.intro.intro
α✝ : Type u_1
inst✝ : TopologicalSpace α✝
α : Type u_2
f : Filter α
u v : α → EReal
a b : EReal
h : limsup u f ≠ ⊥ ∨ limsup v f ≠ ⊤
h' : limsup u f ≠ ⊤ ∨ limsup v f ≠ ⊥
u_nbot : ⊥ < limsup u f
v_nbot : ⊥ < limsup v f
v_ntop : limsup v f < ⊤
limsup_v_real : ↑(limsup v f).toReal = limsup v f
x : ℝ
hx : limsup u f + limsup v f < ↑x
y : ℝ
sum_lt_y : limsup u f + limsup v f < ↑y
y_lt_x : ↑y < ↑x
key₁ : limsup u f < ↑y - limsup v f
key₂ : limsup v f < limsup v f + ↑x - ↑y
⊢ ↑y - ↑(limsup v f).toReal + (↑(limsup v f).toReal + ↑x - ↑y) = ↑x
state_after: case inr.inr.inr.intro.intro
α✝ : Type u_1
inst✝ : TopologicalSpace α✝
α : Type u_2
f : Filter α
u v : α → EReal
a b : EReal
h : limsup u f ≠ ⊥ ∨ limsup v f ≠ ⊤
h' : limsup u f ≠ ⊤ ∨ limsup v f ≠ ⊥
u_nbot : ⊥ < limsup u f
v_nbot : ⊥ < limsup v f
v_ntop : limsup v f < ⊤
limsup_v_real : ↑(limsup v f).toReal = limsup v f
x : ℝ
hx : limsup u f + limsup v f < ↑x
y : ℝ
sum_lt_y : limsup u f + limsup v f < ↑y
y_lt_x : ↑y < ↑x
key₁ : limsup u f < ↑y - limsup v f
key₂ : limsup v f < limsup v f + ↑x - ↑y
⊢ y - (limsup v f).toReal + ((limsup v f).toReal + x - y) = x
tactic: norm_cast
state_before: case inr.inr.inr.intro.intro
α✝ : Type u_1
inst✝ : TopologicalSpace α✝
α : Type u_2
f : Filter α
u v : α → EReal
a b : EReal
h : limsup u f ≠ ⊥ ∨ limsup v f ≠ ⊤
h' : limsup u f ≠ ⊤ ∨ limsup v f ≠ ⊥
u_nbot : ⊥ < limsup u f
v_nbot : ⊥ < limsup v f
v_ntop : limsup v f < ⊤
limsup_v_real : ↑(limsup v f).toReal = limsup v f
x : ℝ
hx : limsup u f + limsup v f < ↑x
y : ℝ
sum_lt_y : limsup u f + limsup v f < ↑y
y_lt_x : ↑y < ↑x
key₁ : limsup u f < ↑y - limsup v f
key₂ : limsup v f < limsup v f + ↑x - ↑y
⊢ y - (limsup v f).toReal + ((limsup v f).toReal + x - y) = x
state_after: no goals
tactic: linarith