442 by transfer (simp_all add: mod_2_eq_odd take_bit_Suc) |
442 by transfer (simp_all add: mod_2_eq_odd take_bit_Suc) |
443 show "\<not> 2 dvd a \<longleftrightarrow> a mod 2 = 1" |
443 show "\<not> 2 dvd a \<longleftrightarrow> a mod 2 = 1" |
444 for a :: "'a word" |
444 for a :: "'a word" |
445 by transfer (simp_all add: mod_2_eq_odd take_bit_Suc) |
445 by transfer (simp_all add: mod_2_eq_odd take_bit_Suc) |
446 qed |
446 qed |
|
447 |
|
448 lemma exp_eq_zero_iff: |
|
449 \<open>2 ^ n = (0 :: 'a::len word) \<longleftrightarrow> n \<ge> LENGTH('a)\<close> |
|
450 by transfer simp |
447 |
451 |
448 |
452 |
449 subsection \<open>Ordering\<close> |
453 subsection \<open>Ordering\<close> |
450 |
454 |
451 instantiation word :: (len0) linorder |
455 instantiation word :: (len0) linorder |
678 using f1 by (meson le_less less_le_trans unique_euclidean_semiring_numeral_class.pos_mod_bound) |
682 using f1 by (meson le_less less_le_trans unique_euclidean_semiring_numeral_class.pos_mod_bound) |
679 qed |
683 qed |
680 show \<open>(1 + a) div 2 = a div 2\<close> |
684 show \<open>(1 + a) div 2 = a div 2\<close> |
681 if \<open>even a\<close> |
685 if \<open>even a\<close> |
682 for a :: \<open>'a word\<close> |
686 for a :: \<open>'a word\<close> |
683 using that by transfer (auto dest: le_Suc_ex simp add: take_bit_Suc) |
687 using that by transfer |
|
688 (auto dest: le_Suc_ex simp add: mod_2_eq_odd take_bit_Suc elim!: evenE) |
684 show \<open>(2 :: 'a word) ^ m div 2 ^ n = of_bool ((2 :: 'a word) ^ m \<noteq> 0 \<and> n \<le> m) * 2 ^ (m - n)\<close> |
689 show \<open>(2 :: 'a word) ^ m div 2 ^ n = of_bool ((2 :: 'a word) ^ m \<noteq> 0 \<and> n \<le> m) * 2 ^ (m - n)\<close> |
685 for m n :: nat |
690 for m n :: nat |
686 by transfer (simp, simp add: exp_div_exp_eq) |
691 by transfer (simp, simp add: exp_div_exp_eq) |
687 show "a div 2 ^ m div 2 ^ n = a div 2 ^ (m + n)" |
692 show "a div 2 ^ m div 2 ^ n = a div 2 ^ (m + n)" |
688 for a :: "'a word" and m n :: nat |
693 for a :: "'a word" and m n :: nat |
3564 done |
3569 done |
3565 |
3570 |
3566 |
3571 |
3567 subsubsection \<open>Mask\<close> |
3572 subsubsection \<open>Mask\<close> |
3568 |
3573 |
3569 lemma nth_mask [OF refl, simp]: "m = mask n \<Longrightarrow> test_bit m i \<longleftrightarrow> i < n \<and> i < size m" |
3574 lemma mask_eq: |
3570 apply (unfold mask_def test_bit_bl) |
3575 \<open>mask n = 2 ^ n - 1\<close> |
3571 apply (simp only: word_1_bl [symmetric] shiftl_of_bl) |
3576 by (simp add: mask_def shiftl_word_eq push_bit_eq_mult) |
3572 apply (clarsimp simp add: word_size) |
3577 |
3573 apply (simp only: of_bl_def mask_lem word_of_int_hom_syms add_diff_cancel2) |
3578 lemma mask_Suc_rec: |
3574 apply (fold of_bl_def) |
3579 \<open>mask (Suc n) = 2 * mask n + 1\<close> |
3575 apply (simp add: word_1_bl) |
3580 by (simp add: mask_eq) |
3576 apply (rule test_bit_of_bl [THEN trans, unfolded test_bit_bl word_size]) |
3581 |
3577 apply auto |
3582 context |
3578 done |
3583 begin |
|
3584 |
|
3585 qualified lemma bit_mask_iff [simp]: |
|
3586 \<open>bit (mask m :: 'a::len word) n \<longleftrightarrow> n < LENGTH('a) \<and> n < m\<close> |
|
3587 by (simp add: mask_eq bit_mask_iff exp_eq_zero_iff not_le) |
|
3588 |
|
3589 end |
|
3590 |
|
3591 lemma nth_mask [simp]: |
|
3592 \<open>(mask n :: 'a::len word) !! i \<longleftrightarrow> i < n \<and> i < size (mask n :: 'a word)\<close> |
|
3593 by (auto simp add: test_bit_word_eq word_size) |
3579 |
3594 |
3580 lemma mask_bl: "mask n = of_bl (replicate n True)" |
3595 lemma mask_bl: "mask n = of_bl (replicate n True)" |
3581 by (auto simp add : test_bit_of_bl word_size intro: word_eqI) |
3596 by (auto simp add : test_bit_of_bl word_size intro: word_eqI) |
3582 |
3597 |
3583 lemma mask_bin: "mask n = word_of_int (bintrunc n (- 1))" |
3598 lemma mask_bin: "mask n = word_of_int (bintrunc n (- 1))" |