diff -r bdea2b95817b -r 4596a14d9a95 src/HOL/Bit_Operations.thy --- a/src/HOL/Bit_Operations.thy Thu Nov 23 16:49:39 2023 +0000 +++ b/src/HOL/Bit_Operations.thy Thu Nov 23 16:49:39 2023 +0000 @@ -719,7 +719,8 @@ and xor_rec: \a XOR b = of_bool (odd a \ odd b) + 2 * ((a div 2) XOR (b div 2))\ and mask_eq_exp_minus_1: \mask n = 2 ^ n - 1\ and set_bit_eq_or: \set_bit n a = a OR push_bit n 1\ - and bit_unset_bit_iff [bit_simps]: \bit (unset_bit m a) n \ bit a n \ m \ n\ + and unset_bit_0 [simp]: \unset_bit 0 a = 2 * (a div 2)\ + and unset_bit_Suc: \unset_bit (Suc n) a = a mod 2 + 2 * unset_bit n (a div 2)\ and flip_bit_eq_xor: \flip_bit n a = a XOR push_bit n 1\ and push_bit_eq_mult: \push_bit n a = a * 2 ^ n\ and drop_bit_eq_div: \drop_bit n a = a div 2 ^ n\ @@ -1204,6 +1205,26 @@ \even (set_bit m a) \ even a \ m \ 0\ using bit_set_bit_iff [of m a 0] by (auto simp add: bit_0) +lemma bit_unset_bit_iff [bit_simps]: + \bit (unset_bit m a) n \ bit a n \ m \ n\ +proof (induction m arbitrary: a n) + case 0 + then show ?case + by (auto simp add: bit_simps simp flip: bit_Suc dest: bit_imp_possible_bit) +next + case (Suc m) + show ?case + proof (cases n) + case 0 + then show ?thesis + by (cases m) (simp_all add: bit_0 unset_bit_Suc) + next + case (Suc n) + with Suc.IH [of \a div 2\ n] show ?thesis + by (auto simp add: unset_bit_Suc mod_2_eq_odd bit_simps even_bit_succ_iff simp flip: bit_Suc dest: bit_imp_possible_bit) + qed +qed + lemma even_unset_bit_iff: \even (unset_bit m a) \ even a \ m = 0\ using bit_unset_bit_iff [of m a 0] by (auto simp add: bit_0) @@ -1240,15 +1261,6 @@ by (auto simp add: bit_eq_iff bit_sum_mult_2_cases bit_simps bit_0 simp flip: bit_Suc elim: possible_bit_less_imp) -lemma unset_bit_0 [simp]: - \unset_bit 0 a = 2 * (a div 2)\ - by (auto simp add: bit_eq_iff bit_simps even_bit_succ_iff simp flip: bit_Suc) - -lemma unset_bit_Suc: - \unset_bit (Suc n) a = a mod 2 + 2 * unset_bit n (a div 2)\ - by (auto simp add: bit_eq_iff bit_sum_mult_2_cases bit_simps bit_0 simp flip: bit_Suc - elim: possible_bit_less_imp) - lemma flip_bit_0 [simp]: \flip_bit 0 a = of_bool (even a) + 2 * (a div 2)\ by (auto simp add: bit_eq_iff bit_simps even_bit_succ_iff bit_0 simp flip: bit_Suc) @@ -1685,23 +1697,14 @@ by (simp add: not_int_def) show \NOT k = of_bool (even k) + 2 * NOT (k div 2)\ by (auto simp add: not_int_def elim: oddE) - show \k AND l = of_bool (odd k \ odd l) + 2 * (k div 2 AND l div 2)\ - by (fact and_int.rec) - show \k OR l = of_bool (odd k \ odd l) + 2 * (k div 2 OR l div 2)\ - by (fact or_int.rec) - show \k XOR l = of_bool (odd k \ odd l) + 2 * (k div 2 XOR l div 2)\ - by (fact xor_int.rec) - show \bit (unset_bit m k) n \ bit k n \ m \ n\ - proof - - have \unset_bit m k = k AND NOT (push_bit m 1)\ - by (simp add: unset_bit_int_def) - also have \NOT (push_bit m 1 :: int) = - (push_bit m 1 + 1)\ - by (simp add: not_int_def) - finally show ?thesis by (simp only: bit_simps and_int.bit_iff) - (auto simp add: bit_simps bit_not_int_iff' push_bit_int_def) - qed -qed (simp_all add: mask_int_def set_bit_int_def flip_bit_int_def - push_bit_int_def drop_bit_int_def take_bit_int_def) + show \unset_bit 0 k = 2 * (k div 2)\ + by (rule bit_eqI) + (auto simp add: unset_bit_int_def push_bit_int_def and_int.bit_iff bit_not_int_iff bit_simps simp flip: bit_Suc) + show \unset_bit (Suc n) k = k mod 2 + 2 * unset_bit n (k div 2)\ + by (rule bit_eqI) + (auto simp add: unset_bit_int_def push_bit_int_def and_int.bit_iff bit_not_int_iff bit_simps mod_2_eq_odd even_bit_succ_iff bit_0 simp flip: bit_Suc) +qed (fact and_int.rec or_int.rec xor_int.rec mask_int_def set_bit_int_def flip_bit_int_def + push_bit_int_def drop_bit_int_def take_bit_int_def)+ end @@ -2460,15 +2463,17 @@ where \flip_bit m n = n XOR push_bit m 1\ for m n :: nat instance proof - fix m n q :: nat + fix m n :: nat show \m AND n = of_bool (odd m \ odd n) + 2 * (m div 2 AND n div 2)\ by (simp add: and_nat_def and_rec [of \int m\ \int n\] nat_add_distrib of_nat_div) show \m OR n = of_bool (odd m \ odd n) + 2 * (m div 2 OR n div 2)\ by (simp add: or_nat_def or_rec [of \int m\ \int n\] nat_add_distrib of_nat_div) show \m XOR n = of_bool (odd m \ odd n) + 2 * (m div 2 XOR n div 2)\ by (simp add: xor_nat_def xor_rec [of \int m\ \int n\] nat_add_distrib of_nat_div) - show \bit (unset_bit m n) q \ bit n q \ m \ q\ - by (simp add: unset_bit_nat_def bit_simps) + show \unset_bit 0 n = 2 * (n div 2)\ + by (simp add: unset_bit_nat_def nat_mult_distrib) + show \unset_bit (Suc m) n = n mod 2 + 2 * unset_bit m (n div 2)\ + by (simp add: unset_bit_nat_def unset_bit_Suc nat_add_distrib nat_mult_distrib nat_mod_distrib of_nat_div) qed (simp_all add: mask_nat_def set_bit_nat_def flip_bit_nat_def push_bit_nat_def drop_bit_nat_def take_bit_nat_def) end