# HG changeset patch # User haftmann # Date 1592471274 0 # Node ID 4320875eb8a12c77337f384e8e919a297674a95b # Parent 3e162c63371a79271344fa5b27e029a6be7acd5c more lemmas diff -r 3e162c63371a -r 4320875eb8a1 src/HOL/Parity.thy --- a/src/HOL/Parity.thy Thu Jun 18 09:07:30 2020 +0000 +++ b/src/HOL/Parity.thy Thu Jun 18 09:07:54 2020 +0000 @@ -1296,10 +1296,6 @@ "drop_bit n (of_bool b) = of_bool (n = 0 \ b)" by (cases n) simp_all -lemma take_bit_eq_0_imp_dvd: - "take_bit n a = 0 \ 2 ^ n dvd a" - by (simp add: take_bit_eq_mod mod_0_imp_dvd) - lemma even_take_bit_eq [simp]: \even (take_bit n a) \ n = 0 \ even a\ by (simp add: take_bit_rec [of n a]) @@ -1388,6 +1384,30 @@ by (simp add: bit_take_bit_iff bit_mask_iff stable_imp_bit_iff_odd) qed +lemma exp_dvdE: + assumes \2 ^ n dvd a\ + obtains b where \a = push_bit n b\ +proof - + from assms obtain b where \a = 2 ^ n * b\ .. + then have \a = push_bit n b\ + by (simp add: push_bit_eq_mult ac_simps) + with that show thesis . +qed + +lemma take_bit_eq_0_iff: + \take_bit n a = 0 \ 2 ^ n dvd a\ (is \?P \ ?Q\) +proof + assume ?P + then show ?Q + by (simp add: take_bit_eq_mod mod_0_imp_dvd) +next + assume ?Q + then obtain b where \a = push_bit n b\ + by (rule exp_dvdE) + then show ?P + by (simp add: take_bit_push_bit) +qed + end instantiation nat :: semiring_bit_shifts @@ -1466,10 +1486,6 @@ "take_bit n (take_bit n a + take_bit n b) = take_bit n (a + b)" by (simp add: take_bit_eq_mod mod_simps) -lemma take_bit_eq_0_iff: - "take_bit n a = 0 \ 2 ^ n dvd a" - by (simp add: take_bit_eq_mod mod_eq_0_iff_dvd) - lemma take_bit_of_1_eq_0_iff [simp]: "take_bit n 1 = 0 \ n = 0" by (simp add: take_bit_eq_mod) diff -r 3e162c63371a -r 4320875eb8a1 src/HOL/Word/Word.thy --- a/src/HOL/Word/Word.thy Thu Jun 18 09:07:30 2020 +0000 +++ b/src/HOL/Word/Word.thy Thu Jun 18 09:07:54 2020 +0000 @@ -385,7 +385,7 @@ begin lemma [transfer_rule]: - "(pcr_word ===> (\)) even ((dvd) 2 :: 'a::len word \ bool)" + \(pcr_word ===> (\)) even ((dvd) 2 :: 'a::len word \ bool)\ proof - have even_word_unfold: "even k \ (\l. take_bit LENGTH('a) k = take_bit LENGTH('a) (2 * l))" (is "?P \ ?Q") for k :: int @@ -449,6 +449,24 @@ \2 ^ n = (0 :: 'a::len word) \ n \ LENGTH('a)\ by transfer simp +lemma double_eq_zero_iff: + \2 * a = 0 \ a = 0 \ a = 2 ^ (LENGTH('a) - Suc 0)\ + for a :: \'a::len word\ +proof - + define n where \n = LENGTH('a) - Suc 0\ + then have *: \LENGTH('a) = Suc n\ + by simp + have \a = 0\ if \2 * a = 0\ and \a \ 2 ^ (LENGTH('a) - Suc 0)\ + using that by transfer + (auto simp add: take_bit_eq_0_iff take_bit_eq_mod *) + moreover have \2 ^ LENGTH('a) = (0 :: 'a word)\ + by transfer simp + then have \2 * 2 ^ (LENGTH('a) - Suc 0) = (0 :: 'a word)\ + by (simp add: *) + ultimately show ?thesis + by auto +qed + subsection \Ordering\ @@ -779,6 +797,11 @@ end +lemma bit_word_eqI: + \a = b\ if \\n. n \ LENGTH('a) \ bit a n \ bit b n\ + for a b :: \'a::len word\ + by (rule bit_eqI, rule that) (simp add: exp_eq_zero_iff) + definition shiftl1 :: "'a::len word \ 'a word" where "shiftl1 w = word_of_int (uint w BIT False)" @@ -1453,6 +1476,16 @@ by (simp add: ucast_def test_bit_bin word_ubin.eq_norm nth_bintr word_size) (fast elim!: bin_nth_uint_imp) +context + includes lifting_syntax +begin + +lemma transfer_rule_mask_word [transfer_rule]: + \((=) ===> pcr_word) Bit_Operations.mask Bit_Operations.mask\ + by (simp only: mask_eq_exp_minus_1 [abs_def]) transfer_prover + +end + lemma ucast_mask_eq: \ucast (Bit_Operations.mask n :: 'b word) = Bit_Operations.mask (min LENGTH('b::len) n)\ by (simp add: bit_eq_iff) (auto simp add: bit_mask_iff bit_ucast_iff exp_eq_zero_iff)