# HG changeset patch # User haftmann # Date 1600859678 0 # Node ID beeadb35e35730818ece130031290fd4ed0d5cbe # Parent db43ee05066d0a9eda719dd277556c46866d24a6 more thorough treatment of division, particularly signed division on int and word diff -r db43ee05066d -r beeadb35e357 NEWS --- a/NEWS Wed Sep 23 08:52:41 2020 +0000 +++ b/NEWS Wed Sep 23 11:14:38 2020 +0000 @@ -78,6 +78,9 @@ * Library theory "Bit_Operations" with generic bit operations. +* Library theory "Signed_Division" provides operations for signed +division, instantiated for type int. + * Session HOL-Word: Type word is restricted to bit strings consisting of at least one bit. INCOMPATIBILITY. diff -r db43ee05066d -r beeadb35e357 src/HOL/Library/Bit_Operations.thy --- a/src/HOL/Library/Bit_Operations.thy Wed Sep 23 08:52:41 2020 +0000 +++ b/src/HOL/Library/Bit_Operations.thy Wed Sep 23 11:14:38 2020 +0000 @@ -159,6 +159,10 @@ by (rule bit_eqI) (auto simp add: bit_take_bit_iff bit_and_iff bit_mask_iff) +lemma or_eq_0_iff: + \a OR b = 0 \ a = 0 \ b = 0\ + by (auto simp add: bit_eq_iff bit_or_iff) + lemma disjunctive_add: \a + b = a OR b\ if \\n. \ bit a n \ \ bit b n\ by (rule bit_eqI) (use that in \simp add: bit_disjunctive_add_iff bit_or_iff\) @@ -249,6 +253,30 @@ \NOT (a - b) = NOT a + b\ using not_add_distrib [of a \- b\] by simp +lemma (in ring_bit_operations) and_eq_minus_1_iff: + \a AND b = - 1 \ a = - 1 \ b = - 1\ +proof + assume \a = - 1 \ b = - 1\ + then show \a AND b = - 1\ + by simp +next + assume \a AND b = - 1\ + have *: \bit a n\ \bit b n\ if \2 ^ n \ 0\ for n + proof - + from \a AND b = - 1\ + have \bit (a AND b) n = bit (- 1) n\ + by (simp add: bit_eq_iff) + then show \bit a n\ \bit b n\ + using that by (simp_all add: bit_and_iff) + qed + have \a = - 1\ + by (rule bit_eqI) (simp add: *) + moreover have \b = - 1\ + by (rule bit_eqI) (simp add: *) + ultimately show \a = - 1 \ b = - 1\ + by simp +qed + lemma disjunctive_diff: \a - b = a AND NOT b\ if \\n. bit b n \ bit a n\ proof - diff -r db43ee05066d -r beeadb35e357 src/HOL/Library/Library.thy --- a/src/HOL/Library/Library.thy Wed Sep 23 08:52:41 2020 +0000 +++ b/src/HOL/Library/Library.thy Wed Sep 23 11:14:38 2020 +0000 @@ -86,6 +86,7 @@ Saturated Set_Algebras Set_Idioms + Signed_Division State_Monad Stirling Stream diff -r db43ee05066d -r beeadb35e357 src/HOL/Library/Signed_Division.thy --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/HOL/Library/Signed_Division.thy Wed Sep 23 11:14:38 2020 +0000 @@ -0,0 +1,27 @@ +(* Author: Stefan Berghofer et al. +*) + +subsection \Signed division: negative results rounded towards zero rather than minus infinity.\ + +theory Signed_Division + imports Main +begin + +class signed_division = + fixes signed_divide :: \'a \ 'a \ 'a\ (infixl "sdiv" 70) + and signed_modulo :: \'a \ 'a \ 'a\ (infixl "smod" 70) + +instantiation int :: signed_division +begin + +definition signed_divide_int :: \int \ int \ int\ + where \k sdiv l = sgn k * sgn l * (\k\ div \l\)\ for k l :: int + +definition signed_modulo_int :: \int \ int \ int\ + where \k smod l = k - (k sdiv l) * l\ for k l :: int + +instance .. + +end + +end diff -r db43ee05066d -r beeadb35e357 src/HOL/Library/Type_Length.thy --- a/src/HOL/Library/Type_Length.thy Wed Sep 23 08:52:41 2020 +0000 +++ b/src/HOL/Library/Type_Length.thy Wed Sep 23 11:14:38 2020 +0000 @@ -117,4 +117,12 @@ end +lemma less_eq_decr_length_iff [simp]: + \n \ LENGTH('a::len) - Suc 0 \ n < LENGTH('a)\ + by (cases \LENGTH('a)\) (simp_all add: less_Suc_eq le_less) + +lemma decr_length_less_iff [simp]: + \LENGTH('a::len) - Suc 0 < n \ LENGTH('a) \ n\ + by (cases \LENGTH('a)\) auto + end diff -r db43ee05066d -r beeadb35e357 src/HOL/Parity.thy --- a/src/HOL/Parity.thy Wed Sep 23 08:52:41 2020 +0000 +++ b/src/HOL/Parity.thy Wed Sep 23 11:14:38 2020 +0000 @@ -1193,6 +1193,10 @@ context semiring_bits begin +lemma bit_of_bool_iff: + \bit (of_bool b) n \ b \ n = 0\ + by (simp add: bit_1_iff) + lemma even_of_nat_iff: \even (of_nat n) \ even n\ by (induction n rule: nat_bit_induct) simp_all diff -r db43ee05066d -r beeadb35e357 src/HOL/Word/Word.thy --- a/src/HOL/Word/Word.thy Wed Sep 23 08:52:41 2020 +0000 +++ b/src/HOL/Word/Word.thy Wed Sep 23 11:14:38 2020 +0000 @@ -75,7 +75,6 @@ transfer_rule_numeral [transfer_rule] transfer_rule_of_nat [transfer_rule] transfer_rule_of_int [transfer_rule] - begin lemma power_transfer_word [transfer_rule]: @@ -275,6 +274,10 @@ \v = w \ unsigned v = unsigned w\ by (auto intro: unsigned_word_eqI) +lemma (in semiring_char_0) unsigned_eq_0_iff: + \unsigned w = 0 \ w = 0\ + using word_eq_iff_unsigned [of w 0] by simp + end context ring_1 @@ -326,6 +329,10 @@ \v = w \ signed v = signed w\ by (auto intro: signed_word_eqI) +lemma signed_eq_0_iff: + \signed w = 0 \ w = 0\ + using word_eq_iff_signed [of w 0] by simp + end abbreviation unat :: \'a::len word \ nat\ @@ -403,6 +410,10 @@ \nat (uint w) = unat w\ by transfer simp +lemma sgn_uint_eq [simp]: + \sgn (uint w) = of_bool (w \ 0)\ + by transfer (simp add: less_le) + text \Aliasses only for code generation\ context @@ -2930,7 +2941,7 @@ lemma udvd_imp_dvd: \v dvd w\ if \v udvd w\ for v w :: \'a::len word\ proof - - from that obtain u :: \'a word\ where w: \unat w = unat v * unat u\ .. + from that obtain u :: \'a word\ where \unat w = unat v * unat u\ .. then have \(word_of_nat (unat w) :: 'a word) = word_of_nat (unat v * unat u)\ by simp then have \w = v * u\ @@ -2938,6 +2949,20 @@ then show \v dvd w\ .. qed +lemma exp_dvd_iff_exp_udvd: + \2 ^ n dvd w \ 2 ^ n udvd w\ for v w :: \'a::len word\ +proof + assume \2 ^ n udvd w\ then show \2 ^ n dvd w\ + by (rule udvd_imp_dvd) +next + assume \2 ^ n dvd w\ + then obtain u :: \'a word\ where \w = 2 ^ n * u\ .. + then have \w = push_bit n u\ + by (simp add: push_bit_eq_mult) + then show \2 ^ n udvd w\ + by transfer (simp add: take_bit_push_bit dvd_eq_mod_eq_0 flip: take_bit_eq_mod) +qed + lemma udvd_nat_alt: \a udvd b \ (\n. unat b = n * unat a)\ by (auto simp add: udvd_iff_dvd)