# Documentation

Mathlib.Data.Real.Basic

# Real numbers from Cauchy sequences #

This file defines ℝ as the type of equivalence classes of Cauchy sequences of rational numbers. This choice is motivated by how easy it is to prove that ℝ is a commutative ring, by simply lifting everything to ℚ.

structure Real :
• ofCauchy :: (
• cauchy :

The underlying Cauchy completion

• )

The type ℝ of real numbers constructed as equivalence classes of Cauchy sequences of rational numbers.

Instances For

The type ℝ of real numbers constructed as equivalence classes of Cauchy sequences of rational numbers.

Instances For
@[simp]
theorem CauSeq.Completion.ofRat_rat {abv : } [] (q : ) :
theorem Real.ext_cauchy_iff {x : } {y : } :
x = y x.cauchy = y.cauchy
theorem Real.ext_cauchy {x : } {y : } :
x.cauchy = y.cauchyx = y

The real numbers are isomorphic to the quotient of Cauchy sequences on the rationals.

Instances For
noncomputable instance Real.instInvReal :
theorem Real.ofCauchy_zero :
{ cauchy := 0 } = 0
theorem Real.ofCauchy_one :
{ cauchy := 1 } = 1
theorem Real.ofCauchy_add (a : ) (b : ) :
{ cauchy := a + b } = { cauchy := a } + { cauchy := b }
theorem Real.ofCauchy_neg (a : ) :
{ cauchy := -a } = -{ cauchy := a }
theorem Real.ofCauchy_sub (a : ) (b : ) :
{ cauchy := a - b } = { cauchy := a } - { cauchy := b }
theorem Real.ofCauchy_mul (a : ) (b : ) :
{ cauchy := a * b } = { cauchy := a } * { cauchy := b }
theorem Real.ofCauchy_inv {f : } :
{ cauchy := f⁻¹ } = { cauchy := f }⁻¹
theorem Real.cauchy_zero :
0.cauchy = 0
theorem Real.cauchy_one :
1.cauchy = 1
theorem Real.cauchy_add (a : ) (b : ) :
(a + b).cauchy = a.cauchy + b.cauchy
theorem Real.cauchy_neg (a : ) :
(-a).cauchy = -a.cauchy
theorem Real.cauchy_mul (a : ) (b : ) :
(a * b).cauchy = a.cauchy * b.cauchy
theorem Real.cauchy_sub (a : ) (b : ) :
(a - b).cauchy = a.cauchy - b.cauchy
theorem Real.cauchy_inv (f : ) :
f⁻¹.cauchy = f.cauchy⁻¹
theorem Real.ofCauchy_natCast (n : ) :
{ cauchy := n } = n
theorem Real.ofCauchy_intCast (z : ) :
{ cauchy := z } = z
theorem Real.ofCauchy_ratCast (q : ) :
{ cauchy := q } = q
theorem Real.cauchy_natCast (n : ) :
(n).cauchy = n
theorem Real.cauchy_intCast (z : ) :
(z).cauchy = z
theorem Real.cauchy_ratCast (q : ) :
(q).cauchy = q
@[simp]
theorem Real.ringEquivCauchy_symm_apply_cauchy (cauchy : ) :
(↑() cauchy).cauchy = cauchy
@[simp]
theorem Real.ringEquivCauchy_apply (self : ) :
Real.ringEquivCauchy self = self.cauchy

Real.equivCauchy as a ring equivalence.

Instances For

Extra instances to short-circuit type class resolution.

These short-circuits have an additional property of ensuring that a computable path is found; if Field ℝ is found first, then decaying it to these typeclasses would result in a noncomputable version of them.

The real numbers are a *-ring, with the trivial *-structure.

def Real.mk (x : CauSeq abs) :

Make a real number from a Cauchy sequence of rationals (by taking the equivalence class).

