Theorem: Real.exists_isLUB
File: Mathlib/Data/Real/Basic.lean

tactic: rcases hne, hbdd with ⟨⟨L, hL⟩, ⟨U, hU⟩⟩
state_before: x y : ℝ
S : Set ℝ
hne : Set.Nonempty S
hbdd : BddAbove S
⊢ ∃ x, IsLUB S x

tactic: have : ∀ d : ℕ, BddAbove { m : ℤ | ∃ y ∈ S, (m : ℝ) ≤ y * d } := by
  cases' exists_int_gt U with k hk
  refine' fun d => ⟨k * d, fun z h => _⟩
  rcases h with ⟨y, yS, hy⟩
  refine' Int.cast_le.1 (hy.trans _)
  push_cast
  exact mul_le_mul_of_nonneg_right ((hU yS).trans hk.le) d.cast_nonneg
state_before: case intro.intro
x y : ℝ
S : Set ℝ
L : ℝ
hL : L ∈ S
U : ℝ
hU : U ∈ upperBounds S
⊢ ∃ x, IsLUB S x

tactic: choose f hf using fun d : ℕ =>
  Int.exists_greatest_of_bdd (this d) ⟨⌊L * d⌋, L, hL, Int.floor_le _⟩
state_before: case intro.intro
x y : ℝ
S : Set ℝ
L : ℝ
hL : L ∈ S
U : ℝ
hU : U ∈ upperBounds S
this : ∀ (d : ℕ), BddAbove {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d}
⊢ ∃ x, IsLUB S x

tactic: have hf₁ : ∀ n > 0, ∃ y ∈ S, ((f n / n : ℚ) : ℝ) ≤ y := fun n n0 =>
  let ⟨y, yS, hy⟩ := (hf n).1
  ⟨y, yS, by simpa using (div_le_iff (Nat.cast_pos.2 n0 : (_ : ℝ) < _)).2 hy⟩
state_before: case intro.intro
x y : ℝ
S : Set ℝ
L : ℝ
hL : L ∈ S
U : ℝ
hU : U ∈ upperBounds S
this : ∀ (d : ℕ), BddAbove {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d}
f : ℕ → ℤ
hf : ∀ (d : ℕ), f d ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} ∧ ∀ (z : ℤ), z ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} → z ≤ f d
⊢ ∃ x, IsLUB S x

tactic: have hf₂ : ∀ n > 0, ∀ y ∈ S, (y - ((n : ℕ) : ℝ)⁻¹) < (f n / n : ℚ) := by
  intro n n0 y yS
  have := (Int.sub_one_lt_floor _).trans_le (Int.cast_le.2 <| (hf n).2 _ ⟨y, yS, Int.floor_le _⟩)
  simp only [Rat.cast_div, Rat.cast_coe_int, Rat.cast_coe_nat, gt_iff_lt]
  rwa [lt_div_iff (Nat.cast_pos.2 n0 : (_ : ℝ) < _), sub_mul, _root_.inv_mul_cancel]
  exact ne_of_gt (Nat.cast_pos.2 n0)
state_before: case intro.intro
x y : ℝ
S : Set ℝ
L : ℝ
hL : L ∈ S
U : ℝ
hU : U ∈ upperBounds S
this : ∀ (d : ℕ), BddAbove {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d}
f : ℕ → ℤ
hf : ∀ (d : ℕ), f d ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} ∧ ∀ (z : ℤ), z ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} → z ≤ f d
hf₁ : ∀ (n : ℕ), n > 0 → ∃ y, y ∈ S ∧ ↑(↑(f n) / ↑n) ≤ y
⊢ ∃ x, IsLUB S x

tactic: have hg : IsCauSeq abs (fun n => f n / n : ℕ → ℚ) := by
  intro ε ε0
  suffices ∀ j ≥ ⌈ε⁻¹⌉₊, ∀ k ≥ ⌈ε⁻¹⌉₊, (f j / j - f k / k : ℚ) < ε by
    refine' ⟨_, fun j ij => abs_lt.2 ⟨_, this _ ij _ le_rfl⟩⟩
    rw [neg_lt, neg_sub]
    exact this _ le_rfl _ ij
  intro j ij k ik
  replace ij := le_trans (Nat.le_ceil _) (Nat.cast_le.2 ij)
  replace ik := le_trans (Nat.le_ceil _) (Nat.cast_le.2 ik)
  have j0 := Nat.cast_pos.1 ((inv_pos.2 ε0).trans_le ij)
  have k0 := Nat.cast_pos.1 ((inv_pos.2 ε0).trans_le ik)
  rcases hf₁ _ j0 with ⟨y, yS, hy⟩
  refine' lt_of_lt_of_le ((@Rat.cast_lt ℝ _ _ _).1 _) ((inv_le ε0 (Nat.cast_pos.2 k0)).1 ik)
  simpa using sub_lt_iff_lt_add'.2 (lt_of_le_of_lt hy <| sub_lt_iff_lt_add.1 <| hf₂ _ k0 _ yS)
