diff -r eed4ca224c9c -r 74a4776f7a22 src/HOL/Bit_Operations.thy --- a/src/HOL/Bit_Operations.thy Sat Nov 18 19:23:56 2023 +0100 +++ b/src/HOL/Bit_Operations.thy Sun Nov 19 15:45:22 2023 +0000 @@ -715,9 +715,9 @@ and push_bit :: \nat \ 'a \ 'a\ and drop_bit :: \nat \ 'a \ 'a\ and take_bit :: \nat \ 'a \ 'a\ - assumes bit_and_iff [bit_simps]: \bit (a AND b) n \ bit a n \ bit b n\ - and bit_or_iff [bit_simps]: \bit (a OR b) n \ bit a n \ bit b n\ - and bit_xor_iff [bit_simps]: \bit (a XOR b) n \ bit a n \ bit b n\ + assumes and_rec: \a AND b = of_bool (odd a \ odd b) + 2 * ((a div 2) AND (b div 2))\ + and or_rec: \a OR b = of_bool (odd a \ odd b) + 2 * ((a div 2) OR (b div 2))\ + 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\ @@ -743,6 +743,48 @@ differently wrt. code generation. \ +lemma bit_and_iff [bit_simps]: + \bit (a AND b) n \ bit a n \ bit b n\ +proof (induction n arbitrary: a b) + case 0 + show ?case + by (simp add: bit_0 and_rec [of a b] even_bit_succ_iff) +next + case (Suc n) + from Suc [of \a div 2\ \b div 2\] + show ?case + by (simp add: and_rec [of a b] bit_Suc) + (auto simp flip: bit_Suc simp add: bit_double_iff dest: bit_imp_possible_bit) +qed + +lemma bit_or_iff [bit_simps]: + \bit (a OR b) n \ bit a n \ bit b n\ +proof (induction n arbitrary: a b) + case 0 + show ?case + by (simp add: bit_0 or_rec [of a b] even_bit_succ_iff) +next + case (Suc n) + from Suc [of \a div 2\ \b div 2\] + show ?case + by (simp add: or_rec [of a b] bit_Suc) + (auto simp flip: bit_Suc simp add: bit_double_iff dest: bit_imp_possible_bit) +qed + +lemma bit_xor_iff [bit_simps]: + \bit (a XOR b) n \ bit a n \ bit b n\ +proof (induction n arbitrary: a b) + case 0 + show ?case + by (simp add: bit_0 xor_rec [of a b] even_bit_succ_iff) +next + case (Suc n) + from Suc [of \a div 2\ \b div 2\] + show ?case + by (simp add: xor_rec [of a b] bit_Suc) + (auto simp flip: bit_Suc simp add: bit_double_iff dest: bit_imp_possible_bit) +qed + sublocale "and": semilattice \(AND)\ by standard (auto simp add: bit_eq_iff bit_and_iff) @@ -1606,12 +1648,12 @@ fix k l :: int and m n :: nat show \- k = NOT (k - 1)\ by (simp add: not_int_def) - show \bit (k AND l) n \ bit k n \ bit l n\ - by (fact bit_and_int_iff) - show \bit (k OR l) n \ bit k n \ bit l n\ - by (fact bit_or_int_iff) - show \bit (k XOR l) n \ bit k n \ bit l n\ - by (fact bit_xor_int_iff) + 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)\ @@ -2376,12 +2418,12 @@ instance proof fix m n q :: nat - show \bit (m AND n) q \ bit m q \ bit n q\ - by (simp add: and_nat_def bit_simps) - show \bit (m OR n) q \ bit m q \ bit n q\ - by (simp add: or_nat_def bit_simps) - show \bit (m XOR n) q \ bit m q \ bit n q\ - by (simp add: xor_nat_def bit_simps) + 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) 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)