Instances For
theorem Real.mk_eq {f : CauSeq abs} {g : CauSeq abs} :
= f g
theorem Real.lt_cauchy {f : CauSeq abs} {g : CauSeq abs} :
{ cauchy := Quotient.mk CauSeq.equiv f } < { cauchy := Quotient.mk CauSeq.equiv g } f < g
@[simp]
theorem Real.mk_lt {f : CauSeq abs} {g : CauSeq abs} :
< f < g
theorem Real.mk_zero :
= 0
theorem Real.mk_one :
= 1
theorem Real.mk_add {f : CauSeq abs} {g : CauSeq abs} :
Real.mk (f + g) = +
theorem Real.mk_mul {f : CauSeq abs} {g : CauSeq abs} :
Real.mk (f * g) = *
theorem Real.mk_neg {f : CauSeq abs} :
@[simp]
theorem Real.mk_pos {f : CauSeq abs} :
0 <
@[simp]
theorem Real.mk_le {f : CauSeq abs} {g : CauSeq abs} :
f g
theorem Real.ind_mk {C : } (x : ) (h : (y : CauSeq abs) → C ()) :
C x
theorem Real.add_lt_add_iff_left {a : } {b : } (c : ) :
c + a < c + b a < b
theorem Real.ratCast_lt {x : } {y : } :
x < y x < y
theorem Real.mul_pos {a : } {b : } :
0 < a0 < b0 < a * b
theorem Real.ofCauchy_sup (a : CauSeq abs) (b : CauSeq abs) :
{ cauchy := Quotient.mk CauSeq.equiv (a b) } = { cauchy := Quotient.mk CauSeq.equiv a } { cauchy := Quotient.mk CauSeq.equiv b }
@[simp]
theorem Real.mk_sup (a : CauSeq abs) (b : CauSeq abs) :
Real.mk (a b) =
theorem Real.ofCauchy_inf (a : CauSeq abs) (b : CauSeq abs) :
{ cauchy := Quotient.mk CauSeq.equiv (a b) } = { cauchy := Quotient.mk CauSeq.equiv a } { cauchy := Quotient.mk CauSeq.equiv b }
@[simp]
theorem Real.mk_inf (a : CauSeq abs) (b : CauSeq abs) :
Real.mk (a b) =
noncomputable instance Real.linearOrder :
noncomputable instance Real.linearOrderedCommRing :
noncomputable instance Real.instLinearOrderedRingReal :
noncomputable instance Real.instLinearOrderedFieldReal :
noncomputable instance Real.field :
noncomputable instance Real.instDivisionRingReal :
noncomputable instance Real.decidableLT (a : ) (b : ) :
Decidable (a < b)
noncomputable instance Real.decidableLE (a : ) (b : ) :
noncomputable instance Real.decidableEq (a : ) (b : ) :
Decidable (a = b)
unsafe instance Real.instReprReal :

Show an underlying cauchy sequence for real numbers.

The representative chosen is the one passed in the VM to Quot.mk, so two cauchy sequences converging to the same number may be printed differently.

