diff -r 554385d4cf59 -r 0bb0cb558bf9 src/HOL/ex/Word.thy --- a/src/HOL/ex/Word.thy Sun Jan 26 20:35:32 2020 +0000 +++ b/src/HOL/ex/Word.thy Sun Jan 26 20:35:32 2020 +0000 @@ -540,6 +540,18 @@ qed qed +lemma even_mult_exp_div_word_iff: + \even (a * 2 ^ m div 2 ^ n) \ \ ( + m \ n \ + n < LENGTH('a) \ odd (a div 2 ^ (n - m)))\ for a :: \'a::len word\ + by transfer + (auto simp flip: drop_bit_eq_div simp add: even_drop_bit_iff_not_bit bit_take_bit_iff, + simp_all flip: push_bit_eq_mult add: bit_push_bit_eq_int) + +(*lemma even_range_div_iff_word: + \even ((2 ^ m - 1) div (2::'a word) ^ n) \ 2 ^ n = (0::'a::len word) \ m \ n\ + by transfer (auto simp add: take_bit_of_range even_range_div_iff)*) + instance word :: (len) semiring_bits proof show \P a\ if stable: \\a. a div 2 = a \ P a\ @@ -663,10 +675,10 @@ lift_definition not_word :: "'a word \ 'a word" is not - by (simp add: take_bit_not_iff) + by (simp add: take_bit_not_iff_int) lift_definition and_word :: "'a word \ 'a word \ 'a word" - is "and" + is \and\ by simp lift_definition or_word :: "'a word \ 'a word \ 'a word" @@ -679,8 +691,8 @@ instance proof fix a b :: \'a word\ and n :: nat - show \even (- 1 div (2 :: 'a word) ^ n) \ (2 :: 'a word) ^ n = 0\ - by transfer (simp flip: drop_bit_eq_div add: drop_bit_take_bit) + show \- a = NOT (a - 1)\ + by transfer (simp add: minus_eq_not_minus_1) show \bit (NOT a) n \ (2 :: 'a word) ^ n \ 0 \ \ bit a n\ by transfer (simp add: bit_not_iff) show \bit (a AND b) n \ bit a n \ bit b n\