Skip to content

Commit 1e25356

Browse files
committed
chore(Init/Data/Nat/Lemmas): remove more bit01 lemmas (#14788)
Deletions: - bit0_eq_zero - bit0_inj - bit0_le - bit0_le_bit - bit0_le_bit1_iff - bit0_lt - bit0_lt_bit0 - bit0_lt_bit1 - bit0_lt_bit1_iff - bit0_ne - bit0_ne_bit1 - bit0_ne_one - bit1_eq_succ_bit0 - bit1_inj - bit1_le - bit1_le_bit0_iff - bit1_lt - bit1_lt_bit0 - bit1_lt_bit0_iff - bit1_ne - bit1_ne_bit0 - bit1_ne_one - bit1_succ_eq - bit_le_bit1 - bit_lt_bit0 - one_le_bit0 - one_le_bit1 - one_lt_bit0 - one_lt_bit1 - one_ne_bit0 - one_ne_bit1 - zero_ne_bit0 - zero_ne_bit1
1 parent 7b4fc5c commit 1e25356

File tree

7 files changed

+54
-166
lines changed

7 files changed

+54
-166
lines changed

Mathlib/Algebra/Polynomial/UnitTrinomial.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ theorem card_support_eq_three (hp : p.IsUnitTrinomial) : p.support.card = 3 := b
150150

151151
theorem ne_zero (hp : p.IsUnitTrinomial) : p ≠ 0 := by
152152
rintro rfl
153-
exact Nat.zero_ne_bit1 1 hp.card_support_eq_three
153+
simpa using hp.card_support_eq_three
154154
#align polynomial.is_unit_trinomial.ne_zero Polynomial.IsUnitTrinomial.ne_zero
155155

156156
theorem coeff_isUnit (hp : p.IsUnitTrinomial) {k : ℕ} (hk : k ∈ p.support) :

Mathlib/Data/Nat/Bits.lean

Lines changed: 17 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import Mathlib.Algebra.Group.Basic
77
import Mathlib.Algebra.Group.Nat
88
import Mathlib.Data.Nat.Defs
99
import Mathlib.Init.Data.List.Basic
10-
import Mathlib.Init.Data.Nat.Lemmas
10+
import Mathlib.Init.Data.Nat.Basic
1111
import Mathlib.Tactic.Convert
1212
import Mathlib.Tactic.GeneralizeProofs
1313
import Mathlib.Tactic.Says
@@ -398,74 +398,36 @@ theorem bit_cases_on_inj {C : ℕ → Sort u} (H₁ H₂ : ∀ b n, C (bit b n))
398398
bit_cases_on_injective.eq_iff
399399
#align nat.bit_cases_on_inj Nat.bit_cases_on_inj
400400

401-
protected theorem bit0_eq_zero {n : ℕ} : 2 * n = 0 ↔ n = 0 := by
402-
omega
403-
#align nat.bit0_eq_zero Nat.bit0_eq_zero
401+
#noalign nat.bit0_eq_zero
404402

405403
theorem bit_eq_zero_iff {n : ℕ} {b : Bool} : bit b n = 0 ↔ n = 0 ∧ b = false := by
406404
constructor
407-
· cases b <;> simp [Nat.bit, Nat.bit0_eq_zero, Nat.bit1_ne_zero]; omega
405+
· cases b <;> simp [Nat.bit]; omega
408406
· rintro ⟨rfl, rfl⟩
409407
rfl
410408
#align nat.bit_eq_zero_iff Nat.bit_eq_zero_iff
411409

412-
protected lemma bit0_le (h : n ≤ m) : 2 * n ≤ 2 * m := by
413-
omega
414-
#align nat.bit0_le Nat.bit0_le
415-
416-
protected lemma bit1_le {n m : ℕ} (h : n ≤ m) : 2 * n + 12 * m + 1 := by
417-
omega
418-
#align nat.bit1_le Nat.bit1_le
410+
#noalign nat.bit0_le
411+
#noalign nat.bit1_le
419412

420413
lemma bit_le : ∀ (b : Bool) {m n : ℕ}, m ≤ n → bit b m ≤ bit b n
421-
| true, _, _, h => Nat.bit1_le h
422-
| false, _, _, h => Nat.bit0_le h
414+
| true, _, _, h => by dsimp [bit]; omega
415+
| false, _, _, h => by dsimp [bit]; omega
423416
#align nat.bit_le Nat.bit_le
424417

425-
lemma bit0_le_bit : ∀ (b) {m n : ℕ}, m ≤ n → 2 * m ≤ bit b n
426-
| true, _, _, h => le_of_lt <| Nat.bit0_lt_bit1 h
427-
| false, _, _, h => Nat.bit0_le h
428-
#align nat.bit0_le_bit Nat.bit0_le_bit
429-
430-
lemma bit_le_bit1 : ∀ (b) {m n : ℕ}, m ≤ n → bit b m ≤ 2 * n + 1
431-
| false, _, _, h => le_of_lt <| Nat.bit0_lt_bit1 h
432-
| true, _, _, h => Nat.bit1_le h
433-
#align nat.bit_le_bit1 Nat.bit_le_bit1
434-
435-
lemma bit_lt_bit0 : ∀ (b) {m n : ℕ}, m < n → bit b m < 2 * n
436-
| true, _, _, h => Nat.bit1_lt_bit0 h
437-
| false, _, _, h => Nat.bit0_lt h
438-
#align nat.bit_lt_bit0 Nat.bit_lt_bit0
418+
#noalign nat.bit0_le_bit
419+
#noalign nat.bit_le_bit1
420+
#noalign nat.bit_lt_bit0
439421

440-
protected lemma bit0_lt_bit0 : 2 * m < 2 * n ↔ m < n := by omega
441-
442-
lemma bit_lt_bit (a b) (h : m < n) : bit a m < bit b n :=
443-
lt_of_lt_of_le (bit_lt_bit0 _ h) (bit0_le_bit _ (le_refl _))
422+
lemma bit_lt_bit (a b) (h : m < n) : bit a m < bit b n := calc
423+
bit a m < 2 * n := by cases a <;> dsimp [bit] <;> omega
424+
_ ≤ bit b n := by cases b <;> dsimp [bit] <;> omega
444425
#align nat.bit_lt_bit Nat.bit_lt_bit
445426

446-
@[simp]
447-
lemma bit0_le_bit1_iff : 2 * m ≤ 2 * n + 1 ↔ m ≤ n := by
448-
refine ⟨fun h ↦ ?_, fun h ↦ le_of_lt (Nat.bit0_lt_bit1 h)⟩
449-
rwa [← Nat.lt_succ_iff, n.bit1_eq_succ_bit0, ← n.bit0_succ_eq, Nat.bit0_lt_bit0, Nat.lt_succ_iff]
450-
at h
451-
#align nat.bit0_le_bit1_iff Nat.bit0_le_bit1_iff
452-
453-
@[simp]
454-
lemma bit0_lt_bit1_iff : 2 * m < 2 * n + 1 ↔ m ≤ n :=
455-
fun h => bit0_le_bit1_iff.1 (le_of_lt h), Nat.bit0_lt_bit1⟩
456-
#align nat.bit0_lt_bit1_iff Nat.bit0_lt_bit1_iff
457-
458-
@[simp]
459-
lemma bit1_le_bit0_iff : 2 * m + 12 * n ↔ m < n :=
460-
fun h ↦ by rwa [m.bit1_eq_succ_bit0, Nat.succ_le_iff, Nat.bit0_lt_bit0] at h,
461-
fun h ↦ le_of_lt (Nat.bit1_lt_bit0 h)⟩
462-
#align nat.bit1_le_bit0_iff Nat.bit1_le_bit0_iff
463-
464-
@[simp]
465-
lemma bit1_lt_bit0_iff : 2 * m + 1 < 2 * n ↔ m < n :=
466-
fun h ↦ bit1_le_bit0_iff.1 (le_of_lt h), Nat.bit1_lt_bit0⟩
467-
#align nat.bit1_lt_bit0_iff Nat.bit1_lt_bit0_iff
468-
427+
#noalign nat.bit0_le_bit1_iff
428+
#noalign nat.bit0_lt_bit1_iff
429+
#noalign nat.bit1_le_bit0_iff
430+
#noalign nat.bit1_lt_bit0_iff
469431
#noalign nat.one_le_bit0_iff
470432
#noalign nat.one_lt_bit0_iff
471433
#noalign nat.bit_le_bit_iff

Mathlib/Data/Nat/Bitwise.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ theorem bit_true : bit true = (2 * · + 1) :=
162162

163163
@[simp]
164164
theorem bit_eq_zero {n : ℕ} {b : Bool} : n.bit b = 0 ↔ n = 0 ∧ b = false := by
165-
cases b <;> simp [Nat.bit0_eq_zero, Nat.bit1_ne_zero]
165+
cases b <;> simp [bit, Nat.mul_eq_zero]
166166
#align nat.bit_eq_zero Nat.bit_eq_zero
167167

168168
theorem bit_ne_zero_iff {n : ℕ} {b : Bool} : n.bit b ≠ 0 ↔ n = 0 → b = true := by

Mathlib/Data/Nat/Size.lean

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ theorem lt_size_self (n : ℕ) : n < 2 ^ size n := by
105105
by_cases h : bit b n = 0
106106
· apply this h
107107
rw [size_bit h, shiftLeft_succ, shiftLeft_eq, one_mul]
108-
exact bit_lt_bit0 _ (by simpa [shiftLeft_eq, shiftRight_eq_div_pow] using IH)
108+
cases b <;> dsimp [bit] <;> omega
109109
#align nat.lt_size_self Nat.lt_size_self
110110

111111
theorem size_le {m n : ℕ} : size m ≤ n ↔ m < 2 ^ n :=
@@ -123,7 +123,8 @@ theorem size_le {m n : ℕ} : size m ≤ n ↔ m < 2 ^ n :=
123123
· apply succ_le_succ (IH _)
124124
apply Nat.lt_of_mul_lt_mul_left (a := 2)
125125
simp only [shiftLeft_succ] at *
126-
exact lt_of_le_of_lt (bit0_le_bit b rfl.le) h⟩
126+
refine lt_of_le_of_lt ?_ h
127+
cases b <;> dsimp [bit] <;> omega⟩
127128
#align nat.size_le Nat.size_le
128129

129130
theorem lt_size {m n : ℕ} : m < size n ↔ 2 ^ m ≤ n := by

Mathlib/Data/Num/Lemmas.lean

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1600,10 +1600,9 @@ theorem divMod_to_nat (d n : PosNum) :
16001600
-- Porting note: `cases'` didn't rewrite at `this`, so `revert` & `intro` are required.
16011601
revert IH; cases' divMod d n with q r; intro IH
16021602
simp only [divMod] at IH ⊢
1603-
apply divMod_to_nat_aux <;> simp
1604-
· rw [← add_assoc, ← add_assoc, ← two_mul, ← two_mul, add_right_comm,
1605-
mul_left_comm, ← mul_add, IH.1]
1606-
· exact IH.2
1603+
apply divMod_to_nat_aux <;> simp only [Num.cast_bit1, cast_bit1]
1604+
· rw [← two_mul, ← two_mul, add_right_comm, mul_left_comm, ← mul_add, IH.1]
1605+
· omega
16071606
· unfold divMod
16081607
-- Porting note: `cases'` didn't rewrite at `this`, so `revert` & `intro` are required.
16091608
revert IH; cases' divMod d n with q r; intro IH

Mathlib/Data/Num/Prime.lean

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -98,11 +98,12 @@ instance decidablePrime : DecidablePred PosNum.Prime
9898
rw [← minFac_to_nat, to_nat_inj]
9999
exact ⟨bit0.inj, congr_arg _⟩)
100100
| bit1 n =>
101-
decidable_of_iff' (minFacAux (bit1 n) n 1 = bit1 n)
102-
(by
101+
decidable_of_iff' (minFacAux (bit1 n) n 1 = bit1 n) <| by
103102
refine Nat.prime_def_minFac.trans ((and_iff_right ?_).trans ?_)
104-
· exact (Nat.bit0_le_bit1_iff.2 (to_nat_pos n)).trans <| by simp [two_mul]
105-
rw [← minFac_to_nat, to_nat_inj]; rfl)
103+
· simp only [cast_bit1]
104+
have := to_nat_pos n
105+
omega
106+
rw [← minFac_to_nat, to_nat_inj]; rfl
106107
#align pos_num.decidable_prime PosNum.decidablePrime
107108

