14 class semiring_bit_operations = semiring_bit_shifts + |
14 class semiring_bit_operations = semiring_bit_shifts + |
15 fixes "and" :: \<open>'a \<Rightarrow> 'a \<Rightarrow> 'a\<close> (infixr \<open>AND\<close> 64) |
15 fixes "and" :: \<open>'a \<Rightarrow> 'a \<Rightarrow> 'a\<close> (infixr \<open>AND\<close> 64) |
16 and or :: \<open>'a \<Rightarrow> 'a \<Rightarrow> 'a\<close> (infixr \<open>OR\<close> 59) |
16 and or :: \<open>'a \<Rightarrow> 'a \<Rightarrow> 'a\<close> (infixr \<open>OR\<close> 59) |
17 and xor :: \<open>'a \<Rightarrow> 'a \<Rightarrow> 'a\<close> (infixr \<open>XOR\<close> 59) |
17 and xor :: \<open>'a \<Rightarrow> 'a \<Rightarrow> 'a\<close> (infixr \<open>XOR\<close> 59) |
18 and mask :: \<open>nat \<Rightarrow> 'a\<close> |
18 and mask :: \<open>nat \<Rightarrow> 'a\<close> |
19 assumes bit_and_iff [bit_simps]: \<open>\<And>n. bit (a AND b) n \<longleftrightarrow> bit a n \<and> bit b n\<close> |
19 and set_bit :: \<open>nat \<Rightarrow> 'a \<Rightarrow> 'a\<close> |
20 and bit_or_iff [bit_simps]: \<open>\<And>n. bit (a OR b) n \<longleftrightarrow> bit a n \<or> bit b n\<close> |
20 and unset_bit :: \<open>nat \<Rightarrow> 'a \<Rightarrow> 'a\<close> |
21 and bit_xor_iff [bit_simps]: \<open>\<And>n. bit (a XOR b) n \<longleftrightarrow> bit a n \<noteq> bit b n\<close> |
21 and flip_bit :: \<open>nat \<Rightarrow> 'a \<Rightarrow> 'a\<close> |
|
22 assumes bit_and_iff [bit_simps]: \<open>bit (a AND b) n \<longleftrightarrow> bit a n \<and> bit b n\<close> |
|
23 and bit_or_iff [bit_simps]: \<open>bit (a OR b) n \<longleftrightarrow> bit a n \<or> bit b n\<close> |
|
24 and bit_xor_iff [bit_simps]: \<open>bit (a XOR b) n \<longleftrightarrow> bit a n \<noteq> bit b n\<close> |
22 and mask_eq_exp_minus_1: \<open>mask n = 2 ^ n - 1\<close> |
25 and mask_eq_exp_minus_1: \<open>mask n = 2 ^ n - 1\<close> |
|
26 and set_bit_eq_or: \<open>set_bit n a = a OR push_bit n 1\<close> |
|
27 and bit_unset_bit_iff [bit_simps]: \<open>bit (unset_bit m a) n \<longleftrightarrow> bit a n \<and> m \<noteq> n\<close> |
|
28 and flip_bit_eq_xor: \<open>flip_bit n a = a XOR push_bit n 1\<close> |
23 begin |
29 begin |
24 |
30 |
25 text \<open> |
31 text \<open> |
26 We want the bitwise operations to bind slightly weaker |
32 We want the bitwise operations to bind slightly weaker |
27 than \<open>+\<close> and \<open>-\<close>. |
33 than \<open>+\<close> and \<open>-\<close>. |
180 apply (cases \<open>2 ^ n = 0\<close>) |
186 apply (cases \<open>2 ^ n = 0\<close>) |
181 apply (simp_all add: push_bit_of_1 bit_eq_iff bit_and_iff bit_push_bit_iff exp_eq_0_imp_not_bit) |
187 apply (simp_all add: push_bit_of_1 bit_eq_iff bit_and_iff bit_push_bit_iff exp_eq_0_imp_not_bit) |
182 apply (simp_all add: bit_exp_iff) |
188 apply (simp_all add: bit_exp_iff) |
183 done |
189 done |
184 |
190 |
185 end |
191 lemmas set_bit_def = set_bit_eq_or |
186 |
|
187 class ring_bit_operations = semiring_bit_operations + ring_parity + |
|
188 fixes not :: \<open>'a \<Rightarrow> 'a\<close> (\<open>NOT\<close>) |
|
189 assumes bit_not_iff [bit_simps]: \<open>\<And>n. bit (NOT a) n \<longleftrightarrow> 2 ^ n \<noteq> 0 \<and> \<not> bit a n\<close> |
|
190 assumes minus_eq_not_minus_1: \<open>- a = NOT (a - 1)\<close> |
|
191 begin |
|
192 |
|
193 text \<open> |
|
194 For the sake of code generation \<^const>\<open>not\<close> is specified as |
|
195 definitional class operation. Note that \<^const>\<open>not\<close> has no |
|
196 sensible definition for unlimited but only positive bit strings |
|
197 (type \<^typ>\<open>nat\<close>). |
|
198 \<close> |
|
199 |
|
200 lemma bits_minus_1_mod_2_eq [simp]: |
|
201 \<open>(- 1) mod 2 = 1\<close> |
|
202 by (simp add: mod_2_eq_odd) |
|
203 |
|
204 lemma not_eq_complement: |
|
205 \<open>NOT a = - a - 1\<close> |
|
206 using minus_eq_not_minus_1 [of \<open>a + 1\<close>] by simp |
|
207 |
|
208 lemma minus_eq_not_plus_1: |
|
209 \<open>- a = NOT a + 1\<close> |
|
210 using not_eq_complement [of a] by simp |
|
211 |
|
212 lemma bit_minus_iff [bit_simps]: |
|
213 \<open>bit (- a) n \<longleftrightarrow> 2 ^ n \<noteq> 0 \<and> \<not> bit (a - 1) n\<close> |
|
214 by (simp add: minus_eq_not_minus_1 bit_not_iff) |
|
215 |
|
216 lemma even_not_iff [simp]: |
|
217 "even (NOT a) \<longleftrightarrow> odd a" |
|
218 using bit_not_iff [of a 0] by auto |
|
219 |
|
220 lemma bit_not_exp_iff [bit_simps]: |
|
221 \<open>bit (NOT (2 ^ m)) n \<longleftrightarrow> 2 ^ n \<noteq> 0 \<and> n \<noteq> m\<close> |
|
222 by (auto simp add: bit_not_iff bit_exp_iff) |
|
223 |
|
224 lemma bit_minus_1_iff [simp]: |
|
225 \<open>bit (- 1) n \<longleftrightarrow> 2 ^ n \<noteq> 0\<close> |
|
226 by (simp add: bit_minus_iff) |
|
227 |
|
228 lemma bit_minus_exp_iff [bit_simps]: |
|
229 \<open>bit (- (2 ^ m)) n \<longleftrightarrow> 2 ^ n \<noteq> 0 \<and> n \<ge> m\<close> |
|
230 by (auto simp add: bit_simps simp flip: mask_eq_exp_minus_1) |
|
231 |
|
232 lemma bit_minus_2_iff [simp]: |
|
233 \<open>bit (- 2) n \<longleftrightarrow> 2 ^ n \<noteq> 0 \<and> n > 0\<close> |
|
234 by (simp add: bit_minus_iff bit_1_iff) |
|
235 |
|
236 lemma not_one [simp]: |
|
237 "NOT 1 = - 2" |
|
238 by (simp add: bit_eq_iff bit_not_iff) (simp add: bit_1_iff) |
|
239 |
|
240 sublocale "and": semilattice_neutr \<open>(AND)\<close> \<open>- 1\<close> |
|
241 by standard (rule bit_eqI, simp add: bit_and_iff) |
|
242 |
|
243 sublocale bit: boolean_algebra \<open>(AND)\<close> \<open>(OR)\<close> NOT 0 \<open>- 1\<close> |
|
244 rewrites \<open>bit.xor = (XOR)\<close> |
|
245 proof - |
|
246 interpret bit: boolean_algebra \<open>(AND)\<close> \<open>(OR)\<close> NOT 0 \<open>- 1\<close> |
|
247 by standard (auto simp add: bit_and_iff bit_or_iff bit_not_iff intro: bit_eqI) |
|
248 show \<open>boolean_algebra (AND) (OR) NOT 0 (- 1)\<close> |
|
249 by standard |
|
250 show \<open>boolean_algebra.xor (AND) (OR) NOT = (XOR)\<close> |
|
251 by (rule ext, rule ext, rule bit_eqI) |
|
252 (auto simp add: bit.xor_def bit_and_iff bit_or_iff bit_xor_iff bit_not_iff) |
|
253 qed |
|
254 |
|
255 lemma and_eq_not_not_or: |
|
256 \<open>a AND b = NOT (NOT a OR NOT b)\<close> |
|
257 by simp |
|
258 |
|
259 lemma or_eq_not_not_and: |
|
260 \<open>a OR b = NOT (NOT a AND NOT b)\<close> |
|
261 by simp |
|
262 |
|
263 lemma not_add_distrib: |
|
264 \<open>NOT (a + b) = NOT a - b\<close> |
|
265 by (simp add: not_eq_complement algebra_simps) |
|
266 |
|
267 lemma not_diff_distrib: |
|
268 \<open>NOT (a - b) = NOT a + b\<close> |
|
269 using not_add_distrib [of a \<open>- b\<close>] by simp |
|
270 |
|
271 lemma (in ring_bit_operations) and_eq_minus_1_iff: |
|
272 \<open>a AND b = - 1 \<longleftrightarrow> a = - 1 \<and> b = - 1\<close> |
|
273 proof |
|
274 assume \<open>a = - 1 \<and> b = - 1\<close> |
|
275 then show \<open>a AND b = - 1\<close> |
|
276 by simp |
|
277 next |
|
278 assume \<open>a AND b = - 1\<close> |
|
279 have *: \<open>bit a n\<close> \<open>bit b n\<close> if \<open>2 ^ n \<noteq> 0\<close> for n |
|
280 proof - |
|
281 from \<open>a AND b = - 1\<close> |
|
282 have \<open>bit (a AND b) n = bit (- 1) n\<close> |
|
283 by (simp add: bit_eq_iff) |
|
284 then show \<open>bit a n\<close> \<open>bit b n\<close> |
|
285 using that by (simp_all add: bit_and_iff) |
|
286 qed |
|
287 have \<open>a = - 1\<close> |
|
288 by (rule bit_eqI) (simp add: *) |
|
289 moreover have \<open>b = - 1\<close> |
|
290 by (rule bit_eqI) (simp add: *) |
|
291 ultimately show \<open>a = - 1 \<and> b = - 1\<close> |
|
292 by simp |
|
293 qed |
|
294 |
|
295 lemma disjunctive_diff: |
|
296 \<open>a - b = a AND NOT b\<close> if \<open>\<And>n. bit b n \<Longrightarrow> bit a n\<close> |
|
297 proof - |
|
298 have \<open>NOT a + b = NOT a OR b\<close> |
|
299 by (rule disjunctive_add) (auto simp add: bit_not_iff dest: that) |
|
300 then have \<open>NOT (NOT a + b) = NOT (NOT a OR b)\<close> |
|
301 by simp |
|
302 then show ?thesis |
|
303 by (simp add: not_add_distrib) |
|
304 qed |
|
305 |
|
306 lemma push_bit_minus: |
|
307 \<open>push_bit n (- a) = - push_bit n a\<close> |
|
308 by (simp add: push_bit_eq_mult) |
|
309 |
|
310 lemma take_bit_not_take_bit: |
|
311 \<open>take_bit n (NOT (take_bit n a)) = take_bit n (NOT a)\<close> |
|
312 by (auto simp add: bit_eq_iff bit_take_bit_iff bit_not_iff) |
|
313 |
|
314 lemma take_bit_not_iff: |
|
315 "take_bit n (NOT a) = take_bit n (NOT b) \<longleftrightarrow> take_bit n a = take_bit n b" |
|
316 apply (simp add: bit_eq_iff) |
|
317 apply (simp add: bit_not_iff bit_take_bit_iff bit_exp_iff) |
|
318 apply (use exp_eq_0_imp_not_bit in blast) |
|
319 done |
|
320 |
|
321 lemma take_bit_not_eq_mask_diff: |
|
322 \<open>take_bit n (NOT a) = mask n - take_bit n a\<close> |
|
323 proof - |
|
324 have \<open>take_bit n (NOT a) = take_bit n (NOT (take_bit n a))\<close> |
|
325 by (simp add: take_bit_not_take_bit) |
|
326 also have \<open>\<dots> = mask n AND NOT (take_bit n a)\<close> |
|
327 by (simp add: take_bit_eq_mask ac_simps) |
|
328 also have \<open>\<dots> = mask n - take_bit n a\<close> |
|
329 by (subst disjunctive_diff) |
|
330 (auto simp add: bit_take_bit_iff bit_mask_iff exp_eq_0_imp_not_bit) |
|
331 finally show ?thesis |
|
332 by simp |
|
333 qed |
|
334 |
|
335 lemma mask_eq_take_bit_minus_one: |
|
336 \<open>mask n = take_bit n (- 1)\<close> |
|
337 by (simp add: bit_eq_iff bit_mask_iff bit_take_bit_iff conj_commute) |
|
338 |
|
339 lemma take_bit_minus_one_eq_mask: |
|
340 \<open>take_bit n (- 1) = mask n\<close> |
|
341 by (simp add: mask_eq_take_bit_minus_one) |
|
342 |
|
343 lemma minus_exp_eq_not_mask: |
|
344 \<open>- (2 ^ n) = NOT (mask n)\<close> |
|
345 by (rule bit_eqI) (simp add: bit_minus_iff bit_not_iff flip: mask_eq_exp_minus_1) |
|
346 |
|
347 lemma push_bit_minus_one_eq_not_mask: |
|
348 \<open>push_bit n (- 1) = NOT (mask n)\<close> |
|
349 by (simp add: push_bit_eq_mult minus_exp_eq_not_mask) |
|
350 |
|
351 lemma take_bit_not_mask_eq_0: |
|
352 \<open>take_bit m (NOT (mask n)) = 0\<close> if \<open>n \<ge> m\<close> |
|
353 by (rule bit_eqI) (use that in \<open>simp add: bit_take_bit_iff bit_not_iff bit_mask_iff\<close>) |
|
354 |
|
355 lemma take_bit_mask [simp]: |
|
356 \<open>take_bit m (mask n) = mask (min m n)\<close> |
|
357 by (simp add: mask_eq_take_bit_minus_one) |
|
358 |
|
359 definition set_bit :: \<open>nat \<Rightarrow> 'a \<Rightarrow> 'a\<close> |
|
360 where \<open>set_bit n a = a OR push_bit n 1\<close> |
|
361 |
|
362 definition unset_bit :: \<open>nat \<Rightarrow> 'a \<Rightarrow> 'a\<close> |
|
363 where \<open>unset_bit n a = a AND NOT (push_bit n 1)\<close> |
|
364 |
|
365 definition flip_bit :: \<open>nat \<Rightarrow> 'a \<Rightarrow> 'a\<close> |
|
366 where \<open>flip_bit n a = a XOR push_bit n 1\<close> |
|
367 |
192 |
368 lemma bit_set_bit_iff [bit_simps]: |
193 lemma bit_set_bit_iff [bit_simps]: |
369 \<open>bit (set_bit m a) n \<longleftrightarrow> bit a n \<or> (m = n \<and> 2 ^ n \<noteq> 0)\<close> |
194 \<open>bit (set_bit m a) n \<longleftrightarrow> bit a n \<or> (m = n \<and> 2 ^ n \<noteq> 0)\<close> |
370 by (auto simp add: set_bit_def push_bit_of_1 bit_or_iff bit_exp_iff) |
195 by (auto simp add: set_bit_def push_bit_of_1 bit_or_iff bit_exp_iff) |
371 |
196 |
372 lemma even_set_bit_iff: |
197 lemma even_set_bit_iff: |
373 \<open>even (set_bit m a) \<longleftrightarrow> even a \<and> m \<noteq> 0\<close> |
198 \<open>even (set_bit m a) \<longleftrightarrow> even a \<and> m \<noteq> 0\<close> |
374 using bit_set_bit_iff [of m a 0] by auto |
199 using bit_set_bit_iff [of m a 0] by auto |
375 |
200 |
376 lemma bit_unset_bit_iff [bit_simps]: |
|
377 \<open>bit (unset_bit m a) n \<longleftrightarrow> bit a n \<and> m \<noteq> n\<close> |
|
378 by (auto simp add: unset_bit_def push_bit_of_1 bit_and_iff bit_not_iff bit_exp_iff exp_eq_0_imp_not_bit) |
|
379 |
|
380 lemma even_unset_bit_iff: |
201 lemma even_unset_bit_iff: |
381 \<open>even (unset_bit m a) \<longleftrightarrow> even a \<or> m = 0\<close> |
202 \<open>even (unset_bit m a) \<longleftrightarrow> even a \<or> m = 0\<close> |
382 using bit_unset_bit_iff [of m a 0] by auto |
203 using bit_unset_bit_iff [of m a 0] by auto |
|
204 |
|
205 lemmas flip_bit_def = flip_bit_eq_xor |
383 |
206 |
384 lemma bit_flip_bit_iff [bit_simps]: |
207 lemma bit_flip_bit_iff [bit_simps]: |
385 \<open>bit (flip_bit m a) n \<longleftrightarrow> (m = n \<longleftrightarrow> \<not> bit a n) \<and> 2 ^ n \<noteq> 0\<close> |
208 \<open>bit (flip_bit m a) n \<longleftrightarrow> (m = n \<longleftrightarrow> \<not> bit a n) \<and> 2 ^ n \<noteq> 0\<close> |
386 by (auto simp add: flip_bit_def push_bit_of_1 bit_xor_iff bit_exp_iff exp_eq_0_imp_not_bit) |
209 by (auto simp add: flip_bit_def push_bit_of_1 bit_xor_iff bit_exp_iff exp_eq_0_imp_not_bit) |
387 |
210 |
493 by (rule bit_eqI) (auto simp add: bit_take_bit_iff bit_unset_bit_iff) |
316 by (rule bit_eqI) (auto simp add: bit_take_bit_iff bit_unset_bit_iff) |
494 |
317 |
495 lemma take_bit_flip_bit_eq: |
318 lemma take_bit_flip_bit_eq: |
496 \<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> |
319 \<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> |
497 by (rule bit_eqI) (auto simp add: bit_take_bit_iff bit_flip_bit_iff) |
320 by (rule bit_eqI) (auto simp add: bit_take_bit_iff bit_flip_bit_iff) |
|
321 |
|
322 |
|
323 end |
|
324 |
|
325 class ring_bit_operations = semiring_bit_operations + ring_parity + |
|
326 fixes not :: \<open>'a \<Rightarrow> 'a\<close> (\<open>NOT\<close>) |
|
327 assumes bit_not_iff [bit_simps]: \<open>\<And>n. bit (NOT a) n \<longleftrightarrow> 2 ^ n \<noteq> 0 \<and> \<not> bit a n\<close> |
|
328 assumes minus_eq_not_minus_1: \<open>- a = NOT (a - 1)\<close> |
|
329 begin |
|
330 |
|
331 text \<open> |
|
332 For the sake of code generation \<^const>\<open>not\<close> is specified as |
|
333 definitional class operation. Note that \<^const>\<open>not\<close> has no |
|
334 sensible definition for unlimited but only positive bit strings |
|
335 (type \<^typ>\<open>nat\<close>). |
|
336 \<close> |
|
337 |
|
338 lemma bits_minus_1_mod_2_eq [simp]: |
|
339 \<open>(- 1) mod 2 = 1\<close> |
|
340 by (simp add: mod_2_eq_odd) |
|
341 |
|
342 lemma not_eq_complement: |
|
343 \<open>NOT a = - a - 1\<close> |
|
344 using minus_eq_not_minus_1 [of \<open>a + 1\<close>] by simp |
|
345 |
|
346 lemma minus_eq_not_plus_1: |
|
347 \<open>- a = NOT a + 1\<close> |
|
348 using not_eq_complement [of a] by simp |
|
349 |
|
350 lemma bit_minus_iff [bit_simps]: |
|
351 \<open>bit (- a) n \<longleftrightarrow> 2 ^ n \<noteq> 0 \<and> \<not> bit (a - 1) n\<close> |
|
352 by (simp add: minus_eq_not_minus_1 bit_not_iff) |
|
353 |
|
354 lemma even_not_iff [simp]: |
|
355 "even (NOT a) \<longleftrightarrow> odd a" |
|
356 using bit_not_iff [of a 0] by auto |
|
357 |
|
358 lemma bit_not_exp_iff [bit_simps]: |
|
359 \<open>bit (NOT (2 ^ m)) n \<longleftrightarrow> 2 ^ n \<noteq> 0 \<and> n \<noteq> m\<close> |
|
360 by (auto simp add: bit_not_iff bit_exp_iff) |
|
361 |
|
362 lemma bit_minus_1_iff [simp]: |
|
363 \<open>bit (- 1) n \<longleftrightarrow> 2 ^ n \<noteq> 0\<close> |
|
364 by (simp add: bit_minus_iff) |
|
365 |
|
366 lemma bit_minus_exp_iff [bit_simps]: |
|
367 \<open>bit (- (2 ^ m)) n \<longleftrightarrow> 2 ^ n \<noteq> 0 \<and> n \<ge> m\<close> |
|
368 by (auto simp add: bit_simps simp flip: mask_eq_exp_minus_1) |
|
369 |
|
370 lemma bit_minus_2_iff [simp]: |
|
371 \<open>bit (- 2) n \<longleftrightarrow> 2 ^ n \<noteq> 0 \<and> n > 0\<close> |
|
372 by (simp add: bit_minus_iff bit_1_iff) |
|
373 |
|
374 lemma not_one [simp]: |
|
375 "NOT 1 = - 2" |
|
376 by (simp add: bit_eq_iff bit_not_iff) (simp add: bit_1_iff) |
|
377 |
|
378 sublocale "and": semilattice_neutr \<open>(AND)\<close> \<open>- 1\<close> |
|
379 by standard (rule bit_eqI, simp add: bit_and_iff) |
|
380 |
|
381 sublocale bit: boolean_algebra \<open>(AND)\<close> \<open>(OR)\<close> NOT 0 \<open>- 1\<close> |
|
382 rewrites \<open>bit.xor = (XOR)\<close> |
|
383 proof - |
|
384 interpret bit: boolean_algebra \<open>(AND)\<close> \<open>(OR)\<close> NOT 0 \<open>- 1\<close> |
|
385 by standard (auto simp add: bit_and_iff bit_or_iff bit_not_iff intro: bit_eqI) |
|
386 show \<open>boolean_algebra (AND) (OR) NOT 0 (- 1)\<close> |
|
387 by standard |
|
388 show \<open>boolean_algebra.xor (AND) (OR) NOT = (XOR)\<close> |
|
389 by (rule ext, rule ext, rule bit_eqI) |
|
390 (auto simp add: bit.xor_def bit_and_iff bit_or_iff bit_xor_iff bit_not_iff) |
|
391 qed |
|
392 |
|
393 lemma and_eq_not_not_or: |
|
394 \<open>a AND b = NOT (NOT a OR NOT b)\<close> |
|
395 by simp |
|
396 |
|
397 lemma or_eq_not_not_and: |
|
398 \<open>a OR b = NOT (NOT a AND NOT b)\<close> |
|
399 by simp |
|
400 |
|
401 lemma not_add_distrib: |
|
402 \<open>NOT (a + b) = NOT a - b\<close> |
|
403 by (simp add: not_eq_complement algebra_simps) |
|
404 |
|
405 lemma not_diff_distrib: |
|
406 \<open>NOT (a - b) = NOT a + b\<close> |
|
407 using not_add_distrib [of a \<open>- b\<close>] by simp |
|
408 |
|
409 lemma (in ring_bit_operations) and_eq_minus_1_iff: |
|
410 \<open>a AND b = - 1 \<longleftrightarrow> a = - 1 \<and> b = - 1\<close> |
|
411 proof |
|
412 assume \<open>a = - 1 \<and> b = - 1\<close> |
|
413 then show \<open>a AND b = - 1\<close> |
|
414 by simp |
|
415 next |
|
416 assume \<open>a AND b = - 1\<close> |
|
417 have *: \<open>bit a n\<close> \<open>bit b n\<close> if \<open>2 ^ n \<noteq> 0\<close> for n |
|
418 proof - |
|
419 from \<open>a AND b = - 1\<close> |
|
420 have \<open>bit (a AND b) n = bit (- 1) n\<close> |
|
421 by (simp add: bit_eq_iff) |
|
422 then show \<open>bit a n\<close> \<open>bit b n\<close> |
|
423 using that by (simp_all add: bit_and_iff) |
|
424 qed |
|
425 have \<open>a = - 1\<close> |
|
426 by (rule bit_eqI) (simp add: *) |
|
427 moreover have \<open>b = - 1\<close> |
|
428 by (rule bit_eqI) (simp add: *) |
|
429 ultimately show \<open>a = - 1 \<and> b = - 1\<close> |
|
430 by simp |
|
431 qed |
|
432 |
|
433 lemma disjunctive_diff: |
|
434 \<open>a - b = a AND NOT b\<close> if \<open>\<And>n. bit b n \<Longrightarrow> bit a n\<close> |
|
435 proof - |
|
436 have \<open>NOT a + b = NOT a OR b\<close> |
|
437 by (rule disjunctive_add) (auto simp add: bit_not_iff dest: that) |
|
438 then have \<open>NOT (NOT a + b) = NOT (NOT a OR b)\<close> |
|
439 by simp |
|
440 then show ?thesis |
|
441 by (simp add: not_add_distrib) |
|
442 qed |
|
443 |
|
444 lemma push_bit_minus: |
|
445 \<open>push_bit n (- a) = - push_bit n a\<close> |
|
446 by (simp add: push_bit_eq_mult) |
|
447 |
|
448 lemma take_bit_not_take_bit: |
|
449 \<open>take_bit n (NOT (take_bit n a)) = take_bit n (NOT a)\<close> |
|
450 by (auto simp add: bit_eq_iff bit_take_bit_iff bit_not_iff) |
|
451 |
|
452 lemma take_bit_not_iff: |
|
453 "take_bit n (NOT a) = take_bit n (NOT b) \<longleftrightarrow> take_bit n a = take_bit n b" |
|
454 apply (simp add: bit_eq_iff) |
|
455 apply (simp add: bit_not_iff bit_take_bit_iff bit_exp_iff) |
|
456 apply (use exp_eq_0_imp_not_bit in blast) |
|
457 done |
|
458 |
|
459 lemma take_bit_not_eq_mask_diff: |
|
460 \<open>take_bit n (NOT a) = mask n - take_bit n a\<close> |
|
461 proof - |
|
462 have \<open>take_bit n (NOT a) = take_bit n (NOT (take_bit n a))\<close> |
|
463 by (simp add: take_bit_not_take_bit) |
|
464 also have \<open>\<dots> = mask n AND NOT (take_bit n a)\<close> |
|
465 by (simp add: take_bit_eq_mask ac_simps) |
|
466 also have \<open>\<dots> = mask n - take_bit n a\<close> |
|
467 by (subst disjunctive_diff) |
|
468 (auto simp add: bit_take_bit_iff bit_mask_iff exp_eq_0_imp_not_bit) |
|
469 finally show ?thesis |
|
470 by simp |
|
471 qed |
|
472 |
|
473 lemma mask_eq_take_bit_minus_one: |
|
474 \<open>mask n = take_bit n (- 1)\<close> |
|
475 by (simp add: bit_eq_iff bit_mask_iff bit_take_bit_iff conj_commute) |
|
476 |
|
477 lemma take_bit_minus_one_eq_mask: |
|
478 \<open>take_bit n (- 1) = mask n\<close> |
|
479 by (simp add: mask_eq_take_bit_minus_one) |
|
480 |
|
481 lemma minus_exp_eq_not_mask: |
|
482 \<open>- (2 ^ n) = NOT (mask n)\<close> |
|
483 by (rule bit_eqI) (simp add: bit_minus_iff bit_not_iff flip: mask_eq_exp_minus_1) |
|
484 |
|
485 lemma push_bit_minus_one_eq_not_mask: |
|
486 \<open>push_bit n (- 1) = NOT (mask n)\<close> |
|
487 by (simp add: push_bit_eq_mult minus_exp_eq_not_mask) |
|
488 |
|
489 lemma take_bit_not_mask_eq_0: |
|
490 \<open>take_bit m (NOT (mask n)) = 0\<close> if \<open>n \<ge> m\<close> |
|
491 by (rule bit_eqI) (use that in \<open>simp add: bit_take_bit_iff bit_not_iff bit_mask_iff\<close>) |
|
492 |
|
493 lemma unset_bit_eq_and_not: |
|
494 \<open>unset_bit n a = a AND NOT (push_bit n 1)\<close> |
|
495 by (rule bit_eqI) (auto simp add: bit_simps) |
|
496 |
|
497 lemmas unset_bit_def = unset_bit_eq_and_not |
498 |
498 |
499 end |
499 end |
500 |
500 |
501 |
501 |
502 subsection \<open>Instance \<^typ>\<open>int\<close>\<close> |
502 subsection \<open>Instance \<^typ>\<open>int\<close>\<close> |
660 by (auto simp add: xor_int_def bit_or_int_iff bit_and_int_iff bit_not_int_iff) |
660 by (auto simp add: xor_int_def bit_or_int_iff bit_and_int_iff bit_not_int_iff) |
661 |
661 |
662 definition mask_int :: \<open>nat \<Rightarrow> int\<close> |
662 definition mask_int :: \<open>nat \<Rightarrow> int\<close> |
663 where \<open>mask n = (2 :: int) ^ n - 1\<close> |
663 where \<open>mask n = (2 :: int) ^ n - 1\<close> |
664 |
664 |
|
665 definition set_bit_int :: \<open>nat \<Rightarrow> int \<Rightarrow> int\<close> |
|
666 where \<open>set_bit n k = k OR push_bit n 1\<close> for k :: int |
|
667 |
|
668 definition unset_bit_int :: \<open>nat \<Rightarrow> int \<Rightarrow> int\<close> |
|
669 where \<open>unset_bit n k = k AND NOT (push_bit n 1)\<close> for k :: int |
|
670 |
|
671 definition flip_bit_int :: \<open>nat \<Rightarrow> int \<Rightarrow> int\<close> |
|
672 where \<open>flip_bit n k = k XOR push_bit n 1\<close> for k :: int |
|
673 |
665 instance proof |
674 instance proof |
666 fix k l :: int and n :: nat |
675 fix k l :: int and m n :: nat |
667 show \<open>- k = NOT (k - 1)\<close> |
676 show \<open>- k = NOT (k - 1)\<close> |
668 by (simp add: not_int_def) |
677 by (simp add: not_int_def) |
669 show \<open>bit (k AND l) n \<longleftrightarrow> bit k n \<and> bit l n\<close> |
678 show \<open>bit (k AND l) n \<longleftrightarrow> bit k n \<and> bit l n\<close> |
670 by (fact bit_and_int_iff) |
679 by (fact bit_and_int_iff) |
671 show \<open>bit (k OR l) n \<longleftrightarrow> bit k n \<or> bit l n\<close> |
680 show \<open>bit (k OR l) n \<longleftrightarrow> bit k n \<or> bit l n\<close> |
672 by (fact bit_or_int_iff) |
681 by (fact bit_or_int_iff) |
673 show \<open>bit (k XOR l) n \<longleftrightarrow> bit k n \<noteq> bit l n\<close> |
682 show \<open>bit (k XOR l) n \<longleftrightarrow> bit k n \<noteq> bit l n\<close> |
674 by (fact bit_xor_int_iff) |
683 by (fact bit_xor_int_iff) |
675 qed (simp_all add: bit_not_int_iff mask_int_def) |
684 show \<open>bit (unset_bit m k) n \<longleftrightarrow> bit k n \<and> m \<noteq> n\<close> |
|
685 proof - |
|
686 have \<open>unset_bit m k = k AND NOT (push_bit m 1)\<close> |
|
687 by (simp add: unset_bit_int_def) |
|
688 also have \<open>NOT (push_bit m 1 :: int) = - (push_bit m 1 + 1)\<close> |
|
689 by (simp add: not_int_def) |
|
690 finally show ?thesis by (simp only: bit_simps bit_and_int_iff) (auto simp add: bit_simps) |
|
691 qed |
|
692 qed (simp_all add: bit_not_int_iff mask_int_def set_bit_int_def flip_bit_int_def) |
676 |
693 |
677 end |
694 end |
678 |
695 |
679 |
696 |
680 lemma mask_half_int: |
697 lemma mask_half_int: |
1590 where \<open>m XOR n = nat (int m XOR int n)\<close> for m n :: nat |
1607 where \<open>m XOR n = nat (int m XOR int n)\<close> for m n :: nat |
1591 |
1608 |
1592 definition mask_nat :: \<open>nat \<Rightarrow> nat\<close> |
1609 definition mask_nat :: \<open>nat \<Rightarrow> nat\<close> |
1593 where \<open>mask n = (2 :: nat) ^ n - 1\<close> |
1610 where \<open>mask n = (2 :: nat) ^ n - 1\<close> |
1594 |
1611 |
|
1612 definition set_bit_nat :: \<open>nat \<Rightarrow> nat \<Rightarrow> nat\<close> |
|
1613 where \<open>set_bit m n = n OR push_bit m 1\<close> for m n :: nat |
|
1614 |
|
1615 definition unset_bit_nat :: \<open>nat \<Rightarrow> nat \<Rightarrow> nat\<close> |
|
1616 where \<open>unset_bit m n = (if bit n m then n - push_bit m 1 else n)\<close> for m n :: nat |
|
1617 |
|
1618 definition flip_bit_nat :: \<open>nat \<Rightarrow> nat \<Rightarrow> nat\<close> |
|
1619 where \<open>flip_bit m n = n XOR push_bit m 1\<close> for m n :: nat |
|
1620 |
1595 instance proof |
1621 instance proof |
1596 fix m n q :: nat |
1622 fix m n q :: nat |
1597 show \<open>bit (m AND n) q \<longleftrightarrow> bit m q \<and> bit n q\<close> |
1623 show \<open>bit (m AND n) q \<longleftrightarrow> bit m q \<and> bit n q\<close> |
1598 by (simp add: and_nat_def bit_simps) |
1624 by (simp add: and_nat_def bit_simps) |
1599 show \<open>bit (m OR n) q \<longleftrightarrow> bit m q \<or> bit n q\<close> |
1625 show \<open>bit (m OR n) q \<longleftrightarrow> bit m q \<or> bit n q\<close> |
1600 by (simp add: or_nat_def bit_simps) |
1626 by (simp add: or_nat_def bit_simps) |
1601 show \<open>bit (m XOR n) q \<longleftrightarrow> bit m q \<noteq> bit n q\<close> |
1627 show \<open>bit (m XOR n) q \<longleftrightarrow> bit m q \<noteq> bit n q\<close> |
1602 by (simp add: xor_nat_def bit_simps) |
1628 by (simp add: xor_nat_def bit_simps) |
1603 qed (simp add: mask_nat_def) |
1629 show \<open>bit (unset_bit m n) q \<longleftrightarrow> bit n q \<and> m \<noteq> q\<close> |
|
1630 proof (cases \<open>bit n m\<close>) |
|
1631 case False |
|
1632 then show ?thesis by (auto simp add: unset_bit_nat_def) |
|
1633 next |
|
1634 case True |
|
1635 have \<open>push_bit m (drop_bit m n) + take_bit m n = n\<close> |
|
1636 by (fact bits_ident) |
|
1637 also from \<open>bit n m\<close> have \<open>drop_bit m n = 2 * drop_bit (Suc m) n + 1\<close> |
|
1638 by (simp add: drop_bit_Suc drop_bit_half even_drop_bit_iff_not_bit ac_simps) |
|
1639 finally have \<open>push_bit m (2 * drop_bit (Suc m) n) + take_bit m n + push_bit m 1 = n\<close> |
|
1640 by (simp only: push_bit_add ac_simps) |
|
1641 then have \<open>n - push_bit m 1 = push_bit m (2 * drop_bit (Suc m) n) + take_bit m n\<close> |
|
1642 by simp |
|
1643 then have \<open>n - push_bit m 1 = push_bit m (2 * drop_bit (Suc m) n) OR take_bit m n\<close> |
|
1644 by (simp add: or_nat_def bit_simps flip: disjunctive_add) |
|
1645 with \<open>bit n m\<close> show ?thesis |
|
1646 by (auto simp add: unset_bit_nat_def or_nat_def bit_simps) |
|
1647 qed |
|
1648 qed (simp_all add: mask_nat_def set_bit_nat_def flip_bit_nat_def) |
1604 |
1649 |
1605 end |
1650 end |
1606 |
1651 |
1607 lemma and_nat_rec: |
1652 lemma and_nat_rec: |
1608 \<open>m AND n = of_bool (odd m \<and> odd n) + 2 * ((m div 2) AND (n div 2))\<close> for m n :: nat |
1653 \<open>m AND n = of_bool (odd m \<and> odd n) + 2 * ((m div 2) AND (n div 2))\<close> for m n :: nat |