82 |
82 |
83 primrec |
83 primrec |
84 bitxor_zero: "(\<zero> bitxor y) = y" |
84 bitxor_zero: "(\<zero> bitxor y) = y" |
85 bitxor_one: "(\<one> bitxor y) = (bitnot y)" |
85 bitxor_one: "(\<one> bitxor y) = (bitnot y)" |
86 |
86 |
87 lemma [simp]: "(bitnot (bitnot b)) = b" |
87 lemma bitnot_bitnot [simp]: "(bitnot (bitnot b)) = b" |
88 by (cases b,simp_all) |
88 by (cases b,simp_all) |
89 |
89 |
90 lemma [simp]: "(b bitand b) = b" |
90 lemma bitand_cancel [simp]: "(b bitand b) = b" |
91 by (cases b,simp_all) |
91 by (cases b,simp_all) |
92 |
92 |
93 lemma [simp]: "(b bitor b) = b" |
93 lemma bitor_cancel [simp]: "(b bitor b) = b" |
94 by (cases b,simp_all) |
94 by (cases b,simp_all) |
95 |
95 |
96 lemma [simp]: "(b bitxor b) = \<zero>" |
96 lemma bitxor_cancel [simp]: "(b bitxor b) = \<zero>" |
97 by (cases b,simp_all) |
97 by (cases b,simp_all) |
98 |
98 |
99 subsection {* Bit Vectors *} |
99 subsection {* Bit Vectors *} |
100 |
100 |
101 text {* First, a couple of theorems expressing case analysis and |
101 text {* First, a couple of theorems expressing case analysis and |
150 "bv_not w == map bitnot w" |
150 "bv_not w == map bitnot w" |
151 |
151 |
152 lemma bv_length_extend [simp]: "length w \<le> i ==> length (bv_extend i b w) = i" |
152 lemma bv_length_extend [simp]: "length w \<le> i ==> length (bv_extend i b w) = i" |
153 by (simp add: bv_extend_def) |
153 by (simp add: bv_extend_def) |
154 |
154 |
155 lemma [simp]: "bv_not [] = []" |
155 lemma bv_not_Nil [simp]: "bv_not [] = []" |
156 by (simp add: bv_not_def) |
156 by (simp add: bv_not_def) |
157 |
157 |
158 lemma [simp]: "bv_not (b#bs) = (bitnot b) # bv_not bs" |
158 lemma bv_not_Cons [simp]: "bv_not (b#bs) = (bitnot b) # bv_not bs" |
159 by (simp add: bv_not_def) |
159 by (simp add: bv_not_def) |
160 |
160 |
161 lemma [simp]: "bv_not (bv_not w) = w" |
161 lemma bv_not_bv_not [simp]: "bv_not (bv_not w) = w" |
162 by (rule bit_list_induct [of _ w],simp_all) |
162 by (rule bit_list_induct [of _ w],simp_all) |
163 |
163 |
164 lemma [simp]: "bv_msb [] = \<zero>" |
164 lemma bv_msb_Nil [simp]: "bv_msb [] = \<zero>" |
165 by (simp add: bv_msb_def) |
165 by (simp add: bv_msb_def) |
166 |
166 |
167 lemma [simp]: "bv_msb (b#bs) = b" |
167 lemma bv_msb_Cons [simp]: "bv_msb (b#bs) = b" |
168 by (simp add: bv_msb_def) |
168 by (simp add: bv_msb_def) |
169 |
169 |
170 lemma [simp]: "0 < length w ==> bv_msb (bv_not w) = (bitnot (bv_msb w))" |
170 lemma bv_msb_bv_not [simp]: "0 < length w ==> bv_msb (bv_not w) = (bitnot (bv_msb w))" |
171 by (cases w,simp_all) |
171 by (cases w,simp_all) |
172 |
172 |
173 lemma [simp,intro]: "bv_msb w = \<one> ==> 0 < length w" |
173 lemma bv_msb_one_length [simp,intro]: "bv_msb w = \<one> ==> 0 < length w" |
174 by (cases w,simp_all) |
174 by (cases w,simp_all) |
175 |
175 |
176 lemma [simp]: "length (bv_not w) = length w" |
176 lemma length_bv_not [simp]: "length (bv_not w) = length w" |
177 by (induct w,simp_all) |
177 by (induct w,simp_all) |
178 |
178 |
179 constdefs |
179 constdefs |
180 bv_to_nat :: "bit list => nat" |
180 bv_to_nat :: "bit list => nat" |
181 "bv_to_nat == foldl (%bn b. 2 * bn + bitval b) 0" |
181 "bv_to_nat == foldl (%bn b. 2 * bn + bitval b) 0" |
182 |
182 |
183 lemma [simp]: "bv_to_nat [] = 0" |
183 lemma bv_to_nat_Nil [simp]: "bv_to_nat [] = 0" |
184 by (simp add: bv_to_nat_def) |
184 by (simp add: bv_to_nat_def) |
185 |
185 |
186 lemma bv_to_nat_helper [simp]: "bv_to_nat (b # bs) = bitval b * 2 ^ length bs + bv_to_nat bs" |
186 lemma bv_to_nat_helper [simp]: "bv_to_nat (b # bs) = bitval b * 2 ^ length bs + bv_to_nat bs" |
187 proof - |
187 proof - |
188 let ?bv_to_nat' = "foldl (\<lambda>bn b. 2 * bn + bitval b)" |
188 let ?bv_to_nat' = "foldl (\<lambda>bn b. 2 * bn + bitval b)" |
230 finally show "bv_to_nat bs < 2 ^ length bs" |
230 finally show "bv_to_nat bs < 2 ^ length bs" |
231 by simp |
231 by simp |
232 qed |
232 qed |
233 qed |
233 qed |
234 |
234 |
235 lemma [simp]: |
235 lemma bv_extend_longer [simp]: |
236 assumes wn: "n \<le> length w" |
236 assumes wn: "n \<le> length w" |
237 shows "bv_extend n b w = w" |
237 shows "bv_extend n b w = w" |
238 by (simp add: bv_extend_def wn) |
238 by (simp add: bv_extend_def wn) |
239 |
239 |
240 lemma [simp]: |
240 lemma bv_extend_shorter [simp]: |
241 assumes wn: "length w < n" |
241 assumes wn: "length w < n" |
242 shows "bv_extend n b w = bv_extend n b (b#w)" |
242 shows "bv_extend n b w = bv_extend n b (b#w)" |
243 proof - |
243 proof - |
244 from wn |
244 from wn |
245 have s: "n - Suc (length w) + 1 = n - length w" |
245 have s: "n - Suc (length w) + 1 = n - length w" |
328 |
328 |
329 constdefs |
329 constdefs |
330 norm_unsigned :: "bit list => bit list" |
330 norm_unsigned :: "bit list => bit list" |
331 "norm_unsigned == rem_initial \<zero>" |
331 "norm_unsigned == rem_initial \<zero>" |
332 |
332 |
333 lemma [simp]: "norm_unsigned [] = []" |
333 lemma norm_unsigned_Nil [simp]: "norm_unsigned [] = []" |
334 by (simp add: norm_unsigned_def) |
334 by (simp add: norm_unsigned_def) |
335 |
335 |
336 lemma [simp]: "norm_unsigned (\<zero>#bs) = norm_unsigned bs" |
336 lemma norm_unsigned_Cons0 [simp]: "norm_unsigned (\<zero>#bs) = norm_unsigned bs" |
337 by (simp add: norm_unsigned_def) |
337 by (simp add: norm_unsigned_def) |
338 |
338 |
339 lemma [simp]: "norm_unsigned (\<one>#bs) = \<one>#bs" |
339 lemma norm_unsigned_Cons1 [simp]: "norm_unsigned (\<one>#bs) = \<one>#bs" |
340 by (simp add: norm_unsigned_def) |
340 by (simp add: norm_unsigned_def) |
341 |
341 |
342 lemma [simp]: "norm_unsigned (norm_unsigned w) = norm_unsigned w" |
342 lemma norm_unsigned_idem [simp]: "norm_unsigned (norm_unsigned w) = norm_unsigned w" |
343 by (rule bit_list_induct [of _ w],simp_all) |
343 by (rule bit_list_induct [of _ w],simp_all) |
344 |
344 |
345 consts |
345 consts |
346 nat_to_bv_helper :: "nat => bit list => bit list" |
346 nat_to_bv_helper :: "nat => bit list => bit list" |
347 |
347 |
564 by simp |
564 by simp |
565 qed |
565 qed |
566 qed |
566 qed |
567 qed |
567 qed |
568 |
568 |
569 lemma [simp]: "bv_to_nat (norm_unsigned w) = bv_to_nat w" |
569 lemma bv_to_nat_type [simp]: "bv_to_nat (norm_unsigned w) = bv_to_nat w" |
570 by (rule bit_list_induct,simp_all) |
570 by (rule bit_list_induct,simp_all) |
571 |
571 |
572 lemma [simp]: "length (norm_unsigned w) \<le> length w" |
572 lemma length_norm_unsigned_le [simp]: "length (norm_unsigned w) \<le> length w" |
573 by (rule bit_list_induct,simp_all) |
573 by (rule bit_list_induct,simp_all) |
574 |
574 |
575 lemma bv_to_nat_rew_msb: "bv_msb w = \<one> ==> bv_to_nat w = 2 ^ (length w - 1) + bv_to_nat (tl w)" |
575 lemma bv_to_nat_rew_msb: "bv_msb w = \<one> ==> bv_to_nat w = 2 ^ (length w - 1) + bv_to_nat (tl w)" |
576 by (rule bit_list_cases [of w],simp_all) |
576 by (rule bit_list_cases [of w],simp_all) |
577 |
577 |
769 by (rule bv_to_nat_upper_range) |
769 by (rule bv_to_nat_upper_range) |
770 show "nat_to_bv (2 ^ length xs + bv_to_nat xs) = \<one> # xs" |
770 show "nat_to_bv (2 ^ length xs + bv_to_nat xs) = \<one> # xs" |
771 by (rule nat_helper2) |
771 by (rule nat_helper2) |
772 qed |
772 qed |
773 |
773 |
774 lemma [simp]: "bv_to_nat (norm_unsigned xs) = bv_to_nat xs" |
|
775 by (rule bit_list_induct [of _ w],simp_all) |
|
776 |
|
777 lemma bv_to_nat_qinj: |
774 lemma bv_to_nat_qinj: |
778 assumes one: "bv_to_nat xs = bv_to_nat ys" |
775 assumes one: "bv_to_nat xs = bv_to_nat ys" |
779 and len: "length xs = length ys" |
776 and len: "length xs = length ys" |
780 shows "xs = ys" |
777 shows "xs = ys" |
781 proof - |
778 proof - |
861 |
858 |
862 constdefs |
859 constdefs |
863 bv_add :: "[bit list, bit list ] => bit list" |
860 bv_add :: "[bit list, bit list ] => bit list" |
864 "bv_add w1 w2 == nat_to_bv (bv_to_nat w1 + bv_to_nat w2)" |
861 "bv_add w1 w2 == nat_to_bv (bv_to_nat w1 + bv_to_nat w2)" |
865 |
862 |
866 lemma [simp]: "bv_add (norm_unsigned w1) w2 = bv_add w1 w2" |
863 lemma bv_add_type1 [simp]: "bv_add (norm_unsigned w1) w2 = bv_add w1 w2" |
867 by (simp add: bv_add_def) |
864 by (simp add: bv_add_def) |
868 |
865 |
869 lemma [simp]: "bv_add w1 (norm_unsigned w2) = bv_add w1 w2" |
866 lemma bv_add_type2 [simp]: "bv_add w1 (norm_unsigned w2) = bv_add w1 w2" |
870 by (simp add: bv_add_def) |
867 by (simp add: bv_add_def) |
871 |
868 |
872 lemma [simp]: "norm_unsigned (bv_add w1 w2) = bv_add w1 w2" |
869 lemma bv_add_returntype [simp]: "norm_unsigned (bv_add w1 w2) = bv_add w1 w2" |
873 by (simp add: bv_add_def) |
870 by (simp add: bv_add_def) |
874 |
871 |
875 lemma bv_add_length: "length (bv_add w1 w2) \<le> Suc (max (length w1) (length w2))" |
872 lemma bv_add_length: "length (bv_add w1 w2) \<le> Suc (max (length w1) (length w2))" |
876 proof (unfold bv_add_def,rule length_nat_to_bv_upper_limit) |
873 proof (unfold bv_add_def,rule length_nat_to_bv_upper_limit) |
877 from bv_to_nat_upper_range [of w1] and bv_to_nat_upper_range [of w2] |
874 from bv_to_nat_upper_range [of w1] and bv_to_nat_upper_range [of w2] |
913 |
910 |
914 constdefs |
911 constdefs |
915 bv_mult :: "[bit list, bit list ] => bit list" |
912 bv_mult :: "[bit list, bit list ] => bit list" |
916 "bv_mult w1 w2 == nat_to_bv (bv_to_nat w1 * bv_to_nat w2)" |
913 "bv_mult w1 w2 == nat_to_bv (bv_to_nat w1 * bv_to_nat w2)" |
917 |
914 |
918 lemma [simp]: "bv_mult (norm_unsigned w1) w2 = bv_mult w1 w2" |
915 lemma bv_mult_type1 [simp]: "bv_mult (norm_unsigned w1) w2 = bv_mult w1 w2" |
919 by (simp add: bv_mult_def) |
916 by (simp add: bv_mult_def) |
920 |
917 |
921 lemma [simp]: "bv_mult w1 (norm_unsigned w2) = bv_mult w1 w2" |
918 lemma bv_mult_type2 [simp]: "bv_mult w1 (norm_unsigned w2) = bv_mult w1 w2" |
922 by (simp add: bv_mult_def) |
919 by (simp add: bv_mult_def) |
923 |
920 |
924 lemma [simp]: "norm_unsigned (bv_mult w1 w2) = bv_mult w1 w2" |
921 lemma bv_mult_returntype [simp]: "norm_unsigned (bv_mult w1 w2) = bv_mult w1 w2" |
925 by (simp add: bv_mult_def) |
922 by (simp add: bv_mult_def) |
926 |
923 |
927 lemma bv_mult_length: "length (bv_mult w1 w2) \<le> length w1 + length w2" |
924 lemma bv_mult_length: "length (bv_mult w1 w2) \<le> length w1 + length w2" |
928 proof (unfold bv_mult_def,rule length_nat_to_bv_upper_limit) |
925 proof (unfold bv_mult_def,rule length_nat_to_bv_upper_limit) |
929 from bv_to_nat_upper_range [of w1] and bv_to_nat_upper_range [of w2] |
926 from bv_to_nat_upper_range [of w1] and bv_to_nat_upper_range [of w2] |
949 |
946 |
950 primrec |
947 primrec |
951 norm_signed_Nil: "norm_signed [] = []" |
948 norm_signed_Nil: "norm_signed [] = []" |
952 norm_signed_Cons: "norm_signed (b#bs) = (case b of \<zero> => if norm_unsigned bs = [] then [] else b#norm_unsigned bs | \<one> => b#rem_initial b bs)" |
949 norm_signed_Cons: "norm_signed (b#bs) = (case b of \<zero> => if norm_unsigned bs = [] then [] else b#norm_unsigned bs | \<one> => b#rem_initial b bs)" |
953 |
950 |
954 lemma [simp]: "norm_signed [\<zero>] = []" |
951 lemma norm_signed0 [simp]: "norm_signed [\<zero>] = []" |
955 by simp |
952 by simp |
956 |
953 |
957 lemma [simp]: "norm_signed [\<one>] = [\<one>]" |
954 lemma norm_signed1 [simp]: "norm_signed [\<one>] = [\<one>]" |
958 by simp |
955 by simp |
959 |
956 |
960 lemma [simp]: "norm_signed (\<zero>#\<one>#xs) = \<zero>#\<one>#xs" |
957 lemma norm_signed01 [simp]: "norm_signed (\<zero>#\<one>#xs) = \<zero>#\<one>#xs" |
961 by simp |
958 by simp |
962 |
959 |
963 lemma [simp]: "norm_signed (\<zero>#\<zero>#xs) = norm_signed (\<zero>#xs)" |
960 lemma norm_signed00 [simp]: "norm_signed (\<zero>#\<zero>#xs) = norm_signed (\<zero>#xs)" |
964 by simp |
961 by simp |
965 |
962 |
966 lemma [simp]: "norm_signed (\<one>#\<zero>#xs) = \<one>#\<zero>#xs" |
963 lemma norm_signed10 [simp]: "norm_signed (\<one>#\<zero>#xs) = \<one>#\<zero>#xs" |
967 by simp |
964 by simp |
968 |
965 |
969 lemma [simp]: "norm_signed (\<one>#\<one>#xs) = norm_signed (\<one>#xs)" |
966 lemma norm_signed11 [simp]: "norm_signed (\<one>#\<one>#xs) = norm_signed (\<one>#xs)" |
970 by simp |
967 by simp |
971 |
968 |
972 lemmas [simp del] = norm_signed_Cons |
969 lemmas [simp del] = norm_signed_Cons |
973 |
970 |
974 constdefs |
971 constdefs |
981 by (simp add: int_to_bv_def) |
978 by (simp add: int_to_bv_def) |
982 |
979 |
983 lemma int_to_bv_lt0 [simp]: "n < 0 ==> int_to_bv n = norm_signed (bv_not (\<zero>#nat_to_bv (nat (-n- 1))))" |
980 lemma int_to_bv_lt0 [simp]: "n < 0 ==> int_to_bv n = norm_signed (bv_not (\<zero>#nat_to_bv (nat (-n- 1))))" |
984 by (simp add: int_to_bv_def) |
981 by (simp add: int_to_bv_def) |
985 |
982 |
986 lemma [simp]: "norm_signed (norm_signed w) = norm_signed w" |
983 lemma norm_signed_idem [simp]: "norm_signed (norm_signed w) = norm_signed w" |
987 proof (rule bit_list_induct [of _ w],simp_all) |
984 proof (rule bit_list_induct [of _ w],simp_all) |
988 fix xs |
985 fix xs |
989 assume "norm_signed (norm_signed xs) = norm_signed xs" |
986 assume "norm_signed (norm_signed xs) = norm_signed xs" |
990 show "norm_signed (norm_signed (\<zero>#xs)) = norm_signed (\<zero>#xs)" |
987 show "norm_signed (norm_signed (\<zero>#xs)) = norm_signed (\<zero>#xs)" |
991 proof (rule bit_list_cases [of xs],simp_all) |
988 proof (rule bit_list_cases [of xs],simp_all) |
1008 |
1005 |
1009 constdefs |
1006 constdefs |
1010 bv_to_int :: "bit list => int" |
1007 bv_to_int :: "bit list => int" |
1011 "bv_to_int w == case bv_msb w of \<zero> => int (bv_to_nat w) | \<one> => - int (bv_to_nat (bv_not w) + 1)" |
1008 "bv_to_int w == case bv_msb w of \<zero> => int (bv_to_nat w) | \<one> => - int (bv_to_nat (bv_not w) + 1)" |
1012 |
1009 |
1013 lemma [simp]: "bv_to_int [] = 0" |
1010 lemma bv_to_int_Nil [simp]: "bv_to_int [] = 0" |
1014 by (simp add: bv_to_int_def) |
1011 by (simp add: bv_to_int_def) |
1015 |
1012 |
1016 lemma [simp]: "bv_to_int (\<zero>#bs) = int (bv_to_nat bs)" |
1013 lemma bv_to_int_Cons0 [simp]: "bv_to_int (\<zero>#bs) = int (bv_to_nat bs)" |
1017 by (simp add: bv_to_int_def) |
1014 by (simp add: bv_to_int_def) |
1018 |
1015 |
1019 lemma [simp]: "bv_to_int (\<one>#bs) = - int (bv_to_nat (bv_not bs) + 1)" |
1016 lemma bv_to_int_Cons1 [simp]: "bv_to_int (\<one>#bs) = - int (bv_to_nat (bv_not bs) + 1)" |
1020 by (simp add: bv_to_int_def) |
1017 by (simp add: bv_to_int_def) |
1021 |
1018 |
1022 lemma [simp]: "bv_to_int (norm_signed w) = bv_to_int w" |
1019 lemma bv_to_int_type [simp]: "bv_to_int (norm_signed w) = bv_to_int w" |
1023 proof (rule bit_list_induct [of _ w],simp_all) |
1020 proof (rule bit_list_induct [of _ w],simp_all) |
1024 fix xs |
1021 fix xs |
1025 assume ind: "bv_to_int (norm_signed xs) = bv_to_int xs" |
1022 assume ind: "bv_to_int (norm_signed xs) = bv_to_int xs" |
1026 show "bv_to_int (norm_signed (\<zero>#xs)) = int (bv_to_nat xs)" |
1023 show "bv_to_int (norm_signed (\<zero>#xs)) = int (bv_to_nat xs)" |
1027 proof (rule bit_list_cases [of xs],simp_all) |
1024 proof (rule bit_list_cases [of xs],simp_all) |
1201 also have "... = ys" |
1198 also have "... = ys" |
1202 by (simp add: bv_extend_norm_signed) |
1199 by (simp add: bv_extend_norm_signed) |
1203 finally show ?thesis . |
1200 finally show ?thesis . |
1204 qed |
1201 qed |
1205 |
1202 |
1206 lemma [simp]: "norm_signed (int_to_bv w) = int_to_bv w" |
1203 lemma int_to_bv_returntype [simp]: "norm_signed (int_to_bv w) = int_to_bv w" |
1207 by (simp add: int_to_bv_def) |
1204 by (simp add: int_to_bv_def) |
1208 |
1205 |
1209 lemma bv_to_int_msb0: "0 \<le> bv_to_int w1 ==> bv_msb w1 = \<zero>" |
1206 lemma bv_to_int_msb0: "0 \<le> bv_to_int w1 ==> bv_msb w1 = \<zero>" |
1210 by (rule bit_list_cases,simp_all) |
1207 by (rule bit_list_cases,simp_all) |
1211 |
1208 |
1591 |
1588 |
1592 constdefs |
1589 constdefs |
1593 utos :: "bit list => bit list" |
1590 utos :: "bit list => bit list" |
1594 "utos w == norm_signed (\<zero> # w)" |
1591 "utos w == norm_signed (\<zero> # w)" |
1595 |
1592 |
1596 lemma [simp]: "utos (norm_unsigned w) = utos w" |
1593 lemma utos_type [simp]: "utos (norm_unsigned w) = utos w" |
1597 by (simp add: utos_def norm_signed_Cons) |
1594 by (simp add: utos_def norm_signed_Cons) |
1598 |
1595 |
1599 lemma [simp]: "norm_signed (utos w) = utos w" |
1596 lemma utos_returntype [simp]: "norm_signed (utos w) = utos w" |
1600 by (simp add: utos_def) |
1597 by (simp add: utos_def) |
1601 |
1598 |
1602 lemma utos_length: "length (utos w) \<le> Suc (length w)" |
1599 lemma utos_length: "length (utos w) \<le> Suc (length w)" |
1603 by (simp add: utos_def norm_signed_Cons) |
1600 by (simp add: utos_def norm_signed_Cons) |
1604 |
1601 |
1615 |
1612 |
1616 constdefs |
1613 constdefs |
1617 bv_uminus :: "bit list => bit list" |
1614 bv_uminus :: "bit list => bit list" |
1618 "bv_uminus w == int_to_bv (- bv_to_int w)" |
1615 "bv_uminus w == int_to_bv (- bv_to_int w)" |
1619 |
1616 |
1620 lemma [simp]: "bv_uminus (norm_signed w) = bv_uminus w" |
1617 lemma bv_uminus_type [simp]: "bv_uminus (norm_signed w) = bv_uminus w" |
1621 by (simp add: bv_uminus_def) |
1618 by (simp add: bv_uminus_def) |
1622 |
1619 |
1623 lemma [simp]: "norm_signed (bv_uminus w) = bv_uminus w" |
1620 lemma bv_uminus_returntype [simp]: "norm_signed (bv_uminus w) = bv_uminus w" |
1624 by (simp add: bv_uminus_def) |
1621 by (simp add: bv_uminus_def) |
1625 |
1622 |
1626 lemma bv_uminus_length: "length (bv_uminus w) \<le> Suc (length w)" |
1623 lemma bv_uminus_length: "length (bv_uminus w) \<le> Suc (length w)" |
1627 proof - |
1624 proof - |
1628 have "1 < -bv_to_int w \<or> -bv_to_int w = 1 \<or> -bv_to_int w = 0 \<or> -bv_to_int w = -1 \<or> -bv_to_int w < -1" |
1625 have "1 < -bv_to_int w \<or> -bv_to_int w = 1 \<or> -bv_to_int w = 0 \<or> -bv_to_int w = -1 \<or> -bv_to_int w < -1" |
1714 |
1711 |
1715 constdefs |
1712 constdefs |
1716 bv_sadd :: "[bit list, bit list ] => bit list" |
1713 bv_sadd :: "[bit list, bit list ] => bit list" |
1717 "bv_sadd w1 w2 == int_to_bv (bv_to_int w1 + bv_to_int w2)" |
1714 "bv_sadd w1 w2 == int_to_bv (bv_to_int w1 + bv_to_int w2)" |
1718 |
1715 |
1719 lemma [simp]: "bv_sadd (norm_signed w1) w2 = bv_sadd w1 w2" |
1716 lemma bv_sadd_type1 [simp]: "bv_sadd (norm_signed w1) w2 = bv_sadd w1 w2" |
1720 by (simp add: bv_sadd_def) |
1717 by (simp add: bv_sadd_def) |
1721 |
1718 |
1722 lemma [simp]: "bv_sadd w1 (norm_signed w2) = bv_sadd w1 w2" |
1719 lemma bv_sadd_type2 [simp]: "bv_sadd w1 (norm_signed w2) = bv_sadd w1 w2" |
1723 by (simp add: bv_sadd_def) |
1720 by (simp add: bv_sadd_def) |
1724 |
1721 |
1725 lemma [simp]: "norm_signed (bv_sadd w1 w2) = bv_sadd w1 w2" |
1722 lemma bv_sadd_returntype [simp]: "norm_signed (bv_sadd w1 w2) = bv_sadd w1 w2" |
1726 by (simp add: bv_sadd_def) |
1723 by (simp add: bv_sadd_def) |
1727 |
1724 |
1728 lemma adder_helper: |
1725 lemma adder_helper: |
1729 assumes lw: "0 < max (length w1) (length w2)" |
1726 assumes lw: "0 < max (length w1) (length w2)" |
1730 shows "((2::int) ^ (length w1 - 1)) + (2 ^ (length w2 - 1)) \<le> 2 ^ max (length w1) (length w2)" |
1727 shows "((2::int) ^ (length w1 - 1)) + (2 ^ (length w2 - 1)) \<le> 2 ^ max (length w1) (length w2)" |
1827 |
1824 |
1828 constdefs |
1825 constdefs |
1829 bv_sub :: "[bit list, bit list] => bit list" |
1826 bv_sub :: "[bit list, bit list] => bit list" |
1830 "bv_sub w1 w2 == bv_sadd w1 (bv_uminus w2)" |
1827 "bv_sub w1 w2 == bv_sadd w1 (bv_uminus w2)" |
1831 |
1828 |
1832 lemma [simp]: "bv_sub (norm_signed w1) w2 = bv_sub w1 w2" |
1829 lemma bv_sub_type1 [simp]: "bv_sub (norm_signed w1) w2 = bv_sub w1 w2" |
1833 by (simp add: bv_sub_def) |
1830 by (simp add: bv_sub_def) |
1834 |
1831 |
1835 lemma [simp]: "bv_sub w1 (norm_signed w2) = bv_sub w1 w2" |
1832 lemma bv_sub_type2 [simp]: "bv_sub w1 (norm_signed w2) = bv_sub w1 w2" |
1836 by (simp add: bv_sub_def) |
1833 by (simp add: bv_sub_def) |
1837 |
1834 |
1838 lemma [simp]: "norm_signed (bv_sub w1 w2) = bv_sub w1 w2" |
1835 lemma bv_sub_returntype [simp]: "norm_signed (bv_sub w1 w2) = bv_sub w1 w2" |
1839 by (simp add: bv_sub_def) |
1836 by (simp add: bv_sub_def) |
1840 |
1837 |
1841 lemma bv_sub_length: "length (bv_sub w1 w2) \<le> Suc (max (length w1) (length w2))" |
1838 lemma bv_sub_length: "length (bv_sub w1 w2) \<le> Suc (max (length w1) (length w2))" |
1842 proof (cases "bv_to_int w2 = 0") |
1839 proof (cases "bv_to_int w2 = 0") |
1843 assume p: "bv_to_int w2 = 0" |
1840 assume p: "bv_to_int w2 = 0" |
1921 |
1918 |
1922 constdefs |
1919 constdefs |
1923 bv_smult :: "[bit list, bit list] => bit list" |
1920 bv_smult :: "[bit list, bit list] => bit list" |
1924 "bv_smult w1 w2 == int_to_bv (bv_to_int w1 * bv_to_int w2)" |
1921 "bv_smult w1 w2 == int_to_bv (bv_to_int w1 * bv_to_int w2)" |
1925 |
1922 |
1926 lemma [simp]: "bv_smult (norm_signed w1) w2 = bv_smult w1 w2" |
1923 lemma bv_smult_type1 [simp]: "bv_smult (norm_signed w1) w2 = bv_smult w1 w2" |
1927 by (simp add: bv_smult_def) |
1924 by (simp add: bv_smult_def) |
1928 |
1925 |
1929 lemma [simp]: "bv_smult w1 (norm_signed w2) = bv_smult w1 w2" |
1926 lemma bv_smult_type2 [simp]: "bv_smult w1 (norm_signed w2) = bv_smult w1 w2" |
1930 by (simp add: bv_smult_def) |
1927 by (simp add: bv_smult_def) |
1931 |
1928 |
1932 lemma [simp]: "norm_signed (bv_smult w1 w2) = bv_smult w1 w2" |
1929 lemma bv_smult_returntype [simp]: "norm_signed (bv_smult w1 w2) = bv_smult w1 w2" |
1933 by (simp add: bv_smult_def) |
1930 by (simp add: bv_smult_def) |
1934 |
1931 |
1935 lemma bv_smult_length: "length (bv_smult w1 w2) \<le> length w1 + length w2" |
1932 lemma bv_smult_length: "length (bv_smult w1 w2) \<le> length w1 + length w2" |
1936 proof - |
1933 proof - |
1937 let ?Q = "bv_to_int w1 * bv_to_int w2" |
1934 let ?Q = "bv_to_int w1 * bv_to_int w2" |
2641 in map (split f) (zip (g w1) (g w2))" |
2638 in map (split f) (zip (g w1) (g w2))" |
2642 |
2639 |
2643 lemma bv_length_bv_mapzip [simp]: "length (bv_mapzip f w1 w2) = max (length w1) (length w2)" |
2640 lemma bv_length_bv_mapzip [simp]: "length (bv_mapzip f w1 w2) = max (length w1) (length w2)" |
2644 by (simp add: bv_mapzip_def Let_def split: split_max) |
2641 by (simp add: bv_mapzip_def Let_def split: split_max) |
2645 |
2642 |
2646 lemma [simp]: "bv_mapzip f [] [] = []" |
2643 lemma bv_mapzip_Nil [simp]: "bv_mapzip f [] [] = []" |
2647 by (simp add: bv_mapzip_def Let_def) |
2644 by (simp add: bv_mapzip_def Let_def) |
2648 |
2645 |
2649 lemma [simp]: "length w1 = length w2 ==> bv_mapzip f (x#w1) (y#w2) = f x y # bv_mapzip f w1 w2" |
2646 lemma bv_mapzip_Cons [simp]: "length w1 = length w2 ==> bv_mapzip f (x#w1) (y#w2) = f x y # bv_mapzip f w1 w2" |
2650 by (simp add: bv_mapzip_def Let_def) |
2647 by (simp add: bv_mapzip_def Let_def) |
2651 |
2648 |
2652 end |
2649 end |