src/HOL/Library/Word.thy
changeset 34942 d62eddd9e253
parent 34915 7894c7dab132
parent 34941 156925dd67af
child 35175 61255c81da01
equal deleted inserted replaced
34938:f4d3daddac42 34942:d62eddd9e253
    41 
    41 
    42 primrec bitval :: "bit => nat" where
    42 primrec bitval :: "bit => nat" where
    43     "bitval \<zero> = 0"
    43     "bitval \<zero> = 0"
    44   | "bitval \<one> = 1"
    44   | "bitval \<one> = 1"
    45 
    45 
    46 consts
    46 primrec bitnot :: "bit => bit" where
    47   bitnot :: "bit => bit"
    47     bitnot_zero: "(bitnot \<zero>) = \<one>"
    48   bitand :: "bit => bit => bit" (infixr "bitand" 35)
    48   | bitnot_one : "(bitnot \<one>)  = \<zero>"
    49   bitor  :: "bit => bit => bit" (infixr "bitor"  30)
    49 
    50   bitxor :: "bit => bit => bit" (infixr "bitxor" 30)
    50 primrec bitand :: "bit => bit => bit" (infixr "bitand" 35) where
       
    51     bitand_zero: "(\<zero> bitand y) = \<zero>"
       
    52   | bitand_one:  "(\<one> bitand y) = y"
       
    53 
       
    54 primrec bitor  :: "bit => bit => bit" (infixr "bitor"  30) where
       
    55     bitor_zero: "(\<zero> bitor y) = y"
       
    56   | bitor_one:  "(\<one> bitor y) = \<one>"
       
    57 
       
    58 primrec bitxor :: "bit => bit => bit" (infixr "bitxor" 30) where
       
    59     bitxor_zero: "(\<zero> bitxor y) = y"
       
    60   | bitxor_one:  "(\<one> bitxor y) = (bitnot y)"
    51 
    61 
    52 notation (xsymbols)
    62 notation (xsymbols)
    53   bitnot ("\<not>\<^sub>b _" [40] 40) and
    63   bitnot ("\<not>\<^sub>b _" [40] 40) and
    54   bitand (infixr "\<and>\<^sub>b" 35) and
    64   bitand (infixr "\<and>\<^sub>b" 35) and
    55   bitor  (infixr "\<or>\<^sub>b" 30) and
    65   bitor  (infixr "\<or>\<^sub>b" 30) and
    58 notation (HTML output)
    68 notation (HTML output)
    59   bitnot ("\<not>\<^sub>b _" [40] 40) and
    69   bitnot ("\<not>\<^sub>b _" [40] 40) and
    60   bitand (infixr "\<and>\<^sub>b" 35) and
    70   bitand (infixr "\<and>\<^sub>b" 35) and
    61   bitor  (infixr "\<or>\<^sub>b" 30) and
    71   bitor  (infixr "\<or>\<^sub>b" 30) and
    62   bitxor (infixr "\<oplus>\<^sub>b" 30)
    72   bitxor (infixr "\<oplus>\<^sub>b" 30)
    63 
       
    64 primrec
       
    65   bitnot_zero: "(bitnot \<zero>) = \<one>"
       
    66   bitnot_one : "(bitnot \<one>)  = \<zero>"
       
    67 
       
    68 primrec
       
    69   bitand_zero: "(\<zero> bitand y) = \<zero>"
       
    70   bitand_one:  "(\<one> bitand y) = y"
       
    71 
       
    72 primrec
       
    73   bitor_zero: "(\<zero> bitor y) = y"
       
    74   bitor_one:  "(\<one> bitor y) = \<one>"
       
    75 
       
    76 primrec
       
    77   bitxor_zero: "(\<zero> bitxor y) = y"
       
    78   bitxor_one:  "(\<one> bitxor y) = (bitnot y)"
       
    79 
    73 
    80 lemma bitnot_bitnot [simp]: "(bitnot (bitnot b)) = b"
    74 lemma bitnot_bitnot [simp]: "(bitnot (bitnot b)) = b"
    81   by (cases b) simp_all
    75   by (cases b) simp_all
    82 
    76 
    83 lemma bitand_cancel [simp]: "(b bitand b) = b"
    77 lemma bitand_cancel [simp]: "(b bitand b) = b"
   242   also have "... = bv_extend n b (b#w)"
   236   also have "... = bv_extend n b (b#w)"
   243     by (simp add: bv_extend_def)
   237     by (simp add: bv_extend_def)
   244   finally show "bv_extend n b w = bv_extend n b (b#w)" .
   238   finally show "bv_extend n b w = bv_extend n b (b#w)" .
   245 qed
   239 qed
   246 
   240 
   247 consts
   241 primrec rem_initial :: "bit => bit list => bit list" where
   248   rem_initial :: "bit => bit list => bit list"
   242     "rem_initial b [] = []"
   249 primrec
   243   | "rem_initial b (x#xs) = (if b = x then rem_initial b xs else x#xs)"
   250   "rem_initial b [] = []"
       
   251   "rem_initial b (x#xs) = (if b = x then rem_initial b xs else x#xs)"
       
   252 
   244 
   253 lemma rem_initial_length: "length (rem_initial b w) \<le> length w"
   245 lemma rem_initial_length: "length (rem_initial b w) \<le> length w"
   254   by (rule bit_list_induct [of _ w],simp_all (no_asm),safe,simp_all)
   246   by (rule bit_list_induct [of _ w],simp_all (no_asm),safe,simp_all)
   255 
   247 
   256 lemma rem_initial_equal:
   248 lemma rem_initial_equal:
   806     by arith
   798     by arith
   807 qed
   799 qed
   808 
   800 
   809 subsection {* Signed Vectors *}
   801 subsection {* Signed Vectors *}
   810 
   802 
   811 consts
   803 primrec norm_signed :: "bit list => bit list" where
   812   norm_signed :: "bit list => bit list"
   804     norm_signed_Nil: "norm_signed [] = []"
   813 primrec
   805   | norm_signed_Cons: "norm_signed (b#bs) =
   814   norm_signed_Nil: "norm_signed [] = []"
   806       (case b of
   815   norm_signed_Cons: "norm_signed (b#bs) =
   807         \<zero> => if norm_unsigned bs = [] then [] else b#norm_unsigned bs
   816     (case b of
   808       | \<one> => b#rem_initial b bs)"
   817       \<zero> => if norm_unsigned bs = [] then [] else b#norm_unsigned bs
       
   818     | \<one> => b#rem_initial b bs)"
       
   819 
   809 
   820 lemma norm_signed0 [simp]: "norm_signed [\<zero>] = []"
   810 lemma norm_signed0 [simp]: "norm_signed [\<zero>] = []"
   821   by simp
   811   by simp
   822 
   812 
   823 lemma norm_signed1 [simp]: "norm_signed [\<one>] = [\<one>]"
   813 lemma norm_signed1 [simp]: "norm_signed [\<one>] = [\<one>]"
  1003 
   993 
  1004 lemma bv_extend_norm_signed: "bv_msb w = b ==> bv_extend (length w) b (norm_signed w) = w"
   994 lemma bv_extend_norm_signed: "bv_msb w = b ==> bv_extend (length w) b (norm_signed w) = w"
  1005 proof (rule bit_list_cases [of w],simp_all)
   995 proof (rule bit_list_cases [of w],simp_all)
  1006   fix xs
   996   fix xs
  1007   show "bv_extend (Suc (length xs)) \<zero> (norm_signed (\<zero>#xs)) = \<zero>#xs"
   997   show "bv_extend (Suc (length xs)) \<zero> (norm_signed (\<zero>#xs)) = \<zero>#xs"
  1008   proof (simp add: norm_signed_list_def,auto)
   998   proof (simp add: norm_signed_def,auto)
  1009     assume "norm_unsigned xs = []"
   999     assume "norm_unsigned xs = []"
  1010     hence xx: "rem_initial \<zero> xs = []"
  1000     hence xx: "rem_initial \<zero> xs = []"
  1011       by (simp add: norm_unsigned_def)
  1001       by (simp add: norm_unsigned_def)
  1012     have "bv_extend (Suc (length xs)) \<zero> (\<zero>#rem_initial \<zero> xs) = \<zero>#xs"
  1002     have "bv_extend (Suc (length xs)) \<zero> (\<zero>#rem_initial \<zero> xs) = \<zero>#xs"
  1013       apply (simp add: bv_extend_def replicate_app_Cons_same)
  1003       apply (simp add: bv_extend_def replicate_app_Cons_same)
  2230 lemmas [simp] = length_nat_non0
  2220 lemmas [simp] = length_nat_non0
  2231 
  2221 
  2232 lemma "nat_to_bv (number_of Int.Pls) = []"
  2222 lemma "nat_to_bv (number_of Int.Pls) = []"
  2233   by simp
  2223   by simp
  2234 
  2224 
  2235 consts
  2225 primrec fast_bv_to_nat_helper :: "[bit list, int] => int" where
  2236   fast_bv_to_nat_helper :: "[bit list, int] => int"
  2226     fast_bv_to_nat_Nil: "fast_bv_to_nat_helper [] k = k"
  2237 primrec
  2227   | fast_bv_to_nat_Cons: "fast_bv_to_nat_helper (b#bs) k =
  2238   fast_bv_to_nat_Nil: "fast_bv_to_nat_helper [] k = k"
  2228       fast_bv_to_nat_helper bs ((bit_case Int.Bit0 Int.Bit1 b) k)"
  2239   fast_bv_to_nat_Cons: "fast_bv_to_nat_helper (b#bs) k =
       
  2240     fast_bv_to_nat_helper bs ((bit_case Int.Bit0 Int.Bit1 b) k)"
       
  2241 
  2229 
  2242 declare fast_bv_to_nat_helper.simps [code del]
  2230 declare fast_bv_to_nat_helper.simps [code del]
  2243 
  2231 
  2244 lemma fast_bv_to_nat_Cons0: "fast_bv_to_nat_helper (\<zero>#bs) bin =
  2232 lemma fast_bv_to_nat_Cons0: "fast_bv_to_nat_helper (\<zero>#bs) bin =
  2245     fast_bv_to_nat_helper bs (Int.Bit0 bin)"
  2233     fast_bv_to_nat_helper bs (Int.Bit0 bin)"