state_before: case intro.intro
x y : ℝ
S : Set ℝ
L : ℝ
hL : L ∈ S
U : ℝ
hU : U ∈ upperBounds S
this : ∀ (d : ℕ), BddAbove {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d}
f : ℕ → ℤ
hf : ∀ (d : ℕ), f d ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} ∧ ∀ (z : ℤ), z ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} → z ≤ f d
hf₁ : ∀ (n : ℕ), n > 0 → ∃ y, y ∈ S ∧ ↑(↑(f n) / ↑n) ≤ y
hf₂ : ∀ (n : ℕ), n > 0 → ∀ (y : ℝ), y ∈ S → y - (↑n)⁻¹ < ↑(↑(f n) / ↑n)
⊢ ∃ x, IsLUB S x

tactic: let g : CauSeq ℚ abs := ⟨fun n => f n / n, hg⟩
state_before: case intro.intro
x y : ℝ
S : Set ℝ
L : ℝ
hL : L ∈ S
U : ℝ
hU : U ∈ upperBounds S
this : ∀ (d : ℕ), BddAbove {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d}
f : ℕ → ℤ
hf : ∀ (d : ℕ), f d ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} ∧ ∀ (z : ℤ), z ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} → z ≤ f d
hf₁ : ∀ (n : ℕ), n > 0 → ∃ y, y ∈ S ∧ ↑(↑(f n) / ↑n) ≤ y
hf₂ : ∀ (n : ℕ), n > 0 → ∀ (y : ℝ), y ∈ S → y - (↑n)⁻¹ < ↑(↑(f n) / ↑n)
hg : IsCauSeq abs fun n => ↑(f n) / ↑n
⊢ ∃ x, IsLUB S x

tactic: refine' ⟨mk g, ⟨fun x xS => _, fun y h => _⟩⟩
state_before: case intro.intro
x y : ℝ
S : Set ℝ
L : ℝ
hL : L ∈ S
U : ℝ
hU : U ∈ upperBounds S
this : ∀ (d : ℕ), BddAbove {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d}
f : ℕ → ℤ
hf : ∀ (d : ℕ), f d ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} ∧ ∀ (z : ℤ), z ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} → z ≤ f d
hf₁ : ∀ (n : ℕ), n > 0 → ∃ y, y ∈ S ∧ ↑(↑(f n) / ↑n) ≤ y
hf₂ : ∀ (n : ℕ), n > 0 → ∀ (y : ℝ), y ∈ S → y - (↑n)⁻¹ < ↑(↑(f n) / ↑n)
hg : IsCauSeq abs fun n => ↑(f n) / ↑n
g : CauSeq ℚ abs := { val := fun n => ↑(f n) / ↑n, property := hg }
⊢ ∃ x, IsLUB S x

tactic: cases' exists_int_gt U with k hk
state_before: x y : ℝ
S : Set ℝ
L : ℝ
hL : L ∈ S
U : ℝ
hU : U ∈ upperBounds S
⊢ ∀ (d : ℕ), BddAbove {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d}

tactic: refine' fun d => ⟨k * d, fun z h => _⟩
state_before: case intro
x y : ℝ
S : Set ℝ
L : ℝ
hL : L ∈ S
U : ℝ
hU : U ∈ upperBounds S
k : ℤ
hk : U < ↑k
⊢ ∀ (d : ℕ), BddAbove {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d}

tactic: rcases h with ⟨y, yS, hy⟩
state_before: case intro
x y : ℝ
S : Set ℝ
L : ℝ
hL : L ∈ S
U : ℝ
hU : U ∈ upperBounds S
k : ℤ
hk : U < ↑k
d : ℕ
z : ℤ
h : z ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d}
⊢ z ≤ k * ↑d

tactic: refine' Int.cast_le.1 (hy.trans _)
state_before: case intro.intro.intro
x y✝ : ℝ
S : Set ℝ
L : ℝ
hL : L ∈ S
U : ℝ
hU : U ∈ upperBounds S
k : ℤ
hk : U < ↑k
d : ℕ
z : ℤ
y : ℝ
yS : y ∈ S
hy : ↑z ≤ y * ↑d
⊢ z ≤ k * ↑d

tactic: push_cast
state_before: case intro.intro.intro
x y✝ : ℝ
S : Set ℝ
L : ℝ
hL : L ∈ S
U : ℝ
hU : U ∈ upperBounds S
k : ℤ
hk : U < ↑k
d : ℕ
z : ℤ
y : ℝ
yS : y ∈ S
hy : ↑z ≤ y * ↑d
⊢ y * ↑d ≤ ↑(k * ↑d)

tactic: exact mul_le_mul_of_nonneg_right ((hU yS).trans hk.le) d.cast_nonneg
state_before: case intro.intro.intro
x y✝ : ℝ
S : Set ℝ
L : ℝ
hL : L ∈ S
U : ℝ
hU : U ∈ upperBounds S
k : ℤ
hk : U < ↑k
d : ℕ
z : ℤ
y : ℝ
yS : y ∈ S
hy : ↑z ≤ y * ↑d
⊢ y * ↑d ≤ ↑k * ↑d