108109
end PosNum

Mathlib/Init/Data/Nat/Lemmas.lean

Lines changed: 24 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@ Released under Apache 2.0 license as described in the file LICENSE.
44
Authors: Leonardo de Moura, Jeremy Avigad
55
-/
66
import Batteries.Data.Nat.Lemmas
7-
import Batteries.Logic
87
import Batteries.WF
9-
import Mathlib.Init.Data.Nat.Basic
108
import Mathlib.Util.AssertExists
9+
import Mathlib.Mathport.Rename
10+
import Mathlib.Data.Nat.Notation
1111

1212
#align_import init.data.nat.lemmas from "leanprover-community/lean"@"38b59111b2b4e6c572582b27e8937e92fc70ac02"
1313

@@ -227,107 +227,32 @@ protected def ltByCases {a b : ℕ} {C : Sort u} (h₁ : a < b → C) (h₂ : a
227227

228228
/-! bit0/bit1 properties -/
229229
section bit
230-
set_option linter.deprecated false
231230

232-
protected theorem bit1_eq_succ_bit0 (n : ℕ) : 2 * n + 1 = succ (2 * n) :=
233-
rfl
234-
#align nat.bit1_eq_succ_bit0 Nat.bit1_eq_succ_bit0
235-
236-
protected theorem bit1_succ_eq (n : ℕ) : 2 * (succ n) + 1 = succ (succ (2 * n + 1)) :=
237-
Eq.trans (Nat.bit1_eq_succ_bit0 (succ n)) (congr_arg succ (Nat.bit0_succ_eq n))
238-
#align nat.bit1_succ_eq Nat.bit1_succ_eq
239-
240-
protected theorem bit1_ne_one : ∀ {n : ℕ}, n ≠ 02 * n + 11
241-
| 0, h, _h1 => absurd rfl h
242-
| _n + 1, _h, h1 => Nat.noConfusion h1 fun h2 => absurd h2 (succ_ne_zero _)
243-
#align nat.bit1_ne_one Nat.bit1_ne_one
244-
245-
protected theorem bit0_ne_one : ∀ n : ℕ, 2 * n ≠ 1 := by
246-
omega
247-
#align nat.bit0_ne_one Nat.bit0_ne_one
231+
#noalign nat.bit1_eq_succ_bit0
232+
#noalign nat.bit1_succ_eq
233+
#noalign nat.bit1_ne_one
234+
#noalign nat.bit0_ne_one
248235

249236
#align nat.add_self_ne_one Nat.add_self_ne_one
250237

251-
protected theorem bit1_ne_bit0 : ∀ n m : ℕ, 2 * n + 12 * m := by
252-
omega
253-
#align nat.bit1_ne_bit0 Nat.bit1_ne_bit0
254-
255-
protected theorem bit0_ne_bit1 : ∀ n m : ℕ, 2 * n ≠ 2 * m + 1 := by
256-
omega
257-
#align nat.bit0_ne_bit1 Nat.bit0_ne_bit1
258-
259-
protected theorem bit0_inj : ∀ {n m : ℕ}, 2 * n = 2 * m → n = m := by
260-
omega
261-
#align nat.bit0_inj Nat.bit0_inj
262-
263-
protected theorem bit1_inj : ∀ {n m : ℕ}, 2 * n + 1 = 2 * m + 1 → n = m := @fun n m h => by
264-
omega
265-
#align nat.bit1_inj Nat.bit1_inj
266-
267-
protected theorem bit0_ne {n m : ℕ} : n ≠ m → 2 * n ≠ 2 * m := fun h₁ h₂ =>
268-
absurd (Nat.bit0_inj h₂) h₁
269-
#align nat.bit0_ne Nat.bit0_ne
270-
271-
protected theorem bit1_ne {n m : ℕ} : n ≠ m → 2 * n + 12 * m + 1 := fun h₁ h₂ =>
272-
absurd (Nat.bit1_inj h₂) h₁
273-
#align nat.bit1_ne Nat.bit1_ne
274-
275-
protected theorem zero_ne_bit0 {n : ℕ} : n ≠ 002 * n := fun h => Ne.symm (Nat.bit0_ne_zero h)
276-
#align nat.zero_ne_bit0 Nat.zero_ne_bit0
277-
278-
protected theorem zero_ne_bit1 (n : ℕ) : 02 * n + 1 :=
279-
Ne.symm (Nat.bit1_ne_zero n)
280-
#align nat.zero_ne_bit1 Nat.zero_ne_bit1
281-
282-
protected theorem one_ne_bit0 (n : ℕ) : 12 * n :=
283-
Ne.symm (Nat.bit0_ne_one n)
284-
#align nat.one_ne_bit0 Nat.one_ne_bit0
285-
286-
protected theorem one_ne_bit1 {n : ℕ} : n ≠ 012 * n + 1 := fun h => Ne.symm (Nat.bit1_ne_one h)
287-
#align nat.one_ne_bit1 Nat.one_ne_bit1
288-
289-
protected theorem one_lt_bit1 : ∀ {n : Nat}, n ≠ 01 < 2 * n + 1
290-
| 0, h => by contradiction
291-
| succ n, _h => by
292-
rw [Nat.bit1_succ_eq]
293-
apply succ_lt_succ
294-
apply zero_lt_succ
295-
#align nat.one_lt_bit1 Nat.one_lt_bit1
296-
297-
protected theorem one_lt_bit0 : ∀ {n : Nat}, n ≠ 01 < 2 * n
298-
| 0, h => by contradiction
299-
| succ n, _h => by
300-
rw [Nat.bit0_succ_eq]
301-
apply succ_lt_succ
302-
apply zero_lt_succ
303-
#align nat.one_lt_bit0 Nat.one_lt_bit0
304-
305-
protected theorem bit0_lt {n m : Nat} (h : n < m) : 2 * n < 2 * m := by
306-
omega
307-
#align nat.bit0_lt Nat.bit0_lt
308-
309-
protected theorem bit1_lt {n m : Nat} (h : n < m) : 2 * n + 1 < 2 * m + 1 := by
310-
omega
311-
#align nat.bit1_lt Nat.bit1_lt
312-
313-
protected theorem bit0_lt_bit1 {n m : Nat} (h : n ≤ m) : 2 * n < 2 * m + 1 := by
314-
omega
315-
#align nat.bit0_lt_bit1 Nat.bit0_lt_bit1
316-
317-
protected theorem bit1_lt_bit0 : ∀ {n m : Nat}, n < m → 2 * n + 1 < 2 * m := by
318-
omega
319-
#align nat.bit1_lt_bit0 Nat.bit1_lt_bit0
320-
321-
protected theorem one_le_bit1 (n : ℕ) : 12 * n + 1 :=
322-
show 1 ≤ succ (2 * n) from succ_le_succ (2 * n).zero_le
323-
#align nat.one_le_bit1 Nat.one_le_bit1
324-
325-
protected theorem one_le_bit0 : ∀ n : ℕ, n ≠ 012 * n
326-
| 0, h => absurd rfl h
327-
| n + 1, _h =>
328-
suffices 1 ≤ succ (succ (2 * n)) from Eq.symm (Nat.bit0_succ_eq n) ▸ this
329-
succ_le_succ (2 * n).succ.zero_le
330-
#align nat.one_le_bit0 Nat.one_le_bit0
238+
#noalign nat.bit1_ne_bit0
239+
#noalign nat.bit0_ne_bit1
240+
#noalign nat.bit0_inj
241+
#noalign nat.bit1_inj
242+
#noalign nat.bit0_ne
243+
#noalign nat.bit1_ne
244+
#noalign nat.zero_ne_bit0
245+
#noalign nat.zero_ne_bit1
246+
#noalign nat.one_ne_bit0
247+
#noalign nat.one_ne_bit1
248+
#noalign nat.one_lt_bit1
249+
#noalign nat.one_lt_bit0
250+
#noalign nat.bit0_lt
251+
#noalign nat.bit1_lt
252+
#noalign nat.bit0_lt_bit1
253+
#noalign nat.bit1_lt_bit0
254+
#noalign nat.one_le_bit1
255+
#noalign nat.one_le_bit0
331256

332257
end bit
333258

0 commit comments

Comments
 (0)