Theorem: MeasureTheory.tendsto_of_uncrossing_lt_top
File: Mathlib/Probability/Martingale/Convergence.lean

tactic: rw [isBoundedUnder_le_abs] at h
state_before: case pos
Ω : Type u_1
ι : Type u_2
m0 : MeasurableSpace Ω
μ : Measure Ω
ℱ : Filtration ℕ m0
a b : ℝ
f : ℕ → Ω → ℝ
ω : Ω
R : ℝ≥0
hf₁ : liminf (fun n => ↑‖f n ω‖₊) atTop < ⊤
hf₂ : ∀ (a b : ℚ), a < b → upcrossings (↑a) (↑b) f ω < ⊤
h : IsBoundedUnder (fun x x_1 => x ≤ x_1) atTop fun n => |f n ω|
⊢ ∃ c, Tendsto (fun n => f n ω) atTop (𝓝 c)
state_after: case pos
Ω : Type u_1
ι : Type u_2
m0 : MeasurableSpace Ω
μ : Measure Ω
ℱ : Filtration ℕ m0
a b : ℝ
f : ℕ → Ω → ℝ
ω : Ω
R : ℝ≥0
hf₁ : liminf (fun n => ↑‖f n ω‖₊) atTop < ⊤
hf₂ : ∀ (a b : ℚ), a < b → upcrossings (↑a) (↑b) f ω < ⊤
h :
  (IsBoundedUnder (fun x x_1 => x ≤ x_1) atTop fun n => f n ω) ∧
    IsBoundedUnder (fun x x_1 => x ≥ x_1) atTop fun n => f n ω
⊢ ∃ c, Tendsto (fun n => f n ω) atTop (𝓝 c)

tactic: refine tendsto_of_no_upcrossings Rat.denseRange_cast ?_ h.1 h.2
state_before: case pos
Ω : Type u_1
ι : Type u_2
m0 : MeasurableSpace Ω
μ : Measure Ω
ℱ : Filtration ℕ m0
a b : ℝ
f : ℕ → Ω → ℝ
ω : Ω
R : ℝ≥0
hf₁ : liminf (fun n => ↑‖f n ω‖₊) atTop < ⊤
hf₂ : ∀ (a b : ℚ), a < b → upcrossings (↑a) (↑b) f ω < ⊤
h :
  (IsBoundedUnder (fun x x_1 => x ≤ x_1) atTop fun n => f n ω) ∧
    IsBoundedUnder (fun x x_1 => x ≥ x_1) atTop fun n => f n ω
⊢ ∃ c, Tendsto (fun n => f n ω) atTop (𝓝 c)
state_after: case pos
Ω : Type u_1
ι : Type u_2
m0 : MeasurableSpace Ω
μ : Measure Ω
ℱ : Filtration ℕ m0
a b : ℝ
f : ℕ → Ω → ℝ
ω : Ω
R : ℝ≥0
hf₁ : liminf (fun n => ↑‖f n ω‖₊) atTop < ⊤
hf₂ : ∀ (a b : ℚ), a < b → upcrossings (↑a) (↑b) f ω < ⊤
h :
  (IsBoundedUnder (fun x x_1 => x ≤ x_1) atTop fun n => f n ω) ∧
    IsBoundedUnder (fun x x_1 => x ≥ x_1) atTop fun n => f n ω
⊢ ∀ a ∈ Set.range Rat.cast,
    ∀ b ∈ Set.range Rat.cast, a < b → ¬((∃ᶠ (n : ℕ) in atTop, f n ω < a) ∧ ∃ᶠ (n : ℕ) in atTop, b < f n ω)

tactic: intro a ha b hb hab
state_before: case pos
Ω : Type u_1
ι : Type u_2
m0 : MeasurableSpace Ω
μ : Measure Ω
ℱ : Filtration ℕ m0
a b : ℝ
f : ℕ → Ω → ℝ
ω : Ω
R : ℝ≥0
hf₁ : liminf (fun n => ↑‖f n ω‖₊) atTop < ⊤
hf₂ : ∀ (a b : ℚ), a < b → upcrossings (↑a) (↑b) f ω < ⊤
h :
  (IsBoundedUnder (fun x x_1 => x ≤ x_1) atTop fun n => f n ω) ∧
    IsBoundedUnder (fun x x_1 => x ≥ x_1) atTop fun n => f n ω