tactic: simpa using (div_le_iff (Nat.cast_pos.2 n0 : (_ : ℝ) < _)).2 hy
state_before: x y✝ : ℝ
S : Set ℝ
L : ℝ
hL : L ∈ S
U : ℝ
hU : U ∈ upperBounds S
this : ∀ (d : ℕ), BddAbove {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d}
f : ℕ → ℤ
hf : ∀ (d : ℕ), f d ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} ∧ ∀ (z : ℤ), z ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} → z ≤ f d
n : ℕ
n0 : n > 0
y : ℝ
yS : y ∈ S
hy : ↑(f n) ≤ y * ↑n
⊢ ↑(↑(f n) / ↑n) ≤ y

tactic: intro n n0 y yS
state_before: x y : ℝ
S : Set ℝ
L : ℝ
hL : L ∈ S
U : ℝ
hU : U ∈ upperBounds S
this : ∀ (d : ℕ), BddAbove {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d}
f : ℕ → ℤ
hf : ∀ (d : ℕ), f d ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} ∧ ∀ (z : ℤ), z ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} → z ≤ f d
hf₁ : ∀ (n : ℕ), n > 0 → ∃ y, y ∈ S ∧ ↑(↑(f n) / ↑n) ≤ y
⊢ ∀ (n : ℕ), n > 0 → ∀ (y : ℝ), y ∈ S → y - (↑n)⁻¹ < ↑(↑(f n) / ↑n)

tactic: have := (Int.sub_one_lt_floor _).trans_le (Int.cast_le.2 <| (hf n).2 _ ⟨y, yS, Int.floor_le _⟩)
state_before: x y✝ : ℝ
S : Set ℝ
L : ℝ
hL : L ∈ S
U : ℝ
hU : U ∈ upperBounds S
this : ∀ (d : ℕ), BddAbove {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d}
f : ℕ → ℤ
hf : ∀ (d : ℕ), f d ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} ∧ ∀ (z : ℤ), z ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} → z ≤ f d
hf₁ : ∀ (n : ℕ), n > 0 → ∃ y, y ∈ S ∧ ↑(↑(f n) / ↑n) ≤ y
n : ℕ
n0 : n > 0
y : ℝ
yS : y ∈ S
⊢ y - (↑n)⁻¹ < ↑(↑(f n) / ↑n)

tactic: simp only [Rat.cast_div, Rat.cast_coe_int, Rat.cast_coe_nat, gt_iff_lt]
state_before: x y✝ : ℝ
S : Set ℝ
L : ℝ
hL : L ∈ S
U : ℝ
hU : U ∈ upperBounds S
this✝ : ∀ (d : ℕ), BddAbove {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d}
f : ℕ → ℤ
hf : ∀ (d : ℕ), f d ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} ∧ ∀ (z : ℤ), z ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} → z ≤ f d
hf₁ : ∀ (n : ℕ), n > 0 → ∃ y, y ∈ S ∧ ↑(↑(f n) / ↑n) ≤ y
n : ℕ
n0 : n > 0
y : ℝ
yS : y ∈ S
this : y * ↑n - 1 < ↑(f n)
⊢ y - (↑n)⁻¹ < ↑(↑(f n) / ↑n)

tactic: rwa [lt_div_iff (Nat.cast_pos.2 n0 : (_ : ℝ) < _), sub_mul, _root_.inv_mul_cancel]
state_before: x y✝ : ℝ
S : Set ℝ
L : ℝ
hL : L ∈ S
U : ℝ
hU : U ∈ upperBounds S
this✝ : ∀ (d : ℕ), BddAbove {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d}
f : ℕ → ℤ
hf : ∀ (d : ℕ), f d ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} ∧ ∀ (z : ℤ), z ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} → z ≤ f d
hf₁ : ∀ (n : ℕ), n > 0 → ∃ y, y ∈ S ∧ ↑(↑(f n) / ↑n) ≤ y
n : ℕ
n0 : n > 0
y : ℝ
yS : y ∈ S
this : y * ↑n - 1 < ↑(f n)
⊢ y - (↑n)⁻¹ < ↑(f n) / ↑n

tactic: exact ne_of_gt (Nat.cast_pos.2 n0)
state_before: x y✝ : ℝ
S : Set ℝ
L : ℝ
hL : L ∈ S
U : ℝ
hU : U ∈ upperBounds S
this✝ : ∀ (d : ℕ), BddAbove {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d}
f : ℕ → ℤ
hf : ∀ (d : ℕ), f d ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} ∧ ∀ (z : ℤ), z ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} → z ≤ f d
hf₁ : ∀ (n : ℕ), n > 0 → ∃ y, y ∈ S ∧ ↑(↑(f n) / ↑n) ≤ y
n : ℕ
n0 : n > 0
y : ℝ
yS : y ∈ S
this : y * ↑n - 1 < ↑(f n)
⊢ ↑n ≠ 0

tactic: intro ε ε0
state_before: x y : ℝ
S : Set ℝ
L : ℝ
hL : L ∈ S
U : ℝ
hU : U ∈ upperBounds S
this : ∀ (d : ℕ), BddAbove {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d}
f : ℕ → ℤ
hf : ∀ (d : ℕ), f d ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} ∧ ∀ (z : ℤ), z ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} → z ≤ f d
hf₁ : ∀ (n : ℕ), n > 0 → ∃ y, y ∈ S ∧ ↑(↑(f n) / ↑n) ≤ y
hf₂ : ∀ (n : ℕ), n > 0 → ∀ (y : ℝ), y ∈ S → y - (↑n)⁻¹ < ↑(↑(f n) / ↑n)
⊢ IsCauSeq abs fun n => ↑(f n) / ↑n

