1103 end |
1103 end |
1104 |
1104 |
1105 lemma divmod_BitM_2_eq [simp]: |
1105 lemma divmod_BitM_2_eq [simp]: |
1106 \<open>divmod (Num.BitM m) (Num.Bit0 Num.One) = (numeral m - 1, (1 :: int))\<close> |
1106 \<open>divmod (Num.BitM m) (Num.Bit0 Num.One) = (numeral m - 1, (1 :: int))\<close> |
1107 by (cases m) simp_all |
1107 by (cases m) simp_all |
1108 |
|
1109 lemma bit_numeral_Bit0_Suc_iff [simp]: |
|
1110 \<open>bit (numeral (Num.Bit0 m) :: int) (Suc n) \<longleftrightarrow> bit (numeral m :: int) n\<close> |
|
1111 by (simp add: bit_Suc) |
|
1112 |
|
1113 lemma bit_numeral_Bit1_Suc_iff [simp]: |
|
1114 \<open>bit (numeral (Num.Bit1 m) :: int) (Suc n) \<longleftrightarrow> bit (numeral m :: int) n\<close> |
|
1115 by (simp add: bit_Suc) |
|
1116 |
1108 |
1117 lemma div_positive_int: |
1109 lemma div_positive_int: |
1118 "k div l > 0" if "k \<ge> l" and "l > 0" for k l :: int |
1110 "k div l > 0" if "k \<ge> l" and "l > 0" for k l :: int |
1119 using that div_positive [of l k] by blast |
1111 using that div_positive [of l k] by blast |
1120 |
1112 |
1223 |
1215 |
1224 code_identifier |
1216 code_identifier |
1225 code_module Divides \<rightharpoonup> (SML) Arith and (OCaml) Arith and (Haskell) Arith |
1217 code_module Divides \<rightharpoonup> (SML) Arith and (OCaml) Arith and (Haskell) Arith |
1226 |
1218 |
1227 |
1219 |
1228 subsection \<open>More on bit operations\<close> |
|
1229 |
|
1230 lemma take_bit_incr_eq: |
|
1231 \<open>take_bit n (k + 1) = 1 + take_bit n k\<close> if \<open>take_bit n k \<noteq> 2 ^ n - 1\<close> |
|
1232 for k :: int |
|
1233 proof - |
|
1234 from that have \<open>2 ^ n \<noteq> k mod 2 ^ n + 1\<close> |
|
1235 by (simp add: take_bit_eq_mod) |
|
1236 moreover have \<open>k mod 2 ^ n < 2 ^ n\<close> |
|
1237 by simp |
|
1238 ultimately have *: \<open>k mod 2 ^ n + 1 < 2 ^ n\<close> |
|
1239 by linarith |
|
1240 have \<open>(k + 1) mod 2 ^ n = (k mod 2 ^ n + 1) mod 2 ^ n\<close> |
|
1241 by (simp add: mod_simps) |
|
1242 also have \<open>\<dots> = k mod 2 ^ n + 1\<close> |
|
1243 using * by (simp add: zmod_trivial_iff) |
|
1244 finally have \<open>(k + 1) mod 2 ^ n = k mod 2 ^ n + 1\<close> . |
|
1245 then show ?thesis |
|
1246 by (simp add: take_bit_eq_mod) |
|
1247 qed |
|
1248 |
|
1249 lemma take_bit_decr_eq: |
|
1250 \<open>take_bit n (k - 1) = take_bit n k - 1\<close> if \<open>take_bit n k \<noteq> 0\<close> |
|
1251 for k :: int |
|
1252 proof - |
|
1253 from that have \<open>k mod 2 ^ n \<noteq> 0\<close> |
|
1254 by (simp add: take_bit_eq_mod) |
|
1255 moreover have \<open>k mod 2 ^ n \<ge> 0\<close> \<open>k mod 2 ^ n < 2 ^ n\<close> |
|
1256 by simp_all |
|
1257 ultimately have *: \<open>k mod 2 ^ n > 0\<close> |
|
1258 by linarith |
|
1259 have \<open>(k - 1) mod 2 ^ n = (k mod 2 ^ n - 1) mod 2 ^ n\<close> |
|
1260 by (simp add: mod_simps) |
|
1261 also have \<open>\<dots> = k mod 2 ^ n - 1\<close> |
|
1262 by (simp add: zmod_trivial_iff) |
|
1263 (use \<open>k mod 2 ^ n < 2 ^ n\<close> * in linarith) |
|
1264 finally have \<open>(k - 1) mod 2 ^ n = k mod 2 ^ n - 1\<close> . |
|
1265 then show ?thesis |
|
1266 by (simp add: take_bit_eq_mod) |
|
1267 qed |
|
1268 |
|
1269 lemma take_bit_int_greater_eq: |
|
1270 \<open>k + 2 ^ n \<le> take_bit n k\<close> if \<open>k < 0\<close> for k :: int |
|
1271 proof - |
|
1272 have \<open>k + 2 ^ n \<le> take_bit n (k + 2 ^ n)\<close> |
|
1273 proof (cases \<open>k > - (2 ^ n)\<close>) |
|
1274 case False |
|
1275 then have \<open>k + 2 ^ n \<le> 0\<close> |
|
1276 by simp |
|
1277 also note take_bit_nonnegative |
|
1278 finally show ?thesis . |
|
1279 next |
|
1280 case True |
|
1281 with that have \<open>0 \<le> k + 2 ^ n\<close> and \<open>k + 2 ^ n < 2 ^ n\<close> |
|
1282 by simp_all |
|
1283 then show ?thesis |
|
1284 by (simp only: take_bit_eq_mod mod_pos_pos_trivial) |
|
1285 qed |
|
1286 then show ?thesis |
|
1287 by (simp add: take_bit_eq_mod) |
|
1288 qed |
|
1289 |
|
1290 lemma take_bit_int_less_eq: |
|
1291 \<open>take_bit n k \<le> k - 2 ^ n\<close> if \<open>2 ^ n \<le> k\<close> and \<open>n > 0\<close> for k :: int |
|
1292 using that zmod_le_nonneg_dividend [of \<open>k - 2 ^ n\<close> \<open>2 ^ n\<close>] |
|
1293 by (simp add: take_bit_eq_mod) |
|
1294 |
|
1295 lemma take_bit_int_less_eq_self_iff: |
|
1296 \<open>take_bit n k \<le> k \<longleftrightarrow> 0 \<le> k\<close> (is \<open>?P \<longleftrightarrow> ?Q\<close>) |
|
1297 for k :: int |
|
1298 proof |
|
1299 assume ?P |
|
1300 show ?Q |
|
1301 proof (rule ccontr) |
|
1302 assume \<open>\<not> 0 \<le> k\<close> |
|
1303 then have \<open>k < 0\<close> |
|
1304 by simp |
|
1305 with \<open>?P\<close> |
|
1306 have \<open>take_bit n k < 0\<close> |
|
1307 by (rule le_less_trans) |
|
1308 then show False |
|
1309 by simp |
|
1310 qed |
|
1311 next |
|
1312 assume ?Q |
|
1313 then show ?P |
|
1314 by (simp add: take_bit_eq_mod zmod_le_nonneg_dividend) |
|
1315 qed |
|
1316 |
|
1317 lemma take_bit_int_less_self_iff: |
|
1318 \<open>take_bit n k < k \<longleftrightarrow> 2 ^ n \<le> k\<close> |
|
1319 for k :: int |
|
1320 by (auto simp add: less_le take_bit_int_less_eq_self_iff take_bit_int_eq_self_iff |
|
1321 intro: order_trans [of 0 \<open>2 ^ n\<close> k]) |
|
1322 |
|
1323 lemma take_bit_int_greater_self_iff: |
|
1324 \<open>k < take_bit n k \<longleftrightarrow> k < 0\<close> |
|
1325 for k :: int |
|
1326 using take_bit_int_less_eq_self_iff [of n k] by auto |
|
1327 |
|
1328 lemma take_bit_int_greater_eq_self_iff: |
|
1329 \<open>k \<le> take_bit n k \<longleftrightarrow> k < 2 ^ n\<close> |
|
1330 for k :: int |
|
1331 by (auto simp add: le_less take_bit_int_greater_self_iff take_bit_int_eq_self_iff |
|
1332 dest: sym not_sym intro: less_trans [of k 0 \<open>2 ^ n\<close>]) |
|
1333 |
|
1334 |
|
1335 subsection \<open>Lemmas of doubtful value\<close> |
1220 subsection \<open>Lemmas of doubtful value\<close> |
1336 |
1221 |
1337 lemma div_geq: "m div n = Suc ((m - n) div n)" if "0 < n" and " \<not> m < n" for m n :: nat |
1222 lemma div_geq: "m div n = Suc ((m - n) div n)" if "0 < n" and " \<not> m < n" for m n :: nat |
1338 by (rule le_div_geq) (use that in \<open>simp_all add: not_less\<close>) |
1223 by (rule le_div_geq) (use that in \<open>simp_all add: not_less\<close>) |
1339 |
1224 |