⊢ ∀ a ∈ Set.range Rat.cast,
    ∀ b ∈ Set.range Rat.cast, a < b → ¬((∃ᶠ (n : ℕ) in atTop, f n ω < a) ∧ ∃ᶠ (n : ℕ) in atTop, b < f n ω)
state_after: case pos
Ω : Type u_1
ι : Type u_2
m0 : MeasurableSpace Ω
μ : Measure Ω
ℱ : Filtration ℕ m0
a✝ b✝ : ℝ
f : ℕ → Ω → ℝ
ω : Ω
R : ℝ≥0
hf₁ : liminf (fun n => ↑‖f n ω‖₊) atTop < ⊤
hf₂ : ∀ (a b : ℚ), a < b → upcrossings (↑a) (↑b) f ω < ⊤
h :
  (IsBoundedUnder (fun x x_1 => x ≤ x_1) atTop fun n => f n ω) ∧
    IsBoundedUnder (fun x x_1 => x ≥ x_1) atTop fun n => f n ω
a : ℝ
ha : a ∈ Set.range Rat.cast
b : ℝ
hb : b ∈ Set.range Rat.cast
hab : a < b
⊢ ¬((∃ᶠ (n : ℕ) in atTop, f n ω < a) ∧ ∃ᶠ (n : ℕ) in atTop, b < f n ω)

tactic: obtain ⟨⟨a, rfl⟩, ⟨b, rfl⟩⟩ := ha, hb
state_before: case pos
Ω : Type u_1
ι : Type u_2
m0 : MeasurableSpace Ω
μ : Measure Ω
ℱ : Filtration ℕ m0
a✝ b✝ : ℝ
f : ℕ → Ω → ℝ
ω : Ω
R : ℝ≥0
hf₁ : liminf (fun n => ↑‖f n ω‖₊) atTop < ⊤
hf₂ : ∀ (a b : ℚ), a < b → upcrossings (↑a) (↑b) f ω < ⊤
h :
  (IsBoundedUnder (fun x x_1 => x ≤ x_1) atTop fun n => f n ω) ∧
    IsBoundedUnder (fun x x_1 => x ≥ x_1) atTop fun n => f n ω
a : ℝ
ha : a ∈ Set.range Rat.cast
b : ℝ
hb : b ∈ Set.range Rat.cast
hab : a < b
⊢ ¬((∃ᶠ (n : ℕ) in atTop, f n ω < a) ∧ ∃ᶠ (n : ℕ) in atTop, b < f n ω)
state_after: case pos.intro.intro
Ω : Type u_1
ι : Type u_2
m0 : MeasurableSpace Ω
μ : Measure Ω
ℱ : Filtration ℕ m0
a✝ b✝ : ℝ
f : ℕ → Ω → ℝ
ω : Ω
R : ℝ≥0
hf₁ : liminf (fun n => ↑‖f n ω‖₊) atTop < ⊤
hf₂ : ∀ (a b : ℚ), a < b → upcrossings (↑a) (↑b) f ω < ⊤
h :
  (IsBoundedUnder (fun x x_1 => x ≤ x_1) atTop fun n => f n ω) ∧
    IsBoundedUnder (fun x x_1 => x ≥ x_1) atTop fun n => f n ω
a b : ℚ
hab : ↑a < ↑b
⊢ ¬((∃ᶠ (n : ℕ) in atTop, f n ω < ↑a) ∧ ∃ᶠ (n : ℕ) in atTop, ↑b < f n ω)

