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

Commit cc20a86

Browse files
urkudgebnerkim-emmergify[bot]
authored
feat(data/nat/basic): simp lemmas about inequalities with bit* (#2207)
* feat(data/nat/basic): `simp` lemmas about inequalities with `bit*` * Fix compile of `computability/partrec_code` * Fix `nat.bit_cases` to work for `Type*` too * Generalize some lemmas to `linear_ordered_semiring`s * Apply suggestions from code review Co-Authored-By: Gabriel Ebner <gebner@gebner.org> * Apply suggestions from code review Co-Authored-By: Scott Morrison <scott@tqft.net> * fixing a proof Co-authored-by: Gabriel Ebner <gebner@gebner.org> Co-authored-by: Scott Morrison <scott@tqft.net> Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
1 parent 7d89f2e commit cc20a86

File tree

4 files changed

+76
-5
lines changed

4 files changed

+76
-5
lines changed

src/algebra/ordered_ring.lean

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,42 @@ by { rw [← zero_add (0:α), bit0], exact add_lt_add zero_lt_one zero_lt_one }
3737
⟨lt_imp_lt_of_le_imp_le $ λ h', mul_le_mul_of_nonneg_right h' (le_of_lt h),
3838
λ h', mul_lt_mul_of_pos_right h' h⟩
3939

40+
@[simp] lemma zero_le_mul_left {b c : α} (h : 0 < c) : 0 ≤ c * b ↔ 0 ≤ b :=
41+
by { convert mul_le_mul_left h, simp }
42+
43+
@[simp] lemma zero_le_mul_right {b c : α} (h : 0 < c) : 0 ≤ b * c ↔ 0 ≤ b :=
44+
by { convert mul_le_mul_right h, simp }
45+
46+
@[simp] lemma zero_lt_mul_left {b c : α} (h : 0 < c) : 0 < c * b ↔ 0 < b :=
47+
by { convert mul_lt_mul_left h, simp }
48+
49+
@[simp] lemma zero_lt_mul_right {b c : α} (h : 0 < c) : 0 < b * c ↔ 0 < b :=
50+
by { convert mul_lt_mul_right h, simp }
51+
52+
@[simp] lemma bit0_le_bit0 {a b : α} : bit0 a ≤ bit0 b ↔ a ≤ b :=
53+
by rw [bit0, bit0, ← two_mul, ← two_mul, mul_le_mul_left zero_lt_two]
54+
55+
@[simp] lemma bit0_lt_bit0 {a b : α} : bit0 a < bit0 b ↔ a < b :=
56+
by rw [bit0, bit0, ← two_mul, ← two_mul, mul_lt_mul_left zero_lt_two]
57+
58+
@[simp] lemma bit1_le_bit1 {a b : α} : bit1 a ≤ bit1 b ↔ a ≤ b :=
59+
(add_le_add_iff_right 1).trans bit0_le_bit0
60+
61+
@[simp] lemma bit1_lt_bit1 {a b : α} : bit1 a < bit1 b ↔ a < b :=
62+
(add_lt_add_iff_right 1).trans bit0_lt_bit0
63+
64+
@[simp] lemma one_le_bit1 {a : α} : (1 : α) ≤ bit1 a ↔ 0 ≤ a :=
65+
by rw [bit1, le_add_iff_nonneg_left, bit0, ← two_mul, zero_le_mul_left zero_lt_two]
66+
67+
@[simp] lemma one_lt_bit1 {a : α} : (1 : α) < bit1 a ↔ 0 < a :=
68+
by rw [bit1, lt_add_iff_pos_left, bit0, ← two_mul, zero_lt_mul_left zero_lt_two]
69+
70+
@[simp] lemma zero_le_bit0 {a : α} : (0 : α) ≤ bit0 a ↔ 0 ≤ a :=
71+
by rw [bit0, ← two_mul, zero_le_mul_left zero_lt_two]
72+
73+
@[simp] lemma zero_lt_bit0 {a : α} : (0 : α) < bit0 a ↔ 0 < a :=
74+
by rw [bit0, ← two_mul, zero_lt_mul_left zero_lt_two]
75+
4076
lemma mul_lt_mul'' {a b c d : α} (h1 : a < c) (h2 : b < d) (h3 : 0 ≤ a) (h4 : 0 ≤ b) :
4177
a * b < c * d :=
4278
(lt_or_eq_of_le h4).elim

src/computability/partrec_code.lean

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -136,8 +136,7 @@ theorem encode_lt_comp (cf cg) :
136136
begin
137137
suffices, exact (encode_lt_pair cf cg).imp
138138
(λ h, lt_trans h this) (λ h, lt_trans h this),
139-
change _, simp [encode_code_eq, encode_code, -add_comm],
140-
exact nat.bit0_lt (nat.lt_succ_self _),
139+
change _, simp [encode_code_eq, encode_code]
141140
end
142141

143142
theorem encode_lt_prec (cf cg) :
@@ -146,8 +145,7 @@ theorem encode_lt_prec (cf cg) :
146145
begin
147146
suffices, exact (encode_lt_pair cf cg).imp
148147
(λ h, lt_trans h this) (λ h, lt_trans h this),
149-
change _, simp [encode_code_eq, encode_code, -add_comm],
150-
exact nat.lt_succ_self _,
148+
change _, simp [encode_code_eq, encode_code],
151149
end
152150

153151
theorem encode_lt_rfind' (cf) : encode cf < encode (rfind' cf) :=

