src/HOL/Word/Word.thy
changeset 72512 83b5911c0164
parent 72508 c89d8e8bd8c7
equal deleted inserted replaced
72511:460d743010bc 72512:83b5911c0164
   118     transfer_prover
   118     transfer_prover
   119 qed
   119 qed
   120 
   120 
   121 end
   121 end
   122 
   122 
       
   123 lemma exp_eq_zero_iff [simp]:
       
   124   \<open>2 ^ n = (0 :: 'a::len word) \<longleftrightarrow> n \<ge> LENGTH('a)\<close>
       
   125   by transfer simp
       
   126 
   123 lemma word_exp_length_eq_0 [simp]:
   127 lemma word_exp_length_eq_0 [simp]:
   124   \<open>(2 :: 'a::len word) ^ LENGTH('a) = 0\<close>
   128   \<open>(2 :: 'a::len word) ^ LENGTH('a) = 0\<close>
   125   by transfer simp
   129   by simp
   126 
       
   127 lemma exp_eq_zero_iff:
       
   128   \<open>2 ^ n = (0 :: 'a::len word) \<longleftrightarrow> n \<ge> LENGTH('a)\<close>
       
   129   by transfer simp
       
   130 
   130 
   131 
   131 
   132 subsubsection \<open>Basic tool setup\<close>
   132 subsubsection \<open>Basic tool setup\<close>
   133 
   133 
   134 ML_file \<open>Tools/word_lib.ML\<close>
   134 ML_file \<open>Tools/word_lib.ML\<close>
  1100   for w :: \<open>'b::len word\<close>
  1100   for w :: \<open>'b::len word\<close>
  1101   by (rule bit_eqI) (simp add: bit_unsigned_iff bit_take_bit_iff Parity.bit_take_bit_iff)
  1101   by (rule bit_eqI) (simp add: bit_unsigned_iff bit_take_bit_iff Parity.bit_take_bit_iff)
  1102 
  1102 
  1103 end
  1103 end
  1104 
  1104 
       
  1105 context unique_euclidean_semiring_with_bit_shifts
       
  1106 begin
       
  1107 
       
  1108 lemma unsigned_drop_bit_eq:
       
  1109   \<open>unsigned (drop_bit n w) = drop_bit n (take_bit LENGTH('b) (unsigned w))\<close>
       
  1110   for w :: \<open>'b::len word\<close>
       
  1111   by (rule bit_eqI) (auto simp add: bit_unsigned_iff bit_take_bit_iff bit_drop_bit_eq Parity.bit_drop_bit_eq dest: bit_imp_le_length)
       
  1112 
       
  1113 end
       
  1114 
  1105 context semiring_bit_operations
  1115 context semiring_bit_operations
  1106 begin
  1116 begin
  1107 
  1117 
  1108 lemma unsigned_and_eq:
  1118 lemma unsigned_and_eq:
  1109   \<open>unsigned (v AND w) = unsigned v AND unsigned w\<close>
  1119   \<open>unsigned (v AND w) = unsigned v AND unsigned w\<close>
  4546 
  4556 
  4547 
  4557 
  4548 subsection \<open>More\<close>
  4558 subsection \<open>More\<close>
  4549 
  4559 
  4550 lemma mask_1: "mask 1 = 1"
  4560 lemma mask_1: "mask 1 = 1"
  4551   by transfer (simp add: min_def mask_Suc_exp)
  4561   by simp
  4552 
  4562 
  4553 lemma mask_Suc_0: "mask (Suc 0) = 1"
  4563 lemma mask_Suc_0: "mask (Suc 0) = 1"
  4554   using mask_1 by simp
  4564   by simp
  4555 
  4565 
  4556 lemma bin_last_bintrunc: "odd (take_bit l n) \<longleftrightarrow> l > 0 \<and> odd n"
  4566 lemma bin_last_bintrunc: "odd (take_bit l n) \<longleftrightarrow> l > 0 \<and> odd n"
  4557   by simp
  4567   by simp
  4558 
  4568 
  4559 
  4569 
       
  4570 lemma push_bit_word_beyond [simp]:
       
  4571   \<open>push_bit n w = 0\<close> if \<open>LENGTH('a) \<le> n\<close> for w :: \<open>'a::len word\<close>
       
  4572   using that by (transfer fixing: n) (simp add: take_bit_push_bit)
       
  4573 
       
  4574 lemma drop_bit_word_beyond [simp]:
       
  4575   \<open>drop_bit n w = 0\<close> if \<open>LENGTH('a) \<le> n\<close> for w :: \<open>'a::len word\<close>
       
  4576   using that by (transfer fixing: n) (simp add: drop_bit_take_bit)
       
  4577 
       
  4578 lemma signed_drop_bit_beyond:
       
  4579   \<open>signed_drop_bit n w = (if bit w (LENGTH('a) - Suc 0) then - 1 else 0)\<close>
       
  4580   if \<open>LENGTH('a) \<le> n\<close> for w :: \<open>'a::len word\<close>
       
  4581   by (rule bit_word_eqI) (simp add: bit_signed_drop_bit_iff that)
       
  4582 
       
  4583 
  4560 subsection \<open>SMT support\<close>
  4584 subsection \<open>SMT support\<close>
  4561 
  4585 
  4562 ML_file \<open>Tools/smt_word.ML\<close>
  4586 ML_file \<open>Tools/smt_word.ML\<close>
  4563 
  4587 
  4564 end
  4588 end