Skip to content

Commit 33d32d5

Browse files
adri326YaelDillies
andcommitted
feat: Small lemmas around |a - b| and Int.natAbs (a - b) (#10027)
Proves the following statements: - if `0 ≤ a ≤ n` and `0 ≤ b ≤ n`, then `|a - b| ≤ n` (similarly with `|a - b| < n`) - `0 < |a - b|` iff `a ≠ b` Co-authored-by: Yaël Dillies <yael.dillies@gmail.com>
1 parent 800df68 commit 33d32d5

File tree

3 files changed

+39
-0
lines changed

3 files changed

+39
-0
lines changed

Mathlib/Algebra/Order/Group/Abs.lean

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -456,6 +456,18 @@ theorem abs_abs_sub_abs_le_abs_sub (a b : α) : |(|a| - |b|)| ≤ |a - b| :=
456456
⟨abs_sub_abs_le_abs_sub _ _, by rw [abs_sub_comm]; apply abs_sub_abs_le_abs_sub⟩
457457
#align abs_abs_sub_abs_le_abs_sub abs_abs_sub_abs_le_abs_sub
458458

459+
/-- `|a - b| ≤ n` if `0 ≤ a ≤ n` and `0 ≤ b ≤ n`. -/
460+
theorem abs_sub_le_of_nonneg_of_le {a b n : α} (a_nonneg : 0 ≤ a) (a_le_n : a ≤ n)
461+
(b_nonneg : 0 ≤ b) (b_le_n : b ≤ n) : |a - b| ≤ n := by
462+
rw [abs_sub_le_iff, sub_le_iff_le_add, sub_le_iff_le_add]
463+
exact ⟨le_add_of_le_of_nonneg a_le_n b_nonneg, le_add_of_le_of_nonneg b_le_n a_nonneg⟩
464+
465+
/-- `|a - b| < n` if `0 ≤ a < n` and `0 ≤ b < n`. -/
466+
theorem abs_sub_lt_of_nonneg_of_lt {a b n : α} (a_nonneg : 0 ≤ a) (a_lt_n : a < n)
467+
(b_nonneg : 0 ≤ b) (b_lt_n : b < n) : |a - b| < n := by
468+
rw [abs_sub_lt_iff, sub_lt_iff_lt_add, sub_lt_iff_lt_add]
469+
exact ⟨lt_add_of_lt_of_nonneg a_lt_n b_nonneg, lt_add_of_lt_of_nonneg b_lt_n a_nonneg⟩
470+
459471
theorem abs_eq (hb : 0 ≤ b) : |a| = b ↔ a = b ∨ a = -b := by
460472
refine' ⟨eq_or_eq_neg_of_abs_eq, _⟩
461473
rintro (rfl | rfl) <;> simp only [abs_neg, abs_of_nonneg hb]
@@ -510,6 +522,12 @@ theorem eq_of_abs_sub_nonpos (h : |a - b| ≤ 0) : a = b :=
510522
eq_of_abs_sub_eq_zero (le_antisymm h (abs_nonneg (a - b)))
511523
#align eq_of_abs_sub_nonpos eq_of_abs_sub_nonpos
512524

525+
theorem abs_sub_nonpos : |a - b| ≤ 0 ↔ a = b :=
526+
⟨eq_of_abs_sub_nonpos, by rintro rfl; rw [sub_self, abs_zero]⟩
527+
528+
theorem abs_sub_pos : 0 < |a - b| ↔ a ≠ b :=
529+
not_le.symm.trans abs_sub_nonpos.not
530+
513531
@[simp]
514532
theorem abs_eq_self : |a| = a ↔ 0 ≤ a := by
515533
rw [abs_eq_max_neg, max_eq_left_iff, neg_le_self_iff]

Mathlib/Data/Int/Lemmas.lean

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,22 @@ theorem natAbs_inj_of_nonpos_of_nonneg {a b : ℤ} (ha : a ≤ 0) (hb : 0 ≤ b)
7777
simpa only [Int.natAbs_neg] using natAbs_inj_of_nonneg_of_nonneg (neg_nonneg_of_nonpos ha) hb
7878
#align int.nat_abs_inj_of_nonpos_of_nonneg Int.natAbs_inj_of_nonpos_of_nonneg
7979

80+
/-- A specialization of `abs_sub_le_of_nonneg_of_le` for working with the signed subtraction
81+
of natural numbers. -/
82+
theorem natAbs_coe_sub_coe_le_of_le {a b n : ℕ} (a_le_n : a ≤ n) (b_le_n : b ≤ n) :
83+
natAbs (a - b : ℤ) ≤ n := by
84+
rw [← Nat.cast_le (α := ℤ), coe_natAbs]
85+
exact abs_sub_le_of_nonneg_of_le (ofNat_nonneg a) (ofNat_le.mpr a_le_n)
86+
(ofNat_nonneg b) (ofNat_le.mpr b_le_n)
87+
88+
/-- A specialization of `abs_sub_lt_of_nonneg_of_lt` for working with the signed subtraction
89+
of natural numbers. -/
90+
theorem natAbs_coe_sub_coe_lt_of_lt {a b n : ℕ} (a_lt_n : a < n) (b_lt_n : b < n) :
91+
natAbs (a - b : ℤ) < n := by
92+
rw [← Nat.cast_lt (α := ℤ), coe_natAbs]
93+
exact abs_sub_lt_of_nonneg_of_lt (ofNat_nonneg a) (ofNat_lt.mpr a_lt_n)
94+
(ofNat_nonneg b) (ofNat_lt.mpr b_lt_n)
95+
8096
section Intervals
8197

8298
open Set

Mathlib/Data/Int/Order/Basic.lean

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,11 @@ lemma cast_mul_eq_zsmul_cast {α : Type*} [AddCommGroupWithOne α] :
121121
simp only [sub_mul, one_mul, cast_sub, ih, sub_zsmul, one_zsmul, ← sub_eq_add_neg, forall_const]
122122
#align int.cast_mul_eq_zsmul_cast Int.cast_mul_eq_zsmul_cast
123123

124+
theorem natAbs_sub_pos_iff {i j : ℤ} : 0 < natAbs (i - j) ↔ i ≠ j := by
125+
rw [natAbs_pos, ne_eq, sub_eq_zero]
126+
127+
theorem natAbs_sub_ne_zero_iff {i j : ℤ} : natAbs (i - j) ≠ 0 ↔ i ≠ j :=
128+
Nat.ne_zero_iff_zero_lt.trans natAbs_sub_pos_iff
124129

125130
/-! ### succ and pred -/
126131

0 commit comments

Comments
 (0)