# HG changeset patch # User haftmann # Date 1599294754 0 # Node ID bb88e31220af1301c9d05c1a79b01b5025133390 # Parent 12e94c2ff6c5cac4b212b11a95e8507da1f2af87 more on conversions diff -r 12e94c2ff6c5 -r bb88e31220af src/HOL/Word/Conversions.thy --- a/src/HOL/Word/Conversions.thy Sat Sep 05 08:32:27 2020 +0000 +++ b/src/HOL/Word/Conversions.thy Sat Sep 05 08:32:34 2020 +0000 @@ -205,7 +205,7 @@ begin lift_definition signed :: \'b::len word \ 'a\ - is \of_int \ signed_take_bit (LENGTH('b) - 1)\ + is \of_int \ signed_take_bit (LENGTH('b) - Suc 0)\ by (simp flip: signed_take_bit_decr_length_iff) lemma signed_0 [simp]: @@ -374,15 +374,15 @@ qed lemma [transfer_rule]: - \(pcr_word ===> pcr_word) (signed_take_bit (LENGTH('a) - 1)) (scast :: 'a::len word \ 'b::len word)\ + \(pcr_word ===> pcr_word) (signed_take_bit (LENGTH('a) - Suc 0)) (scast :: 'a::len word \ 'b::len word)\ proof (rule rel_funI) fix k :: int and w :: \'a word\ assume \pcr_word k w\ then have \w = word_of_int k\ by (simp add: pcr_word_def cr_word_def relcompp_apply) - moreover have \pcr_word (signed_take_bit (LENGTH('a) - 1) k) (scast (word_of_int k :: 'a word))\ + moreover have \pcr_word (signed_take_bit (LENGTH('a) - Suc 0) k) (scast (word_of_int k :: 'a word))\ by transfer (simp add: pcr_word_def cr_word_def relcompp_apply) - ultimately show \pcr_word (signed_take_bit (LENGTH('a) - 1) k) (scast w)\ + ultimately show \pcr_word (signed_take_bit (LENGTH('a) - Suc 0) k) (scast w)\ by simp qed @@ -450,15 +450,15 @@ by (simp add: signed_not_eq signed_take_bit_unfold) lemma sint_push_bit_eq: - \signed (push_bit n w) = signed_take_bit (LENGTH('a) - 1) (push_bit n (signed w))\ + \signed (push_bit n w) = signed_take_bit (LENGTH('a) - Suc 0) (push_bit n (signed w))\ for w :: \'a::len word\ by (transfer fixing: n; cases \LENGTH('a)\) (auto simp add: signed_take_bit_def bit_concat_bit_iff bit_push_bit_iff bit_take_bit_iff bit_or_iff le_diff_conv2, auto simp add: take_bit_push_bit not_less concat_bit_eq_iff take_bit_concat_bit_eq le_diff_conv2) lemma sint_greater_eq: - \- (2 ^ (LENGTH('a) - 1)) \ sint w\ for w :: \'a::len word\ -proof (cases \bit w (LENGTH('a) - 1)\) + \- (2 ^ (LENGTH('a) - Suc 0)) \ sint w\ for w :: \'a::len word\ +proof (cases \bit w (LENGTH('a) - Suc 0)\) case True then show ?thesis by transfer (simp add: signed_take_bit_eq_or minus_exp_eq_not_mask or_greater_eq ac_simps) @@ -471,8 +471,26 @@ qed lemma sint_less: - \sint w < 2 ^ (LENGTH('a) - 1)\ for w :: \'a::len word\ - by (cases \bit w (LENGTH('a) - 1)\; transfer) + \sint w < 2 ^ (LENGTH('a) - Suc 0)\ for w :: \'a::len word\ + by (cases \bit w (LENGTH('a) - Suc 0)\; transfer) (simp_all add: signed_take_bit_eq signed_take_bit_unfold take_bit_int_less_exp not_eq_complement mask_eq_exp_minus_1 OR_upper) +context semiring_1 +begin + +lemma unsigned_ucase_eq: + \unsigned (ucast w :: 'c::len word) = unsigned (take_bit LENGTH('c) w)\ + for w :: \'b::len word\ + by transfer (simp add: ac_simps) + +lemma signed_ucast_eq: + \signed (ucast w :: 'c::len word) = + take_bit (min LENGTH('b) LENGTH('c)) w OR of_bool (bit w (LENGTH('c) - Suc 0)) * NOT (mask LENGTH('c))\ + for w :: \'b::len word\ + by (transfer, rule bit_eqI) + (simp_all add: bit_take_bit_iff bit_signed_take_bit_iff bit_or_iff bit_not_iff bit_mask_iff + not_less not_le min_def le_diff_conv less_diff_conv2 le_Suc_eq) + end + +end