# HG changeset patch # User haftmann # Date 1580070932 0 # Node ID 0bb0cb558bf9a3d9854d47788074414ed48b4322 # Parent 554385d4cf59499ee20fc2eb005cf8c3b5af8d60 sketches of ideas still to come diff -r 554385d4cf59 -r 0bb0cb558bf9 src/HOL/ex/Bit_Operations.thy --- a/src/HOL/ex/Bit_Operations.thy Sun Jan 26 20:35:32 2020 +0000 +++ b/src/HOL/ex/Bit_Operations.thy Sun Jan 26 20:35:32 2020 +0000 @@ -9,14 +9,49 @@ Main begin +lemma bit_push_bit_eq_int: + \bit (push_bit m k) n \ m \ n \ bit k (n - m)\ for k :: int +proof (cases \m \ n\) + case True + then obtain q where \n = m + q\ + using le_Suc_ex by blast + with True show ?thesis + by (simp add: push_bit_eq_mult bit_def power_add) +next + case False + then obtain q where \m = Suc (n + q)\ + using less_imp_Suc_add not_le by blast + with False show ?thesis + by (simp add: push_bit_eq_mult bit_def power_add) +qed + context semiring_bits begin +(*lemma range_rec: + \2 ^ Suc n - 1 = 1 + 2 * (2 ^ n - 1)\ + sorry + +lemma even_range_div_iff: + \even ((2 ^ m - 1) div 2 ^ n) \ 2 ^ n = 0 \ m \ n\ + sorry*) + +(*lemma even_range_iff [simp]: + \even (2 ^ n - 1) \ n = 0\ + by (induction n) (simp_all only: range_rec, simp_all) + +lemma bit_range_iff: + \bit (2 ^ m - 1) n \ 2 ^ n \ 0 \ n < m\ + by (simp add: bit_def even_range_div_iff not_le)*) + end context semiring_bit_shifts begin +(*lemma bit_push_bit_iff: + \bit (push_bit m a) n \ n \ m \ 2 ^ n \ 0 \ bit a (n - m)\*) + end @@ -94,21 +129,64 @@ \flip_bit (Suc n) a = a mod 2 + 2 * flip_bit n (a div 2)\ by (simp add: flip_bit_def) +lemma take_bit_and [simp]: + \take_bit n (a AND b) = take_bit n a AND take_bit n b\ + by (auto simp add: bit_eq_iff bit_take_bit_iff bit_and_iff) + +lemma take_bit_or [simp]: + \take_bit n (a OR b) = take_bit n a OR take_bit n b\ + by (auto simp add: bit_eq_iff bit_take_bit_iff bit_or_iff) + +lemma take_bit_xor [simp]: + \take_bit n (a XOR b) = take_bit n a XOR take_bit n b\ + by (auto simp add: bit_eq_iff bit_take_bit_iff bit_xor_iff) + end class ring_bit_operations = semiring_bit_operations + ring_parity + fixes not :: \'a \ 'a\ (\NOT\) - assumes bits_even_minus_1_div_exp_iff [simp]: \even (- 1 div 2 ^ n) \ 2 ^ n = 0\ assumes bit_not_iff: \\n. bit (NOT a) n \ 2 ^ n \ 0 \ \ bit a n\ + assumes minus_eq_not_minus_1: \- a = NOT (a - 1)\ begin +text \ + For the sake of code generation \<^const>\not\ is specified as + definitional class operation. Note that \<^const>\not\ has no + sensible definition for unlimited but only positive bit strings + (type \<^typ>\nat\). +\ + lemma bits_minus_1_mod_2_eq [simp]: \(- 1) mod 2 = 1\ by (simp add: mod_2_eq_odd) +lemma not_eq_complement: + \NOT a = - a - 1\ + using minus_eq_not_minus_1 [of \a + 1\] by simp + +lemma minus_eq_not_plus_1: + \- a = NOT a + 1\ + using not_eq_complement [of a] by simp + +lemma bit_minus_iff: + \bit (- a) n \ 2 ^ n \ 0 \ \ bit (a - 1) n\ + by (simp add: minus_eq_not_minus_1 bit_not_iff) + +lemma bit_not_exp_iff: + \bit (NOT (2 ^ m)) n \ 2 ^ n \ 0 \ n \ m\ + by (auto simp add: bit_not_iff bit_exp_iff) + lemma bit_minus_1_iff [simp]: \bit (- 1) n \ 2 ^ n \ 0\ - by (simp add: bit_def) + by (simp add: bit_minus_iff) + +lemma bit_minus_exp_iff: + \bit (- (2 ^ m)) n \ 2 ^ n \ 0 \ n \ m\ + oops + +lemma bit_minus_2_iff [simp]: + \bit (- 2) n \ 2 ^ n \ 0 \ n > 0\ + by (simp add: bit_minus_iff bit_1_iff) sublocale bit: boolean_algebra \(AND)\ \(OR)\ NOT 0 \- 1\ rewrites \bit.xor = (XOR)\ @@ -116,6 +194,7 @@ interpret bit: boolean_algebra \(AND)\ \(OR)\ NOT 0 \- 1\ apply standard apply (auto simp add: bit_eq_iff bit_and_iff bit_or_iff bit_not_iff) + apply (simp_all add: bit_exp_iff) apply (metis local.bit_def local.bit_exp_iff local.bits_div_by_0) apply (metis local.bit_def local.bit_exp_iff local.bits_div_by_0) done @@ -123,21 +202,16 @@ by standard show \boolean_algebra.xor (AND) (OR) NOT = (XOR)\ apply (auto simp add: fun_eq_iff bit.xor_def bit_eq_iff bit_and_iff bit_or_iff bit_not_iff bit_xor_iff) - apply (metis local.bit_def local.bit_exp_iff local.bits_div_by_0) + apply (simp add: bit_exp_iff, simp add: bit_def) apply (metis local.bit_def local.bit_exp_iff local.bits_div_by_0) apply (metis local.bit_def local.bit_exp_iff local.bits_div_by_0) - apply (metis local.bit_def local.bit_exp_iff local.bits_div_by_0) - apply (metis local.bit_def local.bit_exp_iff local.bits_div_by_0) - apply (metis local.bit_def local.bit_exp_iff local.bits_div_by_0) + apply (simp_all add: bit_exp_iff, simp_all add: bit_def) done qed -text \ - For the sake of code generation \<^const>\not\ is specified as - definitional class operation. Note that \<^const>\not\ has no - sensible definition for unlimited but only positive bit strings - (type \<^typ>\nat\). -\ +lemma take_bit_not_take_bit: + \take_bit n (NOT (take_bit n a)) = take_bit n (NOT a)\ + by (auto simp add: bit_eq_iff bit_take_bit_iff bit_not_iff) end @@ -700,6 +774,8 @@ instance proof fix k l :: int and n :: nat + show \- k = NOT (k - 1)\ + by (simp add: not_int_def) show \bit (k AND l) n \ bit k n \ bit l n\ proof (rule sym, induction n arbitrary: k l) case 0 @@ -736,7 +812,7 @@ lemma one_and_int_eq [simp]: "1 AND k = k mod 2" for k :: int - using and_int.rec [of 1] by (simp add: mod2_eq_if) + by (simp add: bit_eq_iff bit_and_iff mod2_eq_if) (auto simp add: bit_1_iff) lemma and_one_int_eq [simp]: "k AND 1 = k mod 2" for k :: int @@ -763,29 +839,9 @@ for k l :: int by (simp add: take_bit_eq_mod mod_eq_dvd_iff dvd_diff_commute) -lemma take_bit_not_iff: +lemma take_bit_not_iff_int: "take_bit n (NOT k) = take_bit n (NOT l) \ take_bit n k = take_bit n l" for k l :: int by (auto simp add: bit_eq_iff bit_take_bit_iff bit_not_iff_int) -lemma take_bit_not_take_bit: - \take_bit n (NOT (take_bit n k)) = take_bit n (NOT k)\ - for k :: int - by (auto simp add: bit_eq_iff bit_take_bit_iff bit_not_iff) - -lemma take_bit_and [simp]: - "take_bit n (k AND l) = take_bit n k AND take_bit n l" - for k l :: int - by (auto simp add: bit_eq_iff bit_take_bit_iff bit_and_iff) - -lemma take_bit_or [simp]: - "take_bit n (k OR l) = take_bit n k OR take_bit n l" - for k l :: int - by (auto simp add: bit_eq_iff bit_take_bit_iff bit_or_iff) - -lemma take_bit_xor [simp]: - "take_bit n (k XOR l) = take_bit n k XOR take_bit n l" - for k l :: int - by (auto simp add: bit_eq_iff bit_take_bit_iff bit_xor_iff) - end 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\