# HG changeset patch # User haftmann # Date 1588004331 0 # Node ID 6fd70ed181996d7b0947384a29227ab74eb728e8 # Parent 14914ae80f705666f2a8b31411f17959bf109b54 simplified construction of binary bit operations diff -r 14914ae80f70 -r 6fd70ed18199 src/HOL/Parity.thy --- a/src/HOL/Parity.thy Sat Apr 25 13:26:25 2020 +0000 +++ b/src/HOL/Parity.thy Mon Apr 27 16:18:51 2020 +0000 @@ -1509,6 +1509,21 @@ instance int :: unique_euclidean_semiring_with_bit_shifts .. +lemma bit_nat_iff [simp]: + \bit (nat k) n \ k > 0 \ bit k n\ +proof (cases \k > 0\) + case True + moreover define m where \m = nat k\ + ultimately have \k = int m\ + by simp + then show ?thesis + by (auto intro: ccontr) +next + case False + then show ?thesis + by simp +qed + lemma not_exp_less_eq_0_int [simp]: \\ 2 ^ n \ (0::int)\ by (simp add: power_le_zero_eq) diff -r 14914ae80f70 -r 6fd70ed18199 src/HOL/ex/Bit_Lists.thy --- a/src/HOL/ex/Bit_Lists.thy Sat Apr 25 13:26:25 2020 +0000 +++ b/src/HOL/ex/Bit_Lists.thy Mon Apr 27 16:18:51 2020 +0000 @@ -324,57 +324,38 @@ class ring_bit_representation = ring_bit_operations + semiring_bit_representation + assumes not_eq: "not = of_bits \ map Not \ bits_of" -context zip_nat -begin - -lemma of_bits: - "of_bits bs \<^bold>\ of_bits cs = (of_bits (map2 (\<^bold>*) bs cs) :: nat)" - if "length bs = length cs" for bs cs - by (simp add: Parity.bit_eq_iff bit_unsigned_of_bits_iff bit_eq_iff) - (simp add: that end_of_bits nth_default_map2 [of _ _ _ False False]) -end - instance nat :: semiring_bit_representation - apply standard - apply (simp_all only: and_nat.of_bits or_nat.of_bits xor_nat.of_bits) - apply simp_all - done + by standard (simp_all add: bit_eq_iff bit_unsigned_of_bits_iff nth_default_map2 [of _ _ _ False False] + bit_and_iff bit_or_iff bit_xor_iff) -context zip_int -begin - -lemma of_bits: - \of_bits bs \<^bold>\ of_bits cs = (of_bits (map2 (\<^bold>*) bs cs) :: int)\ - if \length bs = length cs\ and \\ False \<^bold>* False\ for bs cs -proof (cases \bs = []\) - case True - moreover have \cs = []\ - using True that by simp - ultimately show ?thesis - by (simp add: Parity.bit_eq_iff bit_eq_iff that) -next - case False - moreover have \cs \ []\ - using False that by auto - ultimately show ?thesis - apply (simp add: Parity.bit_eq_iff bit_of_bits_int_iff bit_eq_iff zip_eq_Nil_iff last_map last_zip that) - apply (simp add: that nth_default_map2 [of _ _ _ \last bs\ \last cs\]) - done +instance int :: ring_bit_representation +proof + { + fix bs cs :: \bool list\ + assume \length bs = length cs\ + then have \cs = [] \ bs = []\ + by auto + with \length bs = length cs\ have \zip bs cs \ [] \ last (map2 (\) bs cs) \ (bs \ [] \ last bs) \ (cs \ [] \ last cs)\ + and \zip bs cs \ [] \ last (map2 (\) bs cs) \ (bs \ [] \ last bs) \ (cs \ [] \ last cs)\ + and \zip bs cs \ [] \ last (map2 (\) bs cs) \ ((bs \ [] \ last bs) \ (cs \ [] \ last cs))\ + by (auto simp add: last_map last_zip zip_eq_Nil_iff prod_eq_iff) + then show \of_bits bs AND of_bits cs = (of_bits (map2 (\) bs cs) :: int)\ + and \of_bits bs OR of_bits cs = (of_bits (map2 (\) bs cs) :: int)\ + and \of_bits bs XOR of_bits cs = (of_bits (map2 (\) bs cs) :: int)\ + by (simp_all add: fun_eq_iff bit_eq_iff bit_and_iff bit_or_iff bit_xor_iff bit_not_iff bit_of_bits_int_iff \length bs = length cs\ nth_default_map2 [of bs cs _ \bs \ [] \ last bs\ \cs \ [] \ last cs\]) + } + show \push_bit n k = of_bits (replicate n False @ bits_of k)\ + for k :: int and n :: nat + by (cases "n = 0") simp_all + show \drop_bit n k = of_bits (drop n (bits_of k))\ + if \n < length (bits_of k)\ for k :: int and n :: nat + using that by simp + show \(not :: int \ _) = of_bits \ map Not \ bits_of\ + proof (rule sym, rule ext) + fix k :: int + show \(of_bits \ map Not \ bits_of) k = NOT k\ + by (induction k rule: int_bit_induct) (simp_all add: not_int_def) + qed qed end - -instance int :: ring_bit_representation -proof - show "(not :: int \ _) = of_bits \ map Not \ bits_of" - proof (rule sym, rule ext) - fix k :: int - show "(of_bits \ map Not \ bits_of) k = NOT k" - by (induction k rule: int_bit_induct) (simp_all add: not_int_def) - qed - show "push_bit n k = of_bits (replicate n False @ bits_of k)" - for k :: int and n :: nat - by (cases "n = 0") simp_all -qed (simp_all add: and_int.of_bits or_int.of_bits xor_int.of_bits) - -end diff -r 14914ae80f70 -r 6fd70ed18199 src/HOL/ex/Bit_Operations.thy --- a/src/HOL/ex/Bit_Operations.thy Sat Apr 25 13:26:25 2020 +0000 +++ b/src/HOL/ex/Bit_Operations.thy Mon Apr 27 16:18:51 2020 +0000 @@ -310,170 +310,8 @@ end -subsubsection \Instance \<^typ>\nat\\ - -locale zip_nat = single: abel_semigroup f - for f :: "bool \ bool \ bool" (infixl \\<^bold>*\ 70) + - assumes end_of_bits: \\ False \<^bold>* False\ -begin - -function F :: \nat \ nat \ nat\ (infixl \\<^bold>\\ 70) - where \m \<^bold>\ n = (if m = 0 \ n = 0 then 0 - else of_bool (odd m \<^bold>* odd n) + 2 * ((m div 2) \<^bold>\ (n div 2)))\ - by auto - -termination - by (relation "measure (case_prod (+))") auto - -declare F.simps [simp del] - -lemma rec: - "m \<^bold>\ n = of_bool (odd m \<^bold>* odd n) + (m div 2) \<^bold>\ (n div 2) * 2" -proof (cases \m = 0 \ n = 0\) - case True - then have \m \<^bold>\ n = 0\ - using True by (simp add: F.simps [of 0 0]) - moreover have \(m div 2) \<^bold>\ (n div 2) = m \<^bold>\ n\ - using True by simp - ultimately show ?thesis - using True by (simp add: end_of_bits) -next - case False - then show ?thesis - by (auto simp add: ac_simps F.simps [of m n]) -qed - -lemma bit_eq_iff: - \bit (m \<^bold>\ n) q \ bit m q \<^bold>* bit n q\ -proof (induction q arbitrary: m n) - case 0 - then show ?case - by (simp add: rec [of m n]) -next - case (Suc n) - then show ?case - by (simp add: rec [of m n] bit_Suc) -qed - -sublocale abel_semigroup F - by standard (simp_all add: Parity.bit_eq_iff bit_eq_iff ac_simps) - -end - -instantiation nat :: semiring_bit_operations -begin - -global_interpretation and_nat: zip_nat \(\)\ - defines and_nat = and_nat.F - by standard auto - -global_interpretation and_nat: semilattice \(AND) :: nat \ nat \ nat\ -proof (rule semilattice.intro, fact and_nat.abel_semigroup_axioms, standard) - show \n AND n = n\ for n :: nat - by (simp add: bit_eq_iff and_nat.bit_eq_iff) -qed - -global_interpretation or_nat: zip_nat \(\)\ - defines or_nat = or_nat.F - by standard auto - -global_interpretation or_nat: semilattice \(OR) :: nat \ nat \ nat\ -proof (rule semilattice.intro, fact or_nat.abel_semigroup_axioms, standard) - show \n OR n = n\ for n :: nat - by (simp add: bit_eq_iff or_nat.bit_eq_iff) -qed - -global_interpretation xor_nat: zip_nat \(\)\ - defines xor_nat = xor_nat.F - by standard auto - -instance proof - fix m n q :: nat - show \bit (m AND n) q \ bit m q \ bit n q\ - by (fact and_nat.bit_eq_iff) - show \bit (m OR n) q \ bit m q \ bit n q\ - by (fact or_nat.bit_eq_iff) - show \bit (m XOR n) q \ bit m q \ bit n q\ - by (fact xor_nat.bit_eq_iff) -qed - -end - -lemma Suc_0_and_eq [simp]: - \Suc 0 AND n = of_bool (odd n)\ - using one_and_eq [of n] by simp - -lemma and_Suc_0_eq [simp]: - \n AND Suc 0 = of_bool (odd n)\ - using and_one_eq [of n] by simp - -lemma Suc_0_or_eq [simp]: - \Suc 0 OR n = n + of_bool (even n)\ - using one_or_eq [of n] by simp - -lemma or_Suc_0_eq [simp]: - \n OR Suc 0 = n + of_bool (even n)\ - using or_one_eq [of n] by simp - -lemma Suc_0_xor_eq [simp]: - \Suc 0 XOR n = n + of_bool (even n) - of_bool (odd n)\ - using one_xor_eq [of n] by simp - -lemma xor_Suc_0_eq [simp]: - \n XOR Suc 0 = n + of_bool (even n) - of_bool (odd n)\ - using xor_one_eq [of n] by simp - - subsubsection \Instance \<^typ>\int\\ -locale zip_int = single: abel_semigroup f - for f :: \bool \ bool \ bool\ (infixl \\<^bold>*\ 70) -begin - -function F :: \int \ int \ int\ (infixl \\<^bold>\\ 70) - where \k \<^bold>\ l = (if k \ {0, - 1} \ l \ {0, - 1} - then - of_bool (odd k \<^bold>* odd l) - else of_bool (odd k \<^bold>* odd l) + 2 * ((k div 2) \<^bold>\ (l div 2)))\ - by auto - -termination - by (relation "measure (\(k, l). nat (\k\ + \l\))") auto - -declare F.simps [simp del] - -lemma rec: - \k \<^bold>\ l = of_bool (odd k \<^bold>* odd l) + 2 * ((k div 2) \<^bold>\ (l div 2))\ -proof (cases \k \ {0, - 1} \ l \ {0, - 1}\) - case True - then have \(k div 2) \<^bold>\ (l div 2) = k \<^bold>\ l\ - by auto - moreover have \of_bool (odd k \<^bold>* odd l) = - (k \<^bold>\ l)\ - using True by (simp add: F.simps [of k l]) - ultimately show ?thesis by simp -next - case False - then show ?thesis - by (auto simp add: ac_simps F.simps [of k l]) -qed - -lemma bit_eq_iff: - \bit (k \<^bold>\ l) n \ bit k n \<^bold>* bit l n\ -proof (induction n arbitrary: k l) - case 0 - then show ?case - by (simp add: rec [of k l]) -next - case (Suc n) - then show ?case - by (simp add: rec [of k l] bit_Suc) -qed - -lemma abel_semigroup_axioms: - \abel_semigroup F\ - by standard (simp_all add: Parity.bit_eq_iff bit_eq_iff ac_simps) - -end - instantiation int :: ring_bit_operations begin @@ -492,46 +330,89 @@ \NOT k div 2 = NOT (k div 2)\ for k :: int by (simp add: not_int_def) -lemma bit_not_iff_int: +lemma bit_not_int_iff: \bit (NOT k) n \ \ bit k n\ for k :: int by (induction n arbitrary: k) (simp_all add: not_int_div_2 even_not_iff_int bit_Suc) -global_interpretation and_int: zip_int "(\)" - defines and_int = and_int.F - by standard +function and_int :: \int \ int \ int\ + where \(k::int) AND l = (if k \ {0, - 1} \ l \ {0, - 1} + then - of_bool (odd k \ odd l) + else of_bool (odd k \ odd l) + 2 * ((k div 2) AND (l div 2)))\ + by auto + +termination + by (relation \measure (\(k, l). nat (\k\ + \l\))\) auto + +declare and_int.simps [simp del] -interpretation and_int: semilattice "(AND) :: int \ int \ int" -proof (rule semilattice.intro, fact and_int.abel_semigroup_axioms, standard) - show "k AND k = k" for k :: int - by (simp add: bit_eq_iff and_int.bit_eq_iff) +lemma and_int_rec: + \k AND l = of_bool (odd k \ odd l) + 2 * ((k div 2) AND (l div 2))\ + for k l :: int +proof (cases \k \ {0, - 1} \ l \ {0, - 1}\) + case True + then show ?thesis + by auto (simp_all add: and_int.simps) +next + case False + then show ?thesis + by (auto simp add: ac_simps and_int.simps [of k l]) qed -global_interpretation or_int: zip_int "(\)" - defines or_int = or_int.F - by standard - -interpretation or_int: semilattice "(OR) :: int \ int \ int" -proof (rule semilattice.intro, fact or_int.abel_semigroup_axioms, standard) - show "k OR k = k" for k :: int - by (simp add: bit_eq_iff or_int.bit_eq_iff) +lemma bit_and_int_iff: + \bit (k AND l) n \ bit k n \ bit l n\ for k l :: int +proof (induction n arbitrary: k l) + case 0 + then show ?case + by (simp add: and_int_rec [of k l]) +next + case (Suc n) + then show ?case + by (simp add: and_int_rec [of k l] bit_Suc) qed -global_interpretation xor_int: zip_int "(\)" - defines xor_int = xor_int.F - by standard +lemma even_and_iff_int: + \even (k AND l) \ even k \ even l\ for k l :: int + using bit_and_int_iff [of k l 0] by auto + +definition or_int :: \int \ int \ int\ + where \k OR l = NOT (NOT k AND NOT l)\ for k l :: int + +lemma or_int_rec: + \k OR l = of_bool (odd k \ odd l) + 2 * ((k div 2) OR (l div 2))\ + for k l :: int + using and_int_rec [of \NOT k\ \NOT l\] + by (simp add: or_int_def even_not_iff_int not_int_div_2) + (simp add: not_int_def) + +lemma bit_or_int_iff: + \bit (k OR l) n \ bit k n \ bit l n\ for k l :: int + by (simp add: or_int_def bit_not_int_iff bit_and_int_iff) + +definition xor_int :: \int \ int \ int\ + where \k XOR l = k AND NOT l OR NOT k AND l\ for k l :: int + +lemma xor_int_rec: + \k XOR l = of_bool (odd k \ odd l) + 2 * ((k div 2) XOR (l div 2))\ + for k l :: int + by (simp add: xor_int_def or_int_rec [of \k AND NOT l\ \NOT k AND l\] even_and_iff_int even_not_iff_int) + (simp add: and_int_rec [of \NOT k\ \l\] and_int_rec [of \k\ \NOT l\] not_int_div_2) + +lemma bit_xor_int_iff: + \bit (k XOR l) n \ bit k n \ bit l n\ for k l :: int + by (auto simp add: xor_int_def bit_or_int_iff bit_and_int_iff bit_not_int_iff) instance proof fix k l :: int and n :: nat show \- k = NOT (k - 1)\ by (simp add: not_int_def) show \bit (k AND l) n \ bit k n \ bit l n\ - by (fact and_int.bit_eq_iff) + by (fact bit_and_int_iff) show \bit (k OR l) n \ bit k n \ bit l n\ - by (fact or_int.bit_eq_iff) + by (fact bit_or_int_iff) show \bit (k XOR l) n \ bit k n \ bit l n\ - by (fact xor_int.bit_eq_iff) -qed (simp_all add: bit_not_iff_int) + by (fact bit_xor_int_iff) +qed (simp_all add: bit_not_int_iff) end @@ -556,14 +437,14 @@ next case (even k) then show ?case - using and_int.rec [of \k * 2\ l] by (simp add: pos_imp_zdiv_nonneg_iff) + using and_int_rec [of \k * 2\ l] by (simp add: pos_imp_zdiv_nonneg_iff) next case (odd k) from odd have \0 \ k AND l div 2 \ 0 \ k \ 0 \ l div 2\ by simp then have \0 \ (1 + k * 2) div 2 AND l div 2 \ 0 \ (1 + k * 2) div 2\ 0 \ l div 2\ by simp - with and_int.rec [of \1 + k * 2\ l] + with and_int_rec [of \1 + k * 2\ l] show ?case by auto qed @@ -613,6 +494,69 @@ by (simp add: flip_bit_def) +subsubsection \Instance \<^typ>\nat\\ + +instantiation nat :: semiring_bit_operations +begin + +definition and_nat :: \nat \ nat \ nat\ + where \m AND n = nat (int m AND int n)\ for m n :: nat + +definition or_nat :: \nat \ nat \ nat\ + where \m OR n = nat (int m OR int n)\ for m n :: nat + +definition xor_nat :: \nat \ nat \ nat\ + where \m XOR n = nat (int m XOR int n)\ for m n :: nat + +instance proof + fix m n q :: nat + show \bit (m AND n) q \ bit m q \ bit n q\ + by (auto simp add: and_nat_def bit_and_iff less_le bit_eq_iff) + show \bit (m OR n) q \ bit m q \ bit n q\ + by (auto simp add: or_nat_def bit_or_iff less_le bit_eq_iff) + show \bit (m XOR n) q \ bit m q \ bit n q\ + by (auto simp add: xor_nat_def bit_xor_iff less_le bit_eq_iff) +qed + +end + +lemma and_nat_rec: + \m AND n = of_bool (odd m \ odd n) + 2 * ((m div 2) AND (n div 2))\ for m n :: nat + by (simp add: and_nat_def and_int_rec [of \int m\ \int n\] zdiv_int nat_add_distrib nat_mult_distrib) + +lemma or_nat_rec: + \m OR n = of_bool (odd m \ odd n) + 2 * ((m div 2) OR (n div 2))\ for m n :: nat + by (simp add: or_nat_def or_int_rec [of \int m\ \int n\] zdiv_int nat_add_distrib nat_mult_distrib) + +lemma xor_nat_rec: + \m XOR n = of_bool (odd m \ odd n) + 2 * ((m div 2) XOR (n div 2))\ for m n :: nat + by (simp add: xor_nat_def xor_int_rec [of \int m\ \int n\] zdiv_int nat_add_distrib nat_mult_distrib) + +lemma Suc_0_and_eq [simp]: + \Suc 0 AND n = of_bool (odd n)\ + using one_and_eq [of n] by simp + +lemma and_Suc_0_eq [simp]: + \n AND Suc 0 = of_bool (odd n)\ + using and_one_eq [of n] by simp + +lemma Suc_0_or_eq [simp]: + \Suc 0 OR n = n + of_bool (even n)\ + using one_or_eq [of n] by simp + +lemma or_Suc_0_eq [simp]: + \n OR Suc 0 = n + of_bool (even n)\ + using or_one_eq [of n] by simp + +lemma Suc_0_xor_eq [simp]: + \Suc 0 XOR n = n + of_bool (even n) - of_bool (odd n)\ + using one_xor_eq [of n] by simp + +lemma xor_Suc_0_eq [simp]: + \n XOR Suc 0 = n + of_bool (even n) - of_bool (odd n)\ + using xor_one_eq [of n] by simp + + subsubsection \Instances for \<^typ>\integer\ and \<^typ>\natural\\ unbundle integer.lifting natural.lifting @@ -653,11 +597,11 @@ show \bit (NOT k) n \ (2 :: integer) ^ n \ 0 \ \ bit k n\ by transfer (fact bit_not_iff) show \bit (k AND l) n \ bit k n \ bit l n\ - by transfer (fact and_int.bit_eq_iff) + by transfer (fact bit_and_iff) show \bit (k OR l) n \ bit k n \ bit l n\ - by transfer (fact or_int.bit_eq_iff) + by transfer (fact bit_or_iff) show \bit (k XOR l) n \ bit k n \ bit l n\ - by transfer (fact xor_int.bit_eq_iff) + by transfer (fact bit_xor_iff) qed end @@ -677,11 +621,11 @@ instance proof fix m n :: \natural\ and q :: nat show \bit (m AND n) q \ bit m q \ bit n q\ - by transfer (fact and_nat.bit_eq_iff) + by transfer (fact bit_and_iff) show \bit (m OR n) q \ bit m q \ bit n q\ - by transfer (fact or_nat.bit_eq_iff) + by transfer (fact bit_or_iff) show \bit (m XOR n) q \ bit m q \ bit n q\ - by transfer (fact xor_nat.bit_eq_iff) + by transfer (fact bit_xor_iff) qed end