# HG changeset patch # User haftmann # Date 1623831549 0 # Node ID 52b829b18066a2385bec05e978bb4e6b8e4706f0 # Parent adb34395b622183206f97e8ec185dd79ff915e7a more lemmas diff -r adb34395b622 -r 52b829b18066 src/HOL/Euclidean_Division.thy --- a/src/HOL/Euclidean_Division.thy Sat Jun 12 15:37:25 2021 +0200 +++ b/src/HOL/Euclidean_Division.thy Wed Jun 16 08:19:09 2021 +0000 @@ -1280,6 +1280,26 @@ by simp qed +lemma div_less_iff_less_mult: + \m div q < n \ m < n * q\ (is \?P \ ?Q\) + if \q > 0\ for m n q :: nat +proof + assume ?Q then show ?P + by (rule less_mult_imp_div_less) +next + assume ?P + then obtain h where \n = Suc (m div q + h)\ + using less_natE by blast + moreover have \m < m + (Suc h * q - m mod q)\ + using that by (simp add: trans_less_add1) + ultimately show ?Q + by (simp add: algebra_simps flip: minus_mod_eq_mult_div) +qed + +lemma less_eq_div_iff_mult_less_eq: + \m \ n div q \ m * q \ n\ if \q > 0\ for m n q :: nat + using div_less_iff_less_mult [of q n m] that by auto + text \A fact for the mutilated chess board\ lemma mod_Suc: diff -r adb34395b622 -r 52b829b18066 src/HOL/Library/Word.thy --- a/src/HOL/Library/Word.thy Sat Jun 12 15:37:25 2021 +0200 +++ b/src/HOL/Library/Word.thy Wed Jun 16 08:19:09 2021 +0000 @@ -1150,6 +1150,11 @@ end +lemma ucast_drop_bit_eq: + \ucast (drop_bit n w) = drop_bit n (ucast w :: 'b::len word)\ + if \LENGTH('a) \ LENGTH('b)\ for w :: \'a::len word\ + by (rule bit_word_eqI) (use that in \auto simp add: bit_unsigned_iff bit_drop_bit_eq dest: bit_imp_le_length\) + context semiring_bit_operations begin @@ -3546,6 +3551,11 @@ (word_of_int (drop_bit (numeral n) (take_bit LENGTH('a) (numeral k))) :: 'a::len word)\ by transfer simp +lemma signed_drop_bit_word_numeral [simp]: + \signed_drop_bit (numeral n) (numeral k) = + (word_of_int (drop_bit (numeral n) (signed_take_bit (LENGTH('a) - 1) (numeral k))) :: 'a::len word)\ + by transfer simp + lemma False_map2_or: "\set xs \ {False}; length ys = length xs\ \ map2 (\) xs ys = ys" by (induction xs arbitrary: ys) (auto simp: length_Suc_conv) @@ -4167,8 +4177,6 @@ lemma word_rec_in2: "f n (word_rec z f n) = word_rec (f 0 z) (f \ (+) 1) n" by (induct n) (simp_all add: word_rec_Suc) - - lemma word_rec_twice: "m \ n \ word_rec z f n = word_rec (word_rec z f (n - m)) (f \ (+) (n - m)) m" proof (induction n arbitrary: z f) diff -r adb34395b622 -r 52b829b18066 src/HOL/Parity.thy --- a/src/HOL/Parity.thy Sat Jun 12 15:37:25 2021 +0200 +++ b/src/HOL/Parity.thy Wed Jun 16 08:19:09 2021 +0000 @@ -1556,6 +1556,34 @@ by (simp add: min_def) qed +lemma take_bit_eq_self_iff_drop_bit_eq_0: + \take_bit n a = a \ drop_bit n a = 0\ (is \?P \ ?Q\) +proof + assume ?P + show ?Q + proof (rule bit_eqI) + fix m + from \?P\ have \a = take_bit n a\ .. + also have \\ bit (take_bit n a) (n + m)\ + unfolding bit_simps + by (simp add: bit_simps) + finally show \bit (drop_bit n a) m \ bit 0 m\ + by (simp add: bit_simps) + qed +next + assume ?Q + show ?P + proof (rule bit_eqI) + fix m + from \?Q\ have \\ bit (drop_bit n a) (m - n)\ + by simp + then have \ \ bit a (n + (m - n))\ + by (simp add: bit_simps) + then show \bit (take_bit n a) m \ bit a m\ + by (cases \m < n\) (auto simp add: bit_simps) + qed +qed + end instantiation nat :: semiring_bit_shifts