src/HOL/Library/Word.thy
changeset 17650 44b135d04cc4
parent 16796 140f1e0ea846
child 19736 d8d0f8f51d69
equal deleted inserted replaced
17649:631b99d49809 17650:44b135d04cc4
    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