src/HOL/ex/Bit_Operations.thy
changeset 71535 b612edee9b0c
parent 71442 d45495e897f4
child 71800 35a951ed2e82
equal deleted inserted replaced
71534:f10bffaa2bae 71535:b612edee9b0c
    25   than \<open>+\<close> and \<open>-\<close>.
    25   than \<open>+\<close> and \<open>-\<close>.
    26   For the sake of code generation
    26   For the sake of code generation
    27   the operations \<^const>\<open>and\<close>, \<^const>\<open>or\<close> and \<^const>\<open>xor\<close>
    27   the operations \<^const>\<open>and\<close>, \<^const>\<open>or\<close> and \<^const>\<open>xor\<close>
    28   are specified as definitional class operations.
    28   are specified as definitional class operations.
    29 \<close>
    29 \<close>
    30 
       
    31 lemma stable_imp_drop_eq:
       
    32   \<open>drop_bit n a = a\<close> if \<open>a div 2 = a\<close>
       
    33   by (induction n) (simp_all add: that)
       
    34 
    30 
    35 sublocale "and": semilattice \<open>(AND)\<close>
    31 sublocale "and": semilattice \<open>(AND)\<close>
    36   by standard (auto simp add: bit_eq_iff bit_and_iff)
    32   by standard (auto simp add: bit_eq_iff bit_and_iff)
    37 
    33 
    38 sublocale or: semilattice_neutr \<open>(OR)\<close> 0
    34 sublocale or: semilattice_neutr \<open>(OR)\<close> 0
   217 proof (rule bit_eqI)
   213 proof (rule bit_eqI)
   218   fix m
   214   fix m
   219   assume *: \<open>2 ^ m \<noteq> 0\<close>
   215   assume *: \<open>2 ^ m \<noteq> 0\<close>
   220   then show \<open>bit (set_bit 0 a) m = bit (1 + 2 * (a div 2)) m\<close>
   216   then show \<open>bit (set_bit 0 a) m = bit (1 + 2 * (a div 2)) m\<close>
   221     by (simp add: bit_set_bit_iff bit_double_iff even_bit_succ_iff)
   217     by (simp add: bit_set_bit_iff bit_double_iff even_bit_succ_iff)
   222       (cases m, simp_all)
   218       (cases m, simp_all add: bit_Suc)
   223 qed
   219 qed
   224 
   220 
   225 lemma set_bit_Suc [simp]:
   221 lemma set_bit_Suc [simp]:
   226   \<open>set_bit (Suc n) a = a mod 2 + 2 * set_bit n (a div 2)\<close>
   222   \<open>set_bit (Suc n) a = a mod 2 + 2 * set_bit n (a div 2)\<close>
   227 proof (rule bit_eqI)
   223 proof (rule bit_eqI)
   237     with * have \<open>2 ^ m \<noteq> 0\<close>
   233     with * have \<open>2 ^ m \<noteq> 0\<close>
   238       using mult_2 by auto
   234       using mult_2 by auto
   239     show ?thesis
   235     show ?thesis
   240       by (cases a rule: parity_cases)
   236       by (cases a rule: parity_cases)
   241         (simp_all add: bit_set_bit_iff bit_double_iff even_bit_succ_iff *,
   237         (simp_all add: bit_set_bit_iff bit_double_iff even_bit_succ_iff *,
   242         simp_all add: Suc \<open>2 ^ m \<noteq> 0\<close>)
   238         simp_all add: Suc \<open>2 ^ m \<noteq> 0\<close> bit_Suc)
   243   qed
   239   qed
   244 qed
   240 qed
   245 
   241 
   246 lemma unset_bit_0 [simp]:
   242 lemma unset_bit_0 [simp]:
   247   \<open>unset_bit 0 a = 2 * (a div 2)\<close>
   243   \<open>unset_bit 0 a = 2 * (a div 2)\<close>
   248 proof (rule bit_eqI)
   244 proof (rule bit_eqI)
   249   fix m
   245   fix m
   250   assume *: \<open>2 ^ m \<noteq> 0\<close>
   246   assume *: \<open>2 ^ m \<noteq> 0\<close>
   251   then show \<open>bit (unset_bit 0 a) m = bit (2 * (a div 2)) m\<close>
   247   then show \<open>bit (unset_bit 0 a) m = bit (2 * (a div 2)) m\<close>
   252     by (simp add: bit_unset_bit_iff bit_double_iff)
   248     by (simp add: bit_unset_bit_iff bit_double_iff)
   253       (cases m, simp_all)
   249       (cases m, simp_all add: bit_Suc)
   254 qed
   250 qed
   255 
   251 
   256 lemma unset_bit_Suc [simp]:
   252 lemma unset_bit_Suc [simp]:
   257   \<open>unset_bit (Suc n) a = a mod 2 + 2 * unset_bit n (a div 2)\<close>
   253   \<open>unset_bit (Suc n) a = a mod 2 + 2 * unset_bit n (a div 2)\<close>
   258 proof (rule bit_eqI)
   254 proof (rule bit_eqI)
   266   next
   262   next
   267     case (Suc m)
   263     case (Suc m)
   268     show ?thesis
   264     show ?thesis
   269       by (cases a rule: parity_cases)
   265       by (cases a rule: parity_cases)
   270         (simp_all add: bit_unset_bit_iff bit_double_iff even_bit_succ_iff *,
   266         (simp_all add: bit_unset_bit_iff bit_double_iff even_bit_succ_iff *,
   271          simp_all add: Suc)
   267          simp_all add: Suc bit_Suc)
   272   qed
   268   qed
   273 qed
   269 qed
   274 
   270 
   275 lemma flip_bit_0 [simp]:
   271 lemma flip_bit_0 [simp]:
   276   \<open>flip_bit 0 a = of_bool (even a) + 2 * (a div 2)\<close>
   272   \<open>flip_bit 0 a = of_bool (even a) + 2 * (a div 2)\<close>
   277 proof (rule bit_eqI)
   273 proof (rule bit_eqI)
   278   fix m
   274   fix m
   279   assume *: \<open>2 ^ m \<noteq> 0\<close>
   275   assume *: \<open>2 ^ m \<noteq> 0\<close>
   280   then show \<open>bit (flip_bit 0 a) m = bit (of_bool (even a) + 2 * (a div 2)) m\<close>
   276   then show \<open>bit (flip_bit 0 a) m = bit (of_bool (even a) + 2 * (a div 2)) m\<close>
   281     by (simp add: bit_flip_bit_iff bit_double_iff even_bit_succ_iff)
   277     by (simp add: bit_flip_bit_iff bit_double_iff even_bit_succ_iff)
   282       (cases m, simp_all)
   278       (cases m, simp_all add: bit_Suc)
   283 qed
   279 qed
   284 
   280 
   285 lemma flip_bit_Suc [simp]:
   281 lemma flip_bit_Suc [simp]:
   286   \<open>flip_bit (Suc n) a = a mod 2 + 2 * flip_bit n (a div 2)\<close>
   282   \<open>flip_bit (Suc n) a = a mod 2 + 2 * flip_bit n (a div 2)\<close>
   287 proof (rule bit_eqI)
   283 proof (rule bit_eqI)
   297     with * have \<open>2 ^ m \<noteq> 0\<close>
   293     with * have \<open>2 ^ m \<noteq> 0\<close>
   298       using mult_2 by auto
   294       using mult_2 by auto
   299     show ?thesis
   295     show ?thesis
   300       by (cases a rule: parity_cases)
   296       by (cases a rule: parity_cases)
   301         (simp_all add: bit_flip_bit_iff bit_double_iff even_bit_succ_iff,
   297         (simp_all add: bit_flip_bit_iff bit_double_iff even_bit_succ_iff,
   302         simp_all add: Suc \<open>2 ^ m \<noteq> 0\<close>)
   298         simp_all add: Suc \<open>2 ^ m \<noteq> 0\<close> bit_Suc)
   303   qed
   299   qed
   304 qed
   300 qed
   305 
   301 
   306 end
   302 end
   307 
   303 
   346   then show ?case
   342   then show ?case
   347     by (simp add: rec [of m n])
   343     by (simp add: rec [of m n])
   348 next
   344 next
   349   case (Suc n)
   345   case (Suc n)
   350   then show ?case
   346   then show ?case
   351     by (simp add: rec [of m n])
   347     by (simp add: rec [of m n] bit_Suc)
   352 qed
   348 qed
   353 
   349 
   354 sublocale abel_semigroup F
   350 sublocale abel_semigroup F
   355   by standard (simp_all add: Parity.bit_eq_iff bit_eq_iff ac_simps)
   351   by standard (simp_all add: Parity.bit_eq_iff bit_eq_iff ac_simps)
   356 
   352 
   459   then show ?case
   455   then show ?case
   460     by (simp add: rec [of k l])
   456     by (simp add: rec [of k l])
   461 next
   457 next
   462   case (Suc n)
   458   case (Suc n)
   463   then show ?case
   459   then show ?case
   464     by (simp add: rec [of k l])
   460     by (simp add: rec [of k l] bit_Suc)
   465 qed
   461 qed
   466 
   462 
   467 sublocale abel_semigroup F
   463 sublocale abel_semigroup F
   468   by standard (simp_all add: Parity.bit_eq_iff bit_eq_iff ac_simps)
   464   by standard (simp_all add: Parity.bit_eq_iff bit_eq_iff ac_simps)
   469 
   465 
   512   by (simp add: not_int_def)
   508   by (simp add: not_int_def)
   513 
   509 
   514 lemma bit_not_iff_int:
   510 lemma bit_not_iff_int:
   515   \<open>bit (NOT k) n \<longleftrightarrow> \<not> bit k n\<close>
   511   \<open>bit (NOT k) n \<longleftrightarrow> \<not> bit k n\<close>
   516     for k :: int
   512     for k :: int
   517   by (induction n arbitrary: k) (simp_all add: not_int_div_2 even_not_iff_int)
   513   by (induction n arbitrary: k) (simp_all add: not_int_div_2 even_not_iff_int bit_Suc)
   518 
   514 
   519 instance proof
   515 instance proof
   520   fix k l :: int and n :: nat
   516   fix k l :: int and n :: nat
   521   show \<open>- k = NOT (k - 1)\<close>
   517   show \<open>- k = NOT (k - 1)\<close>
   522     by (simp add: not_int_def)
   518     by (simp add: not_int_def)