tactic: suffices ∀ j ≥ ⌈ε⁻¹⌉₊, ∀ k ≥ ⌈ε⁻¹⌉₊, (f j / j - f k / k : ℚ) < ε by
  refine' ⟨_, fun j ij => abs_lt.2 ⟨_, this _ ij _ le_rfl⟩⟩
  rw [neg_lt, neg_sub]
  exact this _ le_rfl _ ij
state_before: x y : ℝ
S : Set ℝ
L : ℝ
hL : L ∈ S
U : ℝ
hU : U ∈ upperBounds S
this : ∀ (d : ℕ), BddAbove {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d}
f : ℕ → ℤ
hf : ∀ (d : ℕ), f d ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} ∧ ∀ (z : ℤ), z ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} → z ≤ f d
hf₁ : ∀ (n : ℕ), n > 0 → ∃ y, y ∈ S ∧ ↑(↑(f n) / ↑n) ≤ y
hf₂ : ∀ (n : ℕ), n > 0 → ∀ (y : ℝ), y ∈ S → y - (↑n)⁻¹ < ↑(↑(f n) / ↑n)
ε : ℚ
ε0 : ε > 0
⊢ ∃ i, ∀ (j : ℕ), j ≥ i → abs ((fun n => ↑(f n) / ↑n) j - (fun n => ↑(f n) / ↑n) i) < ε

tactic: intro j ij k ik
state_before: x y : ℝ
S : Set ℝ
L : ℝ
hL : L ∈ S
U : ℝ
hU : U ∈ upperBounds S
this : ∀ (d : ℕ), BddAbove {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d}
f : ℕ → ℤ
hf : ∀ (d : ℕ), f d ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} ∧ ∀ (z : ℤ), z ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} → z ≤ f d
hf₁ : ∀ (n : ℕ), n > 0 → ∃ y, y ∈ S ∧ ↑(↑(f n) / ↑n) ≤ y
hf₂ : ∀ (n : ℕ), n > 0 → ∀ (y : ℝ), y ∈ S → y - (↑n)⁻¹ < ↑(↑(f n) / ↑n)
ε : ℚ
ε0 : ε > 0
⊢ ∀ (j : ℕ), j ≥ ⌈ε⁻¹⌉₊ → ∀ (k : ℕ), k ≥ ⌈ε⁻¹⌉₊ → ↑(f j) / ↑j - ↑(f k) / ↑k < ε

tactic: replace ij := le_trans (Nat.le_ceil _) (Nat.cast_le.2 ij)
state_before: x y : ℝ
S : Set ℝ
L : ℝ
hL : L ∈ S
U : ℝ
hU : U ∈ upperBounds S
this : ∀ (d : ℕ), BddAbove {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d}
f : ℕ → ℤ
hf : ∀ (d : ℕ), f d ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} ∧ ∀ (z : ℤ), z ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} → z ≤ f d
hf₁ : ∀ (n : ℕ), n > 0 → ∃ y, y ∈ S ∧ ↑(↑(f n) / ↑n) ≤ y
hf₂ : ∀ (n : ℕ), n > 0 → ∀ (y : ℝ), y ∈ S → y - (↑n)⁻¹ < ↑(↑(f n) / ↑n)
ε : ℚ
ε0 : ε > 0
j : ℕ
ij : j ≥ ⌈ε⁻¹⌉₊
k : ℕ
ik : k ≥ ⌈ε⁻¹⌉₊
⊢ ↑(f j) / ↑j - ↑(f k) / ↑k < ε

tactic: replace ik := le_trans (Nat.le_ceil _) (Nat.cast_le.2 ik)
state_before: x y : ℝ
S : Set ℝ
L : ℝ
hL : L ∈ S
U : ℝ
hU : U ∈ upperBounds S
this : ∀ (d : ℕ), BddAbove {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d}
f : ℕ → ℤ
hf : ∀ (d : ℕ), f d ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} ∧ ∀ (z : ℤ), z ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} → z ≤ f d
hf₁ : ∀ (n : ℕ), n > 0 → ∃ y, y ∈ S ∧ ↑(↑(f n) / ↑n) ≤ y
hf₂ : ∀ (n : ℕ), n > 0 → ∀ (y : ℝ), y ∈ S → y - (↑n)⁻¹ < ↑(↑(f n) / ↑n)
ε : ℚ
ε0 : ε > 0
j k : ℕ
ik : k ≥ ⌈ε⁻¹⌉₊
ij : ε⁻¹ ≤ ↑j
⊢ ↑(f j) / ↑j - ↑(f k) / ↑k < ε

