# Zulip Chat Archive

## Stream: general

### Topic: There are infinite rationals in a segment

#### Jiatong Yang (Sep 14 2022 at 04:03):

```
theorem A2 (a b : ℝ) (altb : a < b) : infinite {x : ℚ | (x : ℝ) ∈ set.Ioo a b} := sorry
```

How to prove this?

I come across 2 difficulties. How to use Lean's infinite? (version 3.48.0) How to prove for all a, b s.t. b - a > 1, there is an integer in (a, b)?

#### Ruben Van de Velde (Sep 14 2022 at 07:15):

For your second question, can you write an #mwe?

#### Kevin Buzzard (Sep 14 2022 at 07:27):

For the second one, one approach is floor(a+1), all the lemmas will be there.

#### Ruben Van de Velde (Sep 14 2022 at 07:44):

Slightly easier with `(floor a) + 1`

in terms of lemmas

#### Filippo A. E. Nuccio (Sep 14 2022 at 07:57):

For the first you could use that the rationals are archimedean as in docs#rat.archimedean to construct two rationals `y<x`

such that `a<y<x<b`

. Then you can define the function `f : ℕ → ℚ`

sending `n`

to `y+(x-y)/2+(x-y)/2n=y+(n+1)(x-y)/2`

and prove it is injective and takes values inside your interval. Finally, use that a set receiving an injective function from an infinite set is itself infinite, as in docs#infinite.of_injective.

#### Johan Commelin (Sep 14 2022 at 08:07):

You could also split that approach in two steps:

- prove that
`(0,1)`

is infinite - construct a bijection between
`(a,b)`

and`(0,1)`

#### Yaël Dillies (Sep 14 2022 at 08:27):

Probably the correct generality is nonempty open sets intersect (topologically) dense sets in infinitely many points?

#### Kevin Buzzard (Sep 14 2022 at 10:22):

Johan Commelin said:

You could also split that approach in two steps:

- prove that
`(0,1)`

is infinite- construct a bijection between
`(a,b)`

and`(0,1)`

The natural bijection won't preserve rationality :-( My instinct was to prove that there was a rational in each of the regions (a+di/n, a+d(i+1)/n) with d=b-a but this will also be a pain

#### Mario Carneiro (Sep 14 2022 at 10:23):

My thought was to prove by induction that there is a strictly decreasing sequence of rats by using `exists_rat_btwn`

#### Mario Carneiro (Sep 14 2022 at 10:27):

@Yaël Dillies that's not true for finite top spaces. I think you need to know that the open set is infinite, and also the space is T0 so that you can take a finite set of points out while keeping it open

#### Johan Commelin (Sep 14 2022 at 10:34):

Aah, of course it doesn't preserve rationality. But scaling and translating by rationals does.

#### Johan Commelin (Sep 14 2022 at 10:34):

So you scale and translate `(a,b)`

until it contains `(0,1)`

.

#### Patrick Stevens (Sep 14 2022 at 18:14):

Kevin Buzzard said:

The natural bijection won't preserve rationality :-( My instinct was to prove that there was a rational in each of the regions (a+di/n, a+d(i+1)/n) with d=b-a but this will also be a pain

This can be made to work, though, if you prove it for $a, b$ rational and then show that there are two rationals between every distinct pair of reals, to deal with the irrational case

#### Jiatong Yang (Sep 14 2022 at 23:52):

Thank you all very much! I have written down a proof:

```
theorem A2 (a b : ℝ) (altb : a < b) : infinite {x : ℚ | a < x ∧ (x : ℝ) < b} := begin
cases (exists_rat_btwn altb) with l hl,
cases (exists_rat_btwn hl.2) with r hr,
have lltr : l < r := real.rat_cast_lt.mp hr.left,
have p : ∀ (n : ℕ), l < l + (r - l) * (1 / (n + 1)) ∧ l + (r - l) * (1 / (n + 1)) ≤ r := begin
intro n,
have sp1 : 0 < 1 / ((n : ℚ) + 1) := nat.one_div_pos_of_nat,
have sp2 : 1 / ((n : ℚ) + 1) ≤ 1 := (one_le_div sp1).mp (by simp),
have : (r - l) * (1 / (n + 1)) > 0 := mul_pos (by linarith) sp1,
have : (r - l) * (1 / (n + 1)) ≤ (r - l) := begin
conv_rhs {
rw [← mul_one (r - l)],
},
mono; linarith,
end,
split; linarith,
end,
let f := λ n : ℕ, (⟨l + (r - l)* (1 / (n + 1)), p n⟩ : {x // l < x ∧ x ≤ r}),
have injf : function.injective f,
{
intros n m H,
simp at H,
cases H; linarith,
},
have lrinf : infinite {x // l < x ∧ x ≤ r} := infinite.of_injective f injf,
let g : {x // l < x ∧ x ≤ r} → {x : ℚ // a < x ∧ (x : ℝ) < b} := λ ⟨x, h⟩, ⟨x, begin
have : (l : ℝ) < x := rat.cast_lt.mpr h.left,
have : (x : ℝ) ≤ r := rat.cast_le.mpr h.right,
split; linarith,
end⟩,
have injg : function.injective g,
{
rintros ⟨x, hx⟩ ⟨y, hy⟩ H,
simp at H,
exact subtype.ext H,
},
exact @infinite.of_injective _ _ lrinf g injg,
end
```

But it is too long. Is there any way to improve?

#### Matt Diamond (Sep 15 2022 at 02:03):

(deleted)

#### Matt Diamond (Sep 15 2022 at 02:05):

(deleted)

#### Matt Diamond (Sep 15 2022 at 02:07):

(deleted)

#### Matt Diamond (Sep 15 2022 at 02:17):

nvm, misread the problem

#### Jiatong Yang (Sep 15 2022 at 07:58):

I still need help to improve the proof. :rose:

#### Mario Carneiro (Sep 15 2022 at 07:59):

your proof is missing some imports?

#### Mario Carneiro (Sep 15 2022 at 08:10):

Here's a shorter proof, following Matt's idea:

```
import data.real.basic
theorem A2 (a b : ℝ) (altb : a < b) : infinite {x : ℚ | a < x ∧ (x : ℝ) < b} :=
infinite.of_not_finite $ λ h, begin
obtain ⟨q, H⟩ := @finite.exists_min _ ℝ h (nonempty_subtype.2 (exists_rat_btwn altb)) _ coe,
obtain ⟨q', hq'₁, hq'₂⟩ := exists_rat_btwn q.2.1,
exact not_lt.2 (H ⟨q', hq'₁, hq'₂.trans q.2.2⟩) hq'₂,
end
```

#### Jiatong Yang (Sep 15 2022 at 09:41):

So great! Which version do you use? It cannot be compiled in the newest version for the absence of infinite.of_not_finite.

#### Jiatong Yang (Sep 15 2022 at 09:47):

Now we should use `not_finite_iff_infinite.mp`

instead. (I have no idea why mathlib changed the definition of finite and infinite recently)

#### Jiatong Yang (Sep 15 2022 at 09:49):

Thank you a lot! I wrote on paper using minimum too, but I didn't find the api. :sob:

Last updated: Dec 20 2023 at 11:08 UTC