diff -r 7466b2a3905a -r 42523fbf643b src/HOL/Bit_Operations.thy --- a/src/HOL/Bit_Operations.thy Mon Sep 13 13:30:39 2021 +0200 +++ b/src/HOL/Bit_Operations.thy Mon Sep 13 14:18:24 2021 +0000 @@ -155,8 +155,36 @@ \\ bit a n\ if \2 ^ n = 0\ using that by (simp add: bit_iff_odd) +definition + possible_bit :: "'a itself \ nat \ bool" + where + "possible_bit tyrep n = (2 ^ n \ (0 :: 'a))" + +lemma possible_bit_0[simp]: + "possible_bit ty 0" + by (simp add: possible_bit_def) + +lemma fold_possible_bit: + "2 ^ n = (0 :: 'a) \ \ possible_bit TYPE('a) n" + by (simp add: possible_bit_def) + +lemmas impossible_bit = exp_eq_0_imp_not_bit[simplified fold_possible_bit] + +lemma bit_imp_possible_bit: + "bit a n \ possible_bit TYPE('a) n" + by (rule ccontr) (simp add: impossible_bit) + +lemma possible_bit_less_imp: + "possible_bit tyrep i \ j \ i \ possible_bit tyrep j" + using power_add[of "2 :: 'a" j "i - j"] + by (clarsimp simp: possible_bit_def eq_commute[where a=0]) + +lemma possible_bit_min[simp]: + "possible_bit tyrep (min i j) \ possible_bit tyrep i \ possible_bit tyrep j" + by (auto simp: min_def elim: possible_bit_less_imp) + lemma bit_eqI: - \a = b\ if \\n. 2 ^ n \ 0 \ bit a n \ bit b n\ + \a = b\ if \\n. possible_bit TYPE('a) n \ bit a n \ bit b n\ proof - have \bit a n \ bit b n\ for n proof (cases \2 ^ n = 0\) @@ -166,7 +194,7 @@ next case False then show ?thesis - by (rule that) + by (rule that[unfolded possible_bit_def]) qed then show ?thesis proof (induction a arbitrary: b rule: bits_induct) case (stable a) @@ -210,27 +238,33 @@ qed lemma bit_eq_iff: - \a = b \ (\n. bit a n \ bit b n)\ + \a = b \ (\n. possible_bit TYPE('a) n \ bit a n \ bit b n)\ by (auto intro: bit_eqI) named_theorems bit_simps \Simplification rules for \<^const>\bit\\ lemma bit_exp_iff [bit_simps]: - \bit (2 ^ m) n \ 2 ^ m \ 0 \ m = n\ - by (auto simp add: bit_iff_odd exp_div_exp_eq) + \bit (2 ^ m) n \ possible_bit TYPE('a) n \ m = n\ + by (auto simp add: bit_iff_odd exp_div_exp_eq possible_bit_def) lemma bit_1_iff [bit_simps]: - \bit 1 n \ 1 \ 0 \ n = 0\ - using bit_exp_iff [of 0 n] by simp + \bit 1 n \ n = 0\ + using bit_exp_iff [of 0 n] + by auto lemma bit_2_iff [bit_simps]: - \bit 2 n \ 2 \ 0 \ n = 1\ + \bit 2 n \ possible_bit TYPE('a) 1 \ n = 1\ using bit_exp_iff [of 1 n] by auto lemma even_bit_succ_iff: \bit (1 + a) n \ bit a n \ n = 0\ if \even a\ using that by (cases \n = 0\) (simp_all add: bit_iff_odd) +lemma bit_double_iff [bit_simps]: + \bit (2 * a) n \ bit a (n - 1) \ n \ 0 \ possible_bit TYPE('a) n\ + using even_mult_exp_div_exp_iff [of a 1 n] + by (cases n, auto simp add: bit_iff_odd ac_simps possible_bit_def) + lemma odd_bit_iff_bit_pred: \bit a n \ bit (a - 1) n \ n = 0\ if \odd a\ proof - @@ -240,11 +274,6 @@ ultimately show ?thesis by (simp add: ac_simps) qed -lemma bit_double_iff [bit_simps]: - \bit (2 * a) n \ bit a (n - 1) \ n \ 0 \ 2 ^ n \ 0\ - using even_mult_exp_div_exp_iff [of a 1 n] - by (cases n, auto simp add: bit_iff_odd ac_simps) - lemma bit_eq_rec: \a = b \ (even a \ even b) \ a div 2 = b div 2\ (is \?P = ?Q\) proof @@ -277,9 +306,9 @@ \bit (a mod 2) n \ n = 0 \ odd a\ by (cases a rule: parity_cases) (simp_all add: bit_iff_odd) -lemma bit_mask_iff: - \bit (2 ^ m - 1) n \ 2 ^ n \ 0 \ n < m\ - by (simp add: bit_iff_odd even_mask_div_iff not_le) +lemma bit_mask_sub_iff: + \bit (2 ^ m - 1) n \ possible_bit TYPE('a) n \ n < m\ + by (simp add: bit_iff_odd even_mask_div_iff not_le possible_bit_def) lemma bit_Numeral1_iff [simp]: \bit (numeral Num.One) n \ n = 0\ @@ -325,7 +354,7 @@ also have \\ = of_bool (odd a \ odd b) + 2 * (a div 2 + b div 2)\ using even by (auto simp add: algebra_simps mod2_eq_if) finally have \bit ((a + b) div 2) n \ bit (a div 2 + b div 2) n\ - using \2 * 2 ^ n \ 0\ by simp (simp_all flip: bit_Suc add: bit_double_iff) + using \2 * 2 ^ n \ 0\ by simp (simp_all flip: bit_Suc add: bit_double_iff possible_bit_def) also have \\ \ bit (a div 2) n \ bit (b div 2) n\ using bit \2 ^ n \ 0\ by (rule Suc.IH) finally show ?case @@ -441,6 +470,10 @@ end +lemma possible_bit_nat[simp]: + "possible_bit TYPE(nat) n" + by (simp add: possible_bit_def) + lemma int_bit_induct [case_names zero minus even odd]: "P k" if zero_int: "P 0" and minus_int: "P (- 1)" @@ -510,11 +543,11 @@ by (induction n rule: nat_bit_induct) simp_all lemma bit_of_nat_iff [bit_simps]: - \bit (of_nat m) n \ (2::'a) ^ n \ 0 \ bit m n\ + \bit (of_nat m) n \ possible_bit TYPE('a) n \ bit m n\ proof (cases \(2::'a) ^ n = 0\) case True then show ?thesis - by (simp add: exp_eq_0_imp_not_bit) + by (simp add: exp_eq_0_imp_not_bit possible_bit_def) next case False then have \bit (of_nat m) n \ bit m n\ @@ -526,15 +559,15 @@ case (even m) then show ?case by (cases n) - (auto simp add: bit_double_iff Bit_Operations.bit_double_iff dest: mult_not_zero) + (auto simp add: bit_double_iff Bit_Operations.bit_double_iff possible_bit_def dest: mult_not_zero) next case (odd m) then show ?case by (cases n) - (auto simp add: bit_double_iff even_bit_succ_iff Bit_Operations.bit_Suc dest: mult_not_zero) + (auto simp add: bit_double_iff even_bit_succ_iff possible_bit_def Bit_Operations.bit_Suc dest: mult_not_zero) qed with False show ?thesis - by simp + by (simp add: possible_bit_def) qed end @@ -610,6 +643,10 @@ end +lemma possible_bit_int[simp]: + "possible_bit TYPE(int) n" + by (simp add: possible_bit_def) + lemma bit_not_int_iff': \bit (- k - 1) n \ \ bit k n\ for k :: int @@ -931,8 +968,8 @@ by (simp add: push_bit_eq_mult) auto lemma bit_push_bit_iff [bit_simps]: - \bit (push_bit m a) n \ m \ n \ 2 ^ n \ 0 \ bit a (n - m)\ - by (auto simp add: bit_iff_odd push_bit_eq_mult even_mult_exp_div_exp_iff) + \bit (push_bit m a) n \ m \ n \ possible_bit TYPE('a) n \ bit a (n - m)\ + by (auto simp add: bit_iff_odd push_bit_eq_mult even_mult_exp_div_exp_iff possible_bit_def) lemma bit_drop_bit_eq [bit_simps]: \bit (drop_bit n a) = bit a \ (+) n\ @@ -950,11 +987,11 @@ lemma stable_imp_take_bit_eq: \take_bit n a = (if even a then 0 else 2 ^ n - 1)\ if \a div 2 = a\ -proof (rule bit_eqI) +proof (rule bit_eqI[unfolded possible_bit_def]) fix m assume \2 ^ m \ 0\ with that show \bit (take_bit n a) m \ bit (if even a then 0 else 2 ^ n - 1) m\ - by (simp add: bit_take_bit_iff bit_mask_iff stable_imp_bit_iff_odd) + by (simp add: bit_take_bit_iff bit_mask_sub_iff possible_bit_def stable_imp_bit_iff_odd) qed lemma exp_dvdE: @@ -1021,48 +1058,48 @@ qed lemma drop_bit_exp_eq: - \drop_bit m (2 ^ n) = of_bool (m \ n \ 2 ^ n \ 0) * 2 ^ (n - m)\ - by (rule bit_eqI) (auto simp add: bit_simps) + \drop_bit m (2 ^ n) = of_bool (m \ n \ possible_bit TYPE('a) n) * 2 ^ (n - m)\ + by (auto simp add: bit_eq_iff bit_simps) lemma take_bit_and [simp]: \take_bit n (a AND b) = take_bit n a AND take_bit n b\ - by (auto simp add: bit_eq_iff bit_take_bit_iff bit_and_iff) + by (auto simp add: bit_eq_iff bit_simps) lemma take_bit_or [simp]: \take_bit n (a OR b) = take_bit n a OR take_bit n b\ - by (auto simp add: bit_eq_iff bit_take_bit_iff bit_or_iff) + by (auto simp add: bit_eq_iff bit_simps) lemma take_bit_xor [simp]: \take_bit n (a XOR b) = take_bit n a XOR take_bit n b\ - by (auto simp add: bit_eq_iff bit_take_bit_iff bit_xor_iff) + by (auto simp add: bit_eq_iff bit_simps) lemma push_bit_and [simp]: \push_bit n (a AND b) = push_bit n a AND push_bit n b\ - by (rule bit_eqI) (auto simp add: bit_push_bit_iff bit_and_iff) + by (auto simp add: bit_eq_iff bit_simps) lemma push_bit_or [simp]: \push_bit n (a OR b) = push_bit n a OR push_bit n b\ - by (rule bit_eqI) (auto simp add: bit_push_bit_iff bit_or_iff) + by (auto simp add: bit_eq_iff bit_simps) lemma push_bit_xor [simp]: \push_bit n (a XOR b) = push_bit n a XOR push_bit n b\ - by (rule bit_eqI) (auto simp add: bit_push_bit_iff bit_xor_iff) + by (auto simp add: bit_eq_iff bit_simps) lemma drop_bit_and [simp]: \drop_bit n (a AND b) = drop_bit n a AND drop_bit n b\ - by (rule bit_eqI) (auto simp add: bit_drop_bit_eq bit_and_iff) + by (auto simp add: bit_eq_iff bit_simps) lemma drop_bit_or [simp]: \drop_bit n (a OR b) = drop_bit n a OR drop_bit n b\ - by (rule bit_eqI) (auto simp add: bit_drop_bit_eq bit_or_iff) + by (auto simp add: bit_eq_iff bit_simps) lemma drop_bit_xor [simp]: \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) + by (auto simp add: bit_eq_iff bit_simps) 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) + \bit (mask m) n \ possible_bit TYPE('a) n \ n < m\ + by (simp add: mask_eq_exp_minus_1 bit_mask_sub_iff) lemma even_mask_iff: \even (mask n) \ n = 0\ @@ -1078,18 +1115,11 @@ lemma mask_Suc_exp: \mask (Suc n) = 2 ^ n OR mask n\ - by (rule bit_eqI) - (auto simp add: bit_or_iff bit_mask_iff bit_exp_iff not_less le_less_Suc_eq) + by (auto simp add: bit_eq_iff bit_simps) lemma mask_Suc_double: \mask (Suc n) = 1 OR 2 * mask n\ -proof (rule bit_eqI) - fix q - assume \2 ^ q \ 0\ - show \bit (mask (Suc n)) q \ bit (1 OR 2 * mask n) q\ - by (cases q) - (simp_all add: even_mask_iff even_or_iff bit_or_iff bit_mask_iff bit_exp_iff bit_double_iff not_less le_less_Suc_eq bit_1_iff, auto simp add: mult_2) -qed + by (auto simp add: bit_eq_iff bit_simps elim: possible_bit_less_imp) lemma mask_numeral: \mask (numeral n) = 1 + 2 * mask (pred_numeral n)\ @@ -1101,8 +1131,7 @@ lemma take_bit_eq_mask: \take_bit n a = a AND mask n\ - by (rule bit_eqI) - (auto simp add: bit_take_bit_iff bit_and_iff bit_mask_iff) + by (auto simp add: bit_eq_iff bit_simps) lemma or_eq_0_iff: \a OR b = 0 \ a = 0 \ b = 0\ @@ -1126,7 +1155,7 @@ lemmas set_bit_def = set_bit_eq_or lemma bit_set_bit_iff [bit_simps]: - \bit (set_bit m a) n \ bit a n \ (m = n \ 2 ^ n \ 0)\ + \bit (set_bit m a) n \ bit a n \ (m = n \ possible_bit TYPE('a) n)\ by (auto simp add: set_bit_def push_bit_of_1 bit_or_iff bit_exp_iff) lemma even_set_bit_iff: @@ -1139,122 +1168,55 @@ lemma and_exp_eq_0_iff_not_bit: \a AND 2 ^ n = 0 \ \ bit a n\ (is \?P \ ?Q\) -proof - assume ?Q - then show ?P - by (auto intro: bit_eqI simp add: bit_simps) -next - assume ?P - show ?Q - proof (rule notI) - assume \bit a n\ - then have \a AND 2 ^ n = 2 ^ n\ - by (auto intro: bit_eqI simp add: bit_simps) - with \?P\ show False - using \bit a n\ exp_eq_0_imp_not_bit by auto - qed -qed + using bit_imp_possible_bit[of a n] + by (auto simp add: bit_eq_iff bit_simps) lemmas flip_bit_def = flip_bit_eq_xor 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) + \bit (flip_bit m a) n \ (m = n \ \ bit a n) \ possible_bit TYPE('a) n\ + by (auto simp add: bit_eq_iff bit_simps flip_bit_eq_xor bit_imp_possible_bit) lemma even_flip_bit_iff: \even (flip_bit m a) \ \ (even a \ m = 0)\ - using bit_flip_bit_iff [of m a 0] by auto + using bit_flip_bit_iff [of m a 0] by (auto simp: possible_bit_def) lemma set_bit_0 [simp]: \set_bit 0 a = 1 + 2 * (a div 2)\ -proof (rule bit_eqI) - fix m - assume *: \2 ^ m \ 0\ - then show \bit (set_bit 0 a) m = bit (1 + 2 * (a div 2)) m\ - by (simp add: bit_set_bit_iff bit_double_iff even_bit_succ_iff) - (cases m, simp_all add: bit_Suc) + by (auto simp add: bit_eq_iff bit_simps even_bit_succ_iff simp flip: bit_Suc) + +lemma bit_sum_mult_2_cases: + assumes a: "\j. \ bit a (Suc j)" + shows "bit (a + 2 * b) n = (if n = 0 then odd a else bit (2 * b) n)" +proof - + have a_eq: "bit a i \ i = 0 \ odd a" for i + by (cases i, simp_all add: a) + show ?thesis + by (simp add: disjunctive_add[simplified disj_imp] a_eq bit_simps) qed lemma set_bit_Suc: \set_bit (Suc n) a = a mod 2 + 2 * set_bit n (a div 2)\ -proof (rule bit_eqI) - fix m - assume *: \2 ^ m \ 0\ - show \bit (set_bit (Suc n) a) m \ bit (a mod 2 + 2 * set_bit n (a div 2)) m\ - proof (cases m) - case 0 - then show ?thesis - by (simp add: even_set_bit_iff) - next - case (Suc m) - with * have \2 ^ m \ 0\ - using mult_2 by auto - show ?thesis - by (cases a rule: parity_cases) - (simp_all add: bit_set_bit_iff bit_double_iff even_bit_succ_iff *, - simp_all add: Suc \2 ^ m \ 0\ bit_Suc) - qed -qed + by (auto simp add: bit_eq_iff bit_sum_mult_2_cases bit_simps bit_Suc[symmetric] + elim: possible_bit_less_imp) lemma unset_bit_0 [simp]: \unset_bit 0 a = 2 * (a div 2)\ -proof (rule bit_eqI) - fix m - assume *: \2 ^ m \ 0\ - then show \bit (unset_bit 0 a) m = bit (2 * (a div 2)) m\ - by (simp add: bit_unset_bit_iff bit_double_iff) - (cases m, simp_all add: bit_Suc) -qed + 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)\ -proof (rule bit_eqI) - fix m - assume *: \2 ^ m \ 0\ - then show \bit (unset_bit (Suc n) a) m \ bit (a mod 2 + 2 * unset_bit n (a div 2)) m\ - proof (cases m) - case 0 - then show ?thesis - by (simp add: even_unset_bit_iff) - next - case (Suc m) - show ?thesis - by (cases a rule: parity_cases) - (simp_all add: bit_unset_bit_iff bit_double_iff even_bit_succ_iff *, - simp_all add: Suc bit_Suc) - qed -qed + by (auto simp add: bit_eq_iff bit_sum_mult_2_cases bit_simps bit_Suc[symmetric] + elim: possible_bit_less_imp) lemma flip_bit_0 [simp]: \flip_bit 0 a = of_bool (even a) + 2 * (a div 2)\ -proof (rule bit_eqI) - fix m - assume *: \2 ^ m \ 0\ - then show \bit (flip_bit 0 a) m = bit (of_bool (even a) + 2 * (a div 2)) m\ - by (simp add: bit_flip_bit_iff bit_double_iff even_bit_succ_iff) - (cases m, simp_all add: bit_Suc) -qed + by (auto simp add: bit_eq_iff bit_simps even_bit_succ_iff simp flip: bit_Suc) lemma flip_bit_Suc: \flip_bit (Suc n) a = a mod 2 + 2 * flip_bit n (a div 2)\ -proof (rule bit_eqI) - fix m - assume *: \2 ^ m \ 0\ - show \bit (flip_bit (Suc n) a) m \ bit (a mod 2 + 2 * flip_bit n (a div 2)) m\ - proof (cases m) - case 0 - then show ?thesis - by (simp add: even_flip_bit_iff) - next - case (Suc m) - with * have \2 ^ m \ 0\ - using mult_2 by auto - show ?thesis - by (cases a rule: parity_cases) - (simp_all add: bit_flip_bit_iff bit_double_iff even_bit_succ_iff, - simp_all add: Suc \2 ^ m \ 0\ bit_Suc) - qed -qed + by (auto simp add: bit_eq_iff bit_sum_mult_2_cases bit_simps bit_Suc[symmetric] + elim: possible_bit_less_imp) lemma flip_bit_eq_if: \flip_bit n a = (if bit a n then unset_bit else set_bit) n a\ @@ -1276,10 +1238,12 @@ class ring_bit_operations = semiring_bit_operations + ring_parity + fixes not :: \'a \ 'a\ (\NOT\) - assumes bit_not_iff [bit_simps]: \\n. bit (NOT a) n \ 2 ^ n \ 0 \ \ bit a n\ + assumes bit_not_iff_eq: \\n. bit (NOT a) n \ 2 ^ n \ 0 \ \ bit a n\ assumes minus_eq_not_minus_1: \- a = NOT (a - 1)\ begin +lemmas bit_not_iff[bit_simps] = bit_not_iff_eq[unfolded fold_possible_bit] + text \ For the sake of code generation \<^const>\not\ is specified as definitional class operation. Note that \<^const>\not\ has no @@ -1300,27 +1264,27 @@ using not_eq_complement [of a] by simp lemma bit_minus_iff [bit_simps]: - \bit (- a) n \ 2 ^ n \ 0 \ \ bit (a - 1) n\ + \bit (- a) n \ possible_bit TYPE('a) n \ \ bit (a - 1) n\ by (simp add: minus_eq_not_minus_1 bit_not_iff) lemma even_not_iff [simp]: - \even (NOT a) \ odd a\ + \even (NOT a) \ odd a\ using bit_not_iff [of a 0] by auto lemma bit_not_exp_iff [bit_simps]: - \bit (NOT (2 ^ m)) n \ 2 ^ n \ 0 \ n \ m\ + \bit (NOT (2 ^ m)) n \ possible_bit TYPE('a) n \ n \ m\ by (auto simp add: bit_not_iff bit_exp_iff) lemma bit_minus_1_iff [simp]: - \bit (- 1) n \ 2 ^ n \ 0\ + \bit (- 1) n \ possible_bit TYPE('a) n\ by (simp add: bit_minus_iff) lemma bit_minus_exp_iff [bit_simps]: - \bit (- (2 ^ m)) n \ 2 ^ n \ 0 \ n \ m\ + \bit (- (2 ^ m)) n \ possible_bit TYPE('a) n \ n \ m\ 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\ + \bit (- 2) n \ possible_bit TYPE('a) n \ n > 0\ by (simp add: bit_minus_iff bit_1_iff) lemma not_one_eq: @@ -1357,27 +1321,7 @@ lemma and_eq_minus_1_iff: \a AND b = - 1 \ a = - 1 \ b = - 1\ -proof - assume \a = - 1 \ b = - 1\ - then show \a AND b = - 1\ - by simp -next - assume \a AND b = - 1\ - have *: \bit a n\ \bit b n\ if \2 ^ n \ 0\ for n - proof - - from \a AND b = - 1\ - have \bit (a AND b) n = bit (- 1) n\ - by (simp add: bit_eq_iff) - then show \bit a n\ \bit b n\ - using that by (simp_all add: bit_and_iff) - qed - have \a = - 1\ - by (rule bit_eqI) (simp add: *) - moreover have \b = - 1\ - by (rule bit_eqI) (simp add: *) - ultimately show \a = - 1 \ b = - 1\ - by simp -qed + by (auto simp: bit_eq_iff bit_simps) lemma disjunctive_diff: \a - b = a AND NOT b\ if \\n. bit b n \ bit a n\ @@ -1414,7 +1358,7 @@ by (simp add: take_bit_eq_mask ac_simps) also have \\ = mask n - take_bit n a\ by (subst disjunctive_diff) - (auto simp add: bit_take_bit_iff bit_mask_iff exp_eq_0_imp_not_bit) + (auto simp add: bit_take_bit_iff bit_mask_iff bit_imp_possible_bit) finally show ?thesis by simp qed @@ -2666,13 +2610,13 @@ by (induction k rule: int_bit_induct) simp_all 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 + \bit (of_int k) n \ possible_bit TYPE('a) n \ bit k n\ +proof (cases \possible_bit TYPE('a) n\) + case False then show ?thesis - by (simp add: exp_eq_0_imp_not_bit) + by (simp add: impossible_bit) next - case False + case True then have \bit (of_int k) n \ bit k n\ proof (induction k arbitrary: n rule: int_bit_induct) case zero @@ -2686,14 +2630,14 @@ case (even k) then show ?case using bit_double_iff [of \of_int k\ n] Bit_Operations.bit_double_iff [of k n] - by (cases n) (auto simp add: ac_simps dest: mult_not_zero) + by (cases n) (auto simp add: ac_simps possible_bit_def dest: mult_not_zero) next case (odd k) then show ?case using bit_double_iff [of \of_int k\ n] - by (cases n) (auto simp add: ac_simps bit_double_iff even_bit_succ_iff Bit_Operations.bit_Suc dest: mult_not_zero) + by (cases n) (auto simp add: ac_simps bit_double_iff even_bit_succ_iff Bit_Operations.bit_Suc possible_bit_def dest: mult_not_zero) qed - with False show ?thesis + with True show ?thesis by simp qed @@ -2843,6 +2787,7 @@ by (auto simp add: le_less take_bit_int_greater_self_iff take_bit_int_eq_self_iff dest: sym not_sym intro: less_trans [of k 0 \2 ^ n\]) +(* FIXME: why is this here? *) context semiring_bit_operations begin @@ -3149,9 +3094,9 @@ by (auto simp add: signed_take_bit_def even_or_iff even_mask_iff bit_double_iff) lemma bit_signed_take_bit_iff [bit_simps]: - \bit (signed_take_bit m a) n \ 2 ^ n \ 0 \ bit a (min m n)\ + \bit (signed_take_bit m a) n \ possible_bit TYPE('a) n \ 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) + (blast dest: bit_imp_possible_bit) lemma signed_take_bit_0 [simp]: \signed_take_bit 0 a = - (a mod 2)\ @@ -3159,24 +3104,9 @@ lemma signed_take_bit_Suc: \signed_take_bit (Suc n) a = a mod 2 + 2 * signed_take_bit n (a div 2)\ -proof (rule bit_eqI) - fix m - assume *: \2 ^ m \ 0\ - show \bit (signed_take_bit (Suc n) a) m \ - bit (a mod 2 + 2 * signed_take_bit n (a div 2)) m\ - proof (cases m) - case 0 - then show ?thesis - by (simp add: even_signed_take_bit_iff) - next - case (Suc m) - with * have \2 ^ m \ 0\ - by (metis mult_not_zero power_Suc) - with Suc show ?thesis - by (simp add: bit_signed_take_bit_iff mod2_eq_if bit_double_iff even_bit_succ_iff - ac_simps flip: bit_Suc) - qed -qed + apply (simp add: bit_eq_iff bit_sum_mult_2_cases bit_simps bit_Suc[symmetric]) + apply (simp add: possible_bit_less_imp flip: min_Suc_Suc) + done lemma signed_take_bit_of_0 [simp]: \signed_take_bit n 0 = 0\ @@ -3184,7 +3114,7 @@ lemma signed_take_bit_of_minus_1 [simp]: \signed_take_bit n (- 1) = - 1\ - by (simp add: signed_take_bit_def take_bit_minus_one_eq_mask mask_eq_exp_minus_1) + by (simp add: signed_take_bit_def take_bit_minus_one_eq_mask mask_eq_exp_minus_1 possible_bit_def) lemma signed_take_bit_Suc_1 [simp]: \signed_take_bit (Suc n) 1 = 1\ @@ -3199,20 +3129,14 @@ proof - have \bit (signed_take_bit n a) = bit (signed_take_bit n b) \ bit (take_bit (Suc n) a) = bit (take_bit (Suc n) b)\ by (simp add: fun_eq_iff bit_signed_take_bit_iff bit_take_bit_iff not_le less_Suc_eq_le min_def) - (use exp_eq_0_imp_not_bit in fastforce) + (use bit_imp_possible_bit in fastforce) then show ?thesis - by (simp add: bit_eq_iff fun_eq_iff) + by (auto simp add: fun_eq_iff intro: bit_eqI) qed lemma signed_take_bit_signed_take_bit [simp]: \signed_take_bit m (signed_take_bit n a) = signed_take_bit (min m n) a\ -proof (rule bit_eqI) - fix q - show \bit (signed_take_bit m (signed_take_bit n a)) q \ - bit (signed_take_bit (min m n) a) q\ - by (simp add: bit_signed_take_bit_iff min_def bit_or_iff bit_not_iff bit_mask_iff bit_take_bit_iff) - (use le_Suc_ex exp_add_not_zero_imp in blast) -qed + by (auto simp add: bit_eq_iff bit_simps ac_simps possible_bit_min) lemma signed_take_bit_take_bit: \signed_take_bit m (take_bit n a) = (if n \ m then take_bit n else signed_take_bit m) a\