# HG changeset patch # User haftmann # Date 1583687269 0 # Node ID b612edee9b0cd19483b69cb7ebdff4f62b024a5a # Parent f10bffaa2bae4db5c58d80ee070ab5718c732841 more frugal simp rules for bit operations; more pervasive use of bit selector diff -r f10bffaa2bae -r b612edee9b0c src/HOL/Code_Numeral.thy --- a/src/HOL/Code_Numeral.thy Mon Mar 09 19:35:07 2020 +0100 +++ b/src/HOL/Code_Numeral.thy Sun Mar 08 17:07:49 2020 +0000 @@ -88,7 +88,7 @@ lemma [transfer_rule]: "((\) ===> pcr_integer) of_bool of_bool" - by (unfold of_bool_def [abs_def]) transfer_prover + by (unfold of_bool_def) transfer_prover lemma [transfer_rule]: "((=) ===> pcr_integer) int of_nat" @@ -108,11 +108,11 @@ lemma [transfer_rule]: "((=) ===> (=) ===> pcr_integer) Num.sub Num.sub" - by (unfold Num.sub_def [abs_def]) transfer_prover + by (unfold Num.sub_def) transfer_prover lemma [transfer_rule]: "(pcr_integer ===> (=) ===> pcr_integer) (^) (^)" - by (unfold power_def [abs_def]) transfer_prover + by (unfold power_def) transfer_prover end @@ -218,13 +218,19 @@ end -lemma [transfer_rule]: - "rel_fun pcr_integer (rel_fun pcr_integer pcr_integer) (min :: _ \ _ \ int) (min :: _ \ _ \ integer)" - by (unfold min_def [abs_def]) transfer_prover +context + includes lifting_syntax +begin lemma [transfer_rule]: - "rel_fun pcr_integer (rel_fun pcr_integer pcr_integer) (max :: _ \ _ \ int) (max :: _ \ _ \ integer)" - by (unfold max_def [abs_def]) transfer_prover + \(pcr_integer ===> pcr_integer ===> pcr_integer) min min\ + by (unfold min_def) transfer_prover + +lemma [transfer_rule]: + \(pcr_integer ===> pcr_integer ===> pcr_integer) max max\ + by (unfold max_def) transfer_prover + +end lemma int_of_integer_min [simp]: "int_of_integer (min k l) = min (int_of_integer k) (int_of_integer l)" @@ -304,9 +310,19 @@ end +context + includes lifting_syntax +begin + lemma [transfer_rule]: - "rel_fun (=) (rel_fun pcr_integer pcr_integer) (take_bit :: _ \ _ \ int) (take_bit :: _ \ _ \ integer)" - by (unfold take_bit_eq_mod [abs_def]) transfer_prover + \(pcr_integer ===> (=) ===> (\)) bit bit\ + by (unfold bit_def) transfer_prover + +lemma [transfer_rule]: + \((=) ===> pcr_integer ===> pcr_integer) take_bit take_bit\ + by (unfold take_bit_eq_mod) transfer_prover + +end instance integer :: unique_euclidean_semiring_with_bit_shifts .. @@ -372,10 +388,16 @@ where [simp, code_post]: "Pos = numeral" +context + includes lifting_syntax +begin + lemma [transfer_rule]: - "rel_fun HOL.eq pcr_integer numeral Pos" + \((=) ===> pcr_integer) numeral Pos\ by simp transfer_prover +end + lemma Pos_fold [code_unfold]: "numeral Num.One = Pos Num.One" "numeral (Num.Bit0 k) = Pos (Num.Bit0 k)" @@ -386,9 +408,15 @@ where [simp, code_abbrev]: "Neg n = - Pos n" +context + includes lifting_syntax +begin + lemma [transfer_rule]: - "rel_fun HOL.eq pcr_integer (\n. - numeral n) Neg" - by (simp add: Neg_def [abs_def]) transfer_prover + \((=) ===> pcr_integer) (\n. - numeral n) Neg\ + by (unfold Neg_def) transfer_prover + +end code_datatype "0::integer" Pos Neg @@ -853,33 +881,39 @@ instance natural :: Rings.dvd .. +context + includes lifting_syntax +begin + lemma [transfer_rule]: - "rel_fun pcr_natural (rel_fun pcr_natural HOL.iff) Rings.dvd Rings.dvd" - unfolding dvd_def by transfer_prover + \(pcr_natural ===> pcr_natural ===> (\)) (dvd) (dvd)\ + by (unfold dvd_def) transfer_prover lemma [transfer_rule]: - "rel_fun (=) pcr_natural (of_bool :: bool \ nat) (of_bool :: bool \ natural)" - by (unfold of_bool_def [abs_def]) transfer_prover + \((\) ===> pcr_natural) of_bool of_bool\ + by (unfold of_bool_def) transfer_prover lemma [transfer_rule]: - "rel_fun HOL.eq pcr_natural (\n::nat. n) (of_nat :: nat \ natural)" + \((=) ===> pcr_natural) (\n. n) of_nat\ proof - have "rel_fun HOL.eq pcr_natural (of_nat :: nat \ nat) (of_nat :: nat \ natural)" - by (unfold of_nat_def [abs_def]) transfer_prover + by (unfold of_nat_def) transfer_prover then show ?thesis by (simp add: id_def) qed lemma [transfer_rule]: - "rel_fun HOL.eq pcr_natural (numeral :: num \ nat) (numeral :: num \ natural)" + \((=) ===> pcr_natural) numeral numeral\ proof - - have "rel_fun HOL.eq pcr_natural (numeral :: num \ nat) (\n. of_nat (numeral n))" + have \((=) ===> pcr_natural) numeral (\n. of_nat (numeral n))\ by transfer_prover then show ?thesis by simp qed lemma [transfer_rule]: - "rel_fun pcr_natural (rel_fun (=) pcr_natural) (power :: _ \ _ \ nat) (power :: _ \ _ \ natural)" - by (unfold power_def [abs_def]) transfer_prover + \(pcr_natural ===> (=) ===> pcr_natural) (^) (^)\ + by (unfold power_def) transfer_prover + +end lemma nat_of_natural_of_nat [simp]: "nat_of_natural (of_nat n) = n" @@ -921,13 +955,19 @@ end -lemma [transfer_rule]: - "rel_fun pcr_natural (rel_fun pcr_natural pcr_natural) (min :: _ \ _ \ nat) (min :: _ \ _ \ natural)" - by (unfold min_def [abs_def]) transfer_prover +context + includes lifting_syntax +begin lemma [transfer_rule]: - "rel_fun pcr_natural (rel_fun pcr_natural pcr_natural) (max :: _ \ _ \ nat) (max :: _ \ _ \ natural)" - by (unfold max_def [abs_def]) transfer_prover + \(pcr_natural ===> pcr_natural ===> pcr_natural) min min\ + by (unfold min_def) transfer_prover + +lemma [transfer_rule]: + \(pcr_natural ===> pcr_natural ===> pcr_natural) max max\ + by (unfold max_def) transfer_prover + +end lemma nat_of_natural_min [simp]: "nat_of_natural (min k l) = min (nat_of_natural k) (nat_of_natural l)" @@ -1001,9 +1041,19 @@ end +context + includes lifting_syntax +begin + lemma [transfer_rule]: - "rel_fun (=) (rel_fun pcr_natural pcr_natural) (take_bit :: _ \ _ \ nat) (take_bit :: _ \ _ \ natural)" - by (unfold take_bit_eq_mod [abs_def]) transfer_prover + \(pcr_natural ===> (=) ===> (\)) bit bit\ + by (unfold bit_def) transfer_prover + +lemma [transfer_rule]: + \((=) ===> pcr_natural ===> pcr_natural) take_bit take_bit\ + by (unfold take_bit_eq_mod) transfer_prover + +end instance natural :: unique_euclidean_semiring_with_bit_shifts .. diff -r f10bffaa2bae -r b612edee9b0c src/HOL/Euclidean_Division.thy --- a/src/HOL/Euclidean_Division.thy Mon Mar 09 19:35:07 2020 +0100 +++ b/src/HOL/Euclidean_Division.thy Sun Mar 08 17:07:49 2020 +0000 @@ -2002,6 +2002,10 @@ by (simp add: of_nat_mod of_nat_diff) qed +lemma of_bool_half_eq_0 [simp]: + \of_bool b div 2 = 0\ + by simp + end class unique_euclidean_ring_with_nat = ring + unique_euclidean_semiring_with_nat diff -r f10bffaa2bae -r b612edee9b0c src/HOL/Parity.thy --- a/src/HOL/Parity.thy Mon Mar 09 19:35:07 2020 +0100 +++ b/src/HOL/Parity.thy Sun Mar 08 17:07:49 2020 +0000 @@ -168,6 +168,15 @@ by simp qed +lemma mask_eq_seq_sum: + \2 ^ n - 1 = ((\k. 1 + k * 2) ^^ n) 0\ +proof - + have \2 ^ n = ((\k. 1 + k * 2) ^^ n) 0 + 1\ + by (induction n) (simp_all add: ac_simps mult_2) + then show ?thesis + by simp +qed + end class ring_parity = ring + semiring_parity @@ -742,10 +751,14 @@ \bit a 0 \ odd a\ by (simp add: bit_def) -lemma bit_Suc [simp]: +lemma bit_Suc: \bit a (Suc n) \ bit (a div 2) n\ using div_exp_eq [of a 1 n] by (simp add: bit_def) +lemma bit_rec: + \bit a n \ (if n = 0 then odd a else bit (a div 2) (n - 1))\ + by (cases n) (simp_all add: bit_Suc) + lemma bit_0_eq [simp]: \bit 0 = bot\ by (simp add: fun_eq_iff bit_def) @@ -768,7 +781,7 @@ lemma stable_imp_bit_iff_odd: \bit a n \ odd a\ - by (induction n) (simp_all add: stable) + by (induction n) (simp_all add: stable bit_Suc) end @@ -781,11 +794,11 @@ next case (rec a b) from rec.prems [of 1] have [simp]: \b = odd a\ - by (simp add: rec.hyps) + by (simp add: rec.hyps bit_Suc) from rec.hyps have hyp: \(of_bool (odd a) + 2 * a) div 2 = a\ by simp have \bit a n \ odd a\ for n - using rec.prems [of \Suc n\] by (simp add: hyp) + using rec.prems [of \Suc n\] by (simp add: hyp bit_Suc) then have \a div 2 = a\ by (rule rec.IH) then have \of_bool (odd a) + 2 * a = 2 * (a div 2) + of_bool (odd a)\ @@ -841,7 +854,7 @@ from rec.prems [of 0] have [simp]: \p = odd b\ by simp from rec.hyps have \bit a n \ bit (b div 2) n\ for n - using rec.prems [of \Suc n\] by simp + using rec.prems [of \Suc n\] by (simp add: bit_Suc) then have \a = b div 2\ by (rule rec.IH) then have \2 * a = 2 * (b div 2)\ @@ -912,7 +925,7 @@ moreover from \a div 2 = b div 2\ have \bit (a div 2) n = bit (b div 2) n\ by simp ultimately show ?thesis - by simp + by (simp add: bit_Suc) qed qed qed @@ -1182,7 +1195,7 @@ "take_bit 0 a = 0" by (simp add: take_bit_eq_mod) -lemma take_bit_Suc [simp]: +lemma take_bit_Suc: \take_bit (Suc n) a = take_bit n (a div 2) * 2 + of_bool (odd a)\ proof - have \take_bit (Suc n) (a div 2 * 2 + of_bool (odd a)) = take_bit n (a div 2) * 2 + of_bool (odd a)\ @@ -1193,13 +1206,17 @@ using div_mult_mod_eq [of a 2] by (simp add: mod_2_eq_odd) qed +lemma take_bit_rec: + \take_bit n a = (if n = 0 then 0 else take_bit (n - 1) (a div 2) * 2 + of_bool (odd a))\ + by (cases n) (simp_all add: take_bit_Suc) + lemma take_bit_of_0 [simp]: "take_bit n 0 = 0" by (simp add: take_bit_eq_mod) lemma take_bit_of_1 [simp]: "take_bit n 1 = of_bool (n > 0)" - by (cases n) simp_all + by (cases n) (simp_all add: take_bit_Suc) lemma drop_bit_of_0 [simp]: "drop_bit n 0 = 0" @@ -1213,16 +1230,20 @@ "drop_bit 0 = id" by (simp add: fun_eq_iff drop_bit_eq_div) -lemma drop_bit_Suc [simp]: +lemma drop_bit_Suc: "drop_bit (Suc n) a = drop_bit n (a div 2)" using div_exp_eq [of a 1] by (simp add: drop_bit_eq_div) +lemma drop_bit_rec: + "drop_bit n a = (if n = 0 then a else drop_bit (n - 1) (a div 2))" + by (cases n) (simp_all add: drop_bit_Suc) + lemma drop_bit_half: "drop_bit n (a div 2) = drop_bit n a div 2" - by (induction n arbitrary: a) simp_all + by (induction n arbitrary: a) (simp_all add: drop_bit_Suc) lemma drop_bit_of_bool [simp]: - "drop_bit n (of_bool d) = of_bool (n = 0 \ d)" + "drop_bit n (of_bool b) = of_bool (n = 0 \ b)" by (cases n) simp_all lemma take_bit_eq_0_imp_dvd: @@ -1231,7 +1252,7 @@ lemma even_take_bit_eq [simp]: \even (take_bit n a) \ n = 0 \ even a\ - by (cases n) simp_all + by (simp add: take_bit_rec [of n a]) lemma take_bit_take_bit [simp]: "take_bit m (take_bit n a) = take_bit (min m n) a" @@ -1302,6 +1323,21 @@ \bit (take_bit m a) n \ n < m \ bit a n\ by (simp add: bit_def drop_bit_take_bit not_le flip: drop_bit_eq_div) +lemma stable_imp_drop_bit_eq: + \drop_bit n a = a\ + if \a div 2 = a\ + by (induction n) (simp_all add: that drop_bit_Suc) + +lemma stable_imp_take_bit_eq: + \take_bit n a = (if even a then 0 else 2 ^ n - 1)\ + if \a div 2 = a\ +proof (rule bit_eqI) + fix m + assume \2 ^ m \ 0\ + with that show \bit (take_bit n a) m \ bit (if even a then 0 else 2 ^ n - 1) m\ + by (simp add: bit_take_bit_iff bit_mask_iff stable_imp_bit_iff_odd) +qed + end instantiation nat :: semiring_bit_shifts diff -r f10bffaa2bae -r b612edee9b0c src/HOL/Set_Interval.thy --- a/src/HOL/Set_Interval.thy Mon Mar 09 19:35:07 2020 +0100 +++ b/src/HOL/Set_Interval.thy Sun Mar 08 17:07:49 2020 +0000 @@ -2072,7 +2072,7 @@ begin lemma take_bit_sum: - "take_bit n a = (\k = 0..k = 0..k = 0..k = Suc 0..k = 0..k = Suc 0..k = Suc 0..k = 0..k = Suc 0..k = 0..Bytes as datatype\ +context unique_euclidean_semiring_with_bit_shifts +begin + +lemma bit_horner_sum_iff: + \bit (foldr (\b k. of_bool b + k * 2) bs 0) n \ n < length bs \ bs ! n\ +proof (induction bs arbitrary: n) + case Nil + then show ?case + by simp +next + case (Cons b bs) + show ?case + proof (cases n) + case 0 + then show ?thesis + by simp + next + case (Suc m) + with bit_rec [of _ n] Cons.prems Cons.IH [of m] + show ?thesis by simp + qed +qed + +lemma take_bit_horner_sum_eq: + \take_bit n (foldr (\b k. of_bool b + k * 2) bs 0) = foldr (\b k. of_bool b + k * 2) (take n bs) 0\ +proof (induction bs arbitrary: n) + case Nil + then show ?case + by simp +next + case (Cons b bs) + show ?case + proof (cases n) + case 0 + then show ?thesis + by simp + next + case (Suc m) + with take_bit_rec [of n] Cons.prems Cons.IH [of m] + show ?thesis by (simp add: ac_simps) + qed +qed + +lemma (in semiring_bit_shifts) take_bit_eq_horner_sum: + \take_bit n a = foldr (\b k. of_bool b + k * 2) (map (bit a) [0.. +proof (induction a arbitrary: n rule: bits_induct) + case (stable a) + have *: \((\k. k * 2) ^^ n) 0 = 0\ + by (induction n) simp_all + from stable have \bit a = (\_. odd a)\ + by (simp add: stable_imp_bit_iff_odd fun_eq_iff) + then have \map (bit a) [0.. + by (simp add: map_replicate_const) + with stable show ?case + by (simp add: stable_imp_take_bit_eq mask_eq_seq_sum *) +next + case (rec a b) + show ?case + proof (cases n) + case 0 + then show ?thesis + by simp + next + case (Suc m) + have \map (bit (of_bool b + 2 * a)) [0.. + by (simp only: upt_conv_Cons) simp + also have \\ = b # map (bit a) [0.. + by (simp only: flip: map_Suc_upt) (simp add: bit_Suc rec.hyps) + finally show ?thesis + using Suc rec.IH [of m] by (simp add: take_bit_Suc rec.hyps, simp add: ac_simps) + qed +qed + +end + datatype char = Char (digit0: bool) (digit1: bool) (digit2: bool) (digit3: bool) (digit4: bool) (digit5: bool) (digit6: bool) (digit7: bool) @@ -28,49 +103,37 @@ context comm_semiring_1 begin -definition of_char :: "char \ 'a" - where "of_char c = ((((((of_bool (digit7 c) * 2 - + of_bool (digit6 c)) * 2 - + of_bool (digit5 c)) * 2 - + of_bool (digit4 c)) * 2 - + of_bool (digit3 c)) * 2 - + of_bool (digit2 c)) * 2 - + of_bool (digit1 c)) * 2 - + of_bool (digit0 c)" +definition of_char :: \char \ 'a\ + where \of_char c = foldr (\b k. of_bool b + k * 2) + [digit0 c, digit1 c, digit2 c, digit3 c, digit4 c, digit5 c, digit6 c, digit7 c] 0\ lemma of_char_Char [simp]: - "of_char (Char b0 b1 b2 b3 b4 b5 b6 b7) = - foldr (\b k. of_bool b + k * 2) [b0, b1, b2, b3, b4, b5, b6, b7] 0" - by (simp add: of_char_def ac_simps) + \of_char (Char b0 b1 b2 b3 b4 b5 b6 b7) = + foldr (\b k. of_bool b + k * 2) [b0, b1, b2, b3, b4, b5, b6, b7] 0\ + by (simp add: of_char_def) end context unique_euclidean_semiring_with_bit_shifts begin -definition char_of :: "'a \ char" - where "char_of n = Char (odd n) (odd (drop_bit 1 n)) - (odd (drop_bit 2 n)) (odd (drop_bit 3 n)) - (odd (drop_bit 4 n)) (odd (drop_bit 5 n)) - (odd (drop_bit 6 n)) (odd (drop_bit 7 n))" +definition char_of :: \'a \ char\ + where \char_of n = Char (odd n) (bit n 1) (bit n 2) (bit n 3) (bit n 4) (bit n 5) (bit n 6) (bit n 7)\ + +lemma char_of_take_bit_eq: + \char_of (take_bit n m) = char_of m\ if \n \ 8\ + using that by (simp add: char_of_def bit_take_bit_iff) lemma char_of_char [simp]: - "char_of (of_char c) = c" -proof (cases c) - have **: "drop_bit n (q * 2 + of_bool d) = drop_bit (n - 1) q + drop_bit n (of_bool d)" - if "n > 0" for q :: 'a and n :: nat and d :: bool - using that by (cases n) simp_all - case (Char d0 d1 d2 d3 d4 d5 d6 d7) - then show ?thesis - by (simp only: of_char_def char_of_def char.simps char.sel drop_bit_of_bool **) simp -qed + \char_of (of_char c) = c\ + by (simp only: of_char_def char_of_def bit_horner_sum_iff) simp lemma char_of_comp_of_char [simp]: "char_of \ of_char = id" by (simp add: fun_eq_iff) lemma inj_of_char: - "inj of_char" + \inj of_char\ proof (rule injI) fix c d assume "of_char c = of_char d" @@ -79,45 +142,61 @@ then show "c = d" by simp qed - + +lemma of_char_eqI: + \c = d\ if \of_char c = of_char d\ + using that inj_of_char by (simp add: inj_eq) + lemma of_char_eq_iff [simp]: - "of_char c = of_char d \ c = d" - by (simp add: inj_eq inj_of_char) + \of_char c = of_char d \ c = d\ + by (auto intro: of_char_eqI) lemma of_char_of [simp]: - "of_char (char_of a) = a mod 256" + \of_char (char_of a) = a mod 256\ proof - - have *: "{0::nat..<8} = {0, 1, 2, 3, 4, 5, 6, 7}" - by auto - have "of_char (char_of (take_bit 8 a)) = - (\k\{0, 1, 2, 3, 4, 5, 6, 7}. push_bit k (of_bool (odd (drop_bit k a))))" - by (simp add: of_char_def char_of_def push_bit_of_1 drop_bit_take_bit) - also have "\ = take_bit 8 a" - using * take_bit_sum [of 8 a] by simp - also have "char_of(take_bit 8 a) = char_of a" - by (simp add: char_of_def drop_bit_take_bit) - finally show ?thesis + have \[0..<8] = [0, Suc 0, 2, 3, 4, 5, 6, 7 :: nat]\ + by (simp add: upt_eq_Cons_conv) + then have \[odd a, bit a 1, bit a 2, bit a 3, bit a 4, bit a 5, bit a 6, bit a 7] = map (bit a) [0..<8]\ + by simp + then have \of_char (char_of a) = take_bit 8 a\ + by (simp only: char_of_def of_char_def char.sel take_bit_eq_horner_sum) + then show ?thesis by (simp add: take_bit_eq_mod) qed lemma char_of_mod_256 [simp]: - "char_of (n mod 256) = char_of n" - by (metis char_of_char of_char_of) + \char_of (n mod 256) = char_of n\ + by (rule of_char_eqI) simp lemma of_char_mod_256 [simp]: - "of_char c mod 256 = of_char c" - by (metis char_of_char of_char_of) + \of_char c mod 256 = of_char c\ +proof - + have \of_char (char_of (of_char c)) mod 256 = of_char (char_of (of_char c))\ + by (simp only: of_char_of) simp + then show ?thesis + by simp +qed lemma char_of_quasi_inj [simp]: - "char_of m = char_of n \ m mod 256 = n mod 256" - by (metis char_of_mod_256 of_char_of) + \char_of m = char_of n \ m mod 256 = n mod 256\ (is \?P \ ?Q\) +proof + assume ?Q + then show ?P + by (auto intro: of_char_eqI) +next + assume ?P + then have \of_char (char_of m) = of_char (char_of n)\ + by simp + then show ?Q + by simp +qed -lemma char_of_nat_eq_iff: - "char_of n = c \ take_bit 8 n = of_char c" - by (simp add: take_bit_eq_mod) (use of_char_eq_iff in fastforce) +lemma char_of_eq_iff: + \char_of n = c \ take_bit 8 n = of_char c\ + by (auto intro: of_char_eqI simp add: take_bit_eq_mod) lemma char_of_nat [simp]: - "char_of (of_nat n) = char_of n" + \char_of (of_nat n) = char_of n\ by (simp add: char_of_def String.char_of_def drop_bit_of_nat) end @@ -168,20 +247,20 @@ begin lemma [transfer_rule]: - "(pcr_integer ===> (=)) (char_of :: int \ char) (char_of :: integer \ char)" - by (unfold char_of_def [abs_def]) transfer_prover + \(pcr_integer ===> (=)) char_of char_of\ + by (unfold char_of_def) transfer_prover lemma [transfer_rule]: - "((=) ===> pcr_integer) (of_char :: char \ int) (of_char :: char \ integer)" - by (unfold of_char_def [abs_def]) transfer_prover + \((=) ===> pcr_integer) of_char of_char\ + by (unfold of_char_def) transfer_prover lemma [transfer_rule]: - "(pcr_natural ===> (=)) (char_of :: nat \ char) (char_of :: natural \ char)" - by (unfold char_of_def [abs_def]) transfer_prover + \(pcr_natural ===> (=)) char_of char_of\ + by (unfold char_of_def) transfer_prover lemma [transfer_rule]: - "((=) ===> pcr_natural) (of_char :: char \ nat) (of_char :: char \ natural)" - by (unfold of_char_def [abs_def]) transfer_prover + \((=) ===> pcr_natural) of_char of_char\ + by (unfold of_char_def) transfer_prover end @@ -326,7 +405,7 @@ (q6, b6) = bit_cut_integer q5; (_, b7) = bit_cut_integer q6 in Char b0 b1 b2 b3 b4 b5 b6 b7)" - by (simp add: bit_cut_integer_def char_of_integer_def char_of_def div_mult2_numeral_eq odd_iff_mod_2_eq_one drop_bit_eq_div) + by (simp add: bit_cut_integer_def char_of_integer_def char_of_def div_mult2_numeral_eq bit_iff_odd_drop_bit drop_bit_eq_div) lemma integer_of_char_code [code]: "integer_of_char (Char b0 b1 b2 b3 b4 b5 b6 b7) = @@ -334,7 +413,7 @@ of_bool b5) * 2 + of_bool b4) * 2 + of_bool b3) * 2 + of_bool b2) * 2 + of_bool b1) * 2 + of_bool b0" - by (simp only: integer_of_char_def of_char_def char.sel) + by (simp add: integer_of_char_def of_char_def) subsection \Strings as dedicated type for target language code generation\ @@ -361,8 +440,7 @@ qualified lemma char_of_ascii_of [simp]: "of_char (ascii_of c) = take_bit 7 (of_char c :: nat)" - by (cases c) - (simp add: numeral_3_eq_3 [symmetric] numeral_2_eq_2 [symmetric]) + by (cases c) (simp only: ascii_of_Char of_char_Char take_bit_horner_sum_eq, simp) qualified typedef literal = "{cs. \c\set cs. \ digit7 c}" morphisms explode Abs_literal @@ -632,9 +710,17 @@ where [simp]: "Literal' = String.Literal" lemma [code]: - "Literal' b0 b1 b2 b3 b4 b5 b6 s = String.literal_of_asciis - [foldr (\b k. of_bool b + k * 2) [b0, b1, b2, b3, b4, b5, b6] 0] + s" - unfolding Literal'_def by transfer (simp add: char_of_def) + \Literal' b0 b1 b2 b3 b4 b5 b6 s = String.literal_of_asciis + [foldr (\b k. of_bool b + k * 2) [b0, b1, b2, b3, b4, b5, b6] 0] + s\ +proof - + have \foldr (\b k. of_bool b + k * 2) [b0, b1, b2, b3, b4, b5, b6] 0 = of_char (Char b0 b1 b2 b3 b4 b5 b6 False)\ + by simp + moreover have \Literal' b0 b1 b2 b3 b4 b5 b6 s = String.literal_of_asciis + [of_char (Char b0 b1 b2 b3 b4 b5 b6 False)] + s\ + by (unfold Literal'_def) (transfer, simp only: list.simps comp_apply char_of_char, simp) + ultimately show ?thesis + by simp +qed lemma [code_computation_unfold]: "String.Literal = Literal'" diff -r f10bffaa2bae -r b612edee9b0c src/HOL/ex/Bit_Lists.thy --- a/src/HOL/ex/Bit_Lists.thy Mon Mar 09 19:35:07 2020 +0100 +++ b/src/HOL/ex/Bit_Lists.thy Sun Mar 08 17:07:49 2020 +0000 @@ -1,4 +1,4 @@ -(* Author: Florian Haftmann, TUM + (* Author: Florian Haftmann, TUM *) section \Proof(s) of concept for algebraically founded lists of bits\ @@ -44,11 +44,11 @@ next case (Cons b bs) then show ?case - by (cases n) (simp_all add: ac_simps) + by (cases n) (simp_all add: ac_simps take_bit_Suc) qed lemma unsigned_of_bits_drop [simp]: - "unsigned_of_bits (drop n bs) = Parity.drop_bit n (unsigned_of_bits bs)" + "unsigned_of_bits (drop n bs) = drop_bit n (unsigned_of_bits bs)" proof (induction bs arbitrary: n) case Nil then show ?case @@ -56,7 +56,7 @@ next case (Cons b bs) then show ?case - by (cases n) simp_all + by (cases n) (simp_all add: drop_bit_Suc) qed lemma bit_unsigned_of_bits_iff: @@ -68,7 +68,7 @@ next case (Cons b bs) then show ?case - by (cases n) simp_all + by (cases n) (simp_all add: bit_Suc) qed primrec n_bits_of :: "nat \ 'a \ bool list" @@ -77,9 +77,9 @@ | "n_bits_of (Suc n) a = odd a # n_bits_of n (a div 2)" lemma n_bits_of_eq_iff: - "n_bits_of n a = n_bits_of n b \ Parity.take_bit n a = Parity.take_bit n b" + "n_bits_of n a = n_bits_of n b \ take_bit n a = take_bit n b" apply (induction n arbitrary: a b) - apply (auto elim!: evenE oddE) + apply (auto elim!: evenE oddE simp add: take_bit_Suc) apply (metis dvd_triv_right even_plus_one_iff) apply (metis dvd_triv_right even_plus_one_iff) done @@ -97,8 +97,8 @@ qed lemma unsigned_of_bits_n_bits_of [simp]: - "unsigned_of_bits (n_bits_of n a) = Parity.take_bit n a" - by (induction n arbitrary: a) (simp_all add: ac_simps) + "unsigned_of_bits (n_bits_of n a) = take_bit n a" + by (induction n arbitrary: a) (simp_all add: ac_simps take_bit_Suc) end @@ -236,7 +236,7 @@ next case (Cons b bs) then show ?case - by (cases n; cases b; cases bs) simp_all + by (cases n; cases b; cases bs) (simp_all add: bit_Suc) qed lemma of_bits_append [simp]: @@ -257,7 +257,7 @@ by (auto simp add: of_bits_int_def) lemma of_bits_drop [simp]: - "of_bits (drop n bs) = Parity.drop_bit n (of_bits bs :: int)" + "of_bits (drop n bs) = drop_bit n (of_bits bs :: int)" if "n < length bs" using that proof (induction bs arbitrary: n) case Nil @@ -275,7 +275,7 @@ with Cons.prems have "bs \ []" by auto with Suc Cons.IH [of n] Cons.prems show ?thesis - by (cases b) simp_all + by (cases b) (simp_all add: drop_bit_Suc) qed qed diff -r f10bffaa2bae -r b612edee9b0c src/HOL/ex/Bit_Operations.thy --- a/src/HOL/ex/Bit_Operations.thy Mon Mar 09 19:35:07 2020 +0100 +++ b/src/HOL/ex/Bit_Operations.thy Sun Mar 08 17:07:49 2020 +0000 @@ -28,10 +28,6 @@ are specified as definitional class operations. \ -lemma stable_imp_drop_eq: - \drop_bit n a = a\ if \a div 2 = a\ - by (induction n) (simp_all add: that) - sublocale "and": semilattice \(AND)\ by standard (auto simp add: bit_eq_iff bit_and_iff) @@ -219,7 +215,7 @@ assume *: \2 ^ m \ 0\ then show \bit (set_bit 0 a) m = bit (1 + 2 * (a div 2)) m\ by (simp add: bit_set_bit_iff bit_double_iff even_bit_succ_iff) - (cases m, simp_all) + (cases m, simp_all add: bit_Suc) qed lemma set_bit_Suc [simp]: @@ -239,7 +235,7 @@ show ?thesis by (cases a rule: parity_cases) (simp_all add: bit_set_bit_iff bit_double_iff even_bit_succ_iff *, - simp_all add: Suc \2 ^ m \ 0\) + simp_all add: Suc \2 ^ m \ 0\ bit_Suc) qed qed @@ -250,7 +246,7 @@ assume *: \2 ^ m \ 0\ then show \bit (unset_bit 0 a) m = bit (2 * (a div 2)) m\ by (simp add: bit_unset_bit_iff bit_double_iff) - (cases m, simp_all) + (cases m, simp_all add: bit_Suc) qed lemma unset_bit_Suc [simp]: @@ -268,7 +264,7 @@ show ?thesis by (cases a rule: parity_cases) (simp_all add: bit_unset_bit_iff bit_double_iff even_bit_succ_iff *, - simp_all add: Suc) + simp_all add: Suc bit_Suc) qed qed @@ -279,7 +275,7 @@ assume *: \2 ^ m \ 0\ then show \bit (flip_bit 0 a) m = bit (of_bool (even a) + 2 * (a div 2)) m\ by (simp add: bit_flip_bit_iff bit_double_iff even_bit_succ_iff) - (cases m, simp_all) + (cases m, simp_all add: bit_Suc) qed lemma flip_bit_Suc [simp]: @@ -299,7 +295,7 @@ show ?thesis by (cases a rule: parity_cases) (simp_all add: bit_flip_bit_iff bit_double_iff even_bit_succ_iff, - simp_all add: Suc \2 ^ m \ 0\) + simp_all add: Suc \2 ^ m \ 0\ bit_Suc) qed qed @@ -348,7 +344,7 @@ next case (Suc n) then show ?case - by (simp add: rec [of m n]) + by (simp add: rec [of m n] bit_Suc) qed sublocale abel_semigroup F @@ -461,7 +457,7 @@ next case (Suc n) then show ?case - by (simp add: rec [of k l]) + by (simp add: rec [of k l] bit_Suc) qed sublocale abel_semigroup F @@ -514,7 +510,7 @@ lemma bit_not_iff_int: \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) + by (induction n arbitrary: k) (simp_all add: not_int_div_2 even_not_iff_int bit_Suc) instance proof fix k l :: int and n :: nat diff -r f10bffaa2bae -r b612edee9b0c src/HOL/ex/Word.thy --- a/src/HOL/ex/Word.thy Mon Mar 09 19:35:07 2020 +0100 +++ b/src/HOL/ex/Word.thy Sun Mar 08 17:07:49 2020 +0000 @@ -29,16 +29,16 @@ then have "(k + 1) mod 2 = 1" by (simp add: even_iff_mod_2_eq_zero) with True show ?thesis - by (simp add: signed_take_bit_eq_take_bit) + by (simp add: signed_take_bit_eq_take_bit take_bit_Suc) next case False then show ?thesis - by (simp add: signed_take_bit_eq_take_bit odd_iff_mod_2_eq_one) + by (simp add: signed_take_bit_eq_take_bit odd_iff_mod_2_eq_one take_bit_Suc) qed -lemma signed_take_bit_Suc [simp]: +lemma signed_take_bit_Suc: "signed_take_bit (Suc n) k = signed_take_bit n (k div 2) * 2 + k mod 2" - by (simp add: odd_iff_mod_2_eq_one signed_take_bit_eq_take_bit algebra_simps) + by (simp add: odd_iff_mod_2_eq_one signed_take_bit_eq_take_bit algebra_simps take_bit_Suc) lemma signed_take_bit_of_0 [simp]: "signed_take_bit n 0 = 0" @@ -46,7 +46,7 @@ lemma signed_take_bit_of_minus_1 [simp]: "signed_take_bit n (- 1) = - 1" - by (induct n) simp_all + by (induct n) (simp_all add: signed_take_bit_Suc) lemma signed_take_bit_eq_iff_take_bit_eq: "signed_take_bit (n - Suc 0) k = signed_take_bit (n - Suc 0) l \ take_bit n k = take_bit n l" (is "?P \ ?Q") @@ -356,10 +356,10 @@ by transfer simp show even_iff_mod_2_eq_0: "2 dvd a \ a mod 2 = 0" for a :: "'a word" - by transfer (simp_all add: mod_2_eq_odd) + by transfer (simp_all add: mod_2_eq_odd take_bit_Suc) show "\ 2 dvd a \ a mod 2 = 1" for a :: "'a word" - by transfer (simp_all add: mod_2_eq_odd) + by transfer (simp_all add: mod_2_eq_odd take_bit_Suc) qed @@ -494,7 +494,7 @@ have \of_bool (odd k) < (1 :: int) \ even k\ for k :: int by auto with False that show ?thesis - by (auto; transfer) simp_all + by transfer (simp add: eq_iff) next case True obtain n where length: \LENGTH('a) = Suc n\ @@ -533,7 +533,7 @@ by (simp add: take_bit_eq_mod) with True show \take_bit LENGTH('a) (take_bit LENGTH('a) (1 + k * 2) div take_bit LENGTH('a) 2) = take_bit LENGTH('a) k\ - by auto + by (auto simp add: take_bit_Suc) qed ultimately show ?thesis by simp @@ -592,7 +592,7 @@ show \(1 + a) div 2 = a div 2\ if \even a\ for a :: \'a word\ - using that by transfer (auto dest: le_Suc_ex) + using that by transfer (auto dest: le_Suc_ex simp add: take_bit_Suc) show \(2 :: 'a word) ^ m div 2 ^ n = of_bool ((2 :: 'a word) ^ m \ 0 \ n \ m) * 2 ^ (m - n)\ for m n :: nat by transfer (simp, simp add: exp_div_exp_eq)