tactic: exact not_frequently_of_upcrossings_lt_top hab (hf₂ a b (Rat.cast_lt.1 hab)).ne
state_before: case pos.intro.intro
Ω : Type u_1
ι : Type u_2
m0 : MeasurableSpace Ω
μ : Measure Ω
ℱ : Filtration ℕ m0
a✝ b✝ : ℝ
f : ℕ → Ω → ℝ
ω : Ω
R : ℝ≥0
hf₁ : liminf (fun n => ↑‖f n ω‖₊) atTop < ⊤
hf₂ : ∀ (a b : ℚ), a < b → upcrossings (↑a) (↑b) f ω < ⊤
h :
  (IsBoundedUnder (fun x x_1 => x ≤ x_1) atTop fun n => f n ω) ∧
    IsBoundedUnder (fun x x_1 => x ≥ x_1) atTop fun n => f n ω
a b : ℚ
hab : ↑a < ↑b
⊢ ¬((∃ᶠ (n : ℕ) in atTop, f n ω < ↑a) ∧ ∃ᶠ (n : ℕ) in atTop, ↑b < f n ω)
state_after: no goals

tactic: obtain ⟨a, b, hab, h₁, h₂⟩ := ENNReal.exists_upcrossings_of_not_bounded_under hf₁.ne h
state_before: case neg
Ω : Type u_1
ι : Type u_2
m0 : MeasurableSpace Ω
μ : Measure Ω
ℱ : Filtration ℕ m0
a b : ℝ
f : ℕ → Ω → ℝ
ω : Ω
R : ℝ≥0
hf₁ : liminf (fun n => ↑‖f n ω‖₊) atTop < ⊤
hf₂ : ∀ (a b : ℚ), a < b → upcrossings (↑a) (↑b) f ω < ⊤
h : ¬IsBoundedUnder (fun x x_1 => x ≤ x_1) atTop fun n => |f n ω|
⊢ ∃ c, Tendsto (fun n => f n ω) atTop (𝓝 c)
state_after: case neg.intro.intro.intro.intro
Ω : Type u_1
ι : Type u_2
m0 : MeasurableSpace Ω
μ : Measure Ω
ℱ : Filtration ℕ m0
a✝ b✝ : ℝ
f : ℕ → Ω → ℝ
ω : Ω
R : ℝ≥0
hf₁ : liminf (fun n => ↑‖f n ω‖₊) atTop < ⊤
hf₂ : ∀ (a b : ℚ), a < b → upcrossings (↑a) (↑b) f ω < ⊤
h : ¬IsBoundedUnder (fun x x_1 => x ≤ x_1) atTop fun n => |f n ω|
a b : ℚ
hab : a < b
h₁ : ∃ᶠ (i : ℕ) in atTop, f i ω < ↑a
h₂ : ∃ᶠ (i : ℕ) in atTop, ↑b < f i ω
⊢ ∃ c, Tendsto (fun n => f n ω) atTop (𝓝 c)

tactic: exact
  False.elim ((hf₂ a b hab).ne (upcrossings_eq_top_of_frequently_lt (Rat.cast_lt.2 hab) h₁ h₂))
state_before: case neg.intro.intro.intro.intro
Ω : Type u_1
ι : Type u_2
m0 : MeasurableSpace Ω
μ : Measure Ω
ℱ : Filtration ℕ m0
a✝ b✝ : ℝ
f : ℕ → Ω → ℝ
ω : Ω
R : ℝ≥0
hf₁ : liminf (fun n => ↑‖f n ω‖₊) atTop < ⊤
hf₂ : ∀ (a b : ℚ), a < b → upcrossings (↑a) (↑b) f ω < ⊤
h : ¬IsBoundedUnder (fun x x_1 => x ≤ x_1) atTop fun n => |f n ω|
a b : ℚ
hab : a < b
h₁ : ∃ᶠ (i : ℕ) in atTop, f i ω < ↑a
h₂ : ∃ᶠ (i : ℕ) in atTop, ↑b < f i ω
⊢ ∃ c, Tendsto (fun n => f n ω) atTop (𝓝 c)
state_after: no goals