tactic: have j0 := Nat.cast_pos.1 ((inv_pos.2 ε0).trans_le ij)
state_before: x y : ℝ
S : Set ℝ
L : ℝ
hL : L ∈ S
U : ℝ
hU : U ∈ upperBounds S
this : ∀ (d : ℕ), BddAbove {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d}
f : ℕ → ℤ
hf : ∀ (d : ℕ), f d ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} ∧ ∀ (z : ℤ), z ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} → z ≤ f d
hf₁ : ∀ (n : ℕ), n > 0 → ∃ y, y ∈ S ∧ ↑(↑(f n) / ↑n) ≤ y
hf₂ : ∀ (n : ℕ), n > 0 → ∀ (y : ℝ), y ∈ S → y - (↑n)⁻¹ < ↑(↑(f n) / ↑n)
ε : ℚ
ε0 : ε > 0
j k : ℕ
ij : ε⁻¹ ≤ ↑j
ik : ε⁻¹ ≤ ↑k
⊢ ↑(f j) / ↑j - ↑(f k) / ↑k < ε

tactic: have k0 := Nat.cast_pos.1 ((inv_pos.2 ε0).trans_le ik)
state_before: x y : ℝ
S : Set ℝ
L : ℝ
hL : L ∈ S
U : ℝ
hU : U ∈ upperBounds S
this : ∀ (d : ℕ), BddAbove {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d}
f : ℕ → ℤ
hf : ∀ (d : ℕ), f d ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} ∧ ∀ (z : ℤ), z ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} → z ≤ f d
hf₁ : ∀ (n : ℕ), n > 0 → ∃ y, y ∈ S ∧ ↑(↑(f n) / ↑n) ≤ y
hf₂ : ∀ (n : ℕ), n > 0 → ∀ (y : ℝ), y ∈ S → y - (↑n)⁻¹ < ↑(↑(f n) / ↑n)
ε : ℚ
ε0 : ε > 0
j k : ℕ
ij : ε⁻¹ ≤ ↑j
ik : ε⁻¹ ≤ ↑k
j0 : 0 < j
⊢ ↑(f j) / ↑j - ↑(f k) / ↑k < ε

tactic: rcases hf₁ _ j0 with ⟨y, yS, hy⟩
state_before: x y : ℝ
S : Set ℝ
L : ℝ
hL : L ∈ S
U : ℝ
hU : U ∈ upperBounds S
this : ∀ (d : ℕ), BddAbove {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d}
f : ℕ → ℤ
hf : ∀ (d : ℕ), f d ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} ∧ ∀ (z : ℤ), z ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} → z ≤ f d
hf₁ : ∀ (n : ℕ), n > 0 → ∃ y, y ∈ S ∧ ↑(↑(f n) / ↑n) ≤ y
hf₂ : ∀ (n : ℕ), n > 0 → ∀ (y : ℝ), y ∈ S → y - (↑n)⁻¹ < ↑(↑(f n) / ↑n)
ε : ℚ
ε0 : ε > 0
j k : ℕ
ij : ε⁻¹ ≤ ↑j
ik : ε⁻¹ ≤ ↑k
j0 : 0 < j
k0 : 0 < k
⊢ ↑(f j) / ↑j - ↑(f k) / ↑k < ε

tactic: refine' lt_of_lt_of_le ((@Rat.cast_lt ℝ _ _ _).1 _) ((inv_le ε0 (Nat.cast_pos.2 k0)).1 ik)
state_before: case intro.intro
x y✝ : ℝ
S : Set ℝ
L : ℝ
hL : L ∈ S
U : ℝ
hU : U ∈ upperBounds S
this : ∀ (d : ℕ), BddAbove {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d}
f : ℕ → ℤ
hf : ∀ (d : ℕ), f d ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} ∧ ∀ (z : ℤ), z ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} → z ≤ f d
hf₁ : ∀ (n : ℕ), n > 0 → ∃ y, y ∈ S ∧ ↑(↑(f n) / ↑n) ≤ y
hf₂ : ∀ (n : ℕ), n > 0 → ∀ (y : ℝ), y ∈ S → y - (↑n)⁻¹ < ↑(↑(f n) / ↑n)
ε : ℚ
ε0 : ε > 0
j k : ℕ
ij : ε⁻¹ ≤ ↑j
ik : ε⁻¹ ≤ ↑k
j0 : 0 < j
k0 : 0 < k
y : ℝ
yS : y ∈ S
hy : ↑(↑(f j) / ↑j) ≤ y
⊢ ↑(f j) / ↑j - ↑(f k) / ↑k < ε

tactic: simpa using sub_lt_iff_lt_add'.2 (lt_of_le_of_lt hy <| sub_lt_iff_lt_add.1 <| hf₂ _ k0 _ yS)
state_before: case intro.intro
x y✝ : ℝ
S : Set ℝ
L : ℝ
hL : L ∈ S
U : ℝ
hU : U ∈ upperBounds S
this : ∀ (d : ℕ), BddAbove {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d}
f : ℕ → ℤ
hf : ∀ (d : ℕ), f d ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} ∧ ∀ (z : ℤ), z ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} → z ≤ f d
hf₁ : ∀ (n : ℕ), n > 0 → ∃ y, y ∈ S ∧ ↑(↑(f n) / ↑n) ≤ y
hf₂ : ∀ (n : ℕ), n > 0 → ∀ (y : ℝ), y ∈ S → y - (↑n)⁻¹ < ↑(↑(f n) / ↑n)
ε : ℚ
ε0 : ε > 0
j k : ℕ
ij : ε⁻¹ ≤ ↑j
ik : ε⁻¹ ≤ ↑k
j0 : 0 < j
k0 : 0 < k
y : ℝ
yS : y ∈ S
hy : ↑(↑(f j) / ↑j) ≤ y
⊢ ↑(↑(f j) / ↑j - ↑(f k) / ↑k) < ↑(↑k)⁻¹

