# HG changeset patch # User haftmann # Date 1706181543 0 # Node ID 22a137a6de44fd3afe948865b4c5876ad9c63828 # Parent 1b0fc6ceb750641b4ad0d223ce65e6600bff3f4d rearranged and reformulated abstract classes for bit structures and operations diff -r 1b0fc6ceb750 -r 22a137a6de44 src/HOL/Bit_Operations.thy --- a/src/HOL/Bit_Operations.thy Thu Jan 25 17:08:07 2024 +0000 +++ b/src/HOL/Bit_Operations.thy Thu Jan 25 11:19:03 2024 +0000 @@ -5,7 +5,7 @@ theory Bit_Operations imports Presburger Groups_List -begin +begin subsection \Abstract bit structures\ @@ -14,17 +14,14 @@ \(\a. a div 2 = a \ P a) \ (\a b. P a \ (of_bool b + 2 * a) div 2 = a \ P (of_bool b + 2 * a)) \ P a\ - assumes bits_div_0 [simp]: \0 div a = 0\ - and bits_div_by_0 [simp]: \a div 0 = 0\ + assumes bits_div_by_0 [simp]: \a div 0 = 0\ and bits_div_by_1 [simp]: \a div 1 = a\ + and bits_0_div [simp]: \0 div a = 0\ and even_half_succ_eq [simp]: \even a \ (1 + a) div 2 = a div 2\ - and even_mask_div_iff: \even ((2 ^ m - 1) div 2 ^ n) \ 2 ^ n = 0 \ m \ n\ - and exp_div_exp_eq: \2 ^ m div 2 ^ n = of_bool (2 ^ m \ 0 \ m \ n) * 2 ^ (m - n)\ - and div_exp_eq: \a div 2 ^ m div 2 ^ n = a div 2 ^ (m + n)\ - and mod_exp_eq: \a mod 2 ^ m mod 2 ^ n = a mod 2 ^ min m n\ - and mult_exp_mod_exp_eq: \m \ n \ (a * 2 ^ m) mod (2 ^ n) = (a mod 2 ^ (n - m)) * 2 ^ m\ - and div_exp_mod_exp_eq: \a div 2 ^ n mod 2 ^ m = a mod (2 ^ (n + m)) div 2 ^ n\ - and even_mult_exp_div_exp_iff: \even (a * 2 ^ m div 2 ^ n) \ m > n \ 2 ^ n = 0 \ (m \ n \ even (a div 2 ^ (n - m)))\ + and half_div_exp_eq: \a div 2 div 2 ^ n = a div 2 ^ Suc n\ + and even_double_div_exp_iff: \2 ^ Suc n \ 0 \ even (2 * a div 2 ^ Suc n) \ even (a div 2 ^ n)\ + and even_decr_exp_div_exp_iff: \2 ^ n \ 0 \ even ((2 ^ m - 1) div 2 ^ n) \ m \ n\ + and even_mod_exp_diff_exp_iff: \even (a mod 2 ^ m div 2 ^ n) \ m \ n \ even (a div 2 ^ n)\ fixes bit :: \'a \ nat \ bool\ assumes bit_iff_odd: \bit a n \ odd (a div 2 ^ n)\ begin @@ -35,64 +32,36 @@ differently wrt. code generation. \ -lemma bits_1_div_2 [simp]: +lemma half_1 [simp]: \1 div 2 = 0\ using even_half_succ_eq [of 0] by simp -lemma bits_1_div_exp [simp]: - \1 div 2 ^ n = of_bool (n = 0)\ - using div_exp_eq [of 1 1] by (cases n) simp_all - -lemma even_succ_div_exp [simp]: - \(1 + a) div 2 ^ n = a div 2 ^ n\ if \even a\ and \n > 0\ -proof (cases n) - case 0 - with that show ?thesis - by simp -next - case (Suc n) - with \even a\ have \(1 + a) div 2 ^ Suc n = a div 2 ^ Suc n\ - proof (induction n) - case 0 - then show ?case - by simp - next - case (Suc n) - then show ?case - using div_exp_eq [of _ 1 \Suc n\, symmetric] - by simp - qed - with Suc show ?thesis - by simp -qed - -lemma even_succ_mod_exp [simp]: - \(1 + a) mod 2 ^ n = 1 + (a mod 2 ^ n)\ if \even a\ and \n > 0\ - using div_mult_mod_eq [of \1 + a\ \2 ^ n\] div_mult_mod_eq [of a \2 ^ n\] that - by simp (metis (full_types) add.left_commute add_left_imp_eq) +lemma bits_mod_by_0 [simp]: + \a mod 0 = a\ + using div_mult_mod_eq [of a 0] by simp lemma bits_mod_by_1 [simp]: \a mod 1 = 0\ using div_mult_mod_eq [of a 1] by simp -lemma bits_mod_0 [simp]: +lemma bits_0_mod [simp]: \0 mod a = 0\ using div_mult_mod_eq [of 0 a] by simp -lemma mod_exp_div_exp_eq_0 [simp]: - \a mod 2 ^ n div 2 ^ n = 0\ -proof (induction n arbitrary: a) - case 0 - then show ?case - by simp -next - case (Suc n) - then have \a div 2 ^ 1 mod 2 ^ n div 2 ^ n = 0\ . - then show ?case - using div_exp_eq [of _ 1 n] div_exp_mod_exp_eq [of a 1 n] +lemma div_exp_eq_funpow_half: + \a div 2 ^ n = ((\a. a div 2) ^^ n) a\ +proof - + have \((\a. a div 2) ^^ n) = (\a. a div 2 ^ n)\ + by (induction n) + (simp_all del: funpow.simps power.simps add: power_0 funpow_Suc_right half_div_exp_eq) + then show ?thesis by simp qed +lemma div_exp_eq: + \a div 2 ^ m div 2 ^ n = a div 2 ^ (m + n)\ + by (simp add: div_exp_eq_funpow_half Groups.add.commute [of m] funpow_add) + lemma bit_0: \bit a 0 \ odd a\ by (simp add: bit_iff_odd) @@ -105,10 +74,6 @@ \bit a n \ (if n = 0 then odd a else bit (a div 2) (n - 1))\ by (cases n) (simp_all add: bit_Suc bit_0) -lemma bit_0_eq [simp]: - \bit 0 = \\ - by (simp add: fun_eq_iff bit_iff_odd) - context fixes a assumes stable: \a div 2 = a\ @@ -156,9 +121,35 @@ using \a div 2 = a\ by (simp add: hyp) qed -lemma exp_eq_0_imp_not_bit: - \\ bit a n\ if \2 ^ n = 0\ - using that by (simp add: bit_iff_odd) +lemma even_succ_div_exp [simp]: + \(1 + a) div 2 ^ n = a div 2 ^ n\ if \even a\ and \n > 0\ +proof (cases n) + case 0 + with that show ?thesis + by simp +next + case (Suc n) + with \even a\ have \(1 + a) div 2 ^ Suc n = a div 2 ^ Suc n\ + proof (induction n) + case 0 + then show ?case + by simp + next + case (Suc n) + then show ?case + using div_exp_eq [of _ 1 \Suc n\, symmetric] + by simp + qed + with Suc show ?thesis + by simp +qed + +lemma even_succ_mod_exp [simp]: + \(1 + a) mod 2 ^ n = 1 + (a mod 2 ^ n)\ if \even a\ and \n > 0\ + using div_mult_mod_eq [of \1 + a\ \2 ^ n\] div_mult_mod_eq [of a \2 ^ n\] that + by simp (metis (full_types) add.left_commute add_left_imp_eq) + +named_theorems bit_simps \Simplification rules for \<^const>\bit\\ definition possible_bit :: \'a itself \ nat \ bool\ where \possible_bit TYPE('a) n \ 2 ^ n \ 0\ @@ -174,7 +165,7 @@ lemma bit_imp_possible_bit: \possible_bit TYPE('a) n\ if \bit a n\ - using that by (auto simp add: possible_bit_def exp_eq_0_imp_not_bit) + by (rule ccontr) (use that in \auto simp add: bit_iff_odd possible_bit_def\) lemma impossible_bit: \\ bit a n\ if \\ possible_bit TYPE('a) n\ @@ -193,14 +184,14 @@ \a = b\ if \\n. possible_bit TYPE('a) n \ bit a n \ bit b n\ proof - have \bit a n \ bit b n\ for n - proof (cases \2 ^ n = 0\) + proof (cases \possible_bit TYPE('a) n\) + case False + then show ?thesis + by (simp add: impossible_bit) + next case True then show ?thesis - by (simp add: exp_eq_0_imp_not_bit) - next - case False - then show ?thesis - by (rule that[unfolded possible_bit_def]) + by (rule that) qed then show ?thesis proof (induction a arbitrary: b rule: bit_induct) case (stable a) @@ -243,43 +234,6 @@ qed qed -lemma bit_eq_iff: - \a = b \ (\n. possible_bit TYPE('a) n \ bit a n \ bit b n)\ - by (auto intro: bit_eqI) - -named_theorems bit_simps \Simplification rules for \<^const>\bit\\ - -lemma bit_exp_iff [bit_simps]: - \bit (2 ^ m) n \ possible_bit TYPE('a) n \ m = n\ - by (auto simp add: bit_iff_odd exp_div_exp_eq possible_bit_def) - -lemma bit_1_iff [bit_simps]: - \bit 1 n \ n = 0\ - using bit_exp_iff [of 0 n] - by auto - -lemma bit_2_iff [bit_simps]: - \bit 2 n \ possible_bit TYPE('a) 1 \ n = 1\ - using bit_exp_iff [of 1 n] by auto - -lemma even_bit_succ_iff: - \bit (1 + a) n \ bit a n \ n = 0\ if \even a\ - using that by (cases \n = 0\) (simp_all add: bit_iff_odd) - -lemma bit_double_iff [bit_simps]: - \bit (2 * a) n \ bit a (n - 1) \ n \ 0 \ possible_bit TYPE('a) n\ - using even_mult_exp_div_exp_iff [of a 1 n] - by (cases n, auto simp add: bit_iff_odd ac_simps possible_bit_def) - -lemma odd_bit_iff_bit_pred: - \bit a n \ bit (a - 1) n \ n = 0\ if \odd a\ -proof - - from \odd a\ obtain b where \a = 2 * b + 1\ .. - moreover have \bit (2 * b) n \ n = 0 \ bit (1 + 2 * b) n\ - using even_bit_succ_iff by simp - ultimately show ?thesis by (simp add: ac_simps) -qed - lemma bit_eq_rec: \a = b \ (even a \ even b) \ a div 2 = b div 2\ (is \?P = ?Q\) proof @@ -308,37 +262,97 @@ qed qed +lemma bit_eq_iff: + \a = b \ (\n. possible_bit TYPE('a) n \ bit a n \ bit b n)\ + by (auto intro: bit_eqI simp add: possible_bit_def) + +lemma bit_0_eq [simp]: + \bit 0 = \\ +proof - + have \0 div 2 ^ n = 0\ for n + unfolding div_exp_eq_funpow_half by (induction n) simp_all + then show ?thesis + by (simp add: fun_eq_iff bit_iff_odd) +qed + +lemma bit_double_Suc_iff: + \bit (2 * a) (Suc n) \ possible_bit TYPE('a) (Suc n) \ bit a n\ + using even_double_div_exp_iff [of n a] + by (cases \possible_bit TYPE('a) (Suc n)\) + (auto simp add: bit_iff_odd possible_bit_def) + +lemma bit_double_iff [bit_simps]: + \bit (2 * a) n \ possible_bit TYPE('a) n \ n \ 0 \ bit a (n - 1)\ + by (cases n) (simp_all add: bit_0 bit_double_Suc_iff) + +lemma even_bit_succ_iff: + \bit (1 + a) n \ bit a n \ n = 0\ if \even a\ + using that by (cases \n = 0\) (simp_all add: bit_iff_odd) + +lemma odd_bit_iff_bit_pred: + \bit a n \ bit (a - 1) n \ n = 0\ if \odd a\ +proof - + from \odd a\ obtain b where \a = 2 * b + 1\ .. + moreover have \bit (2 * b) n \ n = 0 \ bit (1 + 2 * b) n\ + using even_bit_succ_iff by simp + ultimately show ?thesis by (simp add: ac_simps) +qed + +lemma bit_exp_iff [bit_simps]: + \bit (2 ^ m) n \ possible_bit TYPE('a) n \ n = m\ +proof (cases \possible_bit TYPE('a) n\) + case False + then show ?thesis + by (simp add: impossible_bit) +next + case True + then show ?thesis + proof (induction n arbitrary: m) + case 0 + show ?case + by (simp add: bit_0) + next + case (Suc n) + then have \possible_bit TYPE('a) n\ + by (simp add: possible_bit_less_imp) + show ?case + proof (cases m) + case 0 + then show ?thesis + by (simp add: bit_Suc) + next + case (Suc m) + with Suc.IH [of m] \possible_bit TYPE('a) n\ show ?thesis + by (simp add: bit_double_Suc_iff) + qed + qed +qed + +lemma bit_1_iff [bit_simps]: + \bit 1 n \ n = 0\ + using bit_exp_iff [of 0 n] by auto + +lemma bit_2_iff [bit_simps]: + \bit 2 n \ possible_bit TYPE('a) 1 \ n = 1\ + using bit_exp_iff [of 1 n] by auto + +lemma bit_of_bool_iff [bit_simps]: + \bit (of_bool b) n \ n = 0 \ b\ + by (simp add: bit_1_iff) + lemma bit_mod_2_iff [simp]: \bit (a mod 2) n \ n = 0 \ odd a\ - by (cases a rule: parity_cases) (simp_all add: bit_iff_odd) - -lemma bit_mask_sub_iff: - \bit (2 ^ m - 1) n \ possible_bit TYPE('a) n \ n < m\ - by (simp add: bit_iff_odd even_mask_div_iff not_le possible_bit_def) - -lemma exp_add_not_zero_imp: - \2 ^ m \ 0\ and \2 ^ n \ 0\ if \2 ^ (m + n) \ 0\ -proof - - have \\ (2 ^ m = 0 \ 2 ^ n = 0)\ - proof (rule notI) - assume \2 ^ m = 0 \ 2 ^ n = 0\ - then have \2 ^ (m + n) = 0\ - by (rule disjE) (simp_all add: power_add) - with that show False .. - qed - then show \2 ^ m \ 0\ and \2 ^ n \ 0\ - by simp_all -qed + by (simp add: mod_2_eq_odd bit_simps) lemma bit_disjunctive_add_iff: \bit (a + b) n \ bit a n \ bit b n\ if \\n. \ bit a n \ \ bit b n\ -proof (cases \2 ^ n = 0\) - case True +proof (cases \possible_bit TYPE('a) n\) + case False then show ?thesis - by (simp add: exp_eq_0_imp_not_bit) + by (auto dest: impossible_bit) next - case False + case True with that show ?thesis proof (induction n arbitrary: a b) case 0 from "0.prems"(1) [of 0] show ?case @@ -349,56 +363,21 @@ by (auto simp add: bit_0) have bit: \\ bit (a div 2) n \ \ bit (b div 2) n\ for n using Suc.prems(1) [of \Suc n\] by (simp add: bit_Suc) - from Suc.prems(2) have \2 * 2 ^ n \ 0\ \2 ^ n \ 0\ - by (auto simp add: mult_2) + from Suc.prems(2) have \possible_bit TYPE('a) (Suc n)\ \possible_bit TYPE('a) n\ + by (simp_all add: possible_bit_less_imp) have \a + b = (a div 2 * 2 + a mod 2) + (b div 2 * 2 + b mod 2)\ using div_mult_mod_eq [of a 2] div_mult_mod_eq [of b 2] by simp also have \\ = of_bool (odd a \ odd b) + 2 * (a div 2 + b div 2)\ using even by (auto simp add: algebra_simps mod2_eq_if) finally have \bit ((a + b) div 2) n \ bit (a div 2 + b div 2) n\ - using \2 * 2 ^ n \ 0\ by simp (simp_all flip: bit_Suc add: bit_double_iff possible_bit_def) + using \possible_bit TYPE('a) (Suc n)\ by simp (simp_all flip: bit_Suc add: bit_double_iff possible_bit_def) also have \\ \ bit (a div 2) n \ bit (b div 2) n\ - using bit \2 ^ n \ 0\ by (rule Suc.IH) + using bit \possible_bit TYPE('a) n\ by (rule Suc.IH) finally show ?case by (simp add: bit_Suc) qed qed -lemma - exp_add_not_zero_imp_left: \2 ^ m \ 0\ - and exp_add_not_zero_imp_right: \2 ^ n \ 0\ - if \2 ^ (m + n) \ 0\ -proof - - have \\ (2 ^ m = 0 \ 2 ^ n = 0)\ - proof (rule notI) - assume \2 ^ m = 0 \ 2 ^ n = 0\ - then have \2 ^ (m + n) = 0\ - by (rule disjE) (simp_all add: power_add) - with that show False .. - qed - then show \2 ^ m \ 0\ and \2 ^ n \ 0\ - by simp_all -qed - -lemma exp_not_zero_imp_exp_diff_not_zero: - \2 ^ (n - m) \ 0\ if \2 ^ n \ 0\ -proof (cases \m \ n\) - case True - moreover define q where \q = n - m\ - ultimately have \n = m + q\ - by simp - with that show ?thesis - by (simp add: exp_add_not_zero_imp_right) -next - case False - with that show ?thesis - by simp -qed - -lemma bit_of_bool_iff [bit_simps]: - \bit (of_bool b) n \ b \ n = 0\ - by (simp add: bit_1_iff) - end lemma nat_bit_induct [case_names zero even odd]: @@ -454,25 +433,27 @@ with rec [of n True] show ?case by simp qed - show \q mod 2 ^ m mod 2 ^ n = q mod 2 ^ min m n\ - for q m n :: nat - apply (auto simp add: less_iff_Suc_add power_add mod_mod_cancel split: split_min_lin) - apply (metis div_mult2_eq mod_div_trivial mod_eq_self_iff_div_eq_0 mod_mult_self2_is_0 power_commutes) - done - show \(q * 2 ^ m) mod (2 ^ n) = (q mod 2 ^ (n - m)) * 2 ^ m\ if \m \ n\ - for q m n :: nat - using that - apply (auto simp add: mod_mod_cancel div_mult2_eq power_add mod_mult2_eq le_iff_add split: split_min_lin) - done - show \even ((2 ^ m - (1::nat)) div 2 ^ n) \ 2 ^ n = (0::nat) \ m \ n\ - for m n :: nat - using even_mask_div_iff' [where ?'a = nat, of m n] by simp - show \even (q * 2 ^ m div 2 ^ n) \ n < m \ (2::nat) ^ n = 0 \ m \ n \ even (q div 2 ^ (n - m))\ - for m n q r :: nat - apply (auto simp add: not_less power_add ac_simps dest!: le_Suc_ex) - apply (metis (full_types) dvd_mult dvd_mult_imp_div dvd_power_iff_le not_less not_less_eq order_refl power_Suc) - done -qed (auto simp add: div_mult2_eq mod_mult2_eq power_add power_diff bit_nat_def) + show \even (((2 :: nat) ^ m - 1) div 2 ^ n) \ m \ n\ for m n :: nat + using even_decr_exp_div_exp_iff' [of m n] . + show \even (q mod 2 ^ m div 2 ^ n) \ m \ n \ even (q div 2 ^ n)\ for q m n :: nat + proof (cases \m \ n\) + case True + moreover define r where \r = n - m\ + ultimately have \n = m + r\ + by simp + with True show ?thesis + by (simp add: power_add div_mult2_eq) + next + case False + moreover define r where \r = m - Suc n\ + ultimately have \m = n + Suc r\ + by simp + moreover have \even (q mod 2 ^ (n + Suc r) div 2 ^ n) \ even (q div 2 ^ n)\ + by (simp only: power_add) (simp add: mod_mult2_eq dvd_mod_iff) + ultimately show ?thesis + by simp + qed +qed (auto simp add: div_mult2_eq bit_nat_def) end @@ -497,12 +478,12 @@ lemma bit_of_nat_iff [bit_simps]: \bit (of_nat m) n \ possible_bit TYPE('a) n \ bit m n\ -proof (cases \(2::'a) ^ n = 0\) - case True +proof (cases \possible_bit TYPE('a) n\) + case False then show ?thesis - by (simp add: exp_eq_0_imp_not_bit possible_bit_def) + by (simp add: impossible_bit) next - case False + case True then have \bit (of_nat m) n \ bit m n\ proof (induction m arbitrary: n rule: nat_bit_induct) case zero @@ -520,8 +501,8 @@ (auto simp add: bit_double_iff even_bit_succ_iff possible_bit_def Bit_Operations.bit_Suc Bit_Operations.bit_0 dest: mult_not_zero) qed - with False show ?thesis - by (simp add: possible_bit_def) + with True show ?thesis + by simp qed end @@ -611,46 +592,27 @@ with rec [of k True] show ?case by (simp add: ac_simps) qed - show \(2::int) ^ m div 2 ^ n = of_bool ((2::int) ^ m \ 0 \ n \ m) * 2 ^ (m - n)\ - for m n :: nat - proof (cases \m < n\) + show \even (((2 :: int) ^ m - 1) div 2 ^ n) \ m \ n\ for m n :: nat + using even_decr_exp_div_exp_iff' [of m n] . + show \even (k mod 2 ^ m div 2 ^ n) \ m \ n \ even (k div 2 ^ n)\ for k :: int and m n :: nat + proof (cases \m \ n\) case True - then have \n = m + (n - m)\ + moreover define r where \r = n - m\ + ultimately have \n = m + r\ by simp - then have \(2::int) ^ m div 2 ^ n = (2::int) ^ m div 2 ^ (m + (n - m))\ - by simp - also have \\ = (2::int) ^ m div (2 ^ m * 2 ^ (n - m))\ - by (simp add: power_add) - also have \\ = (2::int) ^ m div 2 ^ m div 2 ^ (n - m)\ - by (simp add: zdiv_zmult2_eq) - finally show ?thesis using \m < n\ by simp + with True show ?thesis + by (simp add: power_add zdiv_zmult2_eq) next case False - then show ?thesis - by (simp add: power_diff) + moreover define r where \r = m - Suc n\ + ultimately have \m = n + Suc r\ + by simp + moreover have \even (k mod 2 ^ (n + Suc r) div 2 ^ n) \ even (k div 2 ^ n)\ + by (simp only: power_add) (simp add: zmod_zmult2_eq dvd_mod_iff) + ultimately show ?thesis + by simp qed - show \k mod 2 ^ m mod 2 ^ n = k mod 2 ^ min m n\ - for m n :: nat and k :: int - using mod_exp_eq [of \nat k\ m n] - apply (auto simp add: mod_mod_cancel zdiv_zmult2_eq power_add zmod_zmult2_eq le_iff_add split: split_min_lin) - apply (auto simp add: less_iff_Suc_add mod_mod_cancel power_add) - apply (simp only: flip: mult.left_commute [of \2 ^ m\]) - apply (subst zmod_zmult2_eq) apply simp_all - done - show \(k * 2 ^ m) mod (2 ^ n) = (k mod 2 ^ (n - m)) * 2 ^ m\ - if \m \ n\ for m n :: nat and k :: int - using that - apply (auto simp add: power_add zmod_zmult2_eq le_iff_add split: split_min_lin) - done - show \even ((2 ^ m - (1::int)) div 2 ^ n) \ 2 ^ n = (0::int) \ m \ n\ - for m n :: nat - using even_mask_div_iff' [where ?'a = int, of m n] by simp - show \even (k * 2 ^ m div 2 ^ n) \ n < m \ (2::int) ^ n = 0 \ m \ n \ even (k div 2 ^ (n - m))\ - for m n :: nat and k l :: int - apply (auto simp add: not_less power_add ac_simps dest!: le_Suc_ex) - apply (metis Suc_leI dvd_mult dvd_mult_imp_div dvd_power_le dvd_refl power.simps(2)) - done -qed (auto simp add: zdiv_zmult2_eq zmod_zmult2_eq power_add power_diff not_le bit_int_def) +qed (auto simp add: zdiv_zmult2_eq bit_int_def) end @@ -715,6 +677,14 @@ differently wrt. code generation. \ +lemma bit_iff_odd_drop_bit: + \bit a n \ odd (drop_bit n a)\ + by (simp add: bit_iff_odd drop_bit_eq_div) + +lemma even_drop_bit_iff_not_bit: + \even (drop_bit n a) \ \ bit a n\ + by (simp add: bit_iff_odd_drop_bit) + lemma bit_and_iff [bit_simps]: \bit (a AND b) n \ bit a n \ bit b n\ proof (induction n arbitrary: a b) @@ -816,13 +786,71 @@ \a XOR a = 0\ by (rule bit_eqI) (simp add: bit_simps) -lemma bit_iff_odd_drop_bit: - \bit a n \ odd (drop_bit n a)\ - by (simp add: bit_iff_odd drop_bit_eq_div) - -lemma even_drop_bit_iff_not_bit: - \even (drop_bit n a) \ \ bit a n\ - by (simp add: bit_iff_odd_drop_bit) +lemma bit_mask_iff [bit_simps]: + \bit (mask m) n \ possible_bit TYPE('a) n \ n < m\ + apply (cases \possible_bit TYPE('a) n\) + apply (simp add: bit_iff_odd mask_eq_exp_minus_1 possible_bit_def even_decr_exp_div_exp_iff not_le) + apply (simp add: impossible_bit) + done + +lemma even_mask_iff: + \even (mask n) \ n = 0\ + using bit_mask_iff [of n 0] by (auto simp add: bit_0) + +lemma mask_0 [simp]: + \mask 0 = 0\ + by (simp add: mask_eq_exp_minus_1) + +lemma mask_Suc_0 [simp]: + \mask (Suc 0) = 1\ + by (simp add: mask_eq_exp_minus_1 add_implies_diff sym) + +lemma mask_Suc_exp: + \mask (Suc n) = 2 ^ n OR mask n\ + by (auto simp add: bit_eq_iff bit_simps) + +lemma mask_Suc_double: + \mask (Suc n) = 1 OR 2 * mask n\ + by (auto simp add: bit_eq_iff bit_simps elim: possible_bit_less_imp) + +lemma mask_numeral: + \mask (numeral n) = 1 + 2 * mask (pred_numeral n)\ + by (simp add: numeral_eq_Suc mask_Suc_double one_or_eq ac_simps) + +lemma push_bit_0_id [simp]: + \push_bit 0 = id\ + by (simp add: fun_eq_iff push_bit_eq_mult) + +lemma push_bit_Suc [simp]: + \push_bit (Suc n) a = push_bit n (a * 2)\ + by (simp add: push_bit_eq_mult ac_simps) + +lemma push_bit_double: + \push_bit n (a * 2) = push_bit n a * 2\ + by (simp add: push_bit_eq_mult ac_simps) + +lemma bit_push_bit_iff [bit_simps]: + \bit (push_bit m a) n \ m \ n \ possible_bit TYPE('a) n \ bit a (n - m)\ +proof (induction n arbitrary: m) + case 0 + then show ?case + by (auto simp add: bit_0 push_bit_eq_mult) +next + case (Suc n) + show ?case + proof (cases m) + case 0 + then show ?thesis + by (auto simp add: bit_imp_possible_bit) + next + case (Suc m) + with Suc.prems Suc.IH [of m] show ?thesis + apply (simp add: push_bit_double) + apply (simp add: bit_simps mult.commute [of _ 2]) + apply (auto simp add: possible_bit_less_imp) + done + qed +qed lemma div_push_bit_of_1_eq_drop_bit: \a div push_bit n 1 = drop_bit n a\ @@ -836,10 +864,6 @@ \push_bit m (push_bit n a) = push_bit (m + n) a\ by (simp add: push_bit_eq_mult power_add ac_simps) -lemma push_bit_0_id [simp]: - \push_bit 0 = id\ - by (simp add: fun_eq_iff push_bit_eq_mult) - lemma push_bit_of_0 [simp]: \push_bit n 0 = 0\ by (simp add: push_bit_eq_mult) @@ -848,14 +872,6 @@ \push_bit n 1 = 2 ^ n\ by (simp add: push_bit_eq_mult) -lemma push_bit_Suc [simp]: - \push_bit (Suc n) a = push_bit n (a * 2)\ - by (simp add: push_bit_eq_mult ac_simps) - -lemma push_bit_double: - \push_bit n (a * 2) = push_bit n a * 2\ - by (simp add: push_bit_eq_mult ac_simps) - lemma push_bit_add: \push_bit n (a + b) = push_bit n a + push_bit n b\ by (simp add: push_bit_eq_mult algebra_simps) @@ -868,15 +884,20 @@ "take_bit 0 a = 0" by (simp add: take_bit_eq_mod) +lemma bit_take_bit_iff [bit_simps]: + \bit (take_bit m a) n \ n < m \ bit a n\ + by (simp add: take_bit_eq_mod bit_iff_odd even_mod_exp_diff_exp_iff not_le) + lemma take_bit_Suc: - \take_bit (Suc n) a = take_bit n (a div 2) * 2 + a mod 2\ -proof - - have \take_bit (Suc n) (a div 2 * 2 + of_bool (odd a)) = take_bit n (a div 2) * 2 + of_bool (odd a)\ - using even_succ_mod_exp [of \2 * (a div 2)\ \Suc n\] - mult_exp_mod_exp_eq [of 1 \Suc n\ \a div 2\] - by (auto simp add: take_bit_eq_mod ac_simps) - then show ?thesis - using div_mult_mod_eq [of a 2] by (simp add: mod_2_eq_odd) + \take_bit (Suc n) a = take_bit n (a div 2) * 2 + a mod 2\ (is \?lhs = ?rhs\) +proof (rule bit_eqI) + fix m + assume \possible_bit TYPE('a) m\ + then show \bit ?lhs m \ bit ?rhs m\ + apply (cases a rule: parity_cases; cases m) + apply (simp_all add: bit_simps even_bit_succ_iff mult.commute [of _ 2] add.commute [of _ 1] flip: bit_Suc) + apply (simp_all add: bit_0) + done qed lemma take_bit_rec: @@ -889,19 +910,23 @@ lemma take_bit_of_0 [simp]: \take_bit n 0 = 0\ - by (simp add: take_bit_eq_mod) + by (rule bit_eqI) (simp add: bit_simps) lemma take_bit_of_1 [simp]: \take_bit n 1 = of_bool (n > 0)\ by (cases n) (simp_all add: take_bit_Suc) +lemma bit_drop_bit_eq [bit_simps]: + \bit (drop_bit n a) = bit a \ (+) n\ + by rule (simp add: drop_bit_eq_div bit_iff_odd div_exp_eq) + lemma drop_bit_of_0 [simp]: \drop_bit n 0 = 0\ - by (simp add: drop_bit_eq_div) + by (rule bit_eqI) (simp add: bit_simps) lemma drop_bit_of_1 [simp]: \drop_bit n 1 = of_bool (n = 0)\ - by (simp add: drop_bit_eq_div) + by (rule bit_eqI) (simp add: bit_simps ac_simps) lemma drop_bit_0 [simp]: \drop_bit 0 = id\ @@ -929,7 +954,7 @@ lemma take_bit_take_bit [simp]: \take_bit m (take_bit n a) = take_bit (min m n) a\ - by (simp add: take_bit_eq_mod mod_exp_eq ac_simps) + by (rule bit_eqI) (simp add: bit_simps) lemma drop_bit_drop_bit [simp]: \drop_bit m (drop_bit n a) = drop_bit (m + n) a\ @@ -937,79 +962,33 @@ lemma push_bit_take_bit: \push_bit m (take_bit n a) = take_bit (m + n) (push_bit m a)\ - apply (simp add: push_bit_eq_mult take_bit_eq_mod power_add ac_simps) - using mult_exp_mod_exp_eq [of m \m + n\ a] apply (simp add: ac_simps power_add) - done + by (rule bit_eqI) (auto simp add: bit_simps) lemma take_bit_push_bit: \take_bit m (push_bit n a) = push_bit n (take_bit (m - n) a)\ -proof (cases \m \ n\) - case True - then show ?thesis - apply (simp add:) - apply (simp_all add: push_bit_eq_mult take_bit_eq_mod) - apply (auto dest!: le_Suc_ex simp add: power_add ac_simps) - using mult_exp_mod_exp_eq [of m m \a * 2 ^ n\ for n] - apply (simp add: ac_simps) - done -next - case False - then show ?thesis - using push_bit_take_bit [of n \m - n\ a] - by simp -qed + by (rule bit_eqI) (auto simp add: bit_simps) lemma take_bit_drop_bit: \take_bit m (drop_bit n a) = drop_bit n (take_bit (m + n) a)\ - by (simp add: drop_bit_eq_div take_bit_eq_mod ac_simps div_exp_mod_exp_eq) + by (rule bit_eqI) (auto simp add: bit_simps) lemma drop_bit_take_bit: \drop_bit m (take_bit n a) = take_bit (n - m) (drop_bit m a)\ -proof (cases "m \ n") - case True - then show ?thesis - using take_bit_drop_bit [of "n - m" m a] by simp -next - case False - then obtain q where \m = n + q\ - by (auto simp add: not_le dest: less_imp_Suc_add) - then have \drop_bit m (take_bit n a) = 0\ - using div_exp_eq [of \a mod 2 ^ n\ n q] - by (simp add: take_bit_eq_mod drop_bit_eq_div) - with False show ?thesis - by simp -qed + by (rule bit_eqI) (auto simp add: bit_simps) lemma even_push_bit_iff [simp]: \even (push_bit n a) \ n \ 0 \ even a\ by (simp add: push_bit_eq_mult) auto -lemma bit_push_bit_iff [bit_simps]: - \bit (push_bit m a) n \ m \ n \ possible_bit TYPE('a) n \ bit a (n - m)\ - by (auto simp add: bit_iff_odd push_bit_eq_mult even_mult_exp_div_exp_iff possible_bit_def) - -lemma bit_drop_bit_eq [bit_simps]: - \bit (drop_bit n a) = bit a \ (+) n\ - by (simp add: bit_iff_odd fun_eq_iff ac_simps flip: drop_bit_eq_div) - -lemma bit_take_bit_iff [bit_simps]: - \bit (take_bit m a) n \ n < m \ bit a n\ - by (simp add: bit_iff_odd drop_bit_take_bit not_le flip: drop_bit_eq_div) - lemma stable_imp_drop_bit_eq: \drop_bit n a = a\ if \a div 2 = a\ by (induction n) (simp_all add: that drop_bit_Suc) lemma stable_imp_take_bit_eq: - \take_bit n a = (if even a then 0 else 2 ^ n - 1)\ + \take_bit n a = (if even a then 0 else mask n)\ if \a div 2 = a\ -proof (rule bit_eqI[unfolded possible_bit_def]) - fix m - assume \2 ^ m \ 0\ - with that show \bit (take_bit n a) m \ bit (if even a then 0 else 2 ^ n - 1) m\ - by (simp add: bit_take_bit_iff bit_mask_sub_iff possible_bit_def stable_imp_bit_iff_odd) -qed + by (rule bit_eqI) (use that in \simp add: bit_simps stable_imp_bit_iff_odd\) lemma exp_dvdE: assumes \2 ^ n dvd a\ @@ -1114,34 +1093,6 @@ \drop_bit n (a XOR b) = drop_bit n a XOR drop_bit n b\ by (auto simp add: bit_eq_iff bit_simps) -lemma bit_mask_iff [bit_simps]: - \bit (mask m) n \ possible_bit TYPE('a) n \ n < m\ - by (simp add: mask_eq_exp_minus_1 bit_mask_sub_iff) - -lemma even_mask_iff: - \even (mask n) \ n = 0\ - using bit_mask_iff [of n 0] by (auto simp add: bit_0) - -lemma mask_0 [simp]: - \mask 0 = 0\ - by (simp add: mask_eq_exp_minus_1) - -lemma mask_Suc_0 [simp]: - \mask (Suc 0) = 1\ - by (simp add: mask_eq_exp_minus_1 add_implies_diff sym) - -lemma mask_Suc_exp: - \mask (Suc n) = 2 ^ n OR mask n\ - by (auto simp add: bit_eq_iff bit_simps) - -lemma mask_Suc_double: - \mask (Suc n) = 1 OR 2 * mask n\ - by (auto simp add: bit_eq_iff bit_simps elim: possible_bit_less_imp) - -lemma mask_numeral: - \mask (numeral n) = 1 + 2 * mask (pred_numeral n)\ - by (simp add: numeral_eq_Suc mask_Suc_double one_or_eq ac_simps) - lemma take_bit_of_mask [simp]: \take_bit m (mask n) = mask (min m n)\ by (rule bit_eqI) (simp add: bit_simps) @@ -1164,10 +1115,7 @@ lemma bit_iff_and_push_bit_not_eq_0: \bit a n \ a AND push_bit n 1 \ 0\ - apply (cases \2 ^ n = 0\) - apply (simp_all add: bit_eq_iff bit_and_iff bit_push_bit_iff exp_eq_0_imp_not_bit) - apply (simp_all add: bit_exp_iff) - done + by (cases \possible_bit TYPE('a) n\) (simp_all add: bit_eq_iff bit_simps impossible_bit) lemma bit_set_bit_iff [bit_simps]: \bit (set_bit m a) n \ bit a n \ (m = n \ possible_bit TYPE('a) n)\ @@ -1449,10 +1397,7 @@ lemma take_bit_not_iff: \take_bit n (NOT a) = take_bit n (NOT b) \ take_bit n a = take_bit n b\ - apply (simp add: bit_eq_iff) - apply (simp add: bit_not_iff bit_take_bit_iff bit_exp_iff) - apply (use exp_eq_0_imp_not_bit in blast) - done + by (auto simp add: bit_eq_iff bit_simps) lemma take_bit_not_eq_mask_diff: \take_bit n (NOT a) = mask n - take_bit n a\ @@ -1513,12 +1458,7 @@ lemma push_bit_mask_eq: \push_bit m (mask n) = mask (n + m) AND NOT (mask m)\ - apply (rule bit_eqI) - apply (auto simp add: bit_simps not_less possible_bit_def) - apply (drule sym [of 0]) - apply (simp only:) - using exp_not_zero_imp_exp_diff_not_zero apply (blast dest: exp_not_zero_imp_exp_diff_not_zero) - done + by (rule bit_eqI) (auto simp add: bit_simps not_less possible_bit_less_imp) lemma slice_eq_mask: \push_bit n (take_bit m (drop_bit n a)) = a AND mask (m + n) AND NOT (mask n)\ @@ -3755,9 +3695,105 @@ subsection \Lemma duplicates and other\ +context semiring_bits +begin + +lemma even_mask_div_iff [no_atp]: + \even ((2 ^ m - 1) div 2 ^ n) \ 2 ^ n = 0 \ m \ n\ + by (cases \2 ^ n = 0\) (simp_all add: even_decr_exp_div_exp_iff) + +lemma exp_div_exp_eq [no_atp]: + \2 ^ m div 2 ^ n = of_bool (2 ^ m \ 0 \ m \ n) * 2 ^ (m - n)\ + apply (rule bit_eqI) + using bit_exp_iff div_exp_eq apply (auto simp add: bit_iff_odd possible_bit_def) + done + +lemma bits_1_div_2 [no_atp]: + \1 div 2 = 0\ + by (fact half_1) + +lemma bits_1_div_exp [no_atp]: + \1 div 2 ^ n = of_bool (n = 0)\ + using div_exp_eq [of 1 1] by (cases n) simp_all + +lemmas bits_div_0 = bits_0_div + +lemmas bits_mod_0 = bits_0_mod + +lemma exp_add_not_zero_imp [no_atp]: + \2 ^ m \ 0\ and \2 ^ n \ 0\ if \2 ^ (m + n) \ 0\ +proof - + have \\ (2 ^ m = 0 \ 2 ^ n = 0)\ + proof (rule notI) + assume \2 ^ m = 0 \ 2 ^ n = 0\ + then have \2 ^ (m + n) = 0\ + by (rule disjE) (simp_all add: power_add) + with that show False .. + qed + then show \2 ^ m \ 0\ and \2 ^ n \ 0\ + by simp_all +qed + +lemma + exp_add_not_zero_imp_left [no_atp]: \2 ^ m \ 0\ + and exp_add_not_zero_imp_right [no_atp]: \2 ^ n \ 0\ + if \2 ^ (m + n) \ 0\ +proof - + have \\ (2 ^ m = 0 \ 2 ^ n = 0)\ + proof (rule notI) + assume \2 ^ m = 0 \ 2 ^ n = 0\ + then have \2 ^ (m + n) = 0\ + by (rule disjE) (simp_all add: power_add) + with that show False .. + qed + then show \2 ^ m \ 0\ and \2 ^ n \ 0\ + by simp_all +qed + +lemma exp_not_zero_imp_exp_diff_not_zero [no_atp]: + \2 ^ (n - m) \ 0\ if \2 ^ n \ 0\ +proof (cases \m \ n\) + case True + moreover define q where \q = n - m\ + ultimately have \n = m + q\ + by simp + with that show ?thesis + by (simp add: exp_add_not_zero_imp_right) +next + case False + with that show ?thesis + by simp +qed + +lemma exp_eq_0_imp_not_bit [no_atp]: + \\ bit a n\ if \2 ^ n = 0\ + using that by (simp add: bit_iff_odd) + +end + context semiring_bit_operations begin +lemma mod_exp_eq [no_atp]: + \a mod 2 ^ m mod 2 ^ n = a mod 2 ^ min m n\ + by (simp flip: take_bit_eq_mod add: ac_simps) + +lemma mult_exp_mod_exp_eq [no_atp]: + \m \ n \ (a * 2 ^ m) mod (2 ^ n) = (a mod 2 ^ (n - m)) * 2 ^ m\ + by (simp flip: push_bit_eq_mult take_bit_eq_mod add: push_bit_take_bit) + +lemma div_exp_mod_exp_eq [no_atp]: + \a div 2 ^ n mod 2 ^ m = a mod (2 ^ (n + m)) div 2 ^ n\ + by (simp flip: drop_bit_eq_div take_bit_eq_mod add: drop_bit_take_bit) + +lemma even_mult_exp_div_exp_iff [no_atp]: + \even (a * 2 ^ m div 2 ^ n) \ m > n \ 2 ^ n = 0 \ (m \ n \ even (a div 2 ^ (n - m)))\ + by (simp flip: push_bit_eq_mult drop_bit_eq_div add: even_drop_bit_iff_not_bit bit_simps possible_bit_def) auto + +lemma mod_exp_div_exp_eq_0 [no_atp]: + \a mod 2 ^ n div 2 ^ n = 0\ + by (simp flip: take_bit_eq_mod drop_bit_eq_div add: drop_bit_take_bit) + lemmas bits_one_mod_two_eq_one [no_atp] = one_mod_two_eq_one lemmas set_bit_def [no_atp] = set_bit_eq_or diff -r 1b0fc6ceb750 -r 22a137a6de44 src/HOL/Code_Numeral.thy --- a/src/HOL/Code_Numeral.thy Thu Jan 25 17:08:07 2024 +0000 +++ b/src/HOL/Code_Numeral.thy Thu Jan 25 11:19:03 2024 +0000 @@ -348,15 +348,16 @@ is take_bit . instance by (standard; transfer) - (fact bit_eq_rec bit_induct bit_iff_odd push_bit_eq_mult drop_bit_eq_div take_bit_eq_mod - bits_div_0 bits_div_by_0 bits_div_by_1 even_half_succ_eq - exp_div_exp_eq div_exp_eq mod_exp_eq mult_exp_mod_exp_eq div_exp_mod_exp_eq - even_mask_div_iff even_mult_exp_div_exp_iff + (fact bit_induct bits_div_by_0 bits_div_by_1 bits_0_div even_half_succ_eq + half_div_exp_eq even_double_div_exp_iff even_decr_exp_div_exp_iff even_mod_exp_diff_exp_iff + bit_iff_odd push_bit_eq_mult drop_bit_eq_div take_bit_eq_mod and_rec or_rec xor_rec mask_eq_exp_minus_1 set_bit_eq_or unset_bit_eq_or_xor flip_bit_eq_xor not_eq_complement)+ end + + instance integer :: linordered_euclidean_semiring_bit_operations .. context @@ -1107,11 +1108,11 @@ is take_bit . instance by (standard; transfer) - (fact bit_eq_rec bit_induct bit_iff_odd push_bit_eq_mult drop_bit_eq_div take_bit_eq_mod - bits_div_0 bits_div_by_0 bits_div_by_1 even_half_succ_eq - exp_div_exp_eq div_exp_eq mod_exp_eq mult_exp_mod_exp_eq div_exp_mod_exp_eq - even_mask_div_iff even_mult_exp_div_exp_iff and_rec or_rec xor_rec - mask_eq_exp_minus_1 set_bit_eq_or unset_bit_eq_or_xor flip_bit_eq_xor)+ + (fact bit_induct bits_div_by_0 bits_div_by_1 bits_0_div even_half_succ_eq + half_div_exp_eq even_double_div_exp_iff even_decr_exp_div_exp_iff even_mod_exp_diff_exp_iff + bit_iff_odd push_bit_eq_mult drop_bit_eq_div take_bit_eq_mod + and_rec or_rec xor_rec mask_eq_exp_minus_1 + set_bit_eq_or unset_bit_eq_or_xor flip_bit_eq_xor not_eq_complement)+ end diff -r 1b0fc6ceb750 -r 22a137a6de44 src/HOL/Library/Word.thy --- a/src/HOL/Library/Word.thy Thu Jan 25 17:08:07 2024 +0000 +++ b/src/HOL/Library/Word.thy Thu Jan 25 11:19:03 2024 +0000 @@ -828,56 +828,39 @@ qed show \bit a n \ odd (a div 2 ^ n)\ for a :: \'a word\ and n by transfer (simp flip: drop_bit_eq_div add: drop_bit_take_bit bit_iff_odd_drop_bit) - show \0 div a = 0\ - for a :: \'a word\ - by transfer simp show \a div 0 = 0\ for a :: \'a word\ by transfer simp show \a div 1 = a\ for a :: \'a word\ by transfer simp + show \0 div a = 0\ + for a :: \'a word\ + by transfer simp show \(1 + a) div 2 = a div 2\ if \even a\ for a :: \'a word\ using that by transfer (auto dest: le_Suc_ex simp add: take_bit_Suc elim!: evenE) - show \(2 :: 'a word) ^ m div 2 ^ n = of_bool ((2 :: 'a word) ^ m \ 0 \ n \ m) * 2 ^ (m - n)\ - for m n :: nat - by transfer (simp, simp add: exp_div_exp_eq) - show "a div 2 ^ m div 2 ^ n = a div 2 ^ (m + n)" - for a :: "'a word" and m n :: nat + show \a div 2 div 2 ^ n = a div 2 ^ Suc n\ + for a :: \'a word\ and m n :: nat apply transfer - apply (auto simp add: not_less take_bit_drop_bit ac_simps simp flip: drop_bit_eq_div) + using drop_bit_eq_div [symmetric, where ?'a = int,of _ 1] + apply (auto simp add: not_less take_bit_drop_bit ac_simps simp flip: drop_bit_eq_div simp del: power.simps) apply (simp add: drop_bit_take_bit) done - show "a mod 2 ^ m mod 2 ^ n = a mod 2 ^ min m n" - for a :: "'a word" and m n :: nat - by transfer (auto simp flip: take_bit_eq_mod simp add: ac_simps) - show \a * 2 ^ m mod 2 ^ n = a mod 2 ^ (n - m) * 2 ^ m\ - if \m \ n\ for a :: "'a word" and m n :: nat - using that apply transfer - apply (auto simp flip: take_bit_eq_mod) - apply (auto simp flip: push_bit_eq_mult simp add: push_bit_take_bit split: split_min_lin) - done - show \a div 2 ^ n mod 2 ^ m = a mod (2 ^ (n + m)) div 2 ^ n\ - for a :: "'a word" and m n :: nat - by transfer (auto simp add: not_less take_bit_drop_bit ac_simps simp flip: take_bit_eq_mod drop_bit_eq_div split: split_min_lin) - show \even ((2 ^ m - 1) div (2::'a word) ^ n) \ 2 ^ n = (0::'a word) \ m \ n\ + show \even (2 * a div 2 ^ Suc n) \ even (a div 2 ^ n)\ if \2 ^ Suc n \ (0::'a word)\ + for a :: \'a word\ and n :: nat + using that by transfer + (simp add: even_drop_bit_iff_not_bit bit_simps flip: drop_bit_eq_div del: power.simps) + show \even ((2 ^ m - 1) div (2::'a word) ^ n) \ m \ n\ if \2 ^ n \ (0::'a word)\ for m n :: nat - by transfer + using that by transfer (simp flip: drop_bit_eq_div mask_eq_exp_minus_1 add: bit_simps even_drop_bit_iff_not_bit not_less) - show \even (a * 2 ^ m div 2 ^ n) \ n < m \ (2::'a word) ^ n = 0 \ m \ n \ even (a div 2 ^ (n - m))\ + show \even (a mod 2 ^ m div 2 ^ n) \ m \ n \ even (a div 2 ^ n)\ for a :: \'a word\ and m n :: nat - proof transfer - show \even (take_bit LENGTH('a) (k * 2 ^ m) div take_bit LENGTH('a) (2 ^ n)) \ - n < m - \ take_bit LENGTH('a) ((2::int) ^ n) = take_bit LENGTH('a) 0 - \ (m \ n \ even (take_bit LENGTH('a) k div take_bit LENGTH('a) (2 ^ (n - m))))\ - for m n :: nat and k l :: int - by (auto simp flip: take_bit_eq_mod drop_bit_eq_div push_bit_eq_mult - simp add: div_push_bit_of_1_eq_drop_bit drop_bit_take_bit drop_bit_push_bit_int [of n m]) - qed + by transfer + (auto simp flip: take_bit_eq_mod drop_bit_eq_div simp add: even_drop_bit_iff_not_bit bit_simps) qed end diff -r 1b0fc6ceb750 -r 22a137a6de44 src/HOL/Parity.thy --- a/src/HOL/Parity.thy Thu Jan 25 17:08:07 2024 +0000 +++ b/src/HOL/Parity.thy Thu Jan 25 11:19:03 2024 +0000 @@ -925,7 +925,7 @@ context linordered_euclidean_semiring begin -lemma even_mask_div_iff': +lemma even_decr_exp_div_exp_iff': \even ((2 ^ m - 1) div 2 ^ n) \ m \ n\ proof - have \even ((2 ^ m - 1) div 2 ^ n) \ even (of_nat ((2 ^ m - Suc 0) div 2 ^ n))\