diff -r 00fce84413db -r c7bc3e70a8c7 src/HOL/Library/Bit_Operations.thy --- a/src/HOL/Library/Bit_Operations.thy Sun Nov 15 13:08:13 2020 +0000 +++ b/src/HOL/Library/Bit_Operations.thy Sun Nov 15 10:13:03 2020 +0000 @@ -16,9 +16,9 @@ and or :: \'a \ 'a \ 'a\ (infixr \OR\ 59) and xor :: \'a \ 'a \ 'a\ (infixr \XOR\ 59) and mask :: \nat \ 'a\ - assumes bit_and_iff: \\n. bit (a AND b) n \ bit a n \ bit b n\ - and bit_or_iff: \\n. bit (a OR b) n \ bit a n \ bit b n\ - and bit_xor_iff: \\n. bit (a XOR b) n \ bit a n \ bit b n\ + assumes bit_and_iff [bit_simps]: \\n. bit (a AND b) n \ bit a n \ bit b n\ + and bit_or_iff [bit_simps]: \\n. bit (a OR b) n \ bit a n \ bit b n\ + and bit_xor_iff [bit_simps]: \\n. bit (a XOR b) n \ bit a n \ bit b n\ and mask_eq_exp_minus_1: \mask n = 2 ^ n - 1\ begin @@ -119,7 +119,7 @@ \drop_bit n (a XOR b) = drop_bit n a XOR drop_bit n b\ by (rule bit_eqI) (auto simp add: bit_drop_bit_eq bit_xor_iff) -lemma bit_mask_iff: +lemma bit_mask_iff [bit_simps]: \bit (mask m) n \ 2 ^ n \ 0 \ n < m\ by (simp add: mask_eq_exp_minus_1 bit_mask_iff) @@ -182,7 +182,7 @@ class ring_bit_operations = semiring_bit_operations + ring_parity + fixes not :: \'a \ 'a\ (\NOT\) - assumes bit_not_iff: \\n. bit (NOT a) n \ 2 ^ n \ 0 \ \ bit a n\ + assumes bit_not_iff [bit_simps]: \\n. bit (NOT a) n \ 2 ^ n \ 0 \ \ bit a n\ assumes minus_eq_not_minus_1: \- a = NOT (a - 1)\ begin @@ -205,7 +205,7 @@ \- a = NOT a + 1\ using not_eq_complement [of a] by simp -lemma bit_minus_iff: +lemma bit_minus_iff [bit_simps]: \bit (- a) n \ 2 ^ n \ 0 \ \ bit (a - 1) n\ by (simp add: minus_eq_not_minus_1 bit_not_iff) @@ -213,7 +213,7 @@ "even (NOT a) \ odd a" using bit_not_iff [of a 0] by auto -lemma bit_not_exp_iff: +lemma bit_not_exp_iff [bit_simps]: \bit (NOT (2 ^ m)) n \ 2 ^ n \ 0 \ n \ m\ by (auto simp add: bit_not_iff bit_exp_iff) @@ -221,9 +221,9 @@ \bit (- 1) n \ 2 ^ n \ 0\ by (simp add: bit_minus_iff) -lemma bit_minus_exp_iff: +lemma bit_minus_exp_iff [bit_simps]: \bit (- (2 ^ m)) n \ 2 ^ n \ 0 \ n \ m\ - oops + by (auto simp add: bit_simps simp flip: mask_eq_exp_minus_1) lemma bit_minus_2_iff [simp]: \bit (- 2) n \ 2 ^ n \ 0 \ n > 0\ @@ -361,7 +361,7 @@ definition flip_bit :: \nat \ 'a \ 'a\ where \flip_bit n a = a XOR push_bit n 1\ -lemma bit_set_bit_iff: +lemma bit_set_bit_iff [bit_simps]: \bit (set_bit m a) n \ bit a n \ (m = n \ 2 ^ n \ 0)\ by (auto simp add: set_bit_def push_bit_of_1 bit_or_iff bit_exp_iff) @@ -369,7 +369,7 @@ \even (set_bit m a) \ even a \ m \ 0\ using bit_set_bit_iff [of m a 0] by auto -lemma bit_unset_bit_iff: +lemma bit_unset_bit_iff [bit_simps]: \bit (unset_bit m a) n \ bit a n \ m \ n\ by (auto simp add: unset_bit_def push_bit_of_1 bit_and_iff bit_not_iff bit_exp_iff exp_eq_0_imp_not_bit) @@ -377,7 +377,7 @@ \even (unset_bit m a) \ even a \ m = 0\ using bit_unset_bit_iff [of m a 0] by auto -lemma bit_flip_bit_iff: +lemma bit_flip_bit_iff [bit_simps]: \bit (flip_bit m a) n \ (m = n \ \ bit a n) \ 2 ^ n \ 0\ by (auto simp add: flip_bit_def push_bit_of_1 bit_xor_iff bit_exp_iff exp_eq_0_imp_not_bit) @@ -583,7 +583,7 @@ \NOT k div 2 = NOT (k div 2)\ for k :: int by (simp add: not_int_def) -lemma bit_not_int_iff: +lemma bit_not_int_iff [bit_simps]: \bit (NOT k) n \ \ bit k n\ for k :: int by (simp add: bit_not_int_iff' not_int_def) @@ -973,7 +973,7 @@ \even (of_int k) \ even k\ by (induction k rule: int_bit_induct) simp_all -lemma bit_of_int_iff: +lemma bit_of_int_iff [bit_simps]: \bit (of_int k) n \ (2::'a) ^ n \ 0 \ bit k n\ proof (cases \(2::'a) ^ n = 0\) case True @@ -1157,7 +1157,7 @@ definition concat_bit :: \nat \ int \ int \ int\ where \concat_bit n k l = take_bit n k OR push_bit n l\ -lemma bit_concat_bit_iff: +lemma bit_concat_bit_iff [bit_simps]: \bit (concat_bit m k l) n \ n < m \ bit k n \ m \ n \ bit l (n - m)\ by (simp add: concat_bit_def bit_or_iff bit_and_iff bit_take_bit_iff bit_push_bit_iff ac_simps) @@ -1259,7 +1259,7 @@ \even (signed_take_bit m a) \ even a\ by (auto simp add: signed_take_bit_def even_or_iff even_mask_iff bit_double_iff) -lemma bit_signed_take_bit_iff: +lemma bit_signed_take_bit_iff [bit_simps]: \bit (signed_take_bit m a) n \ 2 ^ n \ 0 \ bit a (min m n)\ by (simp add: signed_take_bit_def bit_take_bit_iff bit_or_iff bit_not_iff bit_mask_iff min_def not_le) (use exp_eq_0_imp_not_bit in blast) @@ -1560,11 +1560,11 @@ instance proof fix m n q :: nat show \bit (m AND n) q \ bit m q \ bit n q\ - by (auto simp add: bit_nat_iff and_nat_def bit_and_iff less_le bit_eq_iff) + by (simp add: and_nat_def bit_simps) show \bit (m OR n) q \ bit m q \ bit n q\ - by (auto simp add: bit_nat_iff or_nat_def bit_or_iff less_le bit_eq_iff) + by (simp add: or_nat_def bit_simps) show \bit (m XOR n) q \ bit m q \ bit n q\ - by (auto simp add: bit_nat_iff xor_nat_def bit_xor_iff less_le bit_eq_iff) + by (simp add: xor_nat_def bit_simps) qed (simp add: mask_nat_def) end