# HG changeset patch # User haftmann # Date 1700408722 0 # Node ID 74a4776f7a222dd37dcef12c54ad18971ca2adbf # Parent eed4ca224c9c1030b8484c759d88e7810ab56698 operations AND, OR, XOR are specified by characteristic recursive equation 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) diff -r eed4ca224c9c -r 74a4776f7a22 src/HOL/Code_Numeral.thy --- a/src/HOL/Code_Numeral.thy Sat Nov 18 19:23:56 2023 +0100 +++ b/src/HOL/Code_Numeral.thy Sun Nov 19 15:45:22 2023 +0000 @@ -352,7 +352,7 @@ bits_div_0 bits_div_by_1 bits_mod_div_trivial even_succ_div_2 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 - bit_and_iff bit_or_iff bit_xor_iff mask_eq_exp_minus_1 + and_rec or_rec xor_rec mask_eq_exp_minus_1 set_bit_def bit_unset_bit_iff flip_bit_def bit_not_iff_eq minus_eq_not_minus_1)+ end @@ -1110,7 +1110,7 @@ (fact bit_eq_rec bits_induct bit_iff_odd push_bit_eq_mult drop_bit_eq_div take_bit_eq_mod bits_div_0 bits_div_by_1 bits_mod_div_trivial even_succ_div_2 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 bit_and_iff bit_or_iff bit_xor_iff + even_mask_div_iff even_mult_exp_div_exp_iff and_rec or_rec xor_rec mask_eq_exp_minus_1 set_bit_def bit_unset_bit_iff flip_bit_def)+ end diff -r eed4ca224c9c -r 74a4776f7a22 src/HOL/Library/Word.thy --- a/src/HOL/Library/Word.thy Sat Nov 18 19:23:56 2023 +0100 +++ b/src/HOL/Library/Word.thy Sun Nov 19 15:45:22 2023 +0000 @@ -991,12 +991,51 @@ is \\n. take_bit (min LENGTH('a) n)\ by (simp add: ac_simps) (simp only: flip: take_bit_take_bit) -instance apply (standard; transfer) - apply (auto simp add: minus_eq_not_minus_1 mask_eq_exp_minus_1 - bit_simps set_bit_def flip_bit_def take_bit_drop_bit - simp flip: drop_bit_eq_div take_bit_eq_mod) - apply (simp_all add: drop_bit_take_bit flip: push_bit_eq_mult) - done +context + includes bit_operations_syntax +begin + +instance proof + fix v w :: \'a word\ and n m :: nat + show \v AND w = of_bool (odd v \ odd w) + 2 * (v div 2 AND w div 2)\ + apply transfer + apply (rule bit_eqI) + apply (auto simp add: even_bit_succ_iff bit_simps bit_0 simp flip: bit_Suc) + done + show \v OR w = of_bool (odd v \ odd w) + 2 * (v div 2 OR w div 2)\ + apply transfer + apply (rule bit_eqI) + apply (auto simp add: even_bit_succ_iff bit_simps bit_0 simp flip: bit_Suc) + done + show \v XOR w = of_bool (odd v \ odd w) + 2 * (v div 2 XOR w div 2)\ + apply transfer + apply (rule bit_eqI) + subgoal for k l n + apply (cases n) + apply (auto simp add: even_bit_succ_iff bit_simps bit_0 even_xor_iff simp flip: bit_Suc) + done + done + show \mask n = 2 ^ n - (1 :: 'a word)\ + by transfer (simp flip: mask_eq_exp_minus_1) + show \set_bit n v = v OR push_bit n 1\ + by transfer (simp add: take_bit_set_bit_eq set_bit_eq_or) + show \bit (unset_bit m v) n \ bit v n \ m \ n\ + by transfer (simp add: bit_simps) + show \flip_bit n v = v XOR push_bit n 1\ + by transfer (simp add: take_bit_flip_bit_eq flip_bit_eq_xor) + show \push_bit n v = v * 2 ^ n\ + by transfer (simp add: push_bit_eq_mult) + show \drop_bit n v = v div 2 ^ n\ + by transfer (simp add: drop_bit_take_bit flip: drop_bit_eq_div) + show \take_bit n v = v mod 2 ^ n\ + by transfer (simp flip: take_bit_eq_mod) + show \bit (NOT v) n \ 2 ^ n \ (0 :: 'a word) \ \ bit v n\ + by transfer (auto simp add: bit_simps) + show \- v = NOT (v - 1)\ + by transfer (simp add: minus_eq_not_minus_1) +qed + +end end