diff -r 127ba61b2630 -r 7449ff77029e src/HOL/Bit_Operations.thy --- a/src/HOL/Bit_Operations.thy Tue Nov 21 19:19:16 2023 +0000 +++ b/src/HOL/Bit_Operations.thy Wed Nov 22 17:50:36 2023 +0000 @@ -156,6 +156,7 @@ definition possible_bit :: \'a itself \ nat \ bool\ where \possible_bit TYPE('a) n \ 2 ^ n \ 0\ + \ \This auxiliary avoids non-termination with extensionality.\ lemma possible_bit_0 [simp]: \possible_bit TYPE('a) 0\ @@ -1331,7 +1332,7 @@ class ring_bit_operations = semiring_bit_operations + ring_parity + fixes not :: \'a \ 'a\ (\NOT\) - assumes bit_not_iff_eq: \\n. bit (NOT a) n \ 2 ^ n \ 0 \ \ bit a n\ + assumes not_rec: \NOT a = of_bool (even a) + 2 * NOT (a div 2)\ assumes minus_eq_not_minus_1: \- a = NOT (a - 1)\ begin @@ -1342,10 +1343,6 @@ (type \<^typ>\nat\). \ -lemma bit_not_iff [bit_simps]: - \bit (NOT a) n \ possible_bit TYPE('a) n \ \ bit a n\ - by (simp add: bit_not_iff_eq fold_possible_bit) - lemma bits_minus_1_mod_2_eq [simp]: \(- 1) mod 2 = 1\ by (simp add: mod_2_eq_odd) @@ -1358,18 +1355,41 @@ \- a = NOT a + 1\ using not_eq_complement [of a] by simp -lemma bit_minus_iff [bit_simps]: - \bit (- a) n \ possible_bit TYPE('a) n \ \ bit (a - 1) n\ - by (simp add: minus_eq_not_minus_1 bit_not_iff) - lemma even_not_iff [simp]: - \even (NOT a) \ odd a\ - using bit_not_iff [of a 0] by (auto simp add: bit_0) + \even (NOT a) \ odd a\ + by (simp add: not_rec [of a]) + +lemma bit_not_iff [bit_simps]: + \bit (NOT a) n \ possible_bit TYPE('a) n \ \ bit a n\ +proof (cases \possible_bit TYPE('a) n\) + case False + then show ?thesis + by (auto dest: bit_imp_possible_bit) +next + case True + moreover have \bit (NOT a) n \ \ bit a n\ + using \possible_bit TYPE('a) n\ proof (induction n arbitrary: a) + case 0 + then show ?case + by (simp add: bit_0) + next + case (Suc n) + from Suc.prems Suc.IH [of \a div 2\] + show ?case + by (simp add: impossible_bit possible_bit_less_imp not_rec [of a] even_bit_succ_iff bit_double_iff flip: bit_Suc) + qed + ultimately show ?thesis + by simp +qed lemma bit_not_exp_iff [bit_simps]: \bit (NOT (2 ^ m)) n \ possible_bit TYPE('a) n \ n \ m\ by (auto simp add: bit_not_iff bit_exp_iff) +lemma bit_minus_iff [bit_simps]: + \bit (- a) n \ possible_bit TYPE('a) n \ \ bit (a - 1) n\ + by (simp add: minus_eq_not_minus_1 bit_not_iff) + lemma bit_minus_1_iff [simp]: \bit (- 1) n \ possible_bit TYPE('a) n\ by (simp add: bit_minus_iff) @@ -1382,6 +1402,10 @@ \bit (- 2) n \ possible_bit TYPE('a) n \ n > 0\ by (simp add: bit_minus_iff bit_1_iff) +lemma bit_not_iff_eq: + \bit (NOT a) n \ 2 ^ n \ 0 \ \ bit a n\ + by (simp add: bit_simps possible_bit_def) + lemma not_one_eq [simp]: \NOT 1 = - 2\ by (simp add: bit_eq_iff bit_not_iff) (simp add: bit_1_iff) @@ -1670,6 +1694,8 @@ fix k l :: int and m n :: nat show \- k = NOT (k - 1)\ by (simp add: not_int_def) + show \NOT k = of_bool (even k) + 2 * NOT (k div 2)\ + by (auto simp add: not_int_def elim: oddE) show \k AND l = of_bool (odd k \ odd l) + 2 * (k div 2 AND l div 2)\ by (fact and_int_rec) show \k OR l = of_bool (odd k \ odd l) + 2 * (k div 2 OR l div 2)\ @@ -1685,7 +1711,7 @@ finally show ?thesis by (simp only: bit_simps bit_and_int_iff) (auto simp add: bit_simps bit_not_int_iff' push_bit_int_def) qed -qed (simp_all add: bit_not_int_iff mask_int_def set_bit_int_def flip_bit_int_def +qed (simp_all add: mask_int_def set_bit_int_def flip_bit_int_def push_bit_int_def drop_bit_int_def take_bit_int_def) end