# HG changeset patch # User haftmann # Date 1745077146 -7200 # Node ID df5b2785abd62810490bed9bd2b380029314a8ea # Parent e4207dfa36b55876547e5344c453114d1aa46e3c more lemmas diff -r e4207dfa36b5 -r df5b2785abd6 src/HOL/Bit_Operations.thy --- a/src/HOL/Bit_Operations.thy Fri Apr 18 14:19:41 2025 +0200 +++ b/src/HOL/Bit_Operations.thy Sat Apr 19 17:39:06 2025 +0200 @@ -778,6 +778,14 @@ by (simp add: mask_eq_exp_minus_1) qed +lemma mask_eq_iff_eq_exp: + \mask n = a \ a + 1 = 2 ^ n\ + by (auto simp flip: inc_mask_eq_exp) + +lemma eq_mask_iff_eq_exp: + \a = mask n \ a + 1 = 2 ^ n\ + by (auto simp flip: inc_mask_eq_exp) + lemma mask_Suc_double: \mask (Suc n) = 1 OR 2 * mask n\ proof - @@ -3832,6 +3840,10 @@ using that take_bit_int_less_eq [of \Suc n\ \k + 2 ^ n\] by (simp add: signed_take_bit_eq_take_bit_shift) +lemma signed_take_bit_Suc_sgn_eq [simp]: + \signed_take_bit (Suc n) (sgn k) = sgn k\ for k :: int + by (simp add: sgn_if) + lemma signed_take_bit_Suc_bit0 [simp]: \signed_take_bit (Suc n) (numeral (Num.Bit0 k)) = signed_take_bit n (numeral k) * (2 :: int)\ by (simp add: signed_take_bit_Suc) diff -r e4207dfa36b5 -r df5b2785abd6 src/HOL/Library/Type_Length.thy --- a/src/HOL/Library/Type_Length.thy Fri Apr 18 14:19:41 2025 +0200 +++ b/src/HOL/Library/Type_Length.thy Sat Apr 19 17:39:06 2025 +0200 @@ -101,10 +101,22 @@ end +lemma length_less_eq_Suc_0_iff [simp]: + \LENGTH('a::len) \ Suc 0 \ LENGTH('a) = Suc 0\ + by (simp add: le_Suc_eq) + lemma length_not_greater_eq_2_iff [simp]: - \\ 2 \ LENGTH('a::len) \ LENGTH('a) = 1\ + \\ 2 \ LENGTH('a::len) \ LENGTH('a) = Suc 0\ by (auto simp add: not_le dest: less_2_cases) +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 + context linordered_idom begin @@ -115,12 +127,4 @@ 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 e4207dfa36b5 -r df5b2785abd6 src/HOL/Library/Word.thy --- a/src/HOL/Library/Word.thy Fri Apr 18 14:19:41 2025 +0200 +++ b/src/HOL/Library/Word.thy Sat Apr 19 17:39:06 2025 +0200 @@ -759,10 +759,8 @@ for a :: \'a::len word\ proof (cases \2 \ LENGTH('a::len)\) case False - have \of_bool (odd k) < (1 :: int) \ even k\ for k :: int - by auto - with False that show ?thesis - by transfer (simp add: eq_iff) + with that show ?thesis + by transfer simp next case True obtain n where length: \LENGTH('a) = Suc n\ @@ -1245,9 +1243,7 @@ lemma signed_push_bit_eq: \signed (push_bit n w) = signed_take_bit (LENGTH('b) - Suc 0) (push_bit n (signed w :: 'a))\ for w :: \'b::len word\ - apply (simp add: bit_eq_iff bit_simps possible_bit_less_imp min_less_iff_disj) - apply (cases n, simp_all add: min_def) - done + by (simp add: bit_eq_iff bit_simps possible_bit_less_imp min_less_iff_disj) auto lemma signed_take_bit_eq: \signed (take_bit n w) = (if n < LENGTH('b) then take_bit n (signed w) else signed w)\ @@ -1729,6 +1725,14 @@ \x x <=s y \ x \ y\ by (fact signed.less_le) +lemma minus_1_sless_0 [simp]: + \- 1 + by transfer simp + +lemma minus_1_sless_eq_0 [simp]: + \- 1 \s 0\ + by transfer simp + subsection \Bit-wise operations\