# HG changeset patch # User haftmann # Date 1742131260 -3600 # Node ID 26fbbf43863b64ad2f47344b3b96499cd95d37a8 # Parent e05181b4885c6cfd110b0ccc68cb5fc865dbc334 more lemmas diff -r e05181b4885c -r 26fbbf43863b src/HOL/Bit_Operations.thy --- a/src/HOL/Bit_Operations.thy Sun Mar 16 08:55:17 2025 +0100 +++ b/src/HOL/Bit_Operations.thy Sun Mar 16 14:21:00 2025 +0100 @@ -338,6 +338,57 @@ \bit (a mod 2) n \ n = 0 \ odd a\ by (simp add: mod_2_eq_odd bit_simps) +lemma stable_index: + obtains m where \possible_bit TYPE('a) m\ + \\n. possible_bit TYPE('a) n \ n \ m \ bit a n \ bit a m\ +proof - + have \\m. possible_bit TYPE('a) m \ (\n\m. possible_bit TYPE('a) n \ bit a n \ bit a m)\ + proof (induction a rule: bit_induct) + case (stable a) + show ?case + by (rule exI [of _ \0::nat\]) (simp add: stable_imp_bit_iff_odd stable) + next + case (rec a b) + then obtain m where \possible_bit TYPE('a) m\ + and hyp: \\n. possible_bit TYPE('a) n \ n \ m \ bit a n \ bit a m\ + by blast + show ?case + proof (cases \possible_bit TYPE('a) (Suc m)\) + case True + moreover have \bit (of_bool b + 2 * a) n \ bit (of_bool b + 2 * a) (Suc m)\ + if \possible_bit TYPE('a) n\ \Suc m \ n\ for n + using hyp [of \n - 1\] possible_bit_less_imp [of n \n - 1\] rec.hyps that + by (cases n) (simp_all add: bit_Suc) + ultimately show ?thesis + by blast + next + case False + have \bit (of_bool b + 2 * a) n \ bit (of_bool b + 2 * a) m\ + if \possible_bit TYPE('a) n\ \m \ n\ for n + proof (cases \m = n\) + case True + then show ?thesis + by simp + next + case False + with \m \ n\ have \m < n\ + by simp + with \\ possible_bit TYPE('a) (Suc m)\ + have \\ possible_bit TYPE('a) n\ using possible_bit_less_imp [of n \Suc m\] + by auto + with \possible_bit TYPE('a) n\ + show ?thesis + by simp + qed + with \possible_bit TYPE('a) m\ show ?thesis + by blast + qed + qed + with that show thesis + by blast +qed + + end lemma nat_bit_induct [case_names zero even odd]: @@ -1105,6 +1156,20 @@ qed qed +lemma impossible_bit_imp_take_bit_eq_self: + \take_bit n a = a\ if \\ possible_bit TYPE('a) n\ +proof - + have \drop_bit n a = 0\ + proof (rule bit_eqI) + fix m + show \bit (drop_bit n a) m \ bit 0 m\ + using possible_bit_less_imp [of \n + m\ n] that + by (auto simp add: bit_simps dest: bit_imp_possible_bit) + qed + then show ?thesis + by (simp add: take_bit_eq_self_iff_drop_bit_eq_0) +qed + lemma drop_bit_exp_eq: \drop_bit m (2 ^ n) = of_bool (m \ n \ possible_bit TYPE('a) n) * 2 ^ (n - m)\ by (auto simp: bit_eq_iff bit_simps) @@ -1486,6 +1551,11 @@ \take_bit m (NOT (mask n)) = 0\ if \n \ m\ by (rule bit_eqI) (use that in \simp add: bit_take_bit_iff bit_not_iff bit_mask_iff\) +lemma mask_eq_minus_one_if_not_possible_bit: + \mask n = - 1\ if \\ possible_bit TYPE('a) n\ + using that mask_eq_take_bit_minus_one [of n] impossible_bit_imp_take_bit_eq_self [of n \- 1\] + by simp + lemma unset_bit_eq_and_not: \unset_bit n a = a AND NOT (push_bit n 1)\ by (rule bit_eqI) (auto simp: bit_simps)