src/HOL/Bit_Operations.thy
changeset 79673 c172eecba85d
parent 79610 ad29777e8746
child 79893 7ea70796acaa
equal deleted inserted replaced
79672:76720aeab21e 79673:c172eecba85d
    12 class semiring_bits = semiring_parity + semiring_modulo_trivial +
    12 class semiring_bits = semiring_parity + semiring_modulo_trivial +
    13   assumes bit_induct [case_names stable rec]:
    13   assumes bit_induct [case_names stable rec]:
    14     \<open>(\<And>a. a div 2 = a \<Longrightarrow> P a)
    14     \<open>(\<And>a. a div 2 = a \<Longrightarrow> P a)
    15      \<Longrightarrow> (\<And>a b. P a \<Longrightarrow> (of_bool b + 2 * a) div 2 = a \<Longrightarrow> P (of_bool b + 2 * a))
    15      \<Longrightarrow> (\<And>a b. P a \<Longrightarrow> (of_bool b + 2 * a) div 2 = a \<Longrightarrow> P (of_bool b + 2 * a))
    16         \<Longrightarrow> P a\<close>
    16         \<Longrightarrow> P a\<close>
    17   assumes half_div_exp_eq: \<open>a div 2 div 2 ^ n = a div 2 ^ Suc n\<close>
    17   assumes bits_mod_div_trivial [simp]: \<open>a mod b div b = 0\<close>
       
    18     and half_div_exp_eq: \<open>a div 2 div 2 ^ n = a div 2 ^ Suc n\<close>
    18     and even_double_div_exp_iff: \<open>2 ^ Suc n \<noteq> 0 \<Longrightarrow> even (2 * a div 2 ^ Suc n) \<longleftrightarrow> even (a div 2 ^ n)\<close>
    19     and even_double_div_exp_iff: \<open>2 ^ Suc n \<noteq> 0 \<Longrightarrow> even (2 * a div 2 ^ Suc n) \<longleftrightarrow> even (a div 2 ^ n)\<close>
    19     and even_mod_exp_div_exp_iff: \<open>even (a mod 2 ^ m div 2 ^ n) \<longleftrightarrow> m \<le> n \<or> even (a div 2 ^ n)\<close>
       
    20   fixes bit :: \<open>'a \<Rightarrow> nat \<Rightarrow> bool\<close>
    20   fixes bit :: \<open>'a \<Rightarrow> nat \<Rightarrow> bool\<close>
    21   assumes bit_iff_odd: \<open>bit a n \<longleftrightarrow> odd (a div 2 ^ n)\<close>
    21   assumes bit_iff_odd: \<open>bit a n \<longleftrightarrow> odd (a div 2 ^ n)\<close>
    22 begin
    22 begin
    23 
    23 
    24 text \<open>
    24 text \<open>
   380   next
   380   next
   381     case (odd n)
   381     case (odd n)
   382     with rec [of n True] show ?case
   382     with rec [of n True] show ?case
   383       by simp
   383       by simp
   384   qed
   384   qed
   385   show \<open>even (q mod 2 ^ m div 2 ^ n) \<longleftrightarrow> m \<le> n \<or> even (q div 2 ^ n)\<close> for q m n :: nat
       
   386   proof (cases \<open>m \<le> n\<close>)
       
   387     case True
       
   388     moreover define r where \<open>r = n - m\<close>
       
   389     ultimately have \<open>n = m + r\<close>
       
   390       by simp
       
   391     with True show ?thesis
       
   392       by (simp add: power_add div_mult2_eq)
       
   393   next
       
   394     case False
       
   395     moreover define r where \<open>r = m - Suc n\<close>
       
   396     ultimately have \<open>m = n + Suc r\<close>
       
   397       by simp
       
   398     moreover have \<open>even (q mod 2 ^ (n + Suc r) div 2 ^ n) \<longleftrightarrow> even (q div 2 ^ n)\<close>
       
   399       by (simp only: power_add) (simp add: mod_mult2_eq dvd_mod_iff)
       
   400     ultimately show ?thesis
       
   401       by simp
       
   402   qed
       
   403 qed (auto simp add: div_mult2_eq bit_nat_def)
   385 qed (auto simp add: div_mult2_eq bit_nat_def)
   404 
   386 
   405 end
   387 end
   406 
   388 
   407 lemma possible_bit_nat [simp]:
   389 lemma possible_bit_nat [simp]:
   536       by (simp add: ac_simps)
   518       by (simp add: ac_simps)
   537   next
   519   next
   538     case (odd k)
   520     case (odd k)
   539     with rec [of k True] show ?case
   521     with rec [of k True] show ?case
   540       by (simp add: ac_simps)
   522       by (simp add: ac_simps)
   541   qed
       
   542   show \<open>even (k mod 2 ^ m div 2 ^ n) \<longleftrightarrow> m \<le> n \<or> even (k div 2 ^ n)\<close> for k :: int and m n :: nat
       
   543   proof (cases \<open>m \<le> n\<close>)
       
   544     case True
       
   545     moreover define r where \<open>r = n - m\<close>
       
   546     ultimately have \<open>n = m + r\<close>
       
   547       by simp
       
   548     with True show ?thesis
       
   549       by (simp add: power_add zdiv_zmult2_eq)
       
   550   next
       
   551     case False
       
   552     moreover define r where \<open>r = m - Suc n\<close>
       
   553     ultimately have \<open>m = n + Suc r\<close>
       
   554       by simp
       
   555     moreover have \<open>even (k mod 2 ^ (n + Suc r) div 2 ^ n) \<longleftrightarrow> even (k div 2 ^ n)\<close>
       
   556       by (simp only: power_add) (simp add: zmod_zmult2_eq dvd_mod_iff)
       
   557     ultimately show ?thesis
       
   558       by simp
       
   559   qed
   523   qed
   560 qed (auto simp add: zdiv_zmult2_eq bit_int_def)
   524 qed (auto simp add: zdiv_zmult2_eq bit_int_def)
   561 
   525 
   562 end
   526 end
   563 
   527 
   877 
   841 
   878 lemma push_bit_numeral [simp]:
   842 lemma push_bit_numeral [simp]:
   879   \<open>push_bit (numeral l) (numeral k) = push_bit (pred_numeral l) (numeral (Num.Bit0 k))\<close>
   843   \<open>push_bit (numeral l) (numeral k) = push_bit (pred_numeral l) (numeral (Num.Bit0 k))\<close>
   880   by (simp add: numeral_eq_Suc mult_2_right) (simp add: numeral_Bit0)
   844   by (simp add: numeral_eq_Suc mult_2_right) (simp add: numeral_Bit0)
   881 
   845 
   882 lemma take_bit_0 [simp]:
       
   883   "take_bit 0 a = 0"
       
   884   by (simp add: take_bit_eq_mod)
       
   885 
       
   886 lemma bit_take_bit_iff [bit_simps]:
       
   887   \<open>bit (take_bit m a) n \<longleftrightarrow> n < m \<and> bit a n\<close>
       
   888   by (simp add: take_bit_eq_mod bit_iff_odd even_mod_exp_div_exp_iff not_le)
       
   889 
       
   890 lemma take_bit_Suc:
       
   891   \<open>take_bit (Suc n) a = take_bit n (a div 2) * 2 + a mod 2\<close> (is \<open>?lhs = ?rhs\<close>)
       
   892 proof (rule bit_eqI)
       
   893   fix m
       
   894   assume \<open>possible_bit TYPE('a) m\<close>
       
   895   then show \<open>bit ?lhs m \<longleftrightarrow> bit ?rhs m\<close>
       
   896     apply (cases a rule: parity_cases; cases m)
       
   897        apply (simp_all add: bit_simps even_bit_succ_iff mult.commute [of _ 2] add.commute [of _ 1] flip: bit_Suc)
       
   898      apply (simp_all add: bit_0)
       
   899     done
       
   900 qed
       
   901 
       
   902 lemma take_bit_rec:
       
   903   \<open>take_bit n a = (if n = 0 then 0 else take_bit (n - 1) (a div 2) * 2 + a mod 2)\<close>
       
   904   by (cases n) (simp_all add: take_bit_Suc)
       
   905 
       
   906 lemma take_bit_Suc_0 [simp]:
       
   907   \<open>take_bit (Suc 0) a = a mod 2\<close>
       
   908   by (simp add: take_bit_eq_mod)
       
   909 
       
   910 lemma take_bit_of_0 [simp]:
       
   911   \<open>take_bit n 0 = 0\<close>
       
   912   by (rule bit_eqI) (simp add: bit_simps)
       
   913 
       
   914 lemma take_bit_of_1 [simp]:
       
   915   \<open>take_bit n 1 = of_bool (n > 0)\<close>
       
   916   by (cases n) (simp_all add: take_bit_Suc)
       
   917 
       
   918 lemma bit_drop_bit_eq [bit_simps]:
   846 lemma bit_drop_bit_eq [bit_simps]:
   919   \<open>bit (drop_bit n a) = bit a \<circ> (+) n\<close>
   847   \<open>bit (drop_bit n a) = bit a \<circ> (+) n\<close>
   920   by rule (simp add: drop_bit_eq_div bit_iff_odd div_exp_eq)
   848   by rule (simp add: drop_bit_eq_div bit_iff_odd div_exp_eq)
   921 
       
   922 lemma drop_bit_of_0 [simp]:
       
   923   \<open>drop_bit n 0 = 0\<close>
       
   924   by (rule bit_eqI) (simp add: bit_simps)
       
   925 
       
   926 lemma drop_bit_of_1 [simp]:
       
   927   \<open>drop_bit n 1 = of_bool (n = 0)\<close>
       
   928   by (rule bit_eqI) (simp add: bit_simps ac_simps)
       
   929 
       
   930 lemma drop_bit_0 [simp]:
       
   931   \<open>drop_bit 0 = id\<close>
       
   932   by (simp add: fun_eq_iff drop_bit_eq_div)
       
   933 
       
   934 lemma drop_bit_Suc:
       
   935   \<open>drop_bit (Suc n) a = drop_bit n (a div 2)\<close>
       
   936   using div_exp_eq [of a 1] by (simp add: drop_bit_eq_div)
       
   937 
       
   938 lemma drop_bit_rec:
       
   939   \<open>drop_bit n a = (if n = 0 then a else drop_bit (n - 1) (a div 2))\<close>
       
   940   by (cases n) (simp_all add: drop_bit_Suc)
       
   941 
       
   942 lemma drop_bit_half:
       
   943   \<open>drop_bit n (a div 2) = drop_bit n a div 2\<close>
       
   944   by (induction n arbitrary: a) (simp_all add: drop_bit_Suc)
       
   945 
       
   946 lemma drop_bit_of_bool [simp]:
       
   947   \<open>drop_bit n (of_bool b) = of_bool (n = 0 \<and> b)\<close>
       
   948   by (cases n) simp_all
       
   949 
       
   950 lemma even_take_bit_eq [simp]:
       
   951   \<open>even (take_bit n a) \<longleftrightarrow> n = 0 \<or> even a\<close>
       
   952   by (simp add: take_bit_rec [of n a])
       
   953 
       
   954 lemma take_bit_take_bit [simp]:
       
   955   \<open>take_bit m (take_bit n a) = take_bit (min m n) a\<close>
       
   956   by (rule bit_eqI) (simp add: bit_simps)
       
   957 
       
   958 lemma drop_bit_drop_bit [simp]:
       
   959   \<open>drop_bit m (drop_bit n a) = drop_bit (m + n) a\<close>
       
   960   by (simp add: drop_bit_eq_div power_add div_exp_eq ac_simps)
       
   961 
       
   962 lemma push_bit_take_bit:
       
   963   \<open>push_bit m (take_bit n a) = take_bit (m + n) (push_bit m a)\<close>
       
   964   by (rule bit_eqI) (auto simp add: bit_simps)
       
   965 
       
   966 lemma take_bit_push_bit:
       
   967   \<open>take_bit m (push_bit n a) = push_bit n (take_bit (m - n) a)\<close>
       
   968   by (rule bit_eqI) (auto simp add: bit_simps)
       
   969 
       
   970 lemma take_bit_drop_bit:
       
   971   \<open>take_bit m (drop_bit n a) = drop_bit n (take_bit (m + n) a)\<close>
       
   972   by (rule bit_eqI) (auto simp add: bit_simps)
       
   973 
       
   974 lemma drop_bit_take_bit:
       
   975   \<open>drop_bit m (take_bit n a) = take_bit (n - m) (drop_bit m a)\<close>
       
   976   by (rule bit_eqI) (auto simp add: bit_simps)
       
   977 
       
   978 lemma even_push_bit_iff [simp]:
       
   979   \<open>even (push_bit n a) \<longleftrightarrow> n \<noteq> 0 \<or> even a\<close>
       
   980   by (simp add: push_bit_eq_mult) auto
       
   981 
       
   982 lemma stable_imp_drop_bit_eq:
       
   983   \<open>drop_bit n a = a\<close>
       
   984   if \<open>a div 2 = a\<close>
       
   985   by (induction n) (simp_all add: that drop_bit_Suc)
       
   986 
       
   987 lemma stable_imp_take_bit_eq:
       
   988   \<open>take_bit n a = (if even a then 0 else mask n)\<close>
       
   989     if \<open>a div 2 = a\<close>
       
   990   by (rule bit_eqI) (use that in \<open>simp add: bit_simps stable_imp_bit_iff_odd\<close>)
       
   991 
       
   992 lemma exp_dvdE:
       
   993   assumes \<open>2 ^ n dvd a\<close>
       
   994   obtains b where \<open>a = push_bit n b\<close>
       
   995 proof -
       
   996   from assms obtain b where \<open>a = 2 ^ n * b\<close> ..
       
   997   then have \<open>a = push_bit n b\<close>
       
   998     by (simp add: push_bit_eq_mult ac_simps)
       
   999   with that show thesis .
       
  1000 qed
       
  1001 
       
  1002 lemma take_bit_eq_0_iff:
       
  1003   \<open>take_bit n a = 0 \<longleftrightarrow> 2 ^ n dvd a\<close> (is \<open>?P \<longleftrightarrow> ?Q\<close>)
       
  1004 proof
       
  1005   assume ?P
       
  1006   then show ?Q
       
  1007     by (simp add: take_bit_eq_mod mod_0_imp_dvd)
       
  1008 next
       
  1009   assume ?Q
       
  1010   then obtain b where \<open>a = push_bit n b\<close>
       
  1011     by (rule exp_dvdE)
       
  1012   then show ?P
       
  1013     by (simp add: take_bit_push_bit)
       
  1014 qed
       
  1015 
       
  1016 lemma take_bit_tightened:
       
  1017   \<open>take_bit m a = take_bit m b\<close> if \<open>take_bit n a = take_bit n b\<close> and \<open>m \<le> n\<close>
       
  1018 proof -
       
  1019   from that have \<open>take_bit m (take_bit n a) = take_bit m (take_bit n b)\<close>
       
  1020     by simp
       
  1021   then have \<open>take_bit (min m n) a = take_bit (min m n) b\<close>
       
  1022     by simp
       
  1023   with that show ?thesis
       
  1024     by (simp add: min_def)
       
  1025 qed
       
  1026 
       
  1027 lemma take_bit_eq_self_iff_drop_bit_eq_0:
       
  1028   \<open>take_bit n a = a \<longleftrightarrow> drop_bit n a = 0\<close> (is \<open>?P \<longleftrightarrow> ?Q\<close>)
       
  1029 proof
       
  1030   assume ?P
       
  1031   show ?Q
       
  1032   proof (rule bit_eqI)
       
  1033     fix m
       
  1034     from \<open>?P\<close> have \<open>a = take_bit n a\<close> ..
       
  1035     also have \<open>\<not> bit (take_bit n a) (n + m)\<close>
       
  1036       unfolding bit_simps
       
  1037       by (simp add: bit_simps)
       
  1038     finally show \<open>bit (drop_bit n a) m \<longleftrightarrow> bit 0 m\<close>
       
  1039       by (simp add: bit_simps)
       
  1040   qed
       
  1041 next
       
  1042   assume ?Q
       
  1043   show ?P
       
  1044   proof (rule bit_eqI)
       
  1045     fix m
       
  1046     from \<open>?Q\<close> have \<open>\<not> bit (drop_bit n a) (m - n)\<close>
       
  1047       by simp
       
  1048     then have \<open> \<not> bit a (n + (m - n))\<close>
       
  1049       by (simp add: bit_simps)
       
  1050     then show \<open>bit (take_bit n a) m \<longleftrightarrow> bit a m\<close>
       
  1051       by (cases \<open>m < n\<close>) (auto simp add: bit_simps)
       
  1052   qed
       
  1053 qed
       
  1054 
       
  1055 lemma drop_bit_exp_eq:
       
  1056   \<open>drop_bit m (2 ^ n) = of_bool (m \<le> n \<and> possible_bit TYPE('a) n) * 2 ^ (n - m)\<close>
       
  1057   by (auto simp add: bit_eq_iff bit_simps)
       
  1058 
       
  1059 lemma take_bit_and [simp]:
       
  1060   \<open>take_bit n (a AND b) = take_bit n a AND take_bit n b\<close>
       
  1061   by (auto simp add: bit_eq_iff bit_simps)
       
  1062 
       
  1063 lemma take_bit_or [simp]:
       
  1064   \<open>take_bit n (a OR b) = take_bit n a OR take_bit n b\<close>
       
  1065   by (auto simp add: bit_eq_iff bit_simps)
       
  1066 
       
  1067 lemma take_bit_xor [simp]:
       
  1068   \<open>take_bit n (a XOR b) = take_bit n a XOR take_bit n b\<close>
       
  1069   by (auto simp add: bit_eq_iff bit_simps)
       
  1070 
       
  1071 lemma push_bit_and [simp]:
       
  1072   \<open>push_bit n (a AND b) = push_bit n a AND push_bit n b\<close>
       
  1073   by (auto simp add: bit_eq_iff bit_simps)
       
  1074 
       
  1075 lemma push_bit_or [simp]:
       
  1076   \<open>push_bit n (a OR b) = push_bit n a OR push_bit n b\<close>
       
  1077   by (auto simp add: bit_eq_iff bit_simps)
       
  1078 
       
  1079 lemma push_bit_xor [simp]:
       
  1080   \<open>push_bit n (a XOR b) = push_bit n a XOR push_bit n b\<close>
       
  1081   by (auto simp add: bit_eq_iff bit_simps)
       
  1082 
       
  1083 lemma drop_bit_and [simp]:
       
  1084   \<open>drop_bit n (a AND b) = drop_bit n a AND drop_bit n b\<close>
       
  1085   by (auto simp add: bit_eq_iff bit_simps)
       
  1086 
       
  1087 lemma drop_bit_or [simp]:
       
  1088   \<open>drop_bit n (a OR b) = drop_bit n a OR drop_bit n b\<close>
       
  1089   by (auto simp add: bit_eq_iff bit_simps)
       
  1090 
       
  1091 lemma drop_bit_xor [simp]:
       
  1092   \<open>drop_bit n (a XOR b) = drop_bit n a XOR drop_bit n b\<close>
       
  1093   by (auto simp add: bit_eq_iff bit_simps)
       
  1094 
       
  1095 lemma take_bit_of_mask [simp]:
       
  1096   \<open>take_bit m (mask n) = mask (min m n)\<close>
       
  1097   by (rule bit_eqI) (simp add: bit_simps)
       
  1098 
       
  1099 lemma take_bit_eq_mask:
       
  1100   \<open>take_bit n a = a AND mask n\<close>
       
  1101   by (auto simp add: bit_eq_iff bit_simps)
       
  1102 
       
  1103 lemma or_eq_0_iff:
       
  1104   \<open>a OR b = 0 \<longleftrightarrow> a = 0 \<and> b = 0\<close>
       
  1105   by (auto simp add: bit_eq_iff bit_or_iff)
       
  1106 
       
  1107 lemma bit_iff_and_drop_bit_eq_1:
       
  1108   \<open>bit a n \<longleftrightarrow> drop_bit n a AND 1 = 1\<close>
       
  1109   by (simp add: bit_iff_odd_drop_bit and_one_eq odd_iff_mod_2_eq_one)
       
  1110 
       
  1111 lemma bit_iff_and_push_bit_not_eq_0:
       
  1112   \<open>bit a n \<longleftrightarrow> a AND push_bit n 1 \<noteq> 0\<close>
       
  1113   by (cases \<open>possible_bit TYPE('a) n\<close>) (simp_all add: bit_eq_iff bit_simps impossible_bit)
       
  1114 
       
  1115 lemma bit_set_bit_iff [bit_simps]:
       
  1116   \<open>bit (set_bit m a) n \<longleftrightarrow> bit a n \<or> (m = n \<and> possible_bit TYPE('a) n)\<close>
       
  1117   by (auto simp add: set_bit_eq_or bit_or_iff bit_exp_iff)
       
  1118 
       
  1119 lemma even_set_bit_iff:
       
  1120   \<open>even (set_bit m a) \<longleftrightarrow> even a \<and> m \<noteq> 0\<close>
       
  1121   using bit_set_bit_iff [of m a 0] by (auto simp add: bit_0)
       
  1122 
       
  1123 lemma bit_unset_bit_iff [bit_simps]:
       
  1124   \<open>bit (unset_bit m a) n \<longleftrightarrow> bit a n \<and> m \<noteq> n\<close>
       
  1125   by (auto simp add: unset_bit_eq_or_xor bit_simps dest: bit_imp_possible_bit)
       
  1126 
       
  1127 lemma even_unset_bit_iff:
       
  1128   \<open>even (unset_bit m a) \<longleftrightarrow> even a \<or> m = 0\<close>
       
  1129   using bit_unset_bit_iff [of m a 0] by (auto simp add: bit_0)
       
  1130 
       
  1131 lemma bit_flip_bit_iff [bit_simps]:
       
  1132   \<open>bit (flip_bit m a) n \<longleftrightarrow> (m = n \<longleftrightarrow> \<not> bit a n) \<and> possible_bit TYPE('a) n\<close>
       
  1133   by (auto simp add: bit_eq_iff bit_simps flip_bit_eq_xor bit_imp_possible_bit)
       
  1134 
       
  1135 lemma even_flip_bit_iff:
       
  1136   \<open>even (flip_bit m a) \<longleftrightarrow> \<not> (even a \<longleftrightarrow> m = 0)\<close>
       
  1137   using bit_flip_bit_iff [of m a 0] by (auto simp: possible_bit_def  bit_0)
       
  1138 
       
  1139 lemma and_exp_eq_0_iff_not_bit:
       
  1140   \<open>a AND 2 ^ n = 0 \<longleftrightarrow> \<not> bit a n\<close> (is \<open>?P \<longleftrightarrow> ?Q\<close>)
       
  1141   using bit_imp_possible_bit[of a n]
       
  1142   by (auto simp add: bit_eq_iff bit_simps)
       
  1143 
       
  1144 lemma bit_sum_mult_2_cases:
       
  1145   assumes a: \<open>\<forall>j. \<not> bit a (Suc j)\<close>
       
  1146   shows \<open>bit (a + 2 * b) n = (if n = 0 then odd a else bit (2 * b) n)\<close>
       
  1147 proof -
       
  1148   from a have \<open>n = 0\<close> if \<open>bit a n\<close> for n using that
       
  1149     by (cases n) simp_all
       
  1150   then have \<open>a = 0 \<or> a = 1\<close>
       
  1151     by (auto simp add: bit_eq_iff bit_1_iff)
       
  1152   then show ?thesis
       
  1153     by (cases n) (auto simp add: bit_0 bit_double_iff even_bit_succ_iff)
       
  1154 qed
       
  1155 
       
  1156 lemma set_bit_0 [simp]:
       
  1157   \<open>set_bit 0 a = 1 + 2 * (a div 2)\<close>
       
  1158   by (auto simp add: bit_eq_iff bit_simps even_bit_succ_iff simp flip: bit_Suc)
       
  1159 
       
  1160 lemma set_bit_Suc:
       
  1161   \<open>set_bit (Suc n) a = a mod 2 + 2 * set_bit n (a div 2)\<close>
       
  1162   by (auto simp add: bit_eq_iff bit_sum_mult_2_cases bit_simps bit_0 simp flip: bit_Suc
       
  1163     elim: possible_bit_less_imp)
       
  1164 
       
  1165 lemma unset_bit_0 [simp]:
       
  1166   \<open>unset_bit 0 a = 2 * (a div 2)\<close>
       
  1167   by (auto simp add: bit_eq_iff bit_simps simp flip: bit_Suc)
       
  1168 
       
  1169 lemma unset_bit_Suc:
       
  1170   \<open>unset_bit (Suc n) a = a mod 2 + 2 * unset_bit n (a div 2)\<close>
       
  1171   by (auto simp add: bit_eq_iff bit_sum_mult_2_cases bit_simps bit_0 simp flip: bit_Suc)
       
  1172 
       
  1173 lemma flip_bit_0 [simp]:
       
  1174   \<open>flip_bit 0 a = of_bool (even a) + 2 * (a div 2)\<close>
       
  1175   by (auto simp add: bit_eq_iff bit_simps even_bit_succ_iff bit_0 simp flip: bit_Suc)
       
  1176 
       
  1177 lemma flip_bit_Suc:
       
  1178   \<open>flip_bit (Suc n) a = a mod 2 + 2 * flip_bit n (a div 2)\<close>
       
  1179   by (auto simp add: bit_eq_iff bit_sum_mult_2_cases bit_simps bit_0 simp flip: bit_Suc
       
  1180     elim: possible_bit_less_imp)
       
  1181 
       
  1182 lemma flip_bit_eq_if:
       
  1183   \<open>flip_bit n a = (if bit a n then unset_bit else set_bit) n a\<close>
       
  1184   by (rule bit_eqI) (auto simp add: bit_set_bit_iff bit_unset_bit_iff bit_flip_bit_iff)
       
  1185 
       
  1186 lemma take_bit_set_bit_eq:
       
  1187   \<open>take_bit n (set_bit m a) = (if n \<le> m then take_bit n a else set_bit m (take_bit n a))\<close>
       
  1188   by (rule bit_eqI) (auto simp add: bit_take_bit_iff bit_set_bit_iff)
       
  1189 
       
  1190 lemma take_bit_unset_bit_eq:
       
  1191   \<open>take_bit n (unset_bit m a) = (if n \<le> m then take_bit n a else unset_bit m (take_bit n a))\<close>
       
  1192   by (rule bit_eqI) (auto simp add: bit_take_bit_iff bit_unset_bit_iff)
       
  1193 
       
  1194 lemma take_bit_flip_bit_eq:
       
  1195   \<open>take_bit n (flip_bit m a) = (if n \<le> m then take_bit n a else flip_bit m (take_bit n a))\<close>
       
  1196   by (rule bit_eqI) (auto simp add: bit_take_bit_iff bit_flip_bit_iff)
       
  1197 
       
  1198 lemma bit_1_0 [simp]:
       
  1199   \<open>bit 1 0\<close>
       
  1200   by (simp add: bit_0)
       
  1201 
       
  1202 lemma not_bit_1_Suc [simp]:
       
  1203   \<open>\<not> bit 1 (Suc n)\<close>
       
  1204   by (simp add: bit_Suc)
       
  1205 
       
  1206 lemma push_bit_Suc_numeral [simp]:
       
  1207   \<open>push_bit (Suc n) (numeral k) = push_bit n (numeral (Num.Bit0 k))\<close>
       
  1208   by (simp add: numeral_eq_Suc mult_2_right) (simp add: numeral_Bit0)
       
  1209 
       
  1210 lemma mask_eq_0_iff [simp]:
       
  1211   \<open>mask n = 0 \<longleftrightarrow> n = 0\<close>
       
  1212   by (cases n) (simp_all add: mask_Suc_double or_eq_0_iff)
       
  1213 
       
  1214 lemma bit_horner_sum_bit_iff [bit_simps]:
       
  1215   \<open>bit (horner_sum of_bool 2 bs) n \<longleftrightarrow> possible_bit TYPE('a) n \<and> n < length bs \<and> bs ! n\<close>
       
  1216 proof (induction bs arbitrary: n)
       
  1217   case Nil
       
  1218   then show ?case
       
  1219     by simp
       
  1220 next
       
  1221   case (Cons b bs)
       
  1222   show ?case
       
  1223   proof (cases n)
       
  1224     case 0
       
  1225     then show ?thesis
       
  1226       by (simp add: bit_0)
       
  1227   next
       
  1228     case (Suc m)
       
  1229     with bit_rec [of _ n] Cons.prems Cons.IH [of m]
       
  1230     show ?thesis
       
  1231       by (simp add: bit_simps)
       
  1232         (auto simp add: possible_bit_less_imp bit_simps simp flip: bit_Suc)
       
  1233   qed
       
  1234 qed
       
  1235 
       
  1236 lemma horner_sum_bit_eq_take_bit:
       
  1237   \<open>horner_sum of_bool 2 (map (bit a) [0..<n]) = take_bit n a\<close>
       
  1238   by (rule bit_eqI) (auto simp add: bit_simps)
       
  1239 
       
  1240 lemma take_bit_horner_sum_bit_eq:
       
  1241   \<open>take_bit n (horner_sum of_bool 2 bs) = horner_sum of_bool 2 (take n bs)\<close>
       
  1242   by (auto simp add: bit_eq_iff bit_take_bit_iff bit_horner_sum_bit_iff)
       
  1243 
       
  1244 lemma take_bit_sum:
       
  1245   \<open>take_bit n a = (\<Sum>k = 0..<n. push_bit k (of_bool (bit a k)))\<close>
       
  1246   by (simp flip: horner_sum_bit_eq_take_bit add: horner_sum_eq_sum push_bit_eq_mult)
       
  1247 
   849 
  1248 lemma disjunctive_xor_eq_or:
   850 lemma disjunctive_xor_eq_or:
  1249   \<open>a XOR b = a OR b\<close> if \<open>a AND b = 0\<close>
   851   \<open>a XOR b = a OR b\<close> if \<open>a AND b = 0\<close>
  1250   using that by (auto simp add: bit_eq_iff bit_simps)
   852   using that by (auto simp add: bit_eq_iff bit_simps)
  1251 
   853 
  1288 qed
   890 qed
  1289 
   891 
  1290 lemma disjunctive_add_eq_xor:
   892 lemma disjunctive_add_eq_xor:
  1291   \<open>a + b = a XOR b\<close> if \<open>a AND b = 0\<close>
   893   \<open>a + b = a XOR b\<close> if \<open>a AND b = 0\<close>
  1292   using that by (simp add: disjunctive_add_eq_or disjunctive_xor_eq_or)
   894   using that by (simp add: disjunctive_add_eq_or disjunctive_xor_eq_or)
       
   895 
       
   896 lemma take_bit_0 [simp]:
       
   897   "take_bit 0 a = 0"
       
   898   by (simp add: take_bit_eq_mod)
       
   899 
       
   900 lemma bit_take_bit_iff [bit_simps]:
       
   901   \<open>bit (take_bit m a) n \<longleftrightarrow> n < m \<and> bit a n\<close>
       
   902 proof -
       
   903   have \<open>push_bit m (drop_bit m a) AND take_bit m a = 0\<close> (is \<open>?lhs = _\<close>)
       
   904   proof (rule bit_eqI)
       
   905     fix n
       
   906     show \<open>bit ?lhs n \<longleftrightarrow> bit 0 n\<close>
       
   907     proof (cases \<open>m \<le> n\<close>)
       
   908       case False
       
   909       then show ?thesis
       
   910         by (simp add: bit_simps)
       
   911     next
       
   912       case True
       
   913       moreover define q where \<open>q = n - m\<close>
       
   914       ultimately have \<open>n = m + q\<close> by simp
       
   915       moreover have \<open>\<not> bit (take_bit m a) (m + q)\<close>
       
   916         by (simp add: take_bit_eq_mod bit_iff_odd flip: div_exp_eq)
       
   917       ultimately show ?thesis
       
   918         by (simp add: bit_simps)
       
   919     qed
       
   920   qed
       
   921   then have \<open>push_bit m (drop_bit m a) XOR take_bit m a = push_bit m (drop_bit m a) + take_bit m a\<close>
       
   922     by (simp add: disjunctive_add_eq_xor)
       
   923   also have \<open>\<dots> = a\<close>
       
   924     by (simp add: bits_ident)
       
   925   finally have \<open>bit (push_bit m (drop_bit m a) XOR take_bit m a) n \<longleftrightarrow> bit a n\<close>
       
   926     by simp
       
   927   also have \<open>\<dots> \<longleftrightarrow> (m \<le> n \<or> n < m) \<and> bit a n\<close>
       
   928     by auto
       
   929   also have \<open>\<dots> \<longleftrightarrow> m \<le> n \<and> bit a n \<or> n < m \<and> bit a n\<close>
       
   930     by auto
       
   931   also have \<open>m \<le> n \<and> bit a n \<longleftrightarrow> bit (push_bit m (drop_bit m a)) n\<close>
       
   932     by (auto simp add: bit_simps bit_imp_possible_bit)
       
   933   finally show ?thesis
       
   934     by (auto simp add: bit_simps)
       
   935 qed
       
   936 
       
   937 lemma take_bit_Suc:
       
   938   \<open>take_bit (Suc n) a = take_bit n (a div 2) * 2 + a mod 2\<close> (is \<open>?lhs = ?rhs\<close>)
       
   939 proof (rule bit_eqI)
       
   940   fix m
       
   941   assume \<open>possible_bit TYPE('a) m\<close>
       
   942   then show \<open>bit ?lhs m \<longleftrightarrow> bit ?rhs m\<close>
       
   943     apply (cases a rule: parity_cases; cases m)
       
   944        apply (simp_all add: bit_simps even_bit_succ_iff mult.commute [of _ 2] add.commute [of _ 1] flip: bit_Suc)
       
   945      apply (simp_all add: bit_0)
       
   946     done
       
   947 qed
       
   948 
       
   949 lemma take_bit_rec:
       
   950   \<open>take_bit n a = (if n = 0 then 0 else take_bit (n - 1) (a div 2) * 2 + a mod 2)\<close>
       
   951   by (cases n) (simp_all add: take_bit_Suc)
       
   952 
       
   953 lemma take_bit_Suc_0 [simp]:
       
   954   \<open>take_bit (Suc 0) a = a mod 2\<close>
       
   955   by (simp add: take_bit_eq_mod)
       
   956 
       
   957 lemma take_bit_of_0 [simp]:
       
   958   \<open>take_bit n 0 = 0\<close>
       
   959   by (rule bit_eqI) (simp add: bit_simps)
       
   960 
       
   961 lemma take_bit_of_1 [simp]:
       
   962   \<open>take_bit n 1 = of_bool (n > 0)\<close>
       
   963   by (cases n) (simp_all add: take_bit_Suc)
       
   964 
       
   965 lemma drop_bit_of_0 [simp]:
       
   966   \<open>drop_bit n 0 = 0\<close>
       
   967   by (rule bit_eqI) (simp add: bit_simps)
       
   968 
       
   969 lemma drop_bit_of_1 [simp]:
       
   970   \<open>drop_bit n 1 = of_bool (n = 0)\<close>
       
   971   by (rule bit_eqI) (simp add: bit_simps ac_simps)
       
   972 
       
   973 lemma drop_bit_0 [simp]:
       
   974   \<open>drop_bit 0 = id\<close>
       
   975   by (simp add: fun_eq_iff drop_bit_eq_div)
       
   976 
       
   977 lemma drop_bit_Suc:
       
   978   \<open>drop_bit (Suc n) a = drop_bit n (a div 2)\<close>
       
   979   using div_exp_eq [of a 1] by (simp add: drop_bit_eq_div)
       
   980 
       
   981 lemma drop_bit_rec:
       
   982   \<open>drop_bit n a = (if n = 0 then a else drop_bit (n - 1) (a div 2))\<close>
       
   983   by (cases n) (simp_all add: drop_bit_Suc)
       
   984 
       
   985 lemma drop_bit_half:
       
   986   \<open>drop_bit n (a div 2) = drop_bit n a div 2\<close>
       
   987   by (induction n arbitrary: a) (simp_all add: drop_bit_Suc)
       
   988 
       
   989 lemma drop_bit_of_bool [simp]:
       
   990   \<open>drop_bit n (of_bool b) = of_bool (n = 0 \<and> b)\<close>
       
   991   by (cases n) simp_all
       
   992 
       
   993 lemma even_take_bit_eq [simp]:
       
   994   \<open>even (take_bit n a) \<longleftrightarrow> n = 0 \<or> even a\<close>
       
   995   by (simp add: take_bit_rec [of n a])
       
   996 
       
   997 lemma take_bit_take_bit [simp]:
       
   998   \<open>take_bit m (take_bit n a) = take_bit (min m n) a\<close>
       
   999   by (rule bit_eqI) (simp add: bit_simps)
       
  1000 
       
  1001 lemma drop_bit_drop_bit [simp]:
       
  1002   \<open>drop_bit m (drop_bit n a) = drop_bit (m + n) a\<close>
       
  1003   by (simp add: drop_bit_eq_div power_add div_exp_eq ac_simps)
       
  1004 
       
  1005 lemma push_bit_take_bit:
       
  1006   \<open>push_bit m (take_bit n a) = take_bit (m + n) (push_bit m a)\<close>
       
  1007   by (rule bit_eqI) (auto simp add: bit_simps)
       
  1008 
       
  1009 lemma take_bit_push_bit:
       
  1010   \<open>take_bit m (push_bit n a) = push_bit n (take_bit (m - n) a)\<close>
       
  1011   by (rule bit_eqI) (auto simp add: bit_simps)
       
  1012 
       
  1013 lemma take_bit_drop_bit:
       
  1014   \<open>take_bit m (drop_bit n a) = drop_bit n (take_bit (m + n) a)\<close>
       
  1015   by (rule bit_eqI) (auto simp add: bit_simps)
       
  1016 
       
  1017 lemma drop_bit_take_bit:
       
  1018   \<open>drop_bit m (take_bit n a) = take_bit (n - m) (drop_bit m a)\<close>
       
  1019   by (rule bit_eqI) (auto simp add: bit_simps)
       
  1020 
       
  1021 lemma even_push_bit_iff [simp]:
       
  1022   \<open>even (push_bit n a) \<longleftrightarrow> n \<noteq> 0 \<or> even a\<close>
       
  1023   by (simp add: push_bit_eq_mult) auto
       
  1024 
       
  1025 lemma stable_imp_drop_bit_eq:
       
  1026   \<open>drop_bit n a = a\<close>
       
  1027   if \<open>a div 2 = a\<close>
       
  1028   by (induction n) (simp_all add: that drop_bit_Suc)
       
  1029 
       
  1030 lemma stable_imp_take_bit_eq:
       
  1031   \<open>take_bit n a = (if even a then 0 else mask n)\<close>
       
  1032     if \<open>a div 2 = a\<close>
       
  1033   by (rule bit_eqI) (use that in \<open>simp add: bit_simps stable_imp_bit_iff_odd\<close>)
       
  1034 
       
  1035 lemma exp_dvdE:
       
  1036   assumes \<open>2 ^ n dvd a\<close>
       
  1037   obtains b where \<open>a = push_bit n b\<close>
       
  1038 proof -
       
  1039   from assms obtain b where \<open>a = 2 ^ n * b\<close> ..
       
  1040   then have \<open>a = push_bit n b\<close>
       
  1041     by (simp add: push_bit_eq_mult ac_simps)
       
  1042   with that show thesis .
       
  1043 qed
       
  1044 
       
  1045 lemma take_bit_eq_0_iff:
       
  1046   \<open>take_bit n a = 0 \<longleftrightarrow> 2 ^ n dvd a\<close> (is \<open>?P \<longleftrightarrow> ?Q\<close>)
       
  1047 proof
       
  1048   assume ?P
       
  1049   then show ?Q
       
  1050     by (simp add: take_bit_eq_mod mod_0_imp_dvd)
       
  1051 next
       
  1052   assume ?Q
       
  1053   then obtain b where \<open>a = push_bit n b\<close>
       
  1054     by (rule exp_dvdE)
       
  1055   then show ?P
       
  1056     by (simp add: take_bit_push_bit)
       
  1057 qed
       
  1058 
       
  1059 lemma take_bit_tightened:
       
  1060   \<open>take_bit m a = take_bit m b\<close> if \<open>take_bit n a = take_bit n b\<close> and \<open>m \<le> n\<close>
       
  1061 proof -
       
  1062   from that have \<open>take_bit m (take_bit n a) = take_bit m (take_bit n b)\<close>
       
  1063     by simp
       
  1064   then have \<open>take_bit (min m n) a = take_bit (min m n) b\<close>
       
  1065     by simp
       
  1066   with that show ?thesis
       
  1067     by (simp add: min_def)
       
  1068 qed
       
  1069 
       
  1070 lemma take_bit_eq_self_iff_drop_bit_eq_0:
       
  1071   \<open>take_bit n a = a \<longleftrightarrow> drop_bit n a = 0\<close> (is \<open>?P \<longleftrightarrow> ?Q\<close>)
       
  1072 proof
       
  1073   assume ?P
       
  1074   show ?Q
       
  1075   proof (rule bit_eqI)
       
  1076     fix m
       
  1077     from \<open>?P\<close> have \<open>a = take_bit n a\<close> ..
       
  1078     also have \<open>\<not> bit (take_bit n a) (n + m)\<close>
       
  1079       unfolding bit_simps
       
  1080       by (simp add: bit_simps)
       
  1081     finally show \<open>bit (drop_bit n a) m \<longleftrightarrow> bit 0 m\<close>
       
  1082       by (simp add: bit_simps)
       
  1083   qed
       
  1084 next
       
  1085   assume ?Q
       
  1086   show ?P
       
  1087   proof (rule bit_eqI)
       
  1088     fix m
       
  1089     from \<open>?Q\<close> have \<open>\<not> bit (drop_bit n a) (m - n)\<close>
       
  1090       by simp
       
  1091     then have \<open> \<not> bit a (n + (m - n))\<close>
       
  1092       by (simp add: bit_simps)
       
  1093     then show \<open>bit (take_bit n a) m \<longleftrightarrow> bit a m\<close>
       
  1094       by (cases \<open>m < n\<close>) (auto simp add: bit_simps)
       
  1095   qed
       
  1096 qed
       
  1097 
       
  1098 lemma drop_bit_exp_eq:
       
  1099   \<open>drop_bit m (2 ^ n) = of_bool (m \<le> n \<and> possible_bit TYPE('a) n) * 2 ^ (n - m)\<close>
       
  1100   by (auto simp add: bit_eq_iff bit_simps)
       
  1101 
       
  1102 lemma take_bit_and [simp]:
       
  1103   \<open>take_bit n (a AND b) = take_bit n a AND take_bit n b\<close>
       
  1104   by (auto simp add: bit_eq_iff bit_simps)
       
  1105 
       
  1106 lemma take_bit_or [simp]:
       
  1107   \<open>take_bit n (a OR b) = take_bit n a OR take_bit n b\<close>
       
  1108   by (auto simp add: bit_eq_iff bit_simps)
       
  1109 
       
  1110 lemma take_bit_xor [simp]:
       
  1111   \<open>take_bit n (a XOR b) = take_bit n a XOR take_bit n b\<close>
       
  1112   by (auto simp add: bit_eq_iff bit_simps)
       
  1113 
       
  1114 lemma push_bit_and [simp]:
       
  1115   \<open>push_bit n (a AND b) = push_bit n a AND push_bit n b\<close>
       
  1116   by (auto simp add: bit_eq_iff bit_simps)
       
  1117 
       
  1118 lemma push_bit_or [simp]:
       
  1119   \<open>push_bit n (a OR b) = push_bit n a OR push_bit n b\<close>
       
  1120   by (auto simp add: bit_eq_iff bit_simps)
       
  1121 
       
  1122 lemma push_bit_xor [simp]:
       
  1123   \<open>push_bit n (a XOR b) = push_bit n a XOR push_bit n b\<close>
       
  1124   by (auto simp add: bit_eq_iff bit_simps)
       
  1125 
       
  1126 lemma drop_bit_and [simp]:
       
  1127   \<open>drop_bit n (a AND b) = drop_bit n a AND drop_bit n b\<close>
       
  1128   by (auto simp add: bit_eq_iff bit_simps)
       
  1129 
       
  1130 lemma drop_bit_or [simp]:
       
  1131   \<open>drop_bit n (a OR b) = drop_bit n a OR drop_bit n b\<close>
       
  1132   by (auto simp add: bit_eq_iff bit_simps)
       
  1133 
       
  1134 lemma drop_bit_xor [simp]:
       
  1135   \<open>drop_bit n (a XOR b) = drop_bit n a XOR drop_bit n b\<close>
       
  1136   by (auto simp add: bit_eq_iff bit_simps)
       
  1137 
       
  1138 lemma take_bit_of_mask [simp]:
       
  1139   \<open>take_bit m (mask n) = mask (min m n)\<close>
       
  1140   by (rule bit_eqI) (simp add: bit_simps)
       
  1141 
       
  1142 lemma take_bit_eq_mask:
       
  1143   \<open>take_bit n a = a AND mask n\<close>
       
  1144   by (auto simp add: bit_eq_iff bit_simps)
       
  1145 
       
  1146 lemma or_eq_0_iff:
       
  1147   \<open>a OR b = 0 \<longleftrightarrow> a = 0 \<and> b = 0\<close>
       
  1148   by (auto simp add: bit_eq_iff bit_or_iff)
       
  1149 
       
  1150 lemma bit_iff_and_drop_bit_eq_1:
       
  1151   \<open>bit a n \<longleftrightarrow> drop_bit n a AND 1 = 1\<close>
       
  1152   by (simp add: bit_iff_odd_drop_bit and_one_eq odd_iff_mod_2_eq_one)
       
  1153 
       
  1154 lemma bit_iff_and_push_bit_not_eq_0:
       
  1155   \<open>bit a n \<longleftrightarrow> a AND push_bit n 1 \<noteq> 0\<close>
       
  1156   by (cases \<open>possible_bit TYPE('a) n\<close>) (simp_all add: bit_eq_iff bit_simps impossible_bit)
       
  1157 
       
  1158 lemma bit_set_bit_iff [bit_simps]:
       
  1159   \<open>bit (set_bit m a) n \<longleftrightarrow> bit a n \<or> (m = n \<and> possible_bit TYPE('a) n)\<close>
       
  1160   by (auto simp add: set_bit_eq_or bit_or_iff bit_exp_iff)
       
  1161 
       
  1162 lemma even_set_bit_iff:
       
  1163   \<open>even (set_bit m a) \<longleftrightarrow> even a \<and> m \<noteq> 0\<close>
       
  1164   using bit_set_bit_iff [of m a 0] by (auto simp add: bit_0)
       
  1165 
       
  1166 lemma bit_unset_bit_iff [bit_simps]:
       
  1167   \<open>bit (unset_bit m a) n \<longleftrightarrow> bit a n \<and> m \<noteq> n\<close>
       
  1168   by (auto simp add: unset_bit_eq_or_xor bit_simps dest: bit_imp_possible_bit)
       
  1169 
       
  1170 lemma even_unset_bit_iff:
       
  1171   \<open>even (unset_bit m a) \<longleftrightarrow> even a \<or> m = 0\<close>
       
  1172   using bit_unset_bit_iff [of m a 0] by (auto simp add: bit_0)
       
  1173 
       
  1174 lemma bit_flip_bit_iff [bit_simps]:
       
  1175   \<open>bit (flip_bit m a) n \<longleftrightarrow> (m = n \<longleftrightarrow> \<not> bit a n) \<and> possible_bit TYPE('a) n\<close>
       
  1176   by (auto simp add: bit_eq_iff bit_simps flip_bit_eq_xor bit_imp_possible_bit)
       
  1177 
       
  1178 lemma even_flip_bit_iff:
       
  1179   \<open>even (flip_bit m a) \<longleftrightarrow> \<not> (even a \<longleftrightarrow> m = 0)\<close>
       
  1180   using bit_flip_bit_iff [of m a 0] by (auto simp: possible_bit_def  bit_0)
       
  1181 
       
  1182 lemma and_exp_eq_0_iff_not_bit:
       
  1183   \<open>a AND 2 ^ n = 0 \<longleftrightarrow> \<not> bit a n\<close> (is \<open>?P \<longleftrightarrow> ?Q\<close>)
       
  1184   using bit_imp_possible_bit[of a n]
       
  1185   by (auto simp add: bit_eq_iff bit_simps)
       
  1186 
       
  1187 lemma bit_sum_mult_2_cases:
       
  1188   assumes a: \<open>\<forall>j. \<not> bit a (Suc j)\<close>
       
  1189   shows \<open>bit (a + 2 * b) n = (if n = 0 then odd a else bit (2 * b) n)\<close>
       
  1190 proof -
       
  1191   from a have \<open>n = 0\<close> if \<open>bit a n\<close> for n using that
       
  1192     by (cases n) simp_all
       
  1193   then have \<open>a = 0 \<or> a = 1\<close>
       
  1194     by (auto simp add: bit_eq_iff bit_1_iff)
       
  1195   then show ?thesis
       
  1196     by (cases n) (auto simp add: bit_0 bit_double_iff even_bit_succ_iff)
       
  1197 qed
       
  1198 
       
  1199 lemma set_bit_0 [simp]:
       
  1200   \<open>set_bit 0 a = 1 + 2 * (a div 2)\<close>
       
  1201   by (auto simp add: bit_eq_iff bit_simps even_bit_succ_iff simp flip: bit_Suc)
       
  1202 
       
  1203 lemma set_bit_Suc:
       
  1204   \<open>set_bit (Suc n) a = a mod 2 + 2 * set_bit n (a div 2)\<close>
       
  1205   by (auto simp add: bit_eq_iff bit_sum_mult_2_cases bit_simps bit_0 simp flip: bit_Suc
       
  1206     elim: possible_bit_less_imp)
       
  1207 
       
  1208 lemma unset_bit_0 [simp]:
       
  1209   \<open>unset_bit 0 a = 2 * (a div 2)\<close>
       
  1210   by (auto simp add: bit_eq_iff bit_simps simp flip: bit_Suc)
       
  1211 
       
  1212 lemma unset_bit_Suc:
       
  1213   \<open>unset_bit (Suc n) a = a mod 2 + 2 * unset_bit n (a div 2)\<close>
       
  1214   by (auto simp add: bit_eq_iff bit_sum_mult_2_cases bit_simps bit_0 simp flip: bit_Suc)
       
  1215 
       
  1216 lemma flip_bit_0 [simp]:
       
  1217   \<open>flip_bit 0 a = of_bool (even a) + 2 * (a div 2)\<close>
       
  1218   by (auto simp add: bit_eq_iff bit_simps even_bit_succ_iff bit_0 simp flip: bit_Suc)
       
  1219 
       
  1220 lemma flip_bit_Suc:
       
  1221   \<open>flip_bit (Suc n) a = a mod 2 + 2 * flip_bit n (a div 2)\<close>
       
  1222   by (auto simp add: bit_eq_iff bit_sum_mult_2_cases bit_simps bit_0 simp flip: bit_Suc
       
  1223     elim: possible_bit_less_imp)
       
  1224 
       
  1225 lemma flip_bit_eq_if:
       
  1226   \<open>flip_bit n a = (if bit a n then unset_bit else set_bit) n a\<close>
       
  1227   by (rule bit_eqI) (auto simp add: bit_set_bit_iff bit_unset_bit_iff bit_flip_bit_iff)
       
  1228 
       
  1229 lemma take_bit_set_bit_eq:
       
  1230   \<open>take_bit n (set_bit m a) = (if n \<le> m then take_bit n a else set_bit m (take_bit n a))\<close>
       
  1231   by (rule bit_eqI) (auto simp add: bit_take_bit_iff bit_set_bit_iff)
       
  1232 
       
  1233 lemma take_bit_unset_bit_eq:
       
  1234   \<open>take_bit n (unset_bit m a) = (if n \<le> m then take_bit n a else unset_bit m (take_bit n a))\<close>
       
  1235   by (rule bit_eqI) (auto simp add: bit_take_bit_iff bit_unset_bit_iff)
       
  1236 
       
  1237 lemma take_bit_flip_bit_eq:
       
  1238   \<open>take_bit n (flip_bit m a) = (if n \<le> m then take_bit n a else flip_bit m (take_bit n a))\<close>
       
  1239   by (rule bit_eqI) (auto simp add: bit_take_bit_iff bit_flip_bit_iff)
       
  1240 
       
  1241 lemma bit_1_0 [simp]:
       
  1242   \<open>bit 1 0\<close>
       
  1243   by (simp add: bit_0)
       
  1244 
       
  1245 lemma not_bit_1_Suc [simp]:
       
  1246   \<open>\<not> bit 1 (Suc n)\<close>
       
  1247   by (simp add: bit_Suc)
       
  1248 
       
  1249 lemma push_bit_Suc_numeral [simp]:
       
  1250   \<open>push_bit (Suc n) (numeral k) = push_bit n (numeral (Num.Bit0 k))\<close>
       
  1251   by (simp add: numeral_eq_Suc mult_2_right) (simp add: numeral_Bit0)
       
  1252 
       
  1253 lemma mask_eq_0_iff [simp]:
       
  1254   \<open>mask n = 0 \<longleftrightarrow> n = 0\<close>
       
  1255   by (cases n) (simp_all add: mask_Suc_double or_eq_0_iff)
       
  1256 
       
  1257 lemma bit_horner_sum_bit_iff [bit_simps]:
       
  1258   \<open>bit (horner_sum of_bool 2 bs) n \<longleftrightarrow> possible_bit TYPE('a) n \<and> n < length bs \<and> bs ! n\<close>
       
  1259 proof (induction bs arbitrary: n)
       
  1260   case Nil
       
  1261   then show ?case
       
  1262     by simp
       
  1263 next
       
  1264   case (Cons b bs)
       
  1265   show ?case
       
  1266   proof (cases n)
       
  1267     case 0
       
  1268     then show ?thesis
       
  1269       by (simp add: bit_0)
       
  1270   next
       
  1271     case (Suc m)
       
  1272     with bit_rec [of _ n] Cons.prems Cons.IH [of m]
       
  1273     show ?thesis
       
  1274       by (simp add: bit_simps)
       
  1275         (auto simp add: possible_bit_less_imp bit_simps simp flip: bit_Suc)
       
  1276   qed
       
  1277 qed
       
  1278 
       
  1279 lemma horner_sum_bit_eq_take_bit:
       
  1280   \<open>horner_sum of_bool 2 (map (bit a) [0..<n]) = take_bit n a\<close>
       
  1281   by (rule bit_eqI) (auto simp add: bit_simps)
       
  1282 
       
  1283 lemma take_bit_horner_sum_bit_eq:
       
  1284   \<open>take_bit n (horner_sum of_bool 2 bs) = horner_sum of_bool 2 (take n bs)\<close>
       
  1285   by (auto simp add: bit_eq_iff bit_take_bit_iff bit_horner_sum_bit_iff)
       
  1286 
       
  1287 lemma take_bit_sum:
       
  1288   \<open>take_bit n a = (\<Sum>k = 0..<n. push_bit k (of_bool (bit a k)))\<close>
       
  1289   by (simp flip: horner_sum_bit_eq_take_bit add: horner_sum_eq_sum push_bit_eq_mult)
  1293 
  1290 
  1294 lemma set_bit_eq:
  1291 lemma set_bit_eq:
  1295   \<open>set_bit n a = a + of_bool (\<not> bit a n) * 2 ^ n\<close>
  1292   \<open>set_bit n a = a + of_bool (\<not> bit a n) * 2 ^ n\<close>
  1296 proof -
  1293 proof -
  1297   have \<open>a AND of_bool (\<not> bit a n) * 2 ^ n = 0\<close>
  1294   have \<open>a AND of_bool (\<not> bit a n) * 2 ^ n = 0\<close>
  3919 
  3916 
  3920 lemma disjunctive_add [no_atp]:
  3917 lemma disjunctive_add [no_atp]:
  3921   \<open>a + b = a OR b\<close> if \<open>\<And>n. \<not> bit a n \<or> \<not> bit b n\<close>
  3918   \<open>a + b = a OR b\<close> if \<open>\<And>n. \<not> bit a n \<or> \<not> bit b n\<close>
  3922   by (rule disjunctive_add_eq_or) (use that in \<open>simp add: bit_eq_iff bit_simps\<close>)
  3919   by (rule disjunctive_add_eq_or) (use that in \<open>simp add: bit_eq_iff bit_simps\<close>)
  3923 
  3920 
       
  3921 lemma even_mod_exp_div_exp_iff [no_atp]:
       
  3922   \<open>even (a mod 2 ^ m div 2 ^ n) \<longleftrightarrow> m \<le> n \<or> even (a div 2 ^ n)\<close>
       
  3923   by (auto simp add: even_drop_bit_iff_not_bit bit_simps simp flip: drop_bit_eq_div take_bit_eq_mod)
       
  3924 
  3924 end
  3925 end
  3925 
  3926 
  3926 context ring_bit_operations
  3927 context ring_bit_operations
  3927 begin
  3928 begin
  3928 
  3929