@@ -49,18 +49,44 @@ A `floor_ring` is a linear ordered ring over `α` with a function
49
49
-/
50
50
class floor_ring (α) [linear_ordered_ring α] :=
51
51
(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 }
55
77
56
78
namespace int
57
79
variables [linear_ordered_ring α] [floor_ring α] {z : ℤ} {a : α}
58
80
59
81
/-- `int.floor a` is the greatest integer `z` such that `z ≤ a`. It is denoted with `⌊a⌋`. -/
60
82
def floor : α → ℤ := floor_ring.floor
61
83
84
+ @[simp] lemma floor_ring_floor_eq : @floor_ring.floor = @int.floor := rfl
85
+
62
86
/-- `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
64
90
65
91
/-- `int.fract a`, the fractional part of `a`, is `a` minus its floor. -/
66
92
def fract (a : α) : α := a - floor a
@@ -71,13 +97,15 @@ notation `⌈` a `⌉` := int.ceil a
71
97
72
98
/-! #### Floor -/
73
99
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
75
101
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
77
103
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
79
105
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
81
109
82
110
lemma lt_succ_floor (a : α) : a < ⌊a⌋.succ := floor_lt.1 $ int.lt_succ_self _
83
111
@@ -93,7 +121,7 @@ eq_of_forall_le_iff $ λ a, by rw [le_floor, int.cast_le]
93
121
94
122
@[simp] lemma floor_one : ⌊(1 : α)⌋ = 1 := by rw [← int.cast_one, floor_coe]
95
123
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
97
125
98
126
lemma floor_pos : 0 < ⌊a⌋ ↔ 1 ≤ a :=
99
127
⟨λ 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 _ _)
121
149
lemma abs_sub_lt_one_of_floor_eq_floor {α : Type *} [linear_ordered_comm_ring α] [floor_ring α]
122
150
{a b : α} (h : ⌊a⌋ = ⌊b⌋) : |a - b| < 1 :=
123
151
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,
126
154
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,
129
157
exact abs_sub_lt_iff.2 ⟨by linarith, by linarith⟩
130
158
end
131
159
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 :=
133
161
by rw [le_antisymm_iff, le_floor, ←int.lt_add_one_iff, floor_lt, int.cast_add, int.cast_one,
134
162
and.comm]
135
163
@@ -199,26 +227,27 @@ end
199
227
200
228
/-! #### Ceil -/
201
229
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
204
233
205
- lemma floor_neg {a : α} : ⌊-a⌋ = -⌈a⌉ :=
234
+ lemma floor_neg : ⌊-a⌋ = -⌈a⌉ :=
206
235
eq_of_forall_le_iff (λ z, by rw [le_neg, ceil_le, le_floor, int.cast_neg, le_neg])
207
236
208
- lemma ceil_neg {a : α} : ⌈-a⌉ = -⌊a⌋ :=
237
+ lemma ceil_neg : ⌈-a⌉ = -⌊a⌋ :=
209
238
eq_of_forall_ge_iff (λ z, by rw [neg_le, ceil_le, le_floor, int.cast_neg, neg_le])
210
239
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
212
241
213
242
lemma ceil_le_floor_add_one (a : α) : ⌈a⌉ ≤ ⌊a⌋ + 1 :=
214
243
by { rw [ceil_le, int.cast_add, int.cast_one], exact (lt_floor_add_one a).le }
215
244
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
217
246
218
247
@[simp] lemma ceil_coe (z : ℤ) : ⌈(z : α)⌉ = z :=
219
248
eq_of_forall_ge_iff $ λ a, by rw [ceil_le, int.cast_le]
220
249
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
222
251
223
252
@[simp] lemma ceil_add_int (a : α) (z : ℤ) : ⌈a + z⌉ = ⌈a⌉ + z :=
224
253
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 _ _)
232
261
lemma ceil_lt_add_one (a : α) : (⌈a⌉ : α) < a + 1 :=
233
262
by { rw [← lt_ceil, ← int.cast_one, ceil_add_int], apply lt_add_one }
234
263
235
- lemma ceil_pos {a : α} : 0 < ⌈a⌉ ↔ 0 < a := lt_ceil
264
+ lemma ceil_pos : 0 < ⌈a⌉ ↔ 0 < a := lt_ceil
236
265
237
266
@[simp] lemma ceil_zero : ⌈(0 : α)⌉ = 0 := ceil_coe 0
238
267
239
- lemma ceil_nonneg {a : α} (ha : 0 ≤ a) : 0 ≤ ⌈a⌉ :=
268
+ lemma ceil_nonneg (ha : 0 ≤ a) : 0 ≤ ⌈a⌉ :=
240
269
by exact_mod_cast ha.trans (le_ceil a)
241
270
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 :=
243
272
by rw [←ceil_le, ←int.cast_one, ←int.cast_sub, ←lt_ceil, int.sub_one_lt_iff, le_antisymm_iff,
244
273
and.comm]
245
274
@@ -266,16 +295,16 @@ by { ext, simp [floor_lt, le_floor] }
266
295
@[simp] lemma preimage_Icc {a b : α} : ((coe : ℤ → α) ⁻¹' (set.Icc a b)) = set.Icc ⌈a⌉ ⌊b⌋ :=
267
296
by { ext, simp [ceil_le, le_floor] }
268
297
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⌋ :=
270
299
by { ext, simp [floor_lt] }
271
300
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⌉ :=
273
302
by { ext, simp [ceil_le] }
274
303
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⌉ :=
276
305
by { ext, simp [lt_ceil] }
277
306
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⌋ :=
279
308
by { ext, simp [le_floor] }
280
309
281
310
end int
@@ -368,7 +397,7 @@ begin
368
397
rw [int.floor_add_int, int.to_nat_add_nat (int.le_floor.2 ha)],
369
398
end
370
399
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 :=
372
401
by { convert floor_add_nat ha 1 , exact cast_one.symm }
373
402
374
403
lemma lt_floor_add_one (a : α) : a < ⌊a⌋₊ + 1 :=
@@ -405,7 +434,7 @@ show (⌈((n : ℤ) : α)⌉).to_nat = n, by { rw int.ceil_coe, refl }
405
434
406
435
@[simp] lemma ceil_eq_zero : ⌈a⌉₊ = 0 ↔ a ≤ 0 := by simp [← nonpos_iff_eq_zero]
407
436
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 :=
409
438
begin
410
439
change int.to_nat (⌈a + (n:ℤ)⌉) = int.to_nat ⌈a⌉ + n,
411
440
rw [int.ceil_add_int],
@@ -415,15 +444,15 @@ begin
415
444
refl
416
445
end
417
446
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 :=
419
448
by { convert ceil_add_nat ha 1 , exact cast_one.symm }
420
449
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 :=
422
451
lt_ceil.1 $ (nat.lt_succ_self _).trans_le (ceil_add_one ha).ge
423
452
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)
425
454
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)
427
456
428
457
lemma floor_lt_ceil_of_lt_of_pos {a b : α} (h : a < b) (h' : 0 < b) : ⌊a⌋₊ < ⌈b⌉₊ :=
429
458
begin
0 commit comments