diff -r f9038dd937dd -r 9f22b71e209e src/HOL/Bit_Operations.thy --- a/src/HOL/Bit_Operations.thy Thu Feb 08 10:59:30 2024 +0000 +++ b/src/HOL/Bit_Operations.thy Fri Feb 09 16:43:43 2024 +0000 @@ -16,7 +16,6 @@ \ P a\ assumes half_div_exp_eq: \a div 2 div 2 ^ n = a div 2 ^ Suc n\ and even_double_div_exp_iff: \2 ^ Suc n \ 0 \ even (2 * a div 2 ^ Suc n) \ even (a div 2 ^ n)\ - and even_decr_exp_div_exp_iff: \2 ^ n \ 0 \ even ((2 ^ m - 1) div 2 ^ n) \ m \ n\ and even_mod_exp_div_exp_iff: \even (a mod 2 ^ m div 2 ^ n) \ m \ n \ even (a div 2 ^ n)\ fixes bit :: \'a \ nat \ bool\ assumes bit_iff_odd: \bit a n \ odd (a div 2 ^ n)\ @@ -417,8 +416,6 @@ with rec [of n True] show ?case by simp qed - show \even (((2 :: nat) ^ m - 1) div 2 ^ n) \ m \ n\ for m n :: nat - using even_decr_exp_div_exp_iff' [of m n] . show \even (q mod 2 ^ m div 2 ^ n) \ m \ n \ even (q div 2 ^ n)\ for q m n :: nat proof (cases \m \ n\) case True @@ -576,8 +573,6 @@ with rec [of k True] show ?case by (simp add: ac_simps) qed - show \even (((2 :: int) ^ m - 1) div 2 ^ n) \ m \ n\ for m n :: nat - using even_decr_exp_div_exp_iff' [of m n] . show \even (k mod 2 ^ m div 2 ^ n) \ m \ n \ even (k div 2 ^ n)\ for k :: int and m n :: nat proof (cases \m \ n\) case True @@ -728,6 +723,10 @@ \even (a OR b) \ even a \ even b\ using bit_or_iff [of a b 0] by (auto simp add: bit_0) +lemma disjunctive_add: + \a + b = a OR b\ if \\n. \ bit a n \ \ bit b n\ + by (rule bit_eqI) (use that in \simp add: bit_disjunctive_add_iff bit_or_iff\) + lemma even_xor_iff: \even (a XOR b) \ (even a \ even b)\ using bit_xor_iff [of a b 0] by (auto simp add: bit_0) @@ -770,33 +769,83 @@ \a XOR a = 0\ by (rule bit_eqI) (simp add: bit_simps) +lemma mask_0 [simp]: + \mask 0 = 0\ + by (simp add: mask_eq_exp_minus_1) + +lemma inc_mask_eq_exp: + \mask n + 1 = 2 ^ n\ +proof (induction n) + case 0 + then show ?case + by simp +next + case (Suc n) + from Suc.IH [symmetric] have \2 ^ Suc n = 2 * mask n + 2\ + by (simp add: algebra_simps) + also have \\ = 2 * mask n + 1 + 1\ + by (simp add: add.assoc) + finally have *: \2 ^ Suc n = 2 * mask n + 1 + 1\ . + then show ?case + by (simp add: mask_eq_exp_minus_1) +qed + +lemma mask_Suc_double: + \mask (Suc n) = 1 OR 2 * mask n\ +proof - + have \mask (Suc n) + 1 = (mask n + 1) + (mask n + 1)\ + by (simp add: inc_mask_eq_exp mult_2) + also have \\ = (1 OR 2 * mask n) + 1\ + by (simp add: one_or_eq mult_2_right algebra_simps) + finally show ?thesis + by simp +qed + lemma bit_mask_iff [bit_simps]: \bit (mask m) n \ possible_bit TYPE('a) n \ n < m\ - apply (cases \possible_bit TYPE('a) n\) - apply (simp add: bit_iff_odd mask_eq_exp_minus_1 possible_bit_def even_decr_exp_div_exp_iff not_le) - apply (simp add: impossible_bit) - done +proof (cases \possible_bit TYPE('a) n\) + case False + then show ?thesis + by (simp add: impossible_bit) +next + case True + then have \bit (mask m) n \ n < m\ + proof (induction m arbitrary: n) + case 0 + then show ?case + by (simp add: bit_iff_odd) + next + case (Suc m) + show ?case + proof (cases n) + case 0 + then show ?thesis + by (simp add: bit_0 mask_Suc_double even_or_iff) + next + case (Suc n) + with Suc.prems have \possible_bit TYPE('a) n\ + using possible_bit_less_imp by auto + with Suc.IH [of n] have \bit (mask m) n \ n < m\ . + with Suc.prems show ?thesis + by (simp add: Suc mask_Suc_double bit_simps) + qed + qed + with True show ?thesis + by simp +qed lemma even_mask_iff: \even (mask n) \ n = 0\ using bit_mask_iff [of n 0] by (auto simp add: bit_0) -lemma mask_0 [simp]: - \mask 0 = 0\ - by (simp add: mask_eq_exp_minus_1) - lemma mask_Suc_0 [simp]: \mask (Suc 0) = 1\ - by (simp add: mask_eq_exp_minus_1 add_implies_diff sym) + by (simp add: mask_Suc_double) lemma mask_Suc_exp: \mask (Suc n) = 2 ^ n OR mask n\ by (auto simp add: bit_eq_iff bit_simps) -lemma mask_Suc_double: - \mask (Suc n) = 1 OR 2 * mask n\ - 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)\ by (simp add: numeral_eq_Suc mask_Suc_double one_or_eq ac_simps) @@ -1089,10 +1138,6 @@ \a OR b = 0 \ a = 0 \ b = 0\ by (auto simp add: bit_eq_iff bit_or_iff) -lemma disjunctive_add: - \a + b = a OR b\ if \\n. \ bit a n \ \ bit b n\ - by (rule bit_eqI) (use that in \simp add: bit_disjunctive_add_iff bit_or_iff\) - lemma bit_iff_and_drop_bit_eq_1: \bit a n \ drop_bit n a AND 1 = 1\ by (simp add: bit_iff_odd_drop_bit and_one_eq odd_iff_mod_2_eq_one) @@ -3682,10 +3727,6 @@ context semiring_bits begin -lemma even_mask_div_iff [no_atp]: - \even ((2 ^ m - 1) div 2 ^ n) \ 2 ^ n = 0 \ m \ n\ - by (cases \2 ^ n = 0\) (simp_all add: even_decr_exp_div_exp_iff) - lemma exp_div_exp_eq [no_atp]: \2 ^ m div 2 ^ n = of_bool (2 ^ m \ 0 \ m \ n) * 2 ^ (m - n)\ apply (rule bit_eqI) @@ -3754,6 +3795,10 @@ context semiring_bit_operations begin +lemma even_mask_div_iff [no_atp]: + \even ((2 ^ m - 1) div 2 ^ n) \ 2 ^ n = 0 \ m \ n\ + using bit_mask_iff [of m n] by (auto simp add: mask_eq_exp_minus_1 bit_iff_odd possible_bit_def) + lemma mod_exp_eq [no_atp]: \a mod 2 ^ m mod 2 ^ n = a mod 2 ^ min m n\ by (simp flip: take_bit_eq_mod add: ac_simps)