tactic: refine' ⟨_, fun j ij => abs_lt.2 ⟨_, this _ ij _ le_rfl⟩⟩
state_before: x y : ℝ
S : Set ℝ
L : ℝ
hL : L ∈ S
U : ℝ
hU : U ∈ upperBounds S
this✝ : ∀ (d : ℕ), BddAbove {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d}
f : ℕ → ℤ
hf : ∀ (d : ℕ), f d ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} ∧ ∀ (z : ℤ), z ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} → z ≤ f d
hf₁ : ∀ (n : ℕ), n > 0 → ∃ y, y ∈ S ∧ ↑(↑(f n) / ↑n) ≤ y
hf₂ : ∀ (n : ℕ), n > 0 → ∀ (y : ℝ), y ∈ S → y - (↑n)⁻¹ < ↑(↑(f n) / ↑n)
ε : ℚ
ε0 : ε > 0
this : ∀ (j : ℕ), j ≥ ⌈ε⁻¹⌉₊ → ∀ (k : ℕ), k ≥ ⌈ε⁻¹⌉₊ → ↑(f j) / ↑j - ↑(f k) / ↑k < ε
⊢ ∃ i, ∀ (j : ℕ), j ≥ i → abs ((fun n => ↑(f n) / ↑n) j - (fun n => ↑(f n) / ↑n) i) < ε

tactic: rw [neg_lt, neg_sub]
state_before: x y : ℝ
S : Set ℝ
L : ℝ
hL : L ∈ S
U : ℝ
hU : U ∈ upperBounds S
this✝ : ∀ (d : ℕ), BddAbove {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d}
f : ℕ → ℤ
hf : ∀ (d : ℕ), f d ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} ∧ ∀ (z : ℤ), z ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} → z ≤ f d
hf₁ : ∀ (n : ℕ), n > 0 → ∃ y, y ∈ S ∧ ↑(↑(f n) / ↑n) ≤ y
hf₂ : ∀ (n : ℕ), n > 0 → ∀ (y : ℝ), y ∈ S → y - (↑n)⁻¹ < ↑(↑(f n) / ↑n)
ε : ℚ
ε0 : ε > 0
this : ∀ (j : ℕ), j ≥ ⌈ε⁻¹⌉₊ → ∀ (k : ℕ), k ≥ ⌈ε⁻¹⌉₊ → ↑(f j) / ↑j - ↑(f k) / ↑k < ε
j : ℕ
ij : j ≥ ⌈ε⁻¹⌉₊
⊢ -ε < (fun n => ↑(f n) / ↑n) j - (fun n => ↑(f n) / ↑n) ⌈ε⁻¹⌉₊

tactic: exact this _ le_rfl _ ij
state_before: x y : ℝ
S : Set ℝ
L : ℝ
hL : L ∈ S
U : ℝ
hU : U ∈ upperBounds S
this✝ : ∀ (d : ℕ), BddAbove {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d}
f : ℕ → ℤ
hf : ∀ (d : ℕ), f d ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} ∧ ∀ (z : ℤ), z ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} → z ≤ f d
hf₁ : ∀ (n : ℕ), n > 0 → ∃ y, y ∈ S ∧ ↑(↑(f n) / ↑n) ≤ y
hf₂ : ∀ (n : ℕ), n > 0 → ∀ (y : ℝ), y ∈ S → y - (↑n)⁻¹ < ↑(↑(f n) / ↑n)
ε : ℚ
ε0 : ε > 0
this : ∀ (j : ℕ), j ≥ ⌈ε⁻¹⌉₊ → ∀ (k : ℕ), k ≥ ⌈ε⁻¹⌉₊ → ↑(f j) / ↑j - ↑(f k) / ↑k < ε
j : ℕ
ij : j ≥ ⌈ε⁻¹⌉₊
⊢ (fun n => ↑(f n) / ↑n) ⌈ε⁻¹⌉₊ - (fun n => ↑(f n) / ↑n) j < ε

tactic: refine' le_of_forall_ge_of_dense fun z xz => _
state_before: case intro.intro.refine'_1
x✝ y : ℝ
S : Set ℝ
L : ℝ
hL : L ∈ S
U : ℝ
hU : U ∈ upperBounds S
this : ∀ (d : ℕ), BddAbove {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d}
f : ℕ → ℤ
hf : ∀ (d : ℕ), f d ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} ∧ ∀ (z : ℤ), z ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} → z ≤ f d
hf₁ : ∀ (n : ℕ), n > 0 → ∃ y, y ∈ S ∧ ↑(↑(f n) / ↑n) ≤ y
hf₂ : ∀ (n : ℕ), n > 0 → ∀ (y : ℝ), y ∈ S → y - (↑n)⁻¹ < ↑(↑(f n) / ↑n)
hg : IsCauSeq abs fun n => ↑(f n) / ↑n
g : CauSeq ℚ abs := { val := fun n => ↑(f n) / ↑n, property := hg }
x : ℝ
xS : x ∈ S
⊢ x ≤ mk g

