src/HOL/Bit_Operations.thy
changeset 79071 7ab8b3f1d84b
parent 79070 a4775fe69f5d
child 79072 a91050cd5c93
equal deleted inserted replaced
79070:a4775fe69f5d 79071:7ab8b3f1d84b
    98 lemma bit_rec:
    98 lemma bit_rec:
    99   \<open>bit a n \<longleftrightarrow> (if n = 0 then odd a else bit (a div 2) (n - 1))\<close>
    99   \<open>bit a n \<longleftrightarrow> (if n = 0 then odd a else bit (a div 2) (n - 1))\<close>
   100   by (cases n) (simp_all add: bit_Suc bit_0)
   100   by (cases n) (simp_all add: bit_Suc bit_0)
   101 
   101 
   102 lemma bit_0_eq [simp]:
   102 lemma bit_0_eq [simp]:
   103   \<open>bit 0 = bot\<close>
   103   \<open>bit 0 = \<bottom>\<close>
   104   by (simp add: fun_eq_iff bit_iff_odd)
   104   by (simp add: fun_eq_iff bit_iff_odd)
   105 
   105 
   106 context
   106 context
   107   fixes a
   107   fixes a
   108   assumes stable: \<open>a div 2 = a\<close>
   108   assumes stable: \<open>a div 2 = a\<close>
  1338 
  1338 
  1339 lemma take_bit_sum:
  1339 lemma take_bit_sum:
  1340   \<open>take_bit n a = (\<Sum>k = 0..<n. push_bit k (of_bool (bit a k)))\<close>
  1340   \<open>take_bit n a = (\<Sum>k = 0..<n. push_bit k (of_bool (bit a k)))\<close>
  1341   by (simp flip: horner_sum_bit_eq_take_bit add: horner_sum_eq_sum push_bit_eq_mult)
  1341   by (simp flip: horner_sum_bit_eq_take_bit add: horner_sum_eq_sum push_bit_eq_mult)
  1342 
  1342 
       
  1343 lemma set_bit_eq:
       
  1344   \<open>set_bit n a = a + of_bool (\<not> bit a n) * 2 ^ n\<close>
       
  1345 proof -
       
  1346   have \<open>set_bit n a = a OR of_bool (\<not> bit a n) * 2 ^ n\<close>
       
  1347     by (rule bit_eqI) (auto simp add: bit_simps)
       
  1348   then show ?thesis
       
  1349     by (subst disjunctive_add) (auto simp add: bit_simps)
       
  1350 qed
       
  1351 
  1343 end
  1352 end
  1344 
  1353 
  1345 class ring_bit_operations = semiring_bit_operations + ring_parity +
  1354 class ring_bit_operations = semiring_bit_operations + ring_parity +
  1346   fixes not :: \<open>'a \<Rightarrow> 'a\<close>  (\<open>NOT\<close>)
  1355   fixes not :: \<open>'a \<Rightarrow> 'a\<close>  (\<open>NOT\<close>)
  1347   assumes not_rec: \<open>NOT a = of_bool (even a) + 2 * NOT (a div 2)\<close>
  1356   assumes not_rec: \<open>NOT a = of_bool (even a) + 2 * NOT (a div 2)\<close>
  1552 
  1561 
  1553 lemma push_bit_numeral_minus_1 [simp]:
  1562 lemma push_bit_numeral_minus_1 [simp]:
  1554   \<open>push_bit (numeral n) (- 1) = - (2 ^ numeral n)\<close>
  1563   \<open>push_bit (numeral n) (- 1) = - (2 ^ numeral n)\<close>
  1555   by (simp add: push_bit_eq_mult)
  1564   by (simp add: push_bit_eq_mult)
  1556 
  1565 
       
  1566 lemma unset_bit_eq:
       
  1567   \<open>unset_bit n a = a - of_bool (bit a n) * 2 ^ n\<close>
       
  1568 proof -
       
  1569   have \<open>unset_bit n a = a AND NOT (of_bool (bit a n) * 2 ^ n)\<close>
       
  1570     by (rule bit_eqI) (auto simp add: bit_simps)
       
  1571   then show ?thesis
       
  1572     by (subst disjunctive_diff) (auto simp add: bit_simps simp flip: push_bit_eq_mult)
       
  1573 qed
       
  1574 
  1557 end
  1575 end
  1558 
  1576 
  1559 
  1577 
  1560 subsection \<open>Common algebraic structure\<close>
  1578 subsection \<open>Common algebraic structure\<close>
  1561 
  1579 
  1639 qed
  1657 qed
  1640 
  1658 
  1641 lemma drop_bit_mask_eq:
  1659 lemma drop_bit_mask_eq:
  1642   \<open>drop_bit m (mask n) = mask (n - m)\<close>
  1660   \<open>drop_bit m (mask n) = mask (n - m)\<close>
  1643   by (rule bit_eqI) (auto simp add: bit_simps possible_bit_def)
  1661   by (rule bit_eqI) (auto simp add: bit_simps possible_bit_def)
       
  1662 
       
  1663 lemma bit_push_bit_iff':
       
  1664   \<open>bit (push_bit m a) n \<longleftrightarrow> m \<le> n \<and> bit a (n - m)\<close>
       
  1665   by (simp add: bit_simps)
       
  1666 
       
  1667 lemma mask_half:
       
  1668   \<open>mask n div 2 = mask (n - 1)\<close>
       
  1669   by (cases n) (simp_all add: mask_Suc_double one_or_eq)
       
  1670 
       
  1671 lemma take_bit_Suc_from_most:
       
  1672   \<open>take_bit (Suc n) a = 2 ^ n * of_bool (bit a n) + take_bit n a\<close>
       
  1673   using mod_mult2_eq' [of a \<open>2 ^ n\<close> 2]
       
  1674   by (simp only: take_bit_eq_mod power_Suc2)
       
  1675     (simp_all add: bit_iff_odd odd_iff_mod_2_eq_one)
       
  1676 
       
  1677 lemma take_bit_nonnegative [simp]:
       
  1678   \<open>0 \<le> take_bit n a\<close>
       
  1679   using horner_sum_nonnegative by (simp flip: horner_sum_bit_eq_take_bit)
       
  1680 
       
  1681 lemma not_take_bit_negative [simp]:
       
  1682   \<open>\<not> take_bit n a < 0\<close>
       
  1683   by (simp add: not_less)
       
  1684 
       
  1685 lemma bit_imp_take_bit_positive:
       
  1686   \<open>0 < take_bit m a\<close> if \<open>n < m\<close> and \<open>bit a n\<close>
       
  1687 proof (rule ccontr)
       
  1688   assume \<open>\<not> 0 < take_bit m a\<close>
       
  1689   then have \<open>take_bit m a = 0\<close>
       
  1690     by (auto simp add: not_less intro: order_antisym)
       
  1691   then have \<open>bit (take_bit m a) n = bit 0 n\<close>
       
  1692     by simp
       
  1693   with that show False
       
  1694     by (simp add: bit_take_bit_iff)
       
  1695 qed
       
  1696 
       
  1697 lemma take_bit_mult:
       
  1698   \<open>take_bit n (take_bit n a * take_bit n b) = take_bit n (a * b)\<close>
       
  1699   by (simp add: take_bit_eq_mod mod_mult_eq)
       
  1700 
       
  1701 lemma drop_bit_push_bit:
       
  1702   \<open>drop_bit m (push_bit n a) = drop_bit (m - n) (push_bit (n - m) a)\<close>
       
  1703   by (cases \<open>m \<le> n\<close>)
       
  1704     (auto simp add: mult.left_commute [of _ \<open>2 ^ n\<close>] mult.commute [of _ \<open>2 ^ n\<close>] mult.assoc
       
  1705     mult.commute [of a] drop_bit_eq_div push_bit_eq_mult not_le power_add Orderings.not_le dest!: le_Suc_ex less_imp_Suc_add)
  1644 
  1706 
  1645 end
  1707 end
  1646 
  1708 
  1647 
  1709 
  1648 subsection \<open>Instance \<^typ>\<open>int\<close>\<close>
  1710 subsection \<open>Instance \<^typ>\<open>int\<close>\<close>
  1869 
  1931 
  1870 lemma not_int_div_2:
  1932 lemma not_int_div_2:
  1871   \<open>NOT k div 2 = NOT (k div 2)\<close> for k :: int
  1933   \<open>NOT k div 2 = NOT (k div 2)\<close> for k :: int
  1872   by (simp add: not_int_def)
  1934   by (simp add: not_int_def)
  1873 
  1935 
  1874 lemma bit_push_bit_iff_int:
       
  1875   \<open>bit (push_bit m k) n \<longleftrightarrow> m \<le> n \<and> bit k (n - m)\<close> for k :: int
       
  1876   by (auto simp add: bit_push_bit_iff)
       
  1877 
       
  1878 lemma take_bit_nonnegative [simp]:
       
  1879   \<open>take_bit n k \<ge> 0\<close> for k :: int
       
  1880   by (simp add: take_bit_eq_mod)
       
  1881 
       
  1882 lemma not_take_bit_negative [simp]:
       
  1883   \<open>\<not> take_bit n k < 0\<close> for k :: int
       
  1884   by (simp add: not_less)
       
  1885 
       
  1886 lemma take_bit_int_less_exp [simp]:
  1936 lemma take_bit_int_less_exp [simp]:
  1887   \<open>take_bit n k < 2 ^ n\<close> for k :: int
  1937   \<open>take_bit n k < 2 ^ n\<close> for k :: int
  1888   by (simp add: take_bit_eq_mod)
  1938   by (simp add: take_bit_eq_mod)
  1889 
  1939 
  1890 lemma take_bit_int_eq_self_iff:
  1940 lemma take_bit_int_eq_self_iff:
  1903 
  1953 
  1904 lemma take_bit_int_eq_self:
  1954 lemma take_bit_int_eq_self:
  1905   \<open>take_bit n k = k\<close> if \<open>0 \<le> k\<close> \<open>k < 2 ^ n\<close> for k :: int
  1955   \<open>take_bit n k = k\<close> if \<open>0 \<le> k\<close> \<open>k < 2 ^ n\<close> for k :: int
  1906   using that by (simp add: take_bit_int_eq_self_iff)
  1956   using that by (simp add: take_bit_int_eq_self_iff)
  1907 
  1957 
  1908 lemma mask_half_int:
       
  1909   \<open>mask n div 2 = (mask (n - 1) :: int)\<close>
       
  1910   by (cases n) (simp_all add: mask_eq_exp_minus_1 algebra_simps)
       
  1911 
       
  1912 lemma mask_nonnegative_int [simp]:
  1958 lemma mask_nonnegative_int [simp]:
  1913   \<open>mask n \<ge> (0::int)\<close>
  1959   \<open>mask n \<ge> (0::int)\<close>
  1914   by (simp add: mask_eq_exp_minus_1)
  1960   by (simp add: mask_eq_exp_minus_1 add_le_imp_le_diff)
  1915 
  1961 
  1916 lemma not_mask_negative_int [simp]:
  1962 lemma not_mask_negative_int [simp]:
  1917   \<open>\<not> mask n < (0::int)\<close>
  1963   \<open>\<not> mask n < (0::int)\<close>
  1918   by (simp add: not_less)
  1964   by (simp add: not_less)
  1919 
  1965 
  2133 
  2179 
  2134 lemma drop_bit_minus_one [simp]:
  2180 lemma drop_bit_minus_one [simp]:
  2135   \<open>drop_bit n (- 1 :: int) = - 1\<close>
  2181   \<open>drop_bit n (- 1 :: int) = - 1\<close>
  2136   by (simp add: drop_bit_eq_div minus_1_div_exp_eq_int)
  2182   by (simp add: drop_bit_eq_div minus_1_div_exp_eq_int)
  2137 
  2183 
  2138 lemma take_bit_Suc_from_most:
       
  2139   \<open>take_bit (Suc n) k = 2 ^ n * of_bool (bit k n) + take_bit n k\<close> for k :: int
       
  2140   by (simp only: take_bit_eq_mod power_Suc2) (simp_all add: bit_iff_odd odd_iff_mod_2_eq_one zmod_zmult2_eq)
       
  2141 
       
  2142 lemma take_bit_minus:
  2184 lemma take_bit_minus:
  2143   \<open>take_bit n (- take_bit n k) = take_bit n (- k)\<close>
  2185   \<open>take_bit n (- take_bit n k) = take_bit n (- k)\<close>
  2144     for k :: int
  2186     for k :: int
  2145   by (simp add: take_bit_eq_mod mod_minus_eq)
  2187   by (simp add: take_bit_eq_mod mod_minus_eq)
  2146 
  2188 
  2147 lemma take_bit_diff:
  2189 lemma take_bit_diff:
  2148   \<open>take_bit n (take_bit n k - take_bit n l) = take_bit n (k - l)\<close>
  2190   \<open>take_bit n (take_bit n k - take_bit n l) = take_bit n (k - l)\<close>
  2149     for k l :: int
  2191     for k l :: int
  2150   by (simp add: take_bit_eq_mod mod_diff_eq)
  2192   by (simp add: take_bit_eq_mod mod_diff_eq)
  2151 
       
  2152 lemma bit_imp_take_bit_positive:
       
  2153   \<open>0 < take_bit m k\<close> if \<open>n < m\<close> and \<open>bit k n\<close> for k :: int
       
  2154 proof (rule ccontr)
       
  2155   assume \<open>\<not> 0 < take_bit m k\<close>
       
  2156   then have \<open>take_bit m k = 0\<close>
       
  2157     by (auto simp add: not_less intro: order_antisym)
       
  2158   then have \<open>bit (take_bit m k) n = bit 0 n\<close>
       
  2159     by simp
       
  2160   with that show False
       
  2161     by (simp add: bit_take_bit_iff)
       
  2162 qed
       
  2163 
       
  2164 lemma take_bit_mult:
       
  2165   \<open>take_bit n (take_bit n k * take_bit n l) = take_bit n (k * l)\<close>
       
  2166   for k l :: int
       
  2167   by (simp add: take_bit_eq_mod mod_mult_eq)
       
  2168 
  2193 
  2169 lemma (in ring_1) of_nat_nat_take_bit_eq [simp]:
  2194 lemma (in ring_1) of_nat_nat_take_bit_eq [simp]:
  2170   \<open>of_nat (nat (take_bit n k)) = of_int (take_bit n k)\<close>
  2195   \<open>of_nat (nat (take_bit n k)) = of_int (take_bit n k)\<close>
  2171   by simp
  2196   by simp
  2172 
  2197 
  2186     by simp
  2211     by simp
  2187   then show ?thesis
  2212   then show ?thesis
  2188     by (simp add: take_bit_eq_mod)
  2213     by (simp add: take_bit_eq_mod)
  2189 qed
  2214 qed
  2190 
  2215 
  2191 lemma drop_bit_push_bit_int:
       
  2192   \<open>drop_bit m (push_bit n k) = drop_bit (m - n) (push_bit (n - m) k)\<close> for k :: int
       
  2193   by (cases \<open>m \<le> n\<close>) (auto simp add: mult.left_commute [of _ \<open>2 ^ n\<close>] mult.commute [of _ \<open>2 ^ n\<close>] mult.assoc
       
  2194     mult.commute [of k] drop_bit_eq_div push_bit_eq_mult not_le power_add dest!: le_Suc_ex less_imp_Suc_add)
       
  2195 
       
  2196 lemma push_bit_nonnegative_int_iff [simp]:
  2216 lemma push_bit_nonnegative_int_iff [simp]:
  2197   \<open>push_bit n k \<ge> 0 \<longleftrightarrow> k \<ge> 0\<close> for k :: int
  2217   \<open>push_bit n k \<ge> 0 \<longleftrightarrow> k \<ge> 0\<close> for k :: int
  2198   by (simp add: push_bit_eq_mult zero_le_mult_iff power_le_zero_eq)
  2218   by (simp add: push_bit_eq_mult zero_le_mult_iff power_le_zero_eq)
  2199 
  2219 
  2200 lemma push_bit_negative_int_iff [simp]:
  2220 lemma push_bit_negative_int_iff [simp]:
  2238   by (simp add: set_bit_eq_or or_greater_eq)
  2258   by (simp add: set_bit_eq_or or_greater_eq)
  2239 
  2259 
  2240 lemma unset_bit_less_eq:
  2260 lemma unset_bit_less_eq:
  2241   \<open>unset_bit n k \<le> k\<close> for k :: int
  2261   \<open>unset_bit n k \<le> k\<close> for k :: int
  2242   by (simp add: unset_bit_eq_and_not and_less_eq)
  2262   by (simp add: unset_bit_eq_and_not and_less_eq)
  2243 
       
  2244 lemma set_bit_eq:
       
  2245   \<open>set_bit n k = k + of_bool (\<not> bit k n) * 2 ^ n\<close> for k :: int
       
  2246 proof -
       
  2247   have \<open>set_bit n k = k OR of_bool (\<not> bit k n) * 2 ^ n\<close>
       
  2248     by (rule bit_eqI) (auto simp add: bit_simps)
       
  2249   then show ?thesis
       
  2250     by (subst disjunctive_add) (auto simp add: bit_simps)
       
  2251 qed
       
  2252 
       
  2253 lemma unset_bit_eq:
       
  2254   \<open>unset_bit n k = k - of_bool (bit k n) * 2 ^ n\<close> for k :: int
       
  2255 proof -
       
  2256   have \<open>unset_bit n k = k AND NOT (of_bool (bit k n) * 2 ^ n)\<close>
       
  2257     by (rule bit_eqI) (auto simp add: bit_simps)
       
  2258   then show ?thesis
       
  2259     by (subst disjunctive_diff) (auto simp add: bit_simps simp flip: push_bit_eq_mult)
       
  2260 qed
       
  2261 
  2263 
  2262 lemma and_int_unfold:
  2264 lemma and_int_unfold:
  2263   \<open>k AND l = (if k = 0 \<or> l = 0 then 0 else if k = - 1 then l else if l = - 1 then k
  2265   \<open>k AND l = (if k = 0 \<or> l = 0 then 0 else if k = - 1 then l else if l = - 1 then k
  2264     else (k mod 2) * (l mod 2) + 2 * ((k div 2) AND (l div 2)))\<close> for k l :: int
  2266     else (k mod 2) * (l mod 2) + 2 * ((k div 2) AND (l div 2)))\<close> for k l :: int
  2265   by (auto simp add: and_int.rec [of k l] zmult_eq_1_iff elim: oddE)
  2267   by (auto simp add: and_int.rec [of k l] zmult_eq_1_iff elim: oddE)
  2604     by (fact take_bit_nat_less_exp)
  2606     by (fact take_bit_nat_less_exp)
  2605   also assume ?Q
  2607   also assume ?Q
  2606   finally show ?P .
  2608   finally show ?P .
  2607 qed
  2609 qed
  2608 
  2610 
  2609 lemma bit_push_bit_iff_nat:
       
  2610   \<open>bit (push_bit m q) n \<longleftrightarrow> m \<le> n \<and> bit q (n - m)\<close> for q :: nat
       
  2611   by (auto simp add: bit_push_bit_iff)
       
  2612 
       
  2613 lemma Suc_0_and_eq [simp]:
  2611 lemma Suc_0_and_eq [simp]:
  2614   \<open>Suc 0 AND n = n mod 2\<close>
  2612   \<open>Suc 0 AND n = n mod 2\<close>
  2615   using one_and_eq [of n] by simp
  2613   using one_and_eq [of n] by simp
  2616 
  2614 
  2617 lemma and_Suc_0_eq [simp]:
  2615 lemma and_Suc_0_eq [simp]:
  3810 
  3808 
  3811 lemma xor_nat_rec:
  3809 lemma xor_nat_rec:
  3812   \<open>m XOR n = of_bool (odd m \<noteq> odd n) + 2 * ((m div 2) XOR (n div 2))\<close> for m n :: nat
  3810   \<open>m XOR n = of_bool (odd m \<noteq> odd n) + 2 * ((m div 2) XOR (n div 2))\<close> for m n :: nat
  3813   by (fact xor_rec)
  3811   by (fact xor_rec)
  3814 
  3812 
       
  3813 lemma bit_push_bit_iff_nat:
       
  3814   \<open>bit (push_bit m q) n \<longleftrightarrow> m \<le> n \<and> bit q (n - m)\<close> for q :: nat
       
  3815   by (fact bit_push_bit_iff')
       
  3816 
  3815 lemmas and_int_rec = and_int.rec
  3817 lemmas and_int_rec = and_int.rec
  3816 
  3818 
  3817 lemmas bit_and_int_iff = and_int.bit_iff
  3819 lemmas bit_and_int_iff = and_int.bit_iff
  3818 
  3820 
  3819 lemmas or_int_rec = or_int.rec
  3821 lemmas or_int_rec = or_int.rec
  3826 
  3828 
  3827 lemma not_int_rec:
  3829 lemma not_int_rec:
  3828   \<open>NOT k = of_bool (even k) + 2 * NOT (k div 2)\<close> for k :: int
  3830   \<open>NOT k = of_bool (even k) + 2 * NOT (k div 2)\<close> for k :: int
  3829   by (fact not_rec)
  3831   by (fact not_rec)
  3830 
  3832 
       
  3833 lemma mask_half_int:
       
  3834   \<open>mask n div 2 = (mask (n - 1) :: int)\<close>
       
  3835   by (fact mask_half)
       
  3836 
       
  3837 lemma drop_bit_push_bit_int:
       
  3838   \<open>drop_bit m (push_bit n k) = drop_bit (m - n) (push_bit (n - m) k)\<close> for k :: int
       
  3839   by (fact drop_bit_push_bit)
       
  3840 
  3831 lemma even_not_iff_int:
  3841 lemma even_not_iff_int:
  3832   \<open>even (NOT k) \<longleftrightarrow> odd k\<close> for k :: int
  3842   \<open>even (NOT k) \<longleftrightarrow> odd k\<close> for k :: int
  3833   by (fact even_not_iff)
  3843   by (fact even_not_iff)
  3834 
  3844 
  3835 lemma even_and_iff_int:
  3845 lemma even_and_iff_int:
  3836   \<open>even (k AND l) \<longleftrightarrow> even k \<or> even l\<close> for k l :: int
  3846   \<open>even (k AND l) \<longleftrightarrow> even k \<or> even l\<close> for k l :: int
  3837   by (fact even_and_iff)
  3847   by (fact even_and_iff)
       
  3848 
       
  3849 lemma bit_push_bit_iff_int:
       
  3850   \<open>bit (push_bit m k) n \<longleftrightarrow> m \<le> n \<and> bit k (n - m)\<close> for k :: int
       
  3851   by (fact bit_push_bit_iff')
  3838 
  3852 
  3839 no_notation
  3853 no_notation
  3840   not  (\<open>NOT\<close>)
  3854   not  (\<open>NOT\<close>)
  3841     and "and"  (infixr \<open>AND\<close> 64)
  3855     and "and"  (infixr \<open>AND\<close> 64)
  3842     and or  (infixr \<open>OR\<close>  59)
  3856     and or  (infixr \<open>OR\<close>  59)