# HG changeset patch # User haftmann # Date 1701032807 0 # Node ID 7ab8b3f1d84b3bc53f6965f83bad09a71cb1ef8e # Parent a4775fe69f5dfd93d35843e63ffae9fea2e7d334 generalized diff -r a4775fe69f5d -r 7ab8b3f1d84b src/HOL/Bit_Operations.thy --- a/src/HOL/Bit_Operations.thy Sun Nov 26 21:06:46 2023 +0000 +++ b/src/HOL/Bit_Operations.thy Sun Nov 26 21:06:47 2023 +0000 @@ -100,7 +100,7 @@ by (cases n) (simp_all add: bit_Suc bit_0) lemma bit_0_eq [simp]: - \bit 0 = bot\ + \bit 0 = \\ by (simp add: fun_eq_iff bit_iff_odd) context @@ -1340,6 +1340,15 @@ \take_bit n a = (\k = 0.. by (simp flip: horner_sum_bit_eq_take_bit add: horner_sum_eq_sum push_bit_eq_mult) +lemma set_bit_eq: + \set_bit n a = a + of_bool (\ bit a n) * 2 ^ n\ +proof - + have \set_bit n a = a OR of_bool (\ bit a n) * 2 ^ n\ + by (rule bit_eqI) (auto simp add: bit_simps) + then show ?thesis + by (subst disjunctive_add) (auto simp add: bit_simps) +qed + end class ring_bit_operations = semiring_bit_operations + ring_parity + @@ -1554,6 +1563,15 @@ \push_bit (numeral n) (- 1) = - (2 ^ numeral n)\ by (simp add: push_bit_eq_mult) +lemma unset_bit_eq: + \unset_bit n a = a - of_bool (bit a n) * 2 ^ n\ +proof - + have \unset_bit n a = a AND NOT (of_bool (bit a n) * 2 ^ n)\ + by (rule bit_eqI) (auto simp add: bit_simps) + then show ?thesis + by (subst disjunctive_diff) (auto simp add: bit_simps simp flip: push_bit_eq_mult) +qed + end @@ -1642,6 +1660,50 @@ \drop_bit m (mask n) = mask (n - m)\ by (rule bit_eqI) (auto simp add: bit_simps possible_bit_def) +lemma bit_push_bit_iff': + \bit (push_bit m a) n \ m \ n \ bit a (n - m)\ + by (simp add: bit_simps) + +lemma mask_half: + \mask n div 2 = mask (n - 1)\ + by (cases n) (simp_all add: mask_Suc_double one_or_eq) + +lemma take_bit_Suc_from_most: + \take_bit (Suc n) a = 2 ^ n * of_bool (bit a n) + take_bit n a\ + using mod_mult2_eq' [of a \2 ^ n\ 2] + by (simp only: take_bit_eq_mod power_Suc2) + (simp_all add: bit_iff_odd odd_iff_mod_2_eq_one) + +lemma take_bit_nonnegative [simp]: + \0 \ take_bit n a\ + using horner_sum_nonnegative by (simp flip: horner_sum_bit_eq_take_bit) + +lemma not_take_bit_negative [simp]: + \\ take_bit n a < 0\ + by (simp add: not_less) + +lemma bit_imp_take_bit_positive: + \0 < take_bit m a\ if \n < m\ and \bit a n\ +proof (rule ccontr) + assume \\ 0 < take_bit m a\ + then have \take_bit m a = 0\ + by (auto simp add: not_less intro: order_antisym) + then have \bit (take_bit m a) n = bit 0 n\ + by simp + with that show False + by (simp add: bit_take_bit_iff) +qed + +lemma take_bit_mult: + \take_bit n (take_bit n a * take_bit n b) = take_bit n (a * b)\ + by (simp add: take_bit_eq_mod mod_mult_eq) + +lemma drop_bit_push_bit: + \drop_bit m (push_bit n a) = drop_bit (m - n) (push_bit (n - m) a)\ + by (cases \m \ n\) + (auto simp add: mult.left_commute [of _ \2 ^ n\] mult.commute [of _ \2 ^ n\] mult.assoc + mult.commute [of a] drop_bit_eq_div push_bit_eq_mult not_le power_add Orderings.not_le dest!: le_Suc_ex less_imp_Suc_add) + end @@ -1871,18 +1933,6 @@ \NOT k div 2 = NOT (k div 2)\ for k :: int by (simp add: not_int_def) -lemma bit_push_bit_iff_int: - \bit (push_bit m k) n \ m \ n \ bit k (n - m)\ for k :: int - by (auto simp add: bit_push_bit_iff) - -lemma take_bit_nonnegative [simp]: - \take_bit n k \ 0\ for k :: int - by (simp add: take_bit_eq_mod) - -lemma not_take_bit_negative [simp]: - \\ take_bit n k < 0\ for k :: int - by (simp add: not_less) - lemma take_bit_int_less_exp [simp]: \take_bit n k < 2 ^ n\ for k :: int by (simp add: take_bit_eq_mod) @@ -1905,13 +1955,9 @@ \take_bit n k = k\ if \0 \ k\ \k < 2 ^ n\ for k :: int using that by (simp add: take_bit_int_eq_self_iff) -lemma mask_half_int: - \mask n div 2 = (mask (n - 1) :: int)\ - by (cases n) (simp_all add: mask_eq_exp_minus_1 algebra_simps) - lemma mask_nonnegative_int [simp]: \mask n \ (0::int)\ - by (simp add: mask_eq_exp_minus_1) + by (simp add: mask_eq_exp_minus_1 add_le_imp_le_diff) lemma not_mask_negative_int [simp]: \\ mask n < (0::int)\ @@ -2135,10 +2181,6 @@ \drop_bit n (- 1 :: int) = - 1\ by (simp add: drop_bit_eq_div minus_1_div_exp_eq_int) -lemma take_bit_Suc_from_most: - \take_bit (Suc n) k = 2 ^ n * of_bool (bit k n) + take_bit n k\ for k :: int - by (simp only: take_bit_eq_mod power_Suc2) (simp_all add: bit_iff_odd odd_iff_mod_2_eq_one zmod_zmult2_eq) - lemma take_bit_minus: \take_bit n (- take_bit n k) = take_bit n (- k)\ for k :: int @@ -2149,23 +2191,6 @@ for k l :: int by (simp add: take_bit_eq_mod mod_diff_eq) -lemma bit_imp_take_bit_positive: - \0 < take_bit m k\ if \n < m\ and \bit k n\ for k :: int -proof (rule ccontr) - assume \\ 0 < take_bit m k\ - then have \take_bit m k = 0\ - by (auto simp add: not_less intro: order_antisym) - then have \bit (take_bit m k) n = bit 0 n\ - by simp - with that show False - by (simp add: bit_take_bit_iff) -qed - -lemma take_bit_mult: - \take_bit n (take_bit n k * take_bit n l) = take_bit n (k * l)\ - for k l :: int - by (simp add: take_bit_eq_mod mod_mult_eq) - lemma (in ring_1) of_nat_nat_take_bit_eq [simp]: \of_nat (nat (take_bit n k)) = of_int (take_bit n k)\ by simp @@ -2188,11 +2213,6 @@ by (simp add: take_bit_eq_mod) qed -lemma drop_bit_push_bit_int: - \drop_bit m (push_bit n k) = drop_bit (m - n) (push_bit (n - m) k)\ for k :: int - by (cases \m \ n\) (auto simp add: mult.left_commute [of _ \2 ^ n\] mult.commute [of _ \2 ^ n\] mult.assoc - mult.commute [of k] drop_bit_eq_div push_bit_eq_mult not_le power_add dest!: le_Suc_ex less_imp_Suc_add) - lemma push_bit_nonnegative_int_iff [simp]: \push_bit n k \ 0 \ k \ 0\ for k :: int by (simp add: push_bit_eq_mult zero_le_mult_iff power_le_zero_eq) @@ -2241,24 +2261,6 @@ \unset_bit n k \ k\ for k :: int by (simp add: unset_bit_eq_and_not and_less_eq) -lemma set_bit_eq: - \set_bit n k = k + of_bool (\ bit k n) * 2 ^ n\ for k :: int -proof - - have \set_bit n k = k OR of_bool (\ bit k n) * 2 ^ n\ - by (rule bit_eqI) (auto simp add: bit_simps) - then show ?thesis - by (subst disjunctive_add) (auto simp add: bit_simps) -qed - -lemma unset_bit_eq: - \unset_bit n k = k - of_bool (bit k n) * 2 ^ n\ for k :: int -proof - - have \unset_bit n k = k AND NOT (of_bool (bit k n) * 2 ^ n)\ - by (rule bit_eqI) (auto simp add: bit_simps) - then show ?thesis - by (subst disjunctive_diff) (auto simp add: bit_simps simp flip: push_bit_eq_mult) -qed - lemma and_int_unfold: \k AND l = (if k = 0 \ l = 0 then 0 else if k = - 1 then l else if l = - 1 then k else (k mod 2) * (l mod 2) + 2 * ((k div 2) AND (l div 2)))\ for k l :: int @@ -2606,10 +2608,6 @@ finally show ?P . qed -lemma bit_push_bit_iff_nat: - \bit (push_bit m q) n \ m \ n \ bit q (n - m)\ for q :: nat - by (auto simp add: bit_push_bit_iff) - lemma Suc_0_and_eq [simp]: \Suc 0 AND n = n mod 2\ using one_and_eq [of n] by simp @@ -3812,6 +3810,10 @@ \m XOR n = of_bool (odd m \ odd n) + 2 * ((m div 2) XOR (n div 2))\ for m n :: nat by (fact xor_rec) +lemma bit_push_bit_iff_nat: + \bit (push_bit m q) n \ m \ n \ bit q (n - m)\ for q :: nat + by (fact bit_push_bit_iff') + lemmas and_int_rec = and_int.rec lemmas bit_and_int_iff = and_int.bit_iff @@ -3828,6 +3830,14 @@ \NOT k = of_bool (even k) + 2 * NOT (k div 2)\ for k :: int by (fact not_rec) +lemma mask_half_int: + \mask n div 2 = (mask (n - 1) :: int)\ + by (fact mask_half) + +lemma drop_bit_push_bit_int: + \drop_bit m (push_bit n k) = drop_bit (m - n) (push_bit (n - m) k)\ for k :: int + by (fact drop_bit_push_bit) + lemma even_not_iff_int: \even (NOT k) \ odd k\ for k :: int by (fact even_not_iff) @@ -3836,6 +3846,10 @@ \even (k AND l) \ even k \ even l\ for k l :: int by (fact even_and_iff) +lemma bit_push_bit_iff_int: + \bit (push_bit m k) n \ m \ n \ bit k (n - m)\ for k :: int + by (fact bit_push_bit_iff') + no_notation not (\NOT\) and "and" (infixr \AND\ 64)