tactic: cases' exists_nat_gt (x - z)⁻¹ with K hK
state_before: case intro.intro.refine'_1
x✝ y : ℝ
S : Set ℝ
L : ℝ
hL : L ∈ S
U : ℝ
hU : U ∈ upperBounds S
this : ∀ (d : ℕ), BddAbove {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d}
f : ℕ → ℤ
hf : ∀ (d : ℕ), f d ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} ∧ ∀ (z : ℤ), z ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} → z ≤ f d
hf₁ : ∀ (n : ℕ), n > 0 → ∃ y, y ∈ S ∧ ↑(↑(f n) / ↑n) ≤ y
hf₂ : ∀ (n : ℕ), n > 0 → ∀ (y : ℝ), y ∈ S → y - (↑n)⁻¹ < ↑(↑(f n) / ↑n)
hg : IsCauSeq abs fun n => ↑(f n) / ↑n
g : CauSeq ℚ abs := { val := fun n => ↑(f n) / ↑n, property := hg }
x : ℝ
xS : x ∈ S
z : ℝ
xz : z < x
⊢ z ≤ mk g

tactic: refine' le_mk_of_forall_le ⟨K, fun n nK => _⟩
state_before: case intro.intro.refine'_1.intro
x✝ y : ℝ
S : Set ℝ
L : ℝ
hL : L ∈ S
U : ℝ
hU : U ∈ upperBounds S
this : ∀ (d : ℕ), BddAbove {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d}
f : ℕ → ℤ
hf : ∀ (d : ℕ), f d ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} ∧ ∀ (z : ℤ), z ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} → z ≤ f d
hf₁ : ∀ (n : ℕ), n > 0 → ∃ y, y ∈ S ∧ ↑(↑(f n) / ↑n) ≤ y
hf₂ : ∀ (n : ℕ), n > 0 → ∀ (y : ℝ), y ∈ S → y - (↑n)⁻¹ < ↑(↑(f n) / ↑n)
hg : IsCauSeq abs fun n => ↑(f n) / ↑n
g : CauSeq ℚ abs := { val := fun n => ↑(f n) / ↑n, property := hg }
x : ℝ
xS : x ∈ S
z : ℝ
xz : z < x
K : ℕ
hK : (x - z)⁻¹ < ↑K
⊢ z ≤ mk g

tactic: replace xz := sub_pos.2 xz
state_before: case intro.intro.refine'_1.intro
x✝ y : ℝ
S : Set ℝ
L : ℝ
hL : L ∈ S
U : ℝ
hU : U ∈ upperBounds S
this : ∀ (d : ℕ), BddAbove {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d}
f : ℕ → ℤ
hf : ∀ (d : ℕ), f d ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} ∧ ∀ (z : ℤ), z ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} → z ≤ f d
hf₁ : ∀ (n : ℕ), n > 0 → ∃ y, y ∈ S ∧ ↑(↑(f n) / ↑n) ≤ y
hf₂ : ∀ (n : ℕ), n > 0 → ∀ (y : ℝ), y ∈ S → y - (↑n)⁻¹ < ↑(↑(f n) / ↑n)
hg : IsCauSeq abs fun n => ↑(f n) / ↑n
g : CauSeq ℚ abs := { val := fun n => ↑(f n) / ↑n, property := hg }
x : ℝ
xS : x ∈ S
z : ℝ
xz : z < x
K : ℕ
hK : (x - z)⁻¹ < ↑K
n : ℕ
nK : n ≥ K
⊢ z ≤ ↑(↑g n)

tactic: replace hK := hK.le.trans (Nat.cast_le.2 nK)
state_before: case intro.intro.refine'_1.intro
x✝ y : ℝ
S : Set ℝ
L : ℝ
hL : L ∈ S
U : ℝ
hU : U ∈ upperBounds S
this : ∀ (d : ℕ), BddAbove {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d}
f : ℕ → ℤ
hf : ∀ (d : ℕ), f d ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} ∧ ∀ (z : ℤ), z ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} → z ≤ f d
hf₁ : ∀ (n : ℕ), n > 0 → ∃ y, y ∈ S ∧ ↑(↑(f n) / ↑n) ≤ y
hf₂ : ∀ (n : ℕ), n > 0 → ∀ (y : ℝ), y ∈ S → y - (↑n)⁻¹ < ↑(↑(f n) / ↑n)
hg : IsCauSeq abs fun n => ↑(f n) / ↑n
g : CauSeq ℚ abs := { val := fun n => ↑(f n) / ↑n, property := hg }
x : ℝ
xS : x ∈ S
z : ℝ
K : ℕ
hK : (x - z)⁻¹ < ↑K
n : ℕ
nK : n ≥ K
xz : 0 < x - z
⊢ z ≤ ↑(↑g n)