theorem Real.le_mk_of_forall_le {x : } {f : CauSeq abs} :
(i, ∀ (j : ), j ix ↑(f j)) → x
theorem Real.mk_le_of_forall_le {f : CauSeq abs} {x : } (h : i, ∀ (j : ), j i↑(f j) x) :
x
theorem Real.mk_near_of_forall_near {f : CauSeq abs} {x : } {ε : } (H : i, ∀ (j : ), j i|↑(f j) - x| ε) :
| - x| ε
theorem Real.isCauSeq_iff_lift {f : } :
IsCauSeq abs f IsCauSeq abs fun i => ↑(f i)
theorem Real.of_near (f : ) (x : ) (h : ∀ (ε : ), ε > 0i, ∀ (j : ), j i|↑(f j) - x| < ε) :
h', Real.mk { val := f, property := h' } = x
theorem Real.exists_floor (x : ) :
ub, ub x ∀ (z : ), z xz ub
theorem Real.exists_isLUB (S : ) (hne : ) (hbdd : ) :
x, IsLUB S x
noncomputable instance Real.instSupSetReal :
theorem Real.sSup_def (S : ) :
sSup S = if h : then Classical.choose (_ : x, IsLUB S x) else 0
theorem Real.isLUB_sSup (S : ) (h₁ : ) (h₂ : ) :
IsLUB S (sSup S)
noncomputable instance Real.instInfSetReal :
theorem Real.sInf_def (S : ) :
sInf S = -sSup (-S)
theorem Real.is_glb_sInf (S : ) (h₁ : ) (h₂ : ) :
IsGLB S (sInf S)
theorem Real.lt_sInf_add_pos {s : } (h : ) {ε : } (hε : 0 < ε) :
a, a s a < sInf s + ε
theorem Real.add_neg_lt_sSup {s : } (h : ) {ε : } (hε : ε < 0) :
a, a s sSup s + ε < a
theorem Real.sInf_le_iff {s : } (h : ) (h' : ) {a : } :
sInf s a ∀ (ε : ), 0 < εx, x s x < a + ε
theorem Real.le_sSup_iff {s : } (h : ) (h' : ) {a : } :
a sSup s ∀ (ε : ), ε < 0x, x s a + ε < x
@[simp]
theorem Real.sSup_empty :
= 0
theorem Real.ciSup_empty {α : Sort u_1} [] (f : α) :
⨆ (i : α), f i = 0
@[simp]
theorem Real.ciSup_const_zero {α : Sort u_1} :
⨆ (x : α), 0 = 0
theorem Real.sSup_of_not_bddAbove {s : } (hs : ) :
sSup s = 0
theorem Real.iSup_of_not_bddAbove {α : Sort u_1} {f : α} (hf : ¬) :
⨆ (i : α), f i = 0
theorem Real.sSup_univ :
sSup Set.univ = 0
@[simp]
theorem Real.sInf_empty :
= 0
theorem Real.ciInf_empty {α : Sort u_1} [] (f : α) :
⨅ (i : α), f i = 0
@[simp]
theorem Real.ciInf_const_zero {α : Sort u_1} :
⨅ (x : α), 0 = 0
theorem Real.sInf_of_not_bddBelow {s : } (hs : ) :
sInf s = 0
theorem Real.iInf_of_not_bddBelow {α : Sort u_1} {f : α} (hf : ¬) :
⨅ (i : α), f i = 0
theorem Real.sSup_nonneg (S : ) (hS : ∀ (x : ), x S0 x) :
0 sSup S

As 0 is the default value for Real.sSup of the empty set or sets which are not bounded above, it suffices to show that S is bounded below by 0 to show that 0 ≤ sSup S.

theorem Real.iSup_nonneg {ι : Sort u_1} {f : ι} (hf : ∀ (i : ι), 0 f i) :
0 ⨆ (i : ι), f i

As 0 is the default value for Real.sSup of the empty set or sets which are not bounded above, it suffices to show that f i is nonnegative to show that 0 ≤ ⨆ i, f i.

theorem Real.sSup_le {S : } {a : } (hS : ∀ (x : ), x Sx a) (ha : 0 a) :
sSup S a

As 0 is the default value for Real.sSup of the empty set or sets which are not bounded above, it suffices to show that all elements of S are bounded by a nonnegative number to show that sSup S is bounded by this number.

theorem Real.iSup_le {ι : Sort u_1} {f : ι} {a : } (hS : ∀ (i : ι), f i a) (ha : 0 a) :
⨆ (i : ι), f i a
theorem Real.sSup_nonpos (S : ) (hS : ∀ (x : ), x Sx 0) :
sSup S 0

As 0 is the default value for Real.sSup of the empty set, it suffices to show that S is bounded above by 0 to show that sSup S ≤ 0.

theorem Real.sInf_nonneg (S : ) (hS : ∀ (x : ), x S0 x) :
0 sInf S

As 0 is the default value for Real.sInf of the empty set, it suffices to show that S is bounded below by 0 to show that 0 ≤ sInf S.

theorem Real.iInf_nonneg {ι : Sort u_1} {f : ι} (hf : ∀ (i : ι), 0 f i) :
0 iInf f

As 0 is the default value for Real.sInf of the empty set, it suffices to show that f i is bounded below by 0 to show that 0 ≤ iInf f.

theorem Real.sInf_nonpos (S : ) (hS : ∀ (x : ), x Sx 0) :
sInf S 0

As 0 is the default value for Real.sInf of the empty set or sets which are not bounded below, it suffices to show that S is bounded above by 0 to show that sInf S ≤ 0.

theorem Real.sInf_le_sSup (s : ) (h₁ : ) (h₂ : ) :
theorem Real.cauSeq_converges (f : CauSeq abs) :
x, f CauSeq.const abs x
theorem Real.iInf_Ioi_eq_iInf_rat_gt {f : } (x : ) (hf : BddBelow (f '' )) (hf_mono : ) :
⨅ (r : ↑()), f r = ⨅ (q : { q' // x < q' }), f q