equal
deleted
inserted
replaced
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)" |