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) |