src/data/nat/basic.lean

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -714,9 +714,46 @@ theorem bit_lt_bit0 : ∀ (b) {n m : ℕ}, n < m → bit b n < bit0 m
714714
theorem bit_lt_bit (a b) {n m : ℕ} (h : n < m) : bit a n < bit b m :=
715715
lt_of_lt_of_le (bit_lt_bit0 _ h) (bit0_le_bit _ (le_refl _))
716716

717+
@[simp] lemma bit0_le_bit1_iff : bit0 k ≤ bit1 n ↔ k ≤ n :=
718+
⟨λ h, by rwa [← nat.lt_succ_iff, n.bit1_eq_succ_bit0, ← n.bit0_succ_eq,
719+
bit0_lt_bit0, nat.lt_succ_iff] at h, λ h, le_of_lt (nat.bit0_lt_bit1 h)⟩
720+
721+
@[simp] lemma bit0_lt_bit1_iff : bit0 k < bit1 n ↔ k ≤ n :=
722+
⟨λ h, bit0_le_bit1_iff.1 (le_of_lt h), nat.bit0_lt_bit1⟩
723+
724+
@[simp] lemma bit1_le_bit0_iff : bit1 k ≤ bit0 n ↔ k < n :=
725+
⟨λ h, by rwa [k.bit1_eq_succ_bit0, succ_le_iff, bit0_lt_bit0] at h,
726+
λ h, le_of_lt (nat.bit1_lt_bit0 h)⟩
727+
728+
@[simp] lemma bit1_lt_bit0_iff : bit1 k < bit0 n ↔ k < n :=
729+
⟨λ h, bit1_le_bit0_iff.1 (le_of_lt h), nat.bit1_lt_bit0⟩
730+
731+
@[simp] lemma one_le_bit0_iff : 1 ≤ bit0 n ↔ 0 < n :=
732+
by { convert bit1_le_bit0_iff, refl, }
733+
734+
@[simp] lemma one_lt_bit0_iff : 1 < bit0 n ↔ 1 ≤ n :=
735+
by { convert bit1_lt_bit0_iff, refl, }
736+
737+
@[simp] lemma bit_le_bit_iff : ∀ {b : bool}, bit b k ≤ bit b n ↔ k ≤ n
738+
| ff := bit0_le_bit0
739+
| tt := bit1_le_bit1
740+
741+
@[simp] lemma bit_lt_bit_iff : ∀ {b : bool}, bit b k < bit b n ↔ k < n
742+
| ff := bit0_lt_bit0
743+
| tt := bit1_lt_bit1
744+
745+
@[simp] lemma bit_le_bit1_iff : ∀ {b : bool}, bit b k ≤ bit1 n ↔ k ≤ n
746+
| ff := bit0_le_bit1_iff
747+
| tt := bit1_le_bit1
748+
717749
lemma pos_of_bit0_pos {n : ℕ} (h : 0 < bit0 n) : 0 < n :=
718750
by { cases n, cases h, apply succ_pos, }
719751

752+
/-- Define a function on `ℕ` depending on parity of the argument. -/
753+
@[elab_as_eliminator]
754+
def bit_cases {C : ℕ → Sort u} (H : Π b n, C (bit b n)) (n : ℕ) : C n :=
755+
eq.rec_on n.bit_decomp (H (bodd n) (div2 n))
756+
720757
/- partial subtraction -/
721758

722759
/-- Partial predecessor operation. Returns `ppred n = some m`

src/data/real/pi.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ end
9191
mul_div_cancel_left],
9292
norm_num, norm_num, norm_num,
9393
apply add_nonneg, norm_num, apply sqrt_two_add_series_zero_nonneg, norm_num,
94-
apply le_of_lt, apply mul_pos, apply cos_pos_of_neg_pi_div_two_lt_of_lt_pi_div_two,
94+
apply le_of_lt, apply cos_pos_of_neg_pi_div_two_lt_of_lt_pi_div_two,
9595
{ transitivity (0 : ℝ), rw neg_lt_zero, apply pi_div_two_pos,
9696
apply div_pos pi_pos, apply pow_pos, norm_num },
9797
apply div_lt_div' (le_refl pi) _ pi_pos _,

0 commit comments

Comments
 (0)