src/HOL/Word/Word.thy
changeset 71953 428609096812
parent 71952 2efc5b8c7456
child 71954 13bb3f5cdc5b
equal deleted inserted replaced
71952:2efc5b8c7456 71953:428609096812
   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))"