# HG changeset patch # User haftmann # Date 1593757109 0 # Node ID 8bff286878bf6cb81af9bb2fcfbfb934fc4809d0 # Parent 66beb9d92e4330f3057870bf6a31eed972fbd35f misc lemma tuning diff -r 66beb9d92e43 -r 8bff286878bf src/HOL/Divides.thy --- a/src/HOL/Divides.thy Fri Jul 03 06:18:27 2020 +0000 +++ b/src/HOL/Divides.thy Fri Jul 03 06:18:29 2020 +0000 @@ -495,6 +495,42 @@ lemma zmod_minus1: "0 < b \ - 1 mod b = b - 1" for b :: int by (auto simp add: modulo_int_def) +lemma minus_mod_int_eq: + \- k mod l = l - 1 - (k - 1) mod l\ if \l \ 0\ for k l :: int +proof (cases \l = 0\) + case True + then show ?thesis + by simp +next + case False + with that have \l > 0\ + by simp + then show ?thesis + proof (cases \l dvd k\) + case True + then obtain j where \k = l * j\ .. + moreover have \(l * j mod l - 1) mod l = l - 1\ + using \l > 0\ by (simp add: zmod_minus1) + then have \(l * j - 1) mod l = l - 1\ + by (simp only: mod_simps) + ultimately show ?thesis + by simp + next + case False + moreover have \0 < k mod l\ \k mod l < 1 + l\ + using \0 < l\ le_imp_0_less False apply auto + using le_less apply fastforce + using pos_mod_bound [of l k] apply linarith + done + with \l > 0\ have \(k mod l - 1) mod l = k mod l - 1\ + by (simp add: zmod_trival_iff) + ultimately show ?thesis + apply (simp only: zmod_zminus1_eq_if) + apply (simp add: mod_eq_0_iff_dvd algebra_simps mod_simps) + done + qed +qed + lemma div_neg_pos_less0: fixes a::int assumes "a < 0" "0 < b" diff -r 66beb9d92e43 -r 8bff286878bf src/HOL/Library/Bit_Operations.thy --- a/src/HOL/Library/Bit_Operations.thy Fri Jul 03 06:18:27 2020 +0000 +++ b/src/HOL/Library/Bit_Operations.thy Fri Jul 03 06:18:29 2020 +0000 @@ -257,17 +257,17 @@ qed definition set_bit :: \nat \ 'a \ 'a\ - where \set_bit n a = a OR 2 ^ n\ + where \set_bit n a = a OR push_bit n 1\ definition unset_bit :: \nat \ 'a \ 'a\ - where \unset_bit n a = a AND NOT (2 ^ n)\ + where \unset_bit n a = a AND NOT (push_bit n 1)\ definition flip_bit :: \nat \ 'a \ 'a\ - where \flip_bit n a = a XOR 2 ^ n\ + where \flip_bit n a = a XOR push_bit n 1\ lemma bit_set_bit_iff: \bit (set_bit m a) n \ bit a n \ (m = n \ 2 ^ n \ 0)\ - by (auto simp add: set_bit_def bit_or_iff bit_exp_iff) + by (auto simp add: set_bit_def push_bit_of_1 bit_or_iff bit_exp_iff) lemma even_set_bit_iff: \even (set_bit m a) \ even a \ m \ 0\ @@ -275,7 +275,7 @@ lemma bit_unset_bit_iff: \bit (unset_bit m a) n \ bit a n \ m \ n\ - by (auto simp add: unset_bit_def bit_and_iff bit_not_iff bit_exp_iff exp_eq_0_imp_not_bit) + 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) lemma even_unset_bit_iff: \even (unset_bit m a) \ even a \ m = 0\ @@ -283,7 +283,7 @@ lemma bit_flip_bit_iff: \bit (flip_bit m a) n \ (m = n \ \ bit a n) \ 2 ^ n \ 0\ - by (auto simp add: flip_bit_def bit_xor_iff bit_exp_iff exp_eq_0_imp_not_bit) + by (auto simp add: flip_bit_def push_bit_of_1 bit_xor_iff bit_exp_iff exp_eq_0_imp_not_bit) lemma even_flip_bit_iff: \even (flip_bit m a) \ \ (even a \ m = 0)\ diff -r 66beb9d92e43 -r 8bff286878bf src/HOL/List.thy --- a/src/HOL/List.thy Fri Jul 03 06:18:27 2020 +0000 +++ b/src/HOL/List.thy Fri Jul 03 06:18:29 2020 +0000 @@ -4775,6 +4775,17 @@ lemma rotate_append: "rotate (length l) (l @ q) = q @ l" by (induct l arbitrary: q) (auto simp add: rotate1_rotate_swap) +lemma nth_rotate: + \rotate m xs ! n = xs ! ((m + n) mod length xs)\ if \n < length xs\ + using that apply (auto simp add: rotate_drop_take nth_append not_less less_diff_conv ac_simps dest!: le_Suc_ex) + apply (metis add.commute mod_add_right_eq mod_less) + apply (metis (no_types, lifting) Nat.diff_diff_right add.commute add_diff_cancel_right' diff_le_self dual_order.strict_trans2 length_greater_0_conv less_nat_zero_code list.size(3) mod_add_right_eq mod_add_self2 mod_le_divisor mod_less) + done + +lemma nth_rotate1: + \rotate1 xs ! n = xs ! (Suc n mod length xs)\ if \n < length xs\ + using that nth_rotate [of n xs 1] by simp + subsubsection \\<^const>\nths\ --- a generalization of \<^const>\nth\ to sets\ diff -r 66beb9d92e43 -r 8bff286878bf src/HOL/Num.thy --- a/src/HOL/Num.thy Fri Jul 03 06:18:27 2020 +0000 +++ b/src/HOL/Num.thy Fri Jul 03 06:18:29 2020 +0000 @@ -209,6 +209,14 @@ lemma one_plus_BitM: "One + BitM n = Bit0 n" unfolding add_One_commute BitM_plus_one .. +lemma BitM_inc_eq: + \Num.BitM (Num.inc n) = Num.Bit1 n\ + by (induction n) simp_all + +lemma inc_BitM_eq: + \Num.inc (Num.BitM n) = num.Bit0 n\ + by (simp add: BitM_plus_one[symmetric] add_One) + text \Squaring and exponentiation.\ primrec sqr :: "num \ num" @@ -421,6 +429,10 @@ lemma numeral_BitM: "numeral (BitM n) = numeral (Bit0 n) - 1" by (simp only: BitM_plus_one [symmetric] numeral_add numeral_One eq_diff_eq) +lemma sub_inc_One_eq: + \Num.sub (Num.inc n) num.One = numeral n\ + by (simp_all add: sub_def diff_eq_eq numeral_inc numeral.numeral_One) + lemma dbl_simps [simp]: "dbl (- numeral k) = - dbl (numeral k)" "dbl 0 = 0" diff -r 66beb9d92e43 -r 8bff286878bf src/HOL/Parity.thy --- a/src/HOL/Parity.thy Fri Jul 03 06:18:27 2020 +0000 +++ b/src/HOL/Parity.thy Fri Jul 03 06:18:29 2020 +0000 @@ -1257,6 +1257,10 @@ "push_bit n (a + b) = push_bit n a + push_bit n b" by (simp add: push_bit_eq_mult algebra_simps) +lemma push_bit_numeral [simp]: + \push_bit (numeral l) (numeral k) = push_bit (pred_numeral l) (numeral (Num.Bit0 k))\ + by (simp add: numeral_eq_Suc mult_2_right) (simp add: numeral_Bit0) + lemma take_bit_0 [simp]: "take_bit 0 a = 0" by (simp add: take_bit_eq_mod) @@ -1378,7 +1382,7 @@ by (simp add: push_bit_eq_mult) auto lemma bit_push_bit_iff: - \bit (push_bit m a) n \ n \ m \ 2 ^ n \ 0 \ (n < m \ bit a (n - m))\ + \bit (push_bit m a) n \ m \ n \ 2 ^ n \ 0 \ bit a (n - m)\ by (auto simp add: bit_iff_odd push_bit_eq_mult even_mult_exp_div_exp_iff) lemma bit_drop_bit_eq: @@ -1492,10 +1496,6 @@ "push_bit n a = 0 \ a = 0" by (simp add: push_bit_eq_mult) -lemma push_bit_numeral [simp]: - "push_bit (numeral l) (numeral k) = push_bit (pred_numeral l) (numeral (Num.Bit0 k))" - by (simp only: numeral_eq_Suc power_Suc numeral_Bit0 [of k] mult_2 [symmetric]) (simp add: ac_simps) - lemma push_bit_of_nat: "push_bit n (of_nat m) = of_nat (push_bit n m)" by (simp add: push_bit_eq_mult Parity.push_bit_eq_mult) diff -r 66beb9d92e43 -r 8bff286878bf src/HOL/Word/Ancient_Numeral.thy --- a/src/HOL/Word/Ancient_Numeral.thy Fri Jul 03 06:18:27 2020 +0000 +++ b/src/HOL/Word/Ancient_Numeral.thy Fri Jul 03 06:18:29 2020 +0000 @@ -66,7 +66,7 @@ "numeral (Num.Bit1 w) = numeral w BIT True" "- numeral (Num.Bit0 w) = (- numeral w) BIT False" "- numeral (Num.Bit1 w) = (- numeral (w + Num.One)) BIT True" - by (simp_all add: add_One BitM_inc) + by (simp_all add: BitM_inc_eq add_One) lemma less_Bits: "v BIT b < w BIT c \ v < w \ v \ w \ \ b \ c" by (auto simp: Bit_def) diff -r 66beb9d92e43 -r 8bff286878bf src/HOL/Word/Bits_Int.thy --- a/src/HOL/Word/Bits_Int.thy Fri Jul 03 06:18:27 2020 +0000 +++ b/src/HOL/Word/Bits_Int.thy Fri Jul 03 06:18:29 2020 +0000 @@ -24,9 +24,6 @@ abbreviation (input) bin_rest :: "int \ int" where "bin_rest w \ w div 2" -lemma BitM_inc: "Num.BitM (Num.inc w) = Num.Bit1 w" - by (induct w) simp_all - lemma bin_last_numeral_simps [simp]: "\ bin_last 0" "bin_last 1" @@ -572,6 +569,21 @@ lemmas rco_sbintr = sbintrunc_rest' [THEN rco_lem [THEN fun_cong], unfolded o_def] +lemma sbintrunc_code [code]: + "sbintrunc n k = + (let l = take_bit (Suc n) k + in if bit l n then l - push_bit n 2 else l)" +proof (induction n arbitrary: k) + case 0 + then show ?case + by (simp add: mod_2_eq_odd and_one_eq) +next + case (Suc n) + from Suc [of \k div 2\] + show ?case + by (auto simp add: Let_def push_bit_eq_mult algebra_simps take_bit_Suc [of \Suc n\] bit_Suc elim!: evenE oddE) +qed + subsection \Splitting and concatenation\ diff -r 66beb9d92e43 -r 8bff286878bf src/HOL/Word/Word.thy --- a/src/HOL/Word/Word.thy Fri Jul 03 06:18:27 2020 +0000 +++ b/src/HOL/Word/Word.thy Fri Jul 03 06:18:29 2020 +0000 @@ -15,64 +15,6 @@ Misc_Arithmetic begin -subsection \Prelude\ - -lemma (in semiring_bit_shifts) bit_push_bit_iff: \ \TODO move\ - \bit (push_bit m a) n \ m \ n \ 2 ^ n \ 0 \ bit a (n - m)\ - by (auto simp add: bit_iff_odd push_bit_eq_mult even_mult_exp_div_exp_iff) - -lemma (in semiring_bit_shifts) push_bit_numeral [simp]: \ \TODO: move\ - \push_bit (numeral l) (numeral k) = push_bit (pred_numeral l) (numeral (Num.Bit0 k))\ - by (simp add: numeral_eq_Suc mult_2_right) (simp add: numeral_Bit0) - -lemma minus_mod_int_eq: \ \TODO move\ - \- k mod l = l - 1 - (k - 1) mod l\ if \l \ 0\ for k l :: int -proof (cases \l = 0\) - case True - then show ?thesis - by simp -next - case False - with that have \l > 0\ - by simp - then show ?thesis - proof (cases \l dvd k\) - case True - then obtain j where \k = l * j\ .. - moreover have \(l * j mod l - 1) mod l = l - 1\ - using \l > 0\ by (simp add: zmod_minus1) - then have \(l * j - 1) mod l = l - 1\ - by (simp only: mod_simps) - ultimately show ?thesis - by simp - next - case False - moreover have \0 < k mod l\ \k mod l < 1 + l\ - using \0 < l\ le_imp_0_less pos_mod_conj False apply auto - using le_less apply fastforce - using pos_mod_bound [of l k] apply linarith - done - with \l > 0\ have \(k mod l - 1) mod l = k mod l - 1\ - by (simp add: zmod_trival_iff) - ultimately show ?thesis - apply (simp only: zmod_zminus1_eq_if) - apply (simp add: mod_eq_0_iff_dvd algebra_simps mod_simps) - done - qed -qed - -lemma nth_rotate: \ \TODO move\ - \rotate m xs ! n = xs ! ((m + n) mod length xs)\ if \n < length xs\ - using that apply (auto simp add: rotate_drop_take nth_append not_less less_diff_conv ac_simps dest!: le_Suc_ex) - apply (metis add.commute mod_add_right_eq mod_less) - apply (metis (no_types, lifting) Nat.diff_diff_right add.commute add_diff_cancel_right' diff_le_self dual_order.strict_trans2 length_greater_0_conv less_nat_zero_code list.size(3) mod_add_right_eq mod_add_self2 mod_le_divisor mod_less) - done - -lemma nth_rotate1: \ \TODO move\ - \rotate1 xs ! n = xs ! (Suc n mod length xs)\ if \n < length xs\ - using that nth_rotate [of n xs 1] by simp - - subsection \Type definition\ quotient_type (overloaded) 'a word = int / \\k l. take_bit LENGTH('a) k = take_bit LENGTH('a::len) l\ @@ -1006,7 +948,7 @@ lemma set_bit_unfold: \set_bit w n b = (if b then Bit_Operations.set_bit n w else unset_bit n w)\ for w :: \'a::len word\ - apply (auto simp add: word_set_bit_def bin_clr_conv_NAND bin_set_conv_OR unset_bit_def set_bit_def shiftl_int_def; transfer) + apply (auto simp add: word_set_bit_def bin_clr_conv_NAND bin_set_conv_OR unset_bit_def set_bit_def shiftl_int_def push_bit_of_1; transfer) apply simp_all done diff -r 66beb9d92e43 -r 8bff286878bf src/HOL/ex/Word.thy --- a/src/HOL/ex/Word.thy Fri Jul 03 06:18:27 2020 +0000 +++ b/src/HOL/ex/Word.thy Fri Jul 03 06:18:29 2020 +0000 @@ -37,7 +37,7 @@ qed lemma signed_take_bit_Suc: - "signed_take_bit (Suc n) k = signed_take_bit n (k div 2) * 2 + k mod 2" + "signed_take_bit (Suc n) k = k mod 2 + 2 * signed_take_bit n (k div 2)" by (simp add: odd_iff_mod_2_eq_one signed_take_bit_eq_take_bit algebra_simps take_bit_Suc) lemma signed_take_bit_of_0 [simp]: @@ -80,6 +80,21 @@ qed qed +lemma signed_take_bit_code [code]: + \signed_take_bit n k = + (let l = take_bit (Suc n) k + in if bit l n then l - push_bit n 2 else l)\ +proof (induction n arbitrary: k) + case 0 + then show ?case + by (simp add: mod_2_eq_odd and_one_eq) +next + case (Suc n) + from Suc [of \k div 2\] + show ?case + by (auto simp add: Let_def push_bit_eq_mult algebra_simps take_bit_Suc [of \Suc n\] bit_Suc signed_take_bit_Suc elim!: evenE oddE) +qed + subsection \Bit strings as quotient type\