src/HOL/Library/Bit_Operations.thy
changeset 72023 08348e364739
parent 72010 a851ce626b78
child 72028 08f1e4cb735f
equal deleted inserted replaced
72022:45865bb06182 72023:08348e364739
     6 theory Bit_Operations
     6 theory Bit_Operations
     7   imports
     7   imports
     8     "HOL-Library.Boolean_Algebra"
     8     "HOL-Library.Boolean_Algebra"
     9     Main
     9     Main
    10 begin
    10 begin
    11 
       
    12 subsection \<open>Preliminiaries\<close> \<comment> \<open>TODO move\<close>
       
    13 
       
    14 lemma take_bit_int_less_exp:
       
    15   \<open>take_bit n k < 2 ^ n\<close> for k :: int
       
    16   by (simp add: take_bit_eq_mod)
       
    17 
       
    18 lemma take_bit_Suc_from_most:
       
    19   \<open>take_bit (Suc n) k = 2 ^ n * of_bool (bit k n) + take_bit n k\<close> for k :: int
       
    20   by (simp only: take_bit_eq_mod power_Suc2) (simp_all add: bit_iff_odd odd_iff_mod_2_eq_one zmod_zmult2_eq)
       
    21 
       
    22 lemma take_bit_greater_eq:
       
    23   \<open>k + 2 ^ n \<le> take_bit n k\<close> if \<open>k < 0\<close> for k :: int
       
    24 proof -
       
    25   have \<open>k + 2 ^ n \<le> take_bit n (k + 2 ^ n)\<close>
       
    26   proof (cases \<open>k > - (2 ^ n)\<close>)
       
    27     case False
       
    28     then have \<open>k + 2 ^ n \<le> 0\<close>
       
    29       by simp
       
    30     also note take_bit_nonnegative
       
    31     finally show ?thesis .
       
    32   next
       
    33     case True
       
    34     with that have \<open>0 \<le> k + 2 ^ n\<close> and \<open>k + 2 ^ n < 2 ^ n\<close>
       
    35       by simp_all
       
    36     then show ?thesis
       
    37       by (simp only: take_bit_eq_mod mod_pos_pos_trivial)
       
    38   qed
       
    39   then show ?thesis
       
    40     by (simp add: take_bit_eq_mod)
       
    41 qed
       
    42 
       
    43 lemma take_bit_less_eq:
       
    44   \<open>take_bit n k \<le> k - 2 ^ n\<close> if \<open>2 ^ n \<le> k\<close> and \<open>n > 0\<close> for k :: int
       
    45   using that zmod_le_nonneg_dividend [of \<open>k - 2 ^ n\<close> \<open>2 ^ n\<close>]
       
    46   by (simp add: take_bit_eq_mod)
       
    47 
       
    48 
    11 
    49 subsection \<open>Bit operations\<close>
    12 subsection \<open>Bit operations\<close>
    50 
    13 
    51 class semiring_bit_operations = semiring_bit_shifts +
    14 class semiring_bit_operations = semiring_bit_shifts +
    52   fixes "and" :: \<open>'a \<Rightarrow> 'a \<Rightarrow> 'a\<close>  (infixr \<open>AND\<close> 64)
    15   fixes "and" :: \<open>'a \<Rightarrow> 'a \<Rightarrow> 'a\<close>  (infixr \<open>AND\<close> 64)