src/HOL/Library/Bit_Operations.thy
changeset 73682 78044b2f001c
parent 73535 0f33c7031ec9
child 73789 aab7975fa070
equal deleted inserted replaced
73681:3708884bfa8a 73682:78044b2f001c
    14 class semiring_bit_operations = semiring_bit_shifts +
    14 class semiring_bit_operations = semiring_bit_shifts +
    15   fixes "and" :: \<open>'a \<Rightarrow> 'a \<Rightarrow> 'a\<close>  (infixr \<open>AND\<close> 64)
    15   fixes "and" :: \<open>'a \<Rightarrow> 'a \<Rightarrow> 'a\<close>  (infixr \<open>AND\<close> 64)
    16     and or :: \<open>'a \<Rightarrow> 'a \<Rightarrow> 'a\<close>  (infixr \<open>OR\<close>  59)
    16     and or :: \<open>'a \<Rightarrow> 'a \<Rightarrow> 'a\<close>  (infixr \<open>OR\<close>  59)
    17     and xor :: \<open>'a \<Rightarrow> 'a \<Rightarrow> 'a\<close>  (infixr \<open>XOR\<close> 59)
    17     and xor :: \<open>'a \<Rightarrow> 'a \<Rightarrow> 'a\<close>  (infixr \<open>XOR\<close> 59)
    18     and mask :: \<open>nat \<Rightarrow> 'a\<close>
    18     and mask :: \<open>nat \<Rightarrow> 'a\<close>
    19   assumes bit_and_iff [bit_simps]: \<open>\<And>n. bit (a AND b) n \<longleftrightarrow> bit a n \<and> bit b n\<close>
    19     and set_bit :: \<open>nat \<Rightarrow> 'a \<Rightarrow> 'a\<close>
    20     and bit_or_iff [bit_simps]: \<open>\<And>n. bit (a OR b) n \<longleftrightarrow> bit a n \<or> bit b n\<close>
    20     and unset_bit :: \<open>nat \<Rightarrow> 'a \<Rightarrow> 'a\<close>
    21     and bit_xor_iff [bit_simps]: \<open>\<And>n. bit (a XOR b) n \<longleftrightarrow> bit a n \<noteq> bit b n\<close>
    21     and flip_bit :: \<open>nat \<Rightarrow> 'a \<Rightarrow> 'a\<close>
       
    22   assumes bit_and_iff [bit_simps]: \<open>bit (a AND b) n \<longleftrightarrow> bit a n \<and> bit b n\<close>
       
    23     and bit_or_iff [bit_simps]: \<open>bit (a OR b) n \<longleftrightarrow> bit a n \<or> bit b n\<close>
       
    24     and bit_xor_iff [bit_simps]: \<open>bit (a XOR b) n \<longleftrightarrow> bit a n \<noteq> bit b n\<close>
    22     and mask_eq_exp_minus_1: \<open>mask n = 2 ^ n - 1\<close>
    25     and mask_eq_exp_minus_1: \<open>mask n = 2 ^ n - 1\<close>
       
    26     and set_bit_eq_or: \<open>set_bit n a = a OR push_bit n 1\<close>
       
    27     and bit_unset_bit_iff [bit_simps]: \<open>bit (unset_bit m a) n \<longleftrightarrow> bit a n \<and> m \<noteq> n\<close>
       
    28     and flip_bit_eq_xor: \<open>flip_bit n a = a XOR push_bit n 1\<close>
    23 begin
    29 begin
    24 
    30 
    25 text \<open>
    31 text \<open>
    26   We want the bitwise operations to bind slightly weaker
    32   We want the bitwise operations to bind slightly weaker
    27   than \<open>+\<close> and \<open>-\<close>.
    33   than \<open>+\<close> and \<open>-\<close>.
   180   apply (cases \<open>2 ^ n = 0\<close>)
   186   apply (cases \<open>2 ^ n = 0\<close>)
   181   apply (simp_all add: push_bit_of_1 bit_eq_iff bit_and_iff bit_push_bit_iff exp_eq_0_imp_not_bit)
   187   apply (simp_all add: push_bit_of_1 bit_eq_iff bit_and_iff bit_push_bit_iff exp_eq_0_imp_not_bit)
   182   apply (simp_all add: bit_exp_iff)
   188   apply (simp_all add: bit_exp_iff)
   183   done
   189   done
   184 
   190 
   185 end
   191 lemmas set_bit_def = set_bit_eq_or
   186 
       
   187 class ring_bit_operations = semiring_bit_operations + ring_parity +
       
   188   fixes not :: \<open>'a \<Rightarrow> 'a\<close>  (\<open>NOT\<close>)
       
   189   assumes bit_not_iff [bit_simps]: \<open>\<And>n. bit (NOT a) n \<longleftrightarrow> 2 ^ n \<noteq> 0 \<and> \<not> bit a n\<close>
       
   190   assumes minus_eq_not_minus_1: \<open>- a = NOT (a - 1)\<close>
       
   191 begin
       
   192 
       
   193 text \<open>
       
   194   For the sake of code generation \<^const>\<open>not\<close> is specified as
       
   195   definitional class operation.  Note that \<^const>\<open>not\<close> has no
       
   196   sensible definition for unlimited but only positive bit strings
       
   197   (type \<^typ>\<open>nat\<close>).
       
   198 \<close>
       
   199 
       
   200 lemma bits_minus_1_mod_2_eq [simp]:
       
   201   \<open>(- 1) mod 2 = 1\<close>
       
   202   by (simp add: mod_2_eq_odd)
       
   203 
       
   204 lemma not_eq_complement:
       
   205   \<open>NOT a = - a - 1\<close>
       
   206   using minus_eq_not_minus_1 [of \<open>a + 1\<close>] by simp
       
   207 
       
   208 lemma minus_eq_not_plus_1:
       
   209   \<open>- a = NOT a + 1\<close>
       
   210   using not_eq_complement [of a] by simp
       
   211 
       
   212 lemma bit_minus_iff [bit_simps]:
       
   213   \<open>bit (- a) n \<longleftrightarrow> 2 ^ n \<noteq> 0 \<and> \<not> bit (a - 1) n\<close>
       
   214   by (simp add: minus_eq_not_minus_1 bit_not_iff)
       
   215 
       
   216 lemma even_not_iff [simp]:
       
   217   "even (NOT a) \<longleftrightarrow> odd a"
       
   218   using bit_not_iff [of a 0] by auto
       
   219 
       
   220 lemma bit_not_exp_iff [bit_simps]:
       
   221   \<open>bit (NOT (2 ^ m)) n \<longleftrightarrow> 2 ^ n \<noteq> 0 \<and> n \<noteq> m\<close>
       
   222   by (auto simp add: bit_not_iff bit_exp_iff)
       
   223 
       
   224 lemma bit_minus_1_iff [simp]:
       
   225   \<open>bit (- 1) n \<longleftrightarrow> 2 ^ n \<noteq> 0\<close>
       
   226   by (simp add: bit_minus_iff)
       
   227 
       
   228 lemma bit_minus_exp_iff [bit_simps]:
       
   229   \<open>bit (- (2 ^ m)) n \<longleftrightarrow> 2 ^ n \<noteq> 0 \<and> n \<ge> m\<close>
       
   230   by (auto simp add: bit_simps simp flip: mask_eq_exp_minus_1)
       
   231 
       
   232 lemma bit_minus_2_iff [simp]:
       
   233   \<open>bit (- 2) n \<longleftrightarrow> 2 ^ n \<noteq> 0 \<and> n > 0\<close>
       
   234   by (simp add: bit_minus_iff bit_1_iff)
       
   235 
       
   236 lemma not_one [simp]:
       
   237   "NOT 1 = - 2"
       
   238   by (simp add: bit_eq_iff bit_not_iff) (simp add: bit_1_iff)
       
   239 
       
   240 sublocale "and": semilattice_neutr \<open>(AND)\<close> \<open>- 1\<close>
       
   241   by standard (rule bit_eqI, simp add: bit_and_iff)
       
   242 
       
   243 sublocale bit: boolean_algebra \<open>(AND)\<close> \<open>(OR)\<close> NOT 0 \<open>- 1\<close>
       
   244   rewrites \<open>bit.xor = (XOR)\<close>
       
   245 proof -
       
   246   interpret bit: boolean_algebra \<open>(AND)\<close> \<open>(OR)\<close> NOT 0 \<open>- 1\<close>
       
   247     by standard (auto simp add: bit_and_iff bit_or_iff bit_not_iff intro: bit_eqI)
       
   248   show \<open>boolean_algebra (AND) (OR) NOT 0 (- 1)\<close>
       
   249     by standard
       
   250   show \<open>boolean_algebra.xor (AND) (OR) NOT = (XOR)\<close>
       
   251     by (rule ext, rule ext, rule bit_eqI)
       
   252       (auto simp add: bit.xor_def bit_and_iff bit_or_iff bit_xor_iff bit_not_iff)
       
   253 qed
       
   254 
       
   255 lemma and_eq_not_not_or:
       
   256   \<open>a AND b = NOT (NOT a OR NOT b)\<close>
       
   257   by simp
       
   258 
       
   259 lemma or_eq_not_not_and:
       
   260   \<open>a OR b = NOT (NOT a AND NOT b)\<close>
       
   261   by simp
       
   262 
       
   263 lemma not_add_distrib:
       
   264   \<open>NOT (a + b) = NOT a - b\<close>
       
   265   by (simp add: not_eq_complement algebra_simps)
       
   266 
       
   267 lemma not_diff_distrib:
       
   268   \<open>NOT (a - b) = NOT a + b\<close>
       
   269   using not_add_distrib [of a \<open>- b\<close>] by simp
       
   270 
       
   271 lemma (in ring_bit_operations) and_eq_minus_1_iff:
       
   272   \<open>a AND b = - 1 \<longleftrightarrow> a = - 1 \<and> b = - 1\<close>
       
   273 proof
       
   274   assume \<open>a = - 1 \<and> b = - 1\<close>
       
   275   then show \<open>a AND b = - 1\<close>
       
   276     by simp
       
   277 next
       
   278   assume \<open>a AND b = - 1\<close>
       
   279   have *: \<open>bit a n\<close> \<open>bit b n\<close> if \<open>2 ^ n \<noteq> 0\<close> for n
       
   280   proof -
       
   281     from \<open>a AND b = - 1\<close>
       
   282     have \<open>bit (a AND b) n = bit (- 1) n\<close>
       
   283       by (simp add: bit_eq_iff)
       
   284     then show \<open>bit a n\<close> \<open>bit b n\<close>
       
   285       using that by (simp_all add: bit_and_iff)
       
   286   qed
       
   287   have \<open>a = - 1\<close>
       
   288     by (rule bit_eqI) (simp add: *)
       
   289   moreover have \<open>b = - 1\<close>
       
   290     by (rule bit_eqI) (simp add: *)
       
   291   ultimately show \<open>a = - 1 \<and> b = - 1\<close>
       
   292     by simp
       
   293 qed
       
   294 
       
   295 lemma disjunctive_diff:
       
   296   \<open>a - b = a AND NOT b\<close> if \<open>\<And>n. bit b n \<Longrightarrow> bit a n\<close>
       
   297 proof -
       
   298   have \<open>NOT a + b = NOT a OR b\<close>
       
   299     by (rule disjunctive_add) (auto simp add: bit_not_iff dest: that)
       
   300   then have \<open>NOT (NOT a + b) = NOT (NOT a OR b)\<close>
       
   301     by simp
       
   302   then show ?thesis
       
   303     by (simp add: not_add_distrib)
       
   304 qed
       
   305 
       
   306 lemma push_bit_minus:
       
   307   \<open>push_bit n (- a) = - push_bit n a\<close>
       
   308   by (simp add: push_bit_eq_mult)
       
   309 
       
   310 lemma take_bit_not_take_bit:
       
   311   \<open>take_bit n (NOT (take_bit n a)) = take_bit n (NOT a)\<close>
       
   312   by (auto simp add: bit_eq_iff bit_take_bit_iff bit_not_iff)
       
   313 
       
   314 lemma take_bit_not_iff:
       
   315   "take_bit n (NOT a) = take_bit n (NOT b) \<longleftrightarrow> take_bit n a = take_bit n b"
       
   316   apply (simp add: bit_eq_iff)
       
   317   apply (simp add: bit_not_iff bit_take_bit_iff bit_exp_iff)
       
   318   apply (use exp_eq_0_imp_not_bit in blast)
       
   319   done
       
   320 
       
   321 lemma take_bit_not_eq_mask_diff:
       
   322   \<open>take_bit n (NOT a) = mask n - take_bit n a\<close>
       
   323 proof -
       
   324   have \<open>take_bit n (NOT a) = take_bit n (NOT (take_bit n a))\<close>
       
   325     by (simp add: take_bit_not_take_bit)
       
   326   also have \<open>\<dots> = mask n AND NOT (take_bit n a)\<close>
       
   327     by (simp add: take_bit_eq_mask ac_simps)
       
   328   also have \<open>\<dots> = mask n - take_bit n a\<close>
       
   329     by (subst disjunctive_diff)
       
   330       (auto simp add: bit_take_bit_iff bit_mask_iff exp_eq_0_imp_not_bit)
       
   331   finally show ?thesis
       
   332     by simp
       
   333 qed
       
   334 
       
   335 lemma mask_eq_take_bit_minus_one:
       
   336   \<open>mask n = take_bit n (- 1)\<close>
       
   337   by (simp add: bit_eq_iff bit_mask_iff bit_take_bit_iff conj_commute)
       
   338 
       
   339 lemma take_bit_minus_one_eq_mask:
       
   340   \<open>take_bit n (- 1) = mask n\<close>
       
   341   by (simp add: mask_eq_take_bit_minus_one)
       
   342 
       
   343 lemma minus_exp_eq_not_mask:
       
   344   \<open>- (2 ^ n) = NOT (mask n)\<close>
       
   345   by (rule bit_eqI) (simp add: bit_minus_iff bit_not_iff flip: mask_eq_exp_minus_1)
       
   346 
       
   347 lemma push_bit_minus_one_eq_not_mask:
       
   348   \<open>push_bit n (- 1) = NOT (mask n)\<close>
       
   349   by (simp add: push_bit_eq_mult minus_exp_eq_not_mask)
       
   350 
       
   351 lemma take_bit_not_mask_eq_0:
       
   352   \<open>take_bit m (NOT (mask n)) = 0\<close> if \<open>n \<ge> m\<close>
       
   353   by (rule bit_eqI) (use that in \<open>simp add: bit_take_bit_iff bit_not_iff bit_mask_iff\<close>)
       
   354 
       
   355 lemma take_bit_mask [simp]:
       
   356   \<open>take_bit m (mask n) = mask (min m n)\<close>
       
   357   by (simp add: mask_eq_take_bit_minus_one)
       
   358 
       
   359 definition set_bit :: \<open>nat \<Rightarrow> 'a \<Rightarrow> 'a\<close>
       
   360   where \<open>set_bit n a = a OR push_bit n 1\<close>
       
   361 
       
   362 definition unset_bit :: \<open>nat \<Rightarrow> 'a \<Rightarrow> 'a\<close>
       
   363   where \<open>unset_bit n a = a AND NOT (push_bit n 1)\<close>
       
   364 
       
   365 definition flip_bit :: \<open>nat \<Rightarrow> 'a \<Rightarrow> 'a\<close>
       
   366   where \<open>flip_bit n a = a XOR push_bit n 1\<close>
       
   367 
   192 
   368 lemma bit_set_bit_iff [bit_simps]:
   193 lemma bit_set_bit_iff [bit_simps]:
   369   \<open>bit (set_bit m a) n \<longleftrightarrow> bit a n \<or> (m = n \<and> 2 ^ n \<noteq> 0)\<close>
   194   \<open>bit (set_bit m a) n \<longleftrightarrow> bit a n \<or> (m = n \<and> 2 ^ n \<noteq> 0)\<close>
   370   by (auto simp add: set_bit_def push_bit_of_1 bit_or_iff bit_exp_iff)
   195   by (auto simp add: set_bit_def push_bit_of_1 bit_or_iff bit_exp_iff)
   371 
   196 
   372 lemma even_set_bit_iff:
   197 lemma even_set_bit_iff:
   373   \<open>even (set_bit m a) \<longleftrightarrow> even a \<and> m \<noteq> 0\<close>
   198   \<open>even (set_bit m a) \<longleftrightarrow> even a \<and> m \<noteq> 0\<close>
   374   using bit_set_bit_iff [of m a 0] by auto
   199   using bit_set_bit_iff [of m a 0] by auto
   375 
   200 
   376 lemma bit_unset_bit_iff [bit_simps]:
       
   377   \<open>bit (unset_bit m a) n \<longleftrightarrow> bit a n \<and> m \<noteq> n\<close>
       
   378   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)
       
   379 
       
   380 lemma even_unset_bit_iff:
   201 lemma even_unset_bit_iff:
   381   \<open>even (unset_bit m a) \<longleftrightarrow> even a \<or> m = 0\<close>
   202   \<open>even (unset_bit m a) \<longleftrightarrow> even a \<or> m = 0\<close>
   382   using bit_unset_bit_iff [of m a 0] by auto
   203   using bit_unset_bit_iff [of m a 0] by auto
       
   204 
       
   205 lemmas flip_bit_def = flip_bit_eq_xor
   383 
   206 
   384 lemma bit_flip_bit_iff [bit_simps]:
   207 lemma bit_flip_bit_iff [bit_simps]:
   385   \<open>bit (flip_bit m a) n \<longleftrightarrow> (m = n \<longleftrightarrow> \<not> bit a n) \<and> 2 ^ n \<noteq> 0\<close>
   208   \<open>bit (flip_bit m a) n \<longleftrightarrow> (m = n \<longleftrightarrow> \<not> bit a n) \<and> 2 ^ n \<noteq> 0\<close>
   386   by (auto simp add: flip_bit_def push_bit_of_1 bit_xor_iff bit_exp_iff exp_eq_0_imp_not_bit)
   209   by (auto simp add: flip_bit_def push_bit_of_1 bit_xor_iff bit_exp_iff exp_eq_0_imp_not_bit)
   387 
   210 
   493   by (rule bit_eqI) (auto simp add: bit_take_bit_iff bit_unset_bit_iff)
   316   by (rule bit_eqI) (auto simp add: bit_take_bit_iff bit_unset_bit_iff)
   494 
   317 
   495 lemma take_bit_flip_bit_eq:
   318 lemma take_bit_flip_bit_eq:
   496   \<open>take_bit n (flip_bit m a) = (if n \<le> m then take_bit n a else flip_bit m (take_bit n a))\<close>
   319   \<open>take_bit n (flip_bit m a) = (if n \<le> m then take_bit n a else flip_bit m (take_bit n a))\<close>
   497   by (rule bit_eqI) (auto simp add: bit_take_bit_iff bit_flip_bit_iff)
   320   by (rule bit_eqI) (auto simp add: bit_take_bit_iff bit_flip_bit_iff)
       
   321 
       
   322 
       
   323 end
       
   324 
       
   325 class ring_bit_operations = semiring_bit_operations + ring_parity +
       
   326   fixes not :: \<open>'a \<Rightarrow> 'a\<close>  (\<open>NOT\<close>)
       
   327   assumes bit_not_iff [bit_simps]: \<open>\<And>n. bit (NOT a) n \<longleftrightarrow> 2 ^ n \<noteq> 0 \<and> \<not> bit a n\<close>
       
   328   assumes minus_eq_not_minus_1: \<open>- a = NOT (a - 1)\<close>
       
   329 begin
       
   330 
       
   331 text \<open>
       
   332   For the sake of code generation \<^const>\<open>not\<close> is specified as
       
   333   definitional class operation.  Note that \<^const>\<open>not\<close> has no
       
   334   sensible definition for unlimited but only positive bit strings
       
   335   (type \<^typ>\<open>nat\<close>).
       
   336 \<close>
       
   337 
       
   338 lemma bits_minus_1_mod_2_eq [simp]:
       
   339   \<open>(- 1) mod 2 = 1\<close>
       
   340   by (simp add: mod_2_eq_odd)
       
   341 
       
   342 lemma not_eq_complement:
       
   343   \<open>NOT a = - a - 1\<close>
       
   344   using minus_eq_not_minus_1 [of \<open>a + 1\<close>] by simp
       
   345 
       
   346 lemma minus_eq_not_plus_1:
       
   347   \<open>- a = NOT a + 1\<close>
       
   348   using not_eq_complement [of a] by simp
       
   349 
       
   350 lemma bit_minus_iff [bit_simps]:
       
   351   \<open>bit (- a) n \<longleftrightarrow> 2 ^ n \<noteq> 0 \<and> \<not> bit (a - 1) n\<close>
       
   352   by (simp add: minus_eq_not_minus_1 bit_not_iff)
       
   353 
       
   354 lemma even_not_iff [simp]:
       
   355   "even (NOT a) \<longleftrightarrow> odd a"
       
   356   using bit_not_iff [of a 0] by auto
       
   357 
       
   358 lemma bit_not_exp_iff [bit_simps]:
       
   359   \<open>bit (NOT (2 ^ m)) n \<longleftrightarrow> 2 ^ n \<noteq> 0 \<and> n \<noteq> m\<close>
       
   360   by (auto simp add: bit_not_iff bit_exp_iff)
       
   361 
       
   362 lemma bit_minus_1_iff [simp]:
       
   363   \<open>bit (- 1) n \<longleftrightarrow> 2 ^ n \<noteq> 0\<close>
       
   364   by (simp add: bit_minus_iff)
       
   365 
       
   366 lemma bit_minus_exp_iff [bit_simps]:
       
   367   \<open>bit (- (2 ^ m)) n \<longleftrightarrow> 2 ^ n \<noteq> 0 \<and> n \<ge> m\<close>
       
   368   by (auto simp add: bit_simps simp flip: mask_eq_exp_minus_1)
       
   369 
       
   370 lemma bit_minus_2_iff [simp]:
       
   371   \<open>bit (- 2) n \<longleftrightarrow> 2 ^ n \<noteq> 0 \<and> n > 0\<close>
       
   372   by (simp add: bit_minus_iff bit_1_iff)
       
   373 
       
   374 lemma not_one [simp]:
       
   375   "NOT 1 = - 2"
       
   376   by (simp add: bit_eq_iff bit_not_iff) (simp add: bit_1_iff)
       
   377 
       
   378 sublocale "and": semilattice_neutr \<open>(AND)\<close> \<open>- 1\<close>
       
   379   by standard (rule bit_eqI, simp add: bit_and_iff)
       
   380 
       
   381 sublocale bit: boolean_algebra \<open>(AND)\<close> \<open>(OR)\<close> NOT 0 \<open>- 1\<close>
       
   382   rewrites \<open>bit.xor = (XOR)\<close>
       
   383 proof -
       
   384   interpret bit: boolean_algebra \<open>(AND)\<close> \<open>(OR)\<close> NOT 0 \<open>- 1\<close>
       
   385     by standard (auto simp add: bit_and_iff bit_or_iff bit_not_iff intro: bit_eqI)
       
   386   show \<open>boolean_algebra (AND) (OR) NOT 0 (- 1)\<close>
       
   387     by standard
       
   388   show \<open>boolean_algebra.xor (AND) (OR) NOT = (XOR)\<close>
       
   389     by (rule ext, rule ext, rule bit_eqI)
       
   390       (auto simp add: bit.xor_def bit_and_iff bit_or_iff bit_xor_iff bit_not_iff)
       
   391 qed
       
   392 
       
   393 lemma and_eq_not_not_or:
       
   394   \<open>a AND b = NOT (NOT a OR NOT b)\<close>
       
   395   by simp
       
   396 
       
   397 lemma or_eq_not_not_and:
       
   398   \<open>a OR b = NOT (NOT a AND NOT b)\<close>
       
   399   by simp
       
   400 
       
   401 lemma not_add_distrib:
       
   402   \<open>NOT (a + b) = NOT a - b\<close>
       
   403   by (simp add: not_eq_complement algebra_simps)
       
   404 
       
   405 lemma not_diff_distrib:
       
   406   \<open>NOT (a - b) = NOT a + b\<close>
       
   407   using not_add_distrib [of a \<open>- b\<close>] by simp
       
   408 
       
   409 lemma (in ring_bit_operations) and_eq_minus_1_iff:
       
   410   \<open>a AND b = - 1 \<longleftrightarrow> a = - 1 \<and> b = - 1\<close>
       
   411 proof
       
   412   assume \<open>a = - 1 \<and> b = - 1\<close>
       
   413   then show \<open>a AND b = - 1\<close>
       
   414     by simp
       
   415 next
       
   416   assume \<open>a AND b = - 1\<close>
       
   417   have *: \<open>bit a n\<close> \<open>bit b n\<close> if \<open>2 ^ n \<noteq> 0\<close> for n
       
   418   proof -
       
   419     from \<open>a AND b = - 1\<close>
       
   420     have \<open>bit (a AND b) n = bit (- 1) n\<close>
       
   421       by (simp add: bit_eq_iff)
       
   422     then show \<open>bit a n\<close> \<open>bit b n\<close>
       
   423       using that by (simp_all add: bit_and_iff)
       
   424   qed
       
   425   have \<open>a = - 1\<close>
       
   426     by (rule bit_eqI) (simp add: *)
       
   427   moreover have \<open>b = - 1\<close>
       
   428     by (rule bit_eqI) (simp add: *)
       
   429   ultimately show \<open>a = - 1 \<and> b = - 1\<close>
       
   430     by simp
       
   431 qed
       
   432 
       
   433 lemma disjunctive_diff:
       
   434   \<open>a - b = a AND NOT b\<close> if \<open>\<And>n. bit b n \<Longrightarrow> bit a n\<close>
       
   435 proof -
       
   436   have \<open>NOT a + b = NOT a OR b\<close>
       
   437     by (rule disjunctive_add) (auto simp add: bit_not_iff dest: that)
       
   438   then have \<open>NOT (NOT a + b) = NOT (NOT a OR b)\<close>
       
   439     by simp
       
   440   then show ?thesis
       
   441     by (simp add: not_add_distrib)
       
   442 qed
       
   443 
       
   444 lemma push_bit_minus:
       
   445   \<open>push_bit n (- a) = - push_bit n a\<close>
       
   446   by (simp add: push_bit_eq_mult)
       
   447 
       
   448 lemma take_bit_not_take_bit:
       
   449   \<open>take_bit n (NOT (take_bit n a)) = take_bit n (NOT a)\<close>
       
   450   by (auto simp add: bit_eq_iff bit_take_bit_iff bit_not_iff)
       
   451 
       
   452 lemma take_bit_not_iff:
       
   453   "take_bit n (NOT a) = take_bit n (NOT b) \<longleftrightarrow> take_bit n a = take_bit n b"
       
   454   apply (simp add: bit_eq_iff)
       
   455   apply (simp add: bit_not_iff bit_take_bit_iff bit_exp_iff)
       
   456   apply (use exp_eq_0_imp_not_bit in blast)
       
   457   done
       
   458 
       
   459 lemma take_bit_not_eq_mask_diff:
       
   460   \<open>take_bit n (NOT a) = mask n - take_bit n a\<close>
       
   461 proof -
       
   462   have \<open>take_bit n (NOT a) = take_bit n (NOT (take_bit n a))\<close>
       
   463     by (simp add: take_bit_not_take_bit)
       
   464   also have \<open>\<dots> = mask n AND NOT (take_bit n a)\<close>
       
   465     by (simp add: take_bit_eq_mask ac_simps)
       
   466   also have \<open>\<dots> = mask n - take_bit n a\<close>
       
   467     by (subst disjunctive_diff)
       
   468       (auto simp add: bit_take_bit_iff bit_mask_iff exp_eq_0_imp_not_bit)
       
   469   finally show ?thesis
       
   470     by simp
       
   471 qed
       
   472 
       
   473 lemma mask_eq_take_bit_minus_one:
       
   474   \<open>mask n = take_bit n (- 1)\<close>
       
   475   by (simp add: bit_eq_iff bit_mask_iff bit_take_bit_iff conj_commute)
       
   476 
       
   477 lemma take_bit_minus_one_eq_mask:
       
   478   \<open>take_bit n (- 1) = mask n\<close>
       
   479   by (simp add: mask_eq_take_bit_minus_one)
       
   480 
       
   481 lemma minus_exp_eq_not_mask:
       
   482   \<open>- (2 ^ n) = NOT (mask n)\<close>
       
   483   by (rule bit_eqI) (simp add: bit_minus_iff bit_not_iff flip: mask_eq_exp_minus_1)
       
   484 
       
   485 lemma push_bit_minus_one_eq_not_mask:
       
   486   \<open>push_bit n (- 1) = NOT (mask n)\<close>
       
   487   by (simp add: push_bit_eq_mult minus_exp_eq_not_mask)
       
   488 
       
   489 lemma take_bit_not_mask_eq_0:
       
   490   \<open>take_bit m (NOT (mask n)) = 0\<close> if \<open>n \<ge> m\<close>
       
   491   by (rule bit_eqI) (use that in \<open>simp add: bit_take_bit_iff bit_not_iff bit_mask_iff\<close>)
       
   492 
       
   493 lemma unset_bit_eq_and_not:
       
   494   \<open>unset_bit n a = a AND NOT (push_bit n 1)\<close>
       
   495   by (rule bit_eqI) (auto simp add: bit_simps)
       
   496 
       
   497 lemmas unset_bit_def = unset_bit_eq_and_not
   498 
   498 
   499 end
   499 end
   500 
   500 
   501 
   501 
   502 subsection \<open>Instance \<^typ>\<open>int\<close>\<close>
   502 subsection \<open>Instance \<^typ>\<open>int\<close>\<close>
   660   by (auto simp add: xor_int_def bit_or_int_iff bit_and_int_iff bit_not_int_iff)
   660   by (auto simp add: xor_int_def bit_or_int_iff bit_and_int_iff bit_not_int_iff)
   661 
   661 
   662 definition mask_int :: \<open>nat \<Rightarrow> int\<close>
   662 definition mask_int :: \<open>nat \<Rightarrow> int\<close>
   663   where \<open>mask n = (2 :: int) ^ n - 1\<close>
   663   where \<open>mask n = (2 :: int) ^ n - 1\<close>
   664 
   664 
       
   665 definition set_bit_int :: \<open>nat \<Rightarrow> int \<Rightarrow> int\<close>
       
   666   where \<open>set_bit n k = k OR push_bit n 1\<close> for k :: int
       
   667 
       
   668 definition unset_bit_int :: \<open>nat \<Rightarrow> int \<Rightarrow> int\<close>
       
   669   where \<open>unset_bit n k = k AND NOT (push_bit n 1)\<close> for k :: int
       
   670 
       
   671 definition flip_bit_int :: \<open>nat \<Rightarrow> int \<Rightarrow> int\<close>
       
   672   where \<open>flip_bit n k = k XOR push_bit n 1\<close> for k :: int
       
   673 
   665 instance proof
   674 instance proof
   666   fix k l :: int and n :: nat
   675   fix k l :: int and m n :: nat
   667   show \<open>- k = NOT (k - 1)\<close>
   676   show \<open>- k = NOT (k - 1)\<close>
   668     by (simp add: not_int_def)
   677     by (simp add: not_int_def)
   669   show \<open>bit (k AND l) n \<longleftrightarrow> bit k n \<and> bit l n\<close>
   678   show \<open>bit (k AND l) n \<longleftrightarrow> bit k n \<and> bit l n\<close>
   670     by (fact bit_and_int_iff)
   679     by (fact bit_and_int_iff)
   671   show \<open>bit (k OR l) n \<longleftrightarrow> bit k n \<or> bit l n\<close>
   680   show \<open>bit (k OR l) n \<longleftrightarrow> bit k n \<or> bit l n\<close>
   672     by (fact bit_or_int_iff)
   681     by (fact bit_or_int_iff)
   673   show \<open>bit (k XOR l) n \<longleftrightarrow> bit k n \<noteq> bit l n\<close>
   682   show \<open>bit (k XOR l) n \<longleftrightarrow> bit k n \<noteq> bit l n\<close>
   674     by (fact bit_xor_int_iff)
   683     by (fact bit_xor_int_iff)
   675 qed (simp_all add: bit_not_int_iff mask_int_def)
   684   show \<open>bit (unset_bit m k) n \<longleftrightarrow> bit k n \<and> m \<noteq> n\<close>
       
   685   proof -
       
   686     have \<open>unset_bit m k = k AND NOT (push_bit m 1)\<close>
       
   687       by (simp add: unset_bit_int_def)
       
   688     also have \<open>NOT (push_bit m 1 :: int) = - (push_bit m 1 + 1)\<close>
       
   689       by (simp add: not_int_def)
       
   690     finally show ?thesis by (simp only: bit_simps bit_and_int_iff) (auto simp add: bit_simps)
       
   691   qed
       
   692 qed (simp_all add: bit_not_int_iff mask_int_def set_bit_int_def flip_bit_int_def)
   676 
   693 
   677 end
   694 end
   678 
   695 
   679 
   696 
   680 lemma mask_half_int:
   697 lemma mask_half_int:
  1590   where \<open>m XOR n = nat (int m XOR int n)\<close> for m n :: nat
  1607   where \<open>m XOR n = nat (int m XOR int n)\<close> for m n :: nat
  1591 
  1608 
  1592 definition mask_nat :: \<open>nat \<Rightarrow> nat\<close>
  1609 definition mask_nat :: \<open>nat \<Rightarrow> nat\<close>
  1593   where \<open>mask n = (2 :: nat) ^ n - 1\<close>
  1610   where \<open>mask n = (2 :: nat) ^ n - 1\<close>
  1594 
  1611 
       
  1612 definition set_bit_nat :: \<open>nat \<Rightarrow> nat \<Rightarrow> nat\<close>
       
  1613   where \<open>set_bit m n = n OR push_bit m 1\<close> for m n :: nat
       
  1614 
       
  1615 definition unset_bit_nat :: \<open>nat \<Rightarrow> nat \<Rightarrow> nat\<close>
       
  1616   where \<open>unset_bit m n = (if bit n m then n - push_bit m 1 else n)\<close> for m n :: nat
       
  1617 
       
  1618 definition flip_bit_nat :: \<open>nat \<Rightarrow> nat \<Rightarrow> nat\<close>
       
  1619   where \<open>flip_bit m n = n XOR push_bit m 1\<close> for m n :: nat
       
  1620 
  1595 instance proof
  1621 instance proof
  1596   fix m n q :: nat
  1622   fix m n q :: nat
  1597   show \<open>bit (m AND n) q \<longleftrightarrow> bit m q \<and> bit n q\<close>
  1623   show \<open>bit (m AND n) q \<longleftrightarrow> bit m q \<and> bit n q\<close>
  1598     by (simp add: and_nat_def bit_simps)
  1624     by (simp add: and_nat_def bit_simps)
  1599   show \<open>bit (m OR n) q \<longleftrightarrow> bit m q \<or> bit n q\<close>
  1625   show \<open>bit (m OR n) q \<longleftrightarrow> bit m q \<or> bit n q\<close>
  1600     by (simp add: or_nat_def bit_simps)
  1626     by (simp add: or_nat_def bit_simps)
  1601   show \<open>bit (m XOR n) q \<longleftrightarrow> bit m q \<noteq> bit n q\<close>
  1627   show \<open>bit (m XOR n) q \<longleftrightarrow> bit m q \<noteq> bit n q\<close>
  1602     by (simp add: xor_nat_def bit_simps)
  1628     by (simp add: xor_nat_def bit_simps)
  1603 qed (simp add: mask_nat_def)
  1629   show \<open>bit (unset_bit m n) q \<longleftrightarrow> bit n q \<and> m \<noteq> q\<close>
       
  1630   proof (cases \<open>bit n m\<close>)
       
  1631     case False
       
  1632     then show ?thesis by (auto simp add: unset_bit_nat_def)
       
  1633   next
       
  1634     case True
       
  1635     have \<open>push_bit m (drop_bit m n) + take_bit m n = n\<close>
       
  1636       by (fact bits_ident)
       
  1637     also from \<open>bit n m\<close> have \<open>drop_bit m n = 2 * drop_bit (Suc m) n  + 1\<close>
       
  1638       by (simp add: drop_bit_Suc drop_bit_half even_drop_bit_iff_not_bit ac_simps)
       
  1639     finally have \<open>push_bit m (2 * drop_bit (Suc m) n) + take_bit m n + push_bit m 1 = n\<close>
       
  1640       by (simp only: push_bit_add ac_simps)
       
  1641     then have \<open>n - push_bit m 1 = push_bit m (2 * drop_bit (Suc m) n) + take_bit m n\<close>
       
  1642       by simp
       
  1643     then have \<open>n - push_bit m 1 = push_bit m (2 * drop_bit (Suc m) n) OR take_bit m n\<close>
       
  1644       by (simp add: or_nat_def bit_simps flip: disjunctive_add)
       
  1645     with \<open>bit n m\<close> show ?thesis
       
  1646       by (auto simp add: unset_bit_nat_def or_nat_def bit_simps)
       
  1647   qed
       
  1648 qed (simp_all add: mask_nat_def set_bit_nat_def flip_bit_nat_def)
  1604 
  1649 
  1605 end
  1650 end
  1606 
  1651 
  1607 lemma and_nat_rec:
  1652 lemma and_nat_rec:
  1608   \<open>m AND n = of_bool (odd m \<and> odd n) + 2 * ((m div 2) AND (n div 2))\<close> for m n :: nat
  1653   \<open>m AND n = of_bool (odd m \<and> odd n) + 2 * ((m div 2) AND (n div 2))\<close> for m n :: nat
  1712   is xor .
  1757   is xor .
  1713 
  1758 
  1714 lift_definition mask_integer :: \<open>nat \<Rightarrow> integer\<close>
  1759 lift_definition mask_integer :: \<open>nat \<Rightarrow> integer\<close>
  1715   is mask .
  1760   is mask .
  1716 
  1761 
       
  1762 lift_definition set_bit_integer :: \<open>nat \<Rightarrow> integer \<Rightarrow> integer\<close>
       
  1763   is set_bit .
       
  1764 
       
  1765 lift_definition unset_bit_integer :: \<open>nat \<Rightarrow> integer \<Rightarrow> integer\<close>
       
  1766   is unset_bit .
       
  1767 
       
  1768 lift_definition flip_bit_integer :: \<open>nat \<Rightarrow> integer \<Rightarrow> integer\<close>
       
  1769   is flip_bit .
       
  1770 
  1717 instance by (standard; transfer)
  1771 instance by (standard; transfer)
  1718   (simp_all add: minus_eq_not_minus_1 mask_eq_exp_minus_1
  1772   (simp_all add: minus_eq_not_minus_1 mask_eq_exp_minus_1
  1719     bit_not_iff bit_and_iff bit_or_iff bit_xor_iff)
  1773     bit_not_iff bit_and_iff bit_or_iff bit_xor_iff
       
  1774     set_bit_def bit_unset_bit_iff flip_bit_def)
  1720 
  1775 
  1721 end
  1776 end
  1722 
  1777 
  1723 lemma [code]:
  1778 lemma [code]:
  1724   \<open>mask n = 2 ^ n - (1::integer)\<close>
  1779   \<open>mask n = 2 ^ n - (1::integer)\<close>
  1737   is xor .
  1792   is xor .
  1738 
  1793 
  1739 lift_definition mask_natural :: \<open>nat \<Rightarrow> natural\<close>
  1794 lift_definition mask_natural :: \<open>nat \<Rightarrow> natural\<close>
  1740   is mask .
  1795   is mask .
  1741 
  1796 
       
  1797 lift_definition set_bit_natural :: \<open>nat \<Rightarrow> natural \<Rightarrow> natural\<close>
       
  1798   is set_bit .
       
  1799 
       
  1800 lift_definition unset_bit_natural :: \<open>nat \<Rightarrow> natural \<Rightarrow> natural\<close>
       
  1801   is unset_bit .
       
  1802 
       
  1803 lift_definition flip_bit_natural :: \<open>nat \<Rightarrow> natural \<Rightarrow> natural\<close>
       
  1804   is flip_bit .
       
  1805 
  1742 instance by (standard; transfer)
  1806 instance by (standard; transfer)
  1743   (simp_all add: mask_eq_exp_minus_1 bit_and_iff bit_or_iff bit_xor_iff)
  1807   (simp_all add: mask_eq_exp_minus_1
       
  1808     bit_and_iff bit_or_iff bit_xor_iff
       
  1809     set_bit_def bit_unset_bit_iff flip_bit_def)
  1744 
  1810 
  1745 end
  1811 end
  1746 
  1812 
  1747 lemma [code]:
  1813 lemma [code]:
  1748   \<open>integer_of_natural (mask n) = mask n\<close>
  1814   \<open>integer_of_natural (mask n) = mask n\<close>