equal
deleted
inserted
replaced
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) |