tactic: have n0 : 0 < n := Nat.cast_pos.1 ((inv_pos.2 xz).trans_le hK)
state_before: case intro.intro.refine'_1.intro
x✝ y : ℝ
S : Set ℝ
L : ℝ
hL : L ∈ S
U : ℝ
hU : U ∈ upperBounds S
this : ∀ (d : ℕ), BddAbove {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d}
f : ℕ → ℤ
hf : ∀ (d : ℕ), f d ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} ∧ ∀ (z : ℤ), z ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} → z ≤ f d
hf₁ : ∀ (n : ℕ), n > 0 → ∃ y, y ∈ S ∧ ↑(↑(f n) / ↑n) ≤ y
hf₂ : ∀ (n : ℕ), n > 0 → ∀ (y : ℝ), y ∈ S → y - (↑n)⁻¹ < ↑(↑(f n) / ↑n)
hg : IsCauSeq abs fun n => ↑(f n) / ↑n
g : CauSeq ℚ abs := { val := fun n => ↑(f n) / ↑n, property := hg }
x : ℝ
xS : x ∈ S
z : ℝ
K n : ℕ
nK : n ≥ K
xz : 0 < x - z
hK : (x - z)⁻¹ ≤ ↑n
⊢ z ≤ ↑(↑g n)

tactic: refine' le_trans _ (hf₂ _ n0 _ xS).le
state_before: case intro.intro.refine'_1.intro
x✝ y : ℝ
S : Set ℝ
L : ℝ
hL : L ∈ S
U : ℝ
hU : U ∈ upperBounds S
this : ∀ (d : ℕ), BddAbove {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d}
f : ℕ → ℤ
hf : ∀ (d : ℕ), f d ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} ∧ ∀ (z : ℤ), z ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} → z ≤ f d
hf₁ : ∀ (n : ℕ), n > 0 → ∃ y, y ∈ S ∧ ↑(↑(f n) / ↑n) ≤ y
hf₂ : ∀ (n : ℕ), n > 0 → ∀ (y : ℝ), y ∈ S → y - (↑n)⁻¹ < ↑(↑(f n) / ↑n)
hg : IsCauSeq abs fun n => ↑(f n) / ↑n
g : CauSeq ℚ abs := { val := fun n => ↑(f n) / ↑n, property := hg }
x : ℝ
xS : x ∈ S
z : ℝ
K n : ℕ
nK : n ≥ K
xz : 0 < x - z
hK : (x - z)⁻¹ ≤ ↑n
n0 : 0 < n
⊢ z ≤ ↑(↑g n)

tactic: rwa [le_sub_comm, inv_le (Nat.cast_pos.2 n0 : (_ : ℝ) < _) xz]
state_before: case intro.intro.refine'_1.intro
x✝ y : ℝ
S : Set ℝ
L : ℝ
hL : L ∈ S
U : ℝ
hU : U ∈ upperBounds S
this : ∀ (d : ℕ), BddAbove {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d}
f : ℕ → ℤ
hf : ∀ (d : ℕ), f d ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} ∧ ∀ (z : ℤ), z ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} → z ≤ f d
hf₁ : ∀ (n : ℕ), n > 0 → ∃ y, y ∈ S ∧ ↑(↑(f n) / ↑n) ≤ y
hf₂ : ∀ (n : ℕ), n > 0 → ∀ (y : ℝ), y ∈ S → y - (↑n)⁻¹ < ↑(↑(f n) / ↑n)
hg : IsCauSeq abs fun n => ↑(f n) / ↑n
g : CauSeq ℚ abs := { val := fun n => ↑(f n) / ↑n, property := hg }
x : ℝ
xS : x ∈ S
z : ℝ
K n : ℕ
nK : n ≥ K
xz : 0 < x - z
hK : (x - z)⁻¹ ≤ ↑n
n0 : 0 < n
⊢ z ≤ x - (↑n)⁻¹

tactic: exact
  mk_le_of_forall_le
    ⟨1, fun n n1 =>
      let ⟨x, xS, hx⟩ := hf₁ _ n1
      le_trans hx (h xS)⟩
state_before: case intro.intro.refine'_2
x y✝ : ℝ
S : Set ℝ
L : ℝ
hL : L ∈ S
U : ℝ
hU : U ∈ upperBounds S
this : ∀ (d : ℕ), BddAbove {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d}
f : ℕ → ℤ
hf : ∀ (d : ℕ), f d ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} ∧ ∀ (z : ℤ), z ∈ {m | ∃ y, y ∈ S ∧ ↑m ≤ y * ↑d} → z ≤ f d
hf₁ : ∀ (n : ℕ), n > 0 → ∃ y, y ∈ S ∧ ↑(↑(f n) / ↑n) ≤ y
hf₂ : ∀ (n : ℕ), n > 0 → ∀ (y : ℝ), y ∈ S → y - (↑n)⁻¹ < ↑(↑(f n) / ↑n)
hg : IsCauSeq abs fun n => ↑(f n) / ↑n
g : CauSeq ℚ abs := { val := fun n => ↑(f n) / ↑n, property := hg }
y : ℝ
h : y ∈ upperBounds S
⊢ mk g ≤ y