Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit 80071d4

Browse files
committed
refactor(algebra/floor): Add ceil as a field of floor_ring (#9591)
This allows more control on definitional equality.
1 parent 5ea384e commit 80071d4

File tree

4 files changed

+70
-46
lines changed

4 files changed

+70
-46
lines changed

src/algebra/archimedean.lean

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -236,8 +236,8 @@ by simpa only [nsmul_eq_mul, int.nat_cast_eq_coe_nat, zero_add, mul_one]
236236
cases we have a computable `floor` function. -/
237237
noncomputable def archimedean.floor_ring (α)
238238
[linear_ordered_ring α] [archimedean α] : floor_ring α :=
239-
{ floor := λ x, classical.some (exists_floor x),
240-
le_floor := λ z x, classical.some_spec (exists_floor x) z }
239+
floor_ring.of_floor α (λ a, classical.some (exists_floor a))
240+
(λ z a, (classical.some_spec (exists_floor a) z).symm)
241241

242242
section linear_ordered_field
243243
variables [linear_ordered_field α]

src/algebra/floor.lean

Lines changed: 63 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -49,18 +49,44 @@ A `floor_ring` is a linear ordered ring over `α` with a function
4949
-/
5050
class floor_ring (α) [linear_ordered_ring α] :=
5151
(floor : α → ℤ)
52-
(le_floor : ∀ (z : ℤ) (a : α), z ≤ floor a ↔ (z : α) ≤ a)
53-
54-
instance : floor_ring ℤ := { floor := id, le_floor := λ _ _, by { rw int.cast_id, refl }}
52+
(ceil : α → ℤ)
53+
(gc_coe_floor : galois_connection coe floor)
54+
(gc_ceil_coe : galois_connection ceil coe)
55+
56+
instance : floor_ring ℤ :=
57+
{ floor := id,
58+
ceil := id,
59+
gc_coe_floor := λ a b, by { rw int.cast_id, refl },
60+
gc_ceil_coe := λ a b, by { rw int.cast_id, refl } }
61+
62+
/-- A `floor_ring` constructor from the `floor` function alone. -/
63+
def floor_ring.of_floor (α) [linear_ordered_ring α] (floor : α → ℤ)
64+
(gc_coe_floor : galois_connection coe floor) : floor_ring α :=
65+
{ floor := floor,
66+
ceil := λ a, -floor (-a),
67+
gc_coe_floor := gc_coe_floor,
68+
gc_ceil_coe := λ a z, by rw [neg_le, ←gc_coe_floor, int.cast_neg, neg_le_neg_iff] }
69+
70+
/-- A `floor_ring` constructor from the `ceil` function alone. -/
71+
def floor_ring.of_ceil (α) [linear_ordered_ring α] (ceil : α → ℤ)
72+
(gc_ceil_coe : galois_connection ceil coe) : floor_ring α :=
73+
{ floor := λ a, -ceil (-a),
74+
ceil := ceil,
75+
gc_coe_floor := λ a z, by rw [le_neg, gc_ceil_coe, int.cast_neg, neg_le_neg_iff],
76+
gc_ceil_coe := gc_ceil_coe }
5577

5678
namespace int
5779
variables [linear_ordered_ring α] [floor_ring α] {z : ℤ} {a : α}
5880

5981
/-- `int.floor a` is the greatest integer `z` such that `z ≤ a`. It is denoted with `⌊a⌋`. -/
6082
def floor : α → ℤ := floor_ring.floor
6183

84+
@[simp] lemma floor_ring_floor_eq : @floor_ring.floor = @int.floor := rfl
85+
6286
/-- `int.ceil a` is the smallest integer `z` such that `a ≤ z`. It is denoted with `⌈a⌉`. -/
63-
def ceil (a : α) : ℤ := -floor (-a)
87+
def ceil : α → ℤ := floor_ring.ceil
88+
89+
@[simp] lemma floor_ring_ceil_eq : @floor_ring.ceil = @int.ceil := rfl
6490

6591
/-- `int.fract a`, the fractional part of `a`, is `a` minus its floor. -/
6692
def fract (a : α) : α := a - floor a
@@ -71,13 +97,15 @@ notation `⌈` a `⌉` := int.ceil a
7197

7298
/-! #### Floor -/
7399

74-
lemma le_floor : ∀ {z : ℤ} {a : α}, z ≤ ⌊a⌋ ↔ (z : α) ≤ a := floor_ring.le_floor
100+
lemma gc_coe_floor : galois_connection (coe : ℤ → α) floor := floor_ring.gc_coe_floor
75101

76-
lemma floor_lt {a : α} {z : ℤ} : ⌊a⌋ < z ↔ a < z := lt_iff_lt_of_le_iff_le le_floor
102+
lemma le_floor : z ≤ ⌊a⌋ ↔ (z : α) ≤ a := (gc_coe_floor z a).symm
77103

78-
lemma floor_le (a : α) : (⌊a⌋ : α) ≤ a := le_floor.1 le_rfl
104+
lemma floor_lt : ⌊a⌋ < z ↔ a < z := lt_iff_lt_of_le_iff_le le_floor
79105

80-
lemma floor_nonneg {a : α} : 0 ≤ ⌊a⌋ ↔ 0 ≤ a := le_floor
106+
lemma floor_le (a : α) : (⌊a⌋ : α) ≤ a := gc_coe_floor.l_u_le a
107+
108+
lemma floor_nonneg : 0 ≤ ⌊a⌋ ↔ 0 ≤ a := le_floor
81109

82110
lemma lt_succ_floor (a : α) : a < ⌊a⌋.succ := floor_lt.1 $ int.lt_succ_self _
83111

@@ -93,7 +121,7 @@ eq_of_forall_le_iff $ λ a, by rw [le_floor, int.cast_le]
93121

94122
@[simp] lemma floor_one : ⌊(1 : α)⌋ = 1 := by rw [← int.cast_one, floor_coe]
95123

96-
@[mono] lemma floor_mono {a b : α} (h : a ≤ b) : ⌊a⌋ ≤ ⌊b⌋ := le_floor.2 ((floor_le _).trans h)
124+
@[mono] lemma floor_mono : monotone (floor : α → ℤ) := gc_coe_floor.monotone_u
97125

98126
lemma floor_pos : 0 < ⌊a⌋ ↔ 1 ≤ a :=
99127
⟨λ h, le_trans (by rwa [←int.cast_one, int.cast_le, ←zero_add (1 : ℤ), int.add_one_le_iff])
@@ -121,15 +149,15 @@ eq.trans (by rw [int.cast_neg, sub_eq_add_neg]) (floor_add_int _ _)
121149
lemma abs_sub_lt_one_of_floor_eq_floor {α : Type*} [linear_ordered_comm_ring α] [floor_ring α]
122150
{a b : α} (h : ⌊a⌋ = ⌊b⌋) : |a - b| < 1 :=
123151
begin
124-
have : a < ⌊a⌋ + 1 := lt_floor_add_one a,
125-
have : b < ⌊b⌋ + 1 := lt_floor_add_one b,
152+
have : a < ⌊a⌋ + 1 := lt_floor_add_one a,
153+
have : b < ⌊b⌋ + 1 := lt_floor_add_one b,
126154
have : (⌊a⌋ : α) = ⌊b⌋ := int.cast_inj.2 h,
127-
have : (⌊a⌋: α) ≤ a := floor_le a,
128-
have : (⌊b⌋ : α) ≤ b := floor_le b,
155+
have : (⌊a⌋ : α) ≤ a := floor_le a,
156+
have : (⌊b⌋ : α) ≤ b := floor_le b,
129157
exact abs_sub_lt_iff.2by linarith, by linarith⟩
130158
end
131159

132-
lemma floor_eq_iff {a : α} {z : ℤ} : ⌊a⌋ = z ↔ ↑z ≤ a ∧ a < z + 1 :=
160+
lemma floor_eq_iff : ⌊a⌋ = z ↔ ↑z ≤ a ∧ a < z + 1 :=
133161
by rw [le_antisymm_iff, le_floor, ←int.lt_add_one_iff, floor_lt, int.cast_add, int.cast_one,
134162
and.comm]
135163

@@ -199,26 +227,27 @@ end
199227

200228
/-! #### Ceil -/
201229

202-
lemma ceil_le {z : ℤ} {a : α} : ⌈a⌉ ≤ z ↔ a ≤ z :=
203-
by rw [ceil, neg_le, le_floor, int.cast_neg, neg_le_neg_iff]
230+
lemma gc_ceil_coe : galois_connection ceil (coe : ℤ → α) := floor_ring.gc_ceil_coe
231+
232+
lemma ceil_le : ⌈a⌉ ≤ z ↔ a ≤ z := gc_ceil_coe a z
204233

205-
lemma floor_neg {a : α} : ⌊-a⌋ = -⌈a⌉ :=
234+
lemma floor_neg : ⌊-a⌋ = -⌈a⌉ :=
206235
eq_of_forall_le_iff (λ z, by rw [le_neg, ceil_le, le_floor, int.cast_neg, le_neg])
207236

208-
lemma ceil_neg {a : α} : ⌈-a⌉ = -⌊a⌋ :=
237+
lemma ceil_neg : ⌈-a⌉ = -⌊a⌋ :=
209238
eq_of_forall_ge_iff (λ z, by rw [neg_le, ceil_le, le_floor, int.cast_neg, neg_le])
210239

211-
lemma lt_ceil {a : α} {z : ℤ} : z < ⌈a⌉ ↔ (z : α) < a := lt_iff_lt_of_le_iff_le ceil_le
240+
lemma lt_ceil : z < ⌈a⌉ ↔ (z : α) < a := lt_iff_lt_of_le_iff_le ceil_le
212241

213242
lemma ceil_le_floor_add_one (a : α) : ⌈a⌉ ≤ ⌊a⌋ + 1 :=
214243
by { rw [ceil_le, int.cast_add, int.cast_one], exact (lt_floor_add_one a).le }
215244

216-
lemma le_ceil (a : α) : a ≤ ⌈a⌉ := ceil_le.1 le_rfl
245+
lemma le_ceil (a : α) : a ≤ ⌈a⌉ := gc_ceil_coe.le_u_l a
217246

218247
@[simp] lemma ceil_coe (z : ℤ) : ⌈(z : α)⌉ = z :=
219248
eq_of_forall_ge_iff $ λ a, by rw [ceil_le, int.cast_le]
220249

221-
lemma ceil_mono {a b : α} (h : a ≤ b) : ⌈a⌉ ≤ ⌈b⌉ := ceil_le.2 (h.trans (le_ceil _))
250+
lemma ceil_mono : monotone (ceil : α → ℤ) := gc_ceil_coe.monotone_l
222251

223252
@[simp] lemma ceil_add_int (a : α) (z : ℤ) : ⌈a + z⌉ = ⌈a⌉ + z :=
224253
by rw [←neg_inj, neg_add', ←floor_neg, ←floor_neg, neg_add', floor_sub_int]
@@ -232,14 +261,14 @@ eq.trans (by rw [int.cast_neg, sub_eq_add_neg]) (ceil_add_int _ _)
232261
lemma ceil_lt_add_one (a : α) : (⌈a⌉ : α) < a + 1 :=
233262
by { rw [← lt_ceil, ← int.cast_one, ceil_add_int], apply lt_add_one }
234263

235-
lemma ceil_pos {a : α} : 0 < ⌈a⌉ ↔ 0 < a := lt_ceil
264+
lemma ceil_pos : 0 < ⌈a⌉ ↔ 0 < a := lt_ceil
236265

237266
@[simp] lemma ceil_zero : ⌈(0 : α)⌉ = 0 := ceil_coe 0
238267

239-
lemma ceil_nonneg {a : α} (ha : 0 ≤ a) : 0 ≤ ⌈a⌉ :=
268+
lemma ceil_nonneg (ha : 0 ≤ a) : 0 ≤ ⌈a⌉ :=
240269
by exact_mod_cast ha.trans (le_ceil a)
241270

242-
lemma ceil_eq_iff {a : α} {z : ℤ} : ⌈a⌉ = z ↔ ↑z - 1 < a ∧ a ≤ z :=
271+
lemma ceil_eq_iff : ⌈a⌉ = z ↔ ↑z - 1 < a ∧ a ≤ z :=
243272
by rw [←ceil_le, ←int.cast_one, ←int.cast_sub, ←lt_ceil, int.sub_one_lt_iff, le_antisymm_iff,
244273
and.comm]
245274

@@ -266,16 +295,16 @@ by { ext, simp [floor_lt, le_floor] }
266295
@[simp] lemma preimage_Icc {a b : α} : ((coe : ℤ → α) ⁻¹' (set.Icc a b)) = set.Icc ⌈a⌉ ⌊b⌋ :=
267296
by { ext, simp [ceil_le, le_floor] }
268297

269-
@[simp] lemma preimage_Ioi {a : α} : ((coe : ℤ → α) ⁻¹' (set.Ioi a)) = set.Ioi ⌊a⌋ :=
298+
@[simp] lemma preimage_Ioi : ((coe : ℤ → α) ⁻¹' (set.Ioi a)) = set.Ioi ⌊a⌋ :=
270299
by { ext, simp [floor_lt] }
271300

272-
@[simp] lemma preimage_Ici {a : α} : ((coe : ℤ → α) ⁻¹' (set.Ici a)) = set.Ici ⌈a⌉ :=
301+
@[simp] lemma preimage_Ici : ((coe : ℤ → α) ⁻¹' (set.Ici a)) = set.Ici ⌈a⌉ :=
273302
by { ext, simp [ceil_le] }
274303

275-
@[simp] lemma preimage_Iio {a : α} : ((coe : ℤ → α) ⁻¹' (set.Iio a)) = set.Iio ⌈a⌉ :=
304+
@[simp] lemma preimage_Iio : ((coe : ℤ → α) ⁻¹' (set.Iio a)) = set.Iio ⌈a⌉ :=
276305
by { ext, simp [lt_ceil] }
277306

278-
@[simp] lemma preimage_Iic {a : α} : ((coe : ℤ → α) ⁻¹' (set.Iic a)) = set.Iic ⌊a⌋ :=
307+
@[simp] lemma preimage_Iic : ((coe : ℤ → α) ⁻¹' (set.Iic a)) = set.Iic ⌊a⌋ :=
279308
by { ext, simp [le_floor] }
280309

281310
end int
@@ -368,7 +397,7 @@ begin
368397
rw [int.floor_add_int, int.to_nat_add_nat (int.le_floor.2 ha)],
369398
end
370399

371-
lemma floor_add_one {a : α} (ha : 0 ≤ a) : ⌊a + 1⌋₊ = ⌊a⌋₊ + 1 :=
400+
lemma floor_add_one (ha : 0 ≤ a) : ⌊a + 1⌋₊ = ⌊a⌋₊ + 1 :=
372401
by { convert floor_add_nat ha 1, exact cast_one.symm }
373402

374403
lemma lt_floor_add_one (a : α) : a < ⌊a⌋₊ + 1 :=
@@ -405,7 +434,7 @@ show (⌈((n : ℤ) : α)⌉).to_nat = n, by { rw int.ceil_coe, refl }
405434

406435
@[simp] lemma ceil_eq_zero : ⌈a⌉₊ = 0 ↔ a ≤ 0 := by simp [← nonpos_iff_eq_zero]
407436

408-
lemma ceil_add_nat {a : α} (ha : 0 ≤ a) (n : ℕ) : ⌈a + n⌉₊ = ⌈a⌉₊ + n :=
437+
lemma ceil_add_nat (ha : 0 ≤ a) (n : ℕ) : ⌈a + n⌉₊ = ⌈a⌉₊ + n :=
409438
begin
410439
change int.to_nat (⌈a + (n:ℤ)⌉) = int.to_nat ⌈a⌉ + n,
411440
rw [int.ceil_add_int],
@@ -415,15 +444,15 @@ begin
415444
refl
416445
end
417446

418-
lemma ceil_add_one {a : α} (ha : 0 ≤ a) : ⌈a + 1⌉₊ = ⌈a⌉₊ + 1 :=
447+
lemma ceil_add_one (ha : 0 ≤ a) : ⌈a + 1⌉₊ = ⌈a⌉₊ + 1 :=
419448
by { convert ceil_add_nat ha 1, exact cast_one.symm }
420449

421-
lemma ceil_lt_add_one {a : α} (ha : 0 ≤ a) : (⌈a⌉₊ : α) < a + 1 :=
450+
lemma ceil_lt_add_one (ha : 0 ≤ a) : (⌈a⌉₊ : α) < a + 1 :=
422451
lt_ceil.1 $ (nat.lt_succ_self _).trans_le (ceil_add_one ha).ge
423452

424-
lemma lt_of_ceil_lt {a : α} {n : ℕ} (h : ⌈a⌉₊ < n) : a < n := (le_ceil a).trans_lt (nat.cast_lt.2 h)
453+
lemma lt_of_ceil_lt (h : ⌈a⌉₊ < n) : a < n := (le_ceil a).trans_lt (nat.cast_lt.2 h)
425454

426-
lemma le_of_ceil_le {a : α} {n : ℕ} (h : ⌈a⌉₊ ≤ n) : a ≤ n := (le_ceil a).trans (nat.cast_le.2 h)
455+
lemma le_of_ceil_le (h : ⌈a⌉₊ ≤ n) : a ≤ n := (le_ceil a).trans (nat.cast_le.2 h)
427456

428457
lemma floor_lt_ceil_of_lt_of_pos {a b : α} (h : a < b) (h' : 0 < b) : ⌊a⌋₊ < ⌈b⌉₊ :=
429458
begin

src/data/rat/floor.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ protected theorem le_floor {z : ℤ} : ∀ {r : ℚ}, z ≤ rat.floor r ↔ (z :
3838
end
3939

4040
instance : floor_ring ℚ :=
41-
{ floor := rat.floor, le_floor := @rat.le_floor }
41+
floor_ring.of_floor ℚ rat.floor $ λ a z, rat.le_floor.symm
4242

4343
protected lemma floor_def {q : ℚ} : ⌊q⌋ = q.num / q.denom := by { cases q, refl }
4444

src/topology/algebra/floor_ring.lean

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -29,21 +29,16 @@ open_locale topological_space
2929
variables {α : Type*} [linear_ordered_ring α] [floor_ring α]
3030

3131
lemma tendsto_floor_at_top : tendsto (floor : α → ℤ) at_top at_top :=
32-
begin
33-
refine monotone.tendsto_at_top_at_top (λ a b hab, floor_mono hab) (λ b, _),
34-
use (b : α) + ((1 : ℤ) : α),
35-
rw [floor_add_int, floor_coe],
36-
exact (lt_add_one _).le
37-
end
32+
floor_mono.tendsto_at_top_at_top $ λ b, ⟨(b + 1 : ℤ), by { rw floor_coe, exact (lt_add_one _).le }⟩
3833

3934
lemma tendsto_floor_at_bot : tendsto (floor : α → ℤ) at_bot at_bot :=
40-
monotone.tendsto_at_bot_at_bot (λ a b, floor_mono) (λ b, ⟨b, (floor_coe _).le⟩)
35+
floor_mono.tendsto_at_bot_at_bot $ λ b, ⟨b, (floor_coe _).le⟩
4136

4237
lemma tendsto_ceil_at_top : tendsto (ceil : α → ℤ) at_top at_top :=
43-
tendsto_neg_at_bot_at_top.comp (tendsto_floor_at_bot.comp tendsto_neg_at_top_at_bot)
38+
ceil_mono.tendsto_at_top_at_top $ λ b, ⟨b, (ceil_coe _).ge⟩
4439

4540
lemma tendsto_ceil_at_bot : tendsto (ceil : α → ℤ) at_bot at_bot :=
46-
tendsto_neg_at_top_at_bot.comp (tendsto_floor_at_top.comp tendsto_neg_at_bot_at_top)
41+
ceil_mono.tendsto_at_bot_at_bot $ λ b, ⟨(b - 1 : ℤ), by { rw ceil_coe, exact (sub_one_lt _).le }⟩
4742

4843
variables [topological_space α]
4944

0 commit comments

Comments
 (0)