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