| author | wenzelm | 
| Sat, 21 Mar 2009 20:00:23 +0100 | |
| changeset 30627 | fb9e73c01603 | 
| parent 30224 | 79136ce06bdb | 
| child 30960 | fec1a04b7220 | 
| permissions | -rw-r--r-- | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1 | (* Title: HOL/Library/Word.thy | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2 | ID: $Id$ | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 3 | Author: Sebastian Skalberg (TU Muenchen) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 4 | *) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 5 | |
| 14706 | 6 | header {* Binary Words *}
 | 
| 14589 | 7 | |
| 15131 | 8 | theory Word | 
| 27487 | 9 | imports "~~/src/HOL/Main" | 
| 15131 | 10 | begin | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 11 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 12 | subsection {* Auxilary Lemmas *}
 | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 13 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 14 | lemma max_le [intro!]: "[| x \<le> z; y \<le> z |] ==> max x y \<le> z" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 15 | by (simp add: max_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 16 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 17 | lemma max_mono: | 
| 15067 | 18 | fixes x :: "'a::linorder" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 19 | assumes mf: "mono f" | 
| 15067 | 20 | shows "max (f x) (f y) \<le> f (max x y)" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 21 | proof - | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 22 | from mf and le_maxI1 [of x y] | 
| 23375 | 23 | have fx: "f x \<le> f (max x y)" by (rule monoD) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 24 | from mf and le_maxI2 [of y x] | 
| 23375 | 25 | have fy: "f y \<le> f (max x y)" by (rule monoD) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 26 | from fx and fy | 
| 23375 | 27 | show "max (f x) (f y) \<le> f (max x y)" by auto | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 28 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 29 | |
| 15067 | 30 | declare zero_le_power [intro] | 
| 23375 | 31 | and zero_less_power [intro] | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 32 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 33 | lemma int_nat_two_exp: "2 ^ k = int (2 ^ k)" | 
| 15325 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 34 | by (simp add: zpower_int [symmetric]) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 35 | |
| 23375 | 36 | |
| 14589 | 37 | subsection {* Bits *}
 | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 38 | |
| 23375 | 39 | datatype bit = | 
| 40 |     Zero ("\<zero>")
 | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 41 |   | One ("\<one>")
 | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 42 | |
| 25961 | 43 | primrec | 
| 15325 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 44 | bitval :: "bit => nat" | 
| 25961 | 45 | where | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 46 | "bitval \<zero> = 0" | 
| 25961 | 47 | | "bitval \<one> = 1" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 48 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 49 | consts | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 50 | bitnot :: "bit => bit" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 51 | bitand :: "bit => bit => bit" (infixr "bitand" 35) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 52 | bitor :: "bit => bit => bit" (infixr "bitor" 30) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 53 | bitxor :: "bit => bit => bit" (infixr "bitxor" 30) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 54 | |
| 21210 | 55 | notation (xsymbols) | 
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 56 |   bitnot ("\<not>\<^sub>b _" [40] 40) and
 | 
| 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 57 | bitand (infixr "\<and>\<^sub>b" 35) and | 
| 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 58 | bitor (infixr "\<or>\<^sub>b" 30) and | 
| 19736 | 59 | bitxor (infixr "\<oplus>\<^sub>b" 30) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 60 | |
| 21210 | 61 | notation (HTML output) | 
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 62 |   bitnot ("\<not>\<^sub>b _" [40] 40) and
 | 
| 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 63 | bitand (infixr "\<and>\<^sub>b" 35) and | 
| 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 64 | bitor (infixr "\<or>\<^sub>b" 30) and | 
| 19736 | 65 | bitxor (infixr "\<oplus>\<^sub>b" 30) | 
| 14565 | 66 | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 67 | primrec | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 68 | bitnot_zero: "(bitnot \<zero>) = \<one>" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 69 | bitnot_one : "(bitnot \<one>) = \<zero>" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 70 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 71 | primrec | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 72 | bitand_zero: "(\<zero> bitand y) = \<zero>" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 73 | bitand_one: "(\<one> bitand y) = y" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 74 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 75 | primrec | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 76 | bitor_zero: "(\<zero> bitor y) = y" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 77 | bitor_one: "(\<one> bitor y) = \<one>" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 78 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 79 | primrec | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 80 | bitxor_zero: "(\<zero> bitxor y) = y" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 81 | bitxor_one: "(\<one> bitxor y) = (bitnot y)" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 82 | |
| 17650 
44b135d04cc4
Made sure all lemmas now have names (especially so that certain of them
 skalberg parents: 
16796diff
changeset | 83 | lemma bitnot_bitnot [simp]: "(bitnot (bitnot b)) = b" | 
| 23375 | 84 | by (cases b) simp_all | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 85 | |
| 17650 
44b135d04cc4
Made sure all lemmas now have names (especially so that certain of them
 skalberg parents: 
16796diff
changeset | 86 | lemma bitand_cancel [simp]: "(b bitand b) = b" | 
| 23375 | 87 | by (cases b) simp_all | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 88 | |
| 17650 
44b135d04cc4
Made sure all lemmas now have names (especially so that certain of them
 skalberg parents: 
16796diff
changeset | 89 | lemma bitor_cancel [simp]: "(b bitor b) = b" | 
| 23375 | 90 | by (cases b) simp_all | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 91 | |
| 17650 
44b135d04cc4
Made sure all lemmas now have names (especially so that certain of them
 skalberg parents: 
16796diff
changeset | 92 | lemma bitxor_cancel [simp]: "(b bitxor b) = \<zero>" | 
| 23375 | 93 | by (cases b) simp_all | 
| 94 | ||
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 95 | |
| 14589 | 96 | subsection {* Bit Vectors *}
 | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 97 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 98 | text {* First, a couple of theorems expressing case analysis and
 | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 99 | induction principles for bit vectors. *} | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 100 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 101 | lemma bit_list_cases: | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 102 | assumes empty: "w = [] ==> P w" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 103 | and zero: "!!bs. w = \<zero> # bs ==> P w" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 104 | and one: "!!bs. w = \<one> # bs ==> P w" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 105 | shows "P w" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 106 | proof (cases w) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 107 | assume "w = []" | 
| 23375 | 108 | thus ?thesis by (rule empty) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 109 | next | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 110 | fix b bs | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 111 | assume [simp]: "w = b # bs" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 112 | show "P w" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 113 | proof (cases b) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 114 | assume "b = \<zero>" | 
| 23375 | 115 | hence "w = \<zero> # bs" by simp | 
| 116 | thus ?thesis by (rule zero) | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 117 | next | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 118 | assume "b = \<one>" | 
| 23375 | 119 | hence "w = \<one> # bs" by simp | 
| 120 | thus ?thesis by (rule one) | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 121 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 122 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 123 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 124 | lemma bit_list_induct: | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 125 | assumes empty: "P []" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 126 | and zero: "!!bs. P bs ==> P (\<zero>#bs)" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 127 | and one: "!!bs. P bs ==> P (\<one>#bs)" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 128 | shows "P w" | 
| 23375 | 129 | proof (induct w, simp_all add: empty) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 130 | fix b bs | 
| 23375 | 131 | assume "P bs" | 
| 132 | then show "P (b#bs)" | |
| 133 | by (cases b) (auto intro!: zero one) | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 134 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 135 | |
| 19736 | 136 | definition | 
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 137 | bv_msb :: "bit list => bit" where | 
| 19736 | 138 | "bv_msb w = (if w = [] then \<zero> else hd w)" | 
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 139 | |
| 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 140 | definition | 
| 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 141 | bv_extend :: "[nat,bit,bit list]=>bit list" where | 
| 19736 | 142 | "bv_extend i b w = (replicate (i - length w) b) @ w" | 
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 143 | |
| 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 144 | definition | 
| 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 145 | bv_not :: "bit list => bit list" where | 
| 19736 | 146 | "bv_not w = map bitnot w" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 147 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 148 | lemma bv_length_extend [simp]: "length w \<le> i ==> length (bv_extend i b w) = i" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 149 | by (simp add: bv_extend_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 150 | |
| 17650 
44b135d04cc4
Made sure all lemmas now have names (especially so that certain of them
 skalberg parents: 
16796diff
changeset | 151 | lemma bv_not_Nil [simp]: "bv_not [] = []" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 152 | by (simp add: bv_not_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 153 | |
| 17650 
44b135d04cc4
Made sure all lemmas now have names (especially so that certain of them
 skalberg parents: 
16796diff
changeset | 154 | lemma bv_not_Cons [simp]: "bv_not (b#bs) = (bitnot b) # bv_not bs" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 155 | by (simp add: bv_not_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 156 | |
| 17650 
44b135d04cc4
Made sure all lemmas now have names (especially so that certain of them
 skalberg parents: 
16796diff
changeset | 157 | lemma bv_not_bv_not [simp]: "bv_not (bv_not w) = w" | 
| 23375 | 158 | by (rule bit_list_induct [of _ w]) simp_all | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 159 | |
| 17650 
44b135d04cc4
Made sure all lemmas now have names (especially so that certain of them
 skalberg parents: 
16796diff
changeset | 160 | lemma bv_msb_Nil [simp]: "bv_msb [] = \<zero>" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 161 | by (simp add: bv_msb_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 162 | |
| 17650 
44b135d04cc4
Made sure all lemmas now have names (especially so that certain of them
 skalberg parents: 
16796diff
changeset | 163 | lemma bv_msb_Cons [simp]: "bv_msb (b#bs) = b" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 164 | by (simp add: bv_msb_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 165 | |
| 17650 
44b135d04cc4
Made sure all lemmas now have names (especially so that certain of them
 skalberg parents: 
16796diff
changeset | 166 | lemma bv_msb_bv_not [simp]: "0 < length w ==> bv_msb (bv_not w) = (bitnot (bv_msb w))" | 
| 23375 | 167 | by (cases w) simp_all | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 168 | |
| 17650 
44b135d04cc4
Made sure all lemmas now have names (especially so that certain of them
 skalberg parents: 
16796diff
changeset | 169 | lemma bv_msb_one_length [simp,intro]: "bv_msb w = \<one> ==> 0 < length w" | 
| 23375 | 170 | by (cases w) simp_all | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 171 | |
| 17650 
44b135d04cc4
Made sure all lemmas now have names (especially so that certain of them
 skalberg parents: 
16796diff
changeset | 172 | lemma length_bv_not [simp]: "length (bv_not w) = length w" | 
| 23375 | 173 | by (induct w) simp_all | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 174 | |
| 19736 | 175 | definition | 
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 176 | bv_to_nat :: "bit list => nat" where | 
| 19736 | 177 | "bv_to_nat = foldl (%bn b. 2 * bn + bitval b) 0" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 178 | |
| 17650 
44b135d04cc4
Made sure all lemmas now have names (especially so that certain of them
 skalberg parents: 
16796diff
changeset | 179 | lemma bv_to_nat_Nil [simp]: "bv_to_nat [] = 0" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 180 | by (simp add: bv_to_nat_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 181 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 182 | lemma bv_to_nat_helper [simp]: "bv_to_nat (b # bs) = bitval b * 2 ^ length bs + bv_to_nat bs" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 183 | proof - | 
| 15325 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 184 | let ?bv_to_nat' = "foldl (\<lambda>bn b. 2 * bn + bitval b)" | 
| 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 185 | have helper: "\<And>base. ?bv_to_nat' base bs = base * 2 ^ length bs + ?bv_to_nat' 0 bs" | 
| 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 186 | proof (induct bs) | 
| 23375 | 187 | case Nil | 
| 188 | show ?case by simp | |
| 15325 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 189 | next | 
| 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 190 | case (Cons x xs base) | 
| 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 191 | show ?case | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 192 | apply (simp only: foldl.simps) | 
| 15325 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 193 | apply (subst Cons [of "2 * base + bitval x"]) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 194 | apply simp | 
| 15325 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 195 | apply (subst Cons [of "bitval x"]) | 
| 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 196 | apply (simp add: add_mult_distrib) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 197 | done | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 198 | qed | 
| 15325 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 199 | show ?thesis by (simp add: bv_to_nat_def) (rule helper) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 200 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 201 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 202 | lemma bv_to_nat0 [simp]: "bv_to_nat (\<zero>#bs) = bv_to_nat bs" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 203 | by simp | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 204 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 205 | lemma bv_to_nat1 [simp]: "bv_to_nat (\<one>#bs) = 2 ^ length bs + bv_to_nat bs" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 206 | by simp | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 207 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 208 | lemma bv_to_nat_upper_range: "bv_to_nat w < 2 ^ length w" | 
| 23375 | 209 | proof (induct w, simp_all) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 210 | fix b bs | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 211 | assume "bv_to_nat bs < 2 ^ length bs" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 212 | show "bitval b * 2 ^ length bs + bv_to_nat bs < 2 * 2 ^ length bs" | 
| 23375 | 213 | proof (cases b, simp_all) | 
| 214 | have "bv_to_nat bs < 2 ^ length bs" by fact | |
| 215 | also have "... < 2 * 2 ^ length bs" by auto | |
| 216 | finally show "bv_to_nat bs < 2 * 2 ^ length bs" by simp | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 217 | next | 
| 23375 | 218 | have "bv_to_nat bs < 2 ^ length bs" by fact | 
| 219 | hence "2 ^ length bs + bv_to_nat bs < 2 ^ length bs + 2 ^ length bs" by arith | |
| 220 | also have "... = 2 * (2 ^ length bs)" by simp | |
| 221 | finally show "bv_to_nat bs < 2 ^ length bs" by simp | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 222 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 223 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 224 | |
| 17650 
44b135d04cc4
Made sure all lemmas now have names (especially so that certain of them
 skalberg parents: 
16796diff
changeset | 225 | lemma bv_extend_longer [simp]: | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 226 | assumes wn: "n \<le> length w" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 227 | shows "bv_extend n b w = w" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 228 | by (simp add: bv_extend_def wn) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 229 | |
| 17650 
44b135d04cc4
Made sure all lemmas now have names (especially so that certain of them
 skalberg parents: 
16796diff
changeset | 230 | lemma bv_extend_shorter [simp]: | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 231 | assumes wn: "length w < n" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 232 | shows "bv_extend n b w = bv_extend n b (b#w)" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 233 | proof - | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 234 | from wn | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 235 | have s: "n - Suc (length w) + 1 = n - length w" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 236 | by arith | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 237 | have "bv_extend n b w = replicate (n - length w) b @ w" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 238 | by (simp add: bv_extend_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 239 | also have "... = replicate (n - Suc (length w) + 1) b @ w" | 
| 23375 | 240 | by (subst s) rule | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 241 | also have "... = (replicate (n - Suc (length w)) b @ replicate 1 b) @ w" | 
| 23375 | 242 | by (subst replicate_add) rule | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 243 | also have "... = replicate (n - Suc (length w)) b @ b # w" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 244 | by simp | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 245 | also have "... = bv_extend n b (b#w)" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 246 | by (simp add: bv_extend_def) | 
| 23375 | 247 | finally show "bv_extend n b w = bv_extend n b (b#w)" . | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 248 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 249 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 250 | consts | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 251 | rem_initial :: "bit => bit list => bit list" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 252 | primrec | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 253 | "rem_initial b [] = []" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 254 | "rem_initial b (x#xs) = (if b = x then rem_initial b xs else x#xs)" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 255 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 256 | lemma rem_initial_length: "length (rem_initial b w) \<le> length w" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 257 | by (rule bit_list_induct [of _ w],simp_all (no_asm),safe,simp_all) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 258 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 259 | lemma rem_initial_equal: | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 260 | assumes p: "length (rem_initial b w) = length w" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 261 | shows "rem_initial b w = w" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 262 | proof - | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 263 | have "length (rem_initial b w) = length w --> rem_initial b w = w" | 
| 23375 | 264 | proof (induct w, simp_all, clarify) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 265 | fix xs | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 266 | assume "length (rem_initial b xs) = length xs --> rem_initial b xs = xs" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 267 | assume f: "length (rem_initial b xs) = Suc (length xs)" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 268 | with rem_initial_length [of b xs] | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 269 | show "rem_initial b xs = b#xs" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 270 | by auto | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 271 | qed | 
| 23375 | 272 | from this and p show ?thesis .. | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 273 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 274 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 275 | lemma bv_extend_rem_initial: "bv_extend (length w) b (rem_initial b w) = w" | 
| 23375 | 276 | proof (induct w, simp_all, safe) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 277 | fix xs | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 278 | assume ind: "bv_extend (length xs) b (rem_initial b xs) = xs" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 279 | from rem_initial_length [of b xs] | 
| 23375 | 280 | have [simp]: "Suc (length xs) - length (rem_initial b xs) = | 
| 281 | 1 + (length xs - length (rem_initial b xs))" | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 282 | by arith | 
| 23375 | 283 | have "bv_extend (Suc (length xs)) b (rem_initial b xs) = | 
| 284 | replicate (Suc (length xs) - length (rem_initial b xs)) b @ (rem_initial b xs)" | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 285 | by (simp add: bv_extend_def) | 
| 23375 | 286 | also have "... = | 
| 287 | replicate (1 + (length xs - length (rem_initial b xs))) b @ rem_initial b xs" | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 288 | by simp | 
| 23375 | 289 | also have "... = | 
| 290 | (replicate 1 b @ replicate (length xs - length (rem_initial b xs)) b) @ rem_initial b xs" | |
| 291 | by (subst replicate_add) (rule refl) | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 292 | also have "... = b # bv_extend (length xs) b (rem_initial b xs)" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 293 | by (auto simp add: bv_extend_def [symmetric]) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 294 | also have "... = b # xs" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 295 | by (simp add: ind) | 
| 23375 | 296 | finally show "bv_extend (Suc (length xs)) b (rem_initial b xs) = b # xs" . | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 297 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 298 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 299 | lemma rem_initial_append1: | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 300 | assumes "rem_initial b xs ~= []" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 301 | shows "rem_initial b (xs @ ys) = rem_initial b xs @ ys" | 
| 23375 | 302 | using assms by (induct xs) auto | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 303 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 304 | lemma rem_initial_append2: | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 305 | assumes "rem_initial b xs = []" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 306 | shows "rem_initial b (xs @ ys) = rem_initial b ys" | 
| 23375 | 307 | using assms by (induct xs) auto | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 308 | |
| 19736 | 309 | definition | 
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 310 | norm_unsigned :: "bit list => bit list" where | 
| 19736 | 311 | "norm_unsigned = rem_initial \<zero>" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 312 | |
| 17650 
44b135d04cc4
Made sure all lemmas now have names (especially so that certain of them
 skalberg parents: 
16796diff
changeset | 313 | lemma norm_unsigned_Nil [simp]: "norm_unsigned [] = []" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 314 | by (simp add: norm_unsigned_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 315 | |
| 17650 
44b135d04cc4
Made sure all lemmas now have names (especially so that certain of them
 skalberg parents: 
16796diff
changeset | 316 | lemma norm_unsigned_Cons0 [simp]: "norm_unsigned (\<zero>#bs) = norm_unsigned bs" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 317 | by (simp add: norm_unsigned_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 318 | |
| 17650 
44b135d04cc4
Made sure all lemmas now have names (especially so that certain of them
 skalberg parents: 
16796diff
changeset | 319 | lemma norm_unsigned_Cons1 [simp]: "norm_unsigned (\<one>#bs) = \<one>#bs" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 320 | by (simp add: norm_unsigned_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 321 | |
| 17650 
44b135d04cc4
Made sure all lemmas now have names (especially so that certain of them
 skalberg parents: 
16796diff
changeset | 322 | lemma norm_unsigned_idem [simp]: "norm_unsigned (norm_unsigned w) = norm_unsigned w" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 323 | by (rule bit_list_induct [of _ w],simp_all) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 324 | |
| 23829 
41014a878a7d
reverted fun->recdef, since there are problems with induction rule
 krauss parents: 
23821diff
changeset | 325 | consts | 
| 15325 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 326 | nat_to_bv_helper :: "nat => bit list => bit list" | 
| 23829 
41014a878a7d
reverted fun->recdef, since there are problems with induction rule
 krauss parents: 
23821diff
changeset | 327 | recdef nat_to_bv_helper "measure (\<lambda>n. n)" | 
| 
41014a878a7d
reverted fun->recdef, since there are problems with induction rule
 krauss parents: 
23821diff
changeset | 328 | "nat_to_bv_helper n = (%bs. (if n = 0 then bs | 
| 
41014a878a7d
reverted fun->recdef, since there are problems with induction rule
 krauss parents: 
23821diff
changeset | 329 | else nat_to_bv_helper (n div 2) ((if n mod 2 = 0 then \<zero> else \<one>)#bs)))" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 330 | |
| 19736 | 331 | definition | 
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 332 | nat_to_bv :: "nat => bit list" where | 
| 19736 | 333 | "nat_to_bv n = nat_to_bv_helper n []" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 334 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 335 | lemma nat_to_bv0 [simp]: "nat_to_bv 0 = []" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 336 | by (simp add: nat_to_bv_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 337 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 338 | lemmas [simp del] = nat_to_bv_helper.simps | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 339 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 340 | lemma n_div_2_cases: | 
| 15325 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 341 | assumes zero: "(n::nat) = 0 ==> R" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 342 | and div : "[| n div 2 < n ; 0 < n |] ==> R" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 343 | shows "R" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 344 | proof (cases "n = 0") | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 345 | assume "n = 0" | 
| 23375 | 346 | thus R by (rule zero) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 347 | next | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 348 | assume "n ~= 0" | 
| 23375 | 349 | hence "0 < n" by simp | 
| 350 | hence "n div 2 < n" by arith | |
| 351 | from this and `0 < n` show R by (rule div) | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 352 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 353 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 354 | lemma int_wf_ge_induct: | 
| 22059 | 355 | assumes ind : "!!i::int. (!!j. [| k \<le> j ; j < i |] ==> P j) ==> P i" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 356 | shows "P i" | 
| 22059 | 357 | proof (rule wf_induct_rule [OF wf_int_ge_less_than]) | 
| 358 | fix x | |
| 359 | assume ih: "(\<And>y\<Colon>int. (y, x) \<in> int_ge_less_than k \<Longrightarrow> P y)" | |
| 360 | thus "P x" | |
| 23375 | 361 | by (rule ind) (simp add: int_ge_less_than_def) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 362 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 363 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 364 | lemma unfold_nat_to_bv_helper: | 
| 15325 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 365 | "nat_to_bv_helper b l = nat_to_bv_helper b [] @ l" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 366 | proof - | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 367 | have "\<forall>l. nat_to_bv_helper b l = nat_to_bv_helper b [] @ l" | 
| 15325 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 368 | proof (induct b rule: less_induct) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 369 | fix n | 
| 15325 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 370 | assume ind: "!!j. j < n \<Longrightarrow> \<forall> l. nat_to_bv_helper j l = nat_to_bv_helper j [] @ l" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 371 | show "\<forall>l. nat_to_bv_helper n l = nat_to_bv_helper n [] @ l" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 372 | proof | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 373 | fix l | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 374 | show "nat_to_bv_helper n l = nat_to_bv_helper n [] @ l" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 375 | proof (cases "n < 0") | 
| 19736 | 376 | assume "n < 0" | 
| 377 | thus ?thesis | |
| 378 | by (simp add: nat_to_bv_helper.simps) | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 379 | next | 
| 19736 | 380 | assume "~n < 0" | 
| 381 | show ?thesis | |
| 382 | proof (rule n_div_2_cases [of n]) | |
| 383 | assume [simp]: "n = 0" | |
| 384 | show ?thesis | |
| 385 | apply (simp only: nat_to_bv_helper.simps [of n]) | |
| 386 | apply simp | |
| 387 | done | |
| 388 | next | |
| 389 | assume n2n: "n div 2 < n" | |
| 390 | assume [simp]: "0 < n" | |
| 391 | hence n20: "0 \<le> n div 2" | |
| 392 | by arith | |
| 393 | from ind [of "n div 2"] and n2n n20 | |
| 394 | have ind': "\<forall>l. nat_to_bv_helper (n div 2) l = nat_to_bv_helper (n div 2) [] @ l" | |
| 395 | by blast | |
| 396 | show ?thesis | |
| 397 | apply (simp only: nat_to_bv_helper.simps [of n]) | |
| 398 | apply (cases "n=0") | |
| 399 | apply simp | |
| 400 | apply (simp only: if_False) | |
| 401 | apply simp | |
| 402 | apply (subst spec [OF ind',of "\<zero>#l"]) | |
| 403 | apply (subst spec [OF ind',of "\<one>#l"]) | |
| 404 | apply (subst spec [OF ind',of "[\<one>]"]) | |
| 405 | apply (subst spec [OF ind',of "[\<zero>]"]) | |
| 406 | apply simp | |
| 407 | done | |
| 408 | qed | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 409 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 410 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 411 | qed | 
| 23375 | 412 | thus ?thesis .. | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 413 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 414 | |
| 25134 
3d4953e88449
Eliminated most of the neq0_conv occurrences. As a result, many
 nipkow parents: 
25112diff
changeset | 415 | lemma nat_to_bv_non0 [simp]: "n\<noteq>0 ==> nat_to_bv n = nat_to_bv (n div 2) @ [if n mod 2 = 0 then \<zero> else \<one>]" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 416 | proof - | 
| 25134 
3d4953e88449
Eliminated most of the neq0_conv occurrences. As a result, many
 nipkow parents: 
25112diff
changeset | 417 | assume [simp]: "n\<noteq>0" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 418 | show ?thesis | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 419 | apply (subst nat_to_bv_def [of n]) | 
| 15481 | 420 | apply (simp only: nat_to_bv_helper.simps [of n]) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 421 | apply (subst unfold_nat_to_bv_helper) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 422 | using prems | 
| 25134 
3d4953e88449
Eliminated most of the neq0_conv occurrences. As a result, many
 nipkow parents: 
25112diff
changeset | 423 | apply (simp) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 424 | apply (subst nat_to_bv_def [of "n div 2"]) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 425 | apply auto | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 426 | done | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 427 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 428 | |
| 25134 
3d4953e88449
Eliminated most of the neq0_conv occurrences. As a result, many
 nipkow parents: 
25112diff
changeset | 429 | lemma bv_to_nat_dist_append: | 
| 
3d4953e88449
Eliminated most of the neq0_conv occurrences. As a result, many
 nipkow parents: 
25112diff
changeset | 430 | "bv_to_nat (l1 @ l2) = bv_to_nat l1 * 2 ^ length l2 + bv_to_nat l2" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 431 | proof - | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 432 | have "\<forall>l2. bv_to_nat (l1 @ l2) = bv_to_nat l1 * 2 ^ length l2 + bv_to_nat l2" | 
| 27368 | 433 | proof (induct l1, simp_all) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 434 | fix x xs | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 435 | assume ind: "\<forall>l2. bv_to_nat (xs @ l2) = bv_to_nat xs * 2 ^ length l2 + bv_to_nat l2" | 
| 27368 | 436 | show "\<forall>l2::bit list. bitval x * 2 ^ (length xs + length l2) + bv_to_nat xs * 2 ^ length l2 = (bitval x * 2 ^ length xs + bv_to_nat xs) * 2 ^ length l2" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 437 | proof | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 438 | fix l2 | 
| 27368 | 439 | show "bitval x * 2 ^ (length xs + length l2) + bv_to_nat xs * 2 ^ length l2 = (bitval x * 2 ^ length xs + bv_to_nat xs) * 2 ^ length l2" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 440 | proof - | 
| 19736 | 441 | have "(2::nat) ^ (length xs + length l2) = 2 ^ length xs * 2 ^ length l2" | 
| 442 | by (induct "length xs",simp_all) | |
| 443 | hence "bitval x * 2 ^ (length xs + length l2) + bv_to_nat xs * 2 ^ length l2 = | |
| 444 | bitval x * 2 ^ length xs * 2 ^ length l2 + bv_to_nat xs * 2 ^ length l2" | |
| 445 | by simp | |
| 446 | also have "... = (bitval x * 2 ^ length xs + bv_to_nat xs) * 2 ^ length l2" | |
| 23477 
f4b83f03cac9
tuned and renamed group_eq_simps and ring_eq_simps
 nipkow parents: 
23431diff
changeset | 447 | by (simp add: ring_distribs) | 
| 25595 | 448 | finally show ?thesis by simp | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 449 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 450 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 451 | qed | 
| 23375 | 452 | thus ?thesis .. | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 453 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 454 | |
| 15325 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 455 | lemma bv_nat_bv [simp]: "bv_to_nat (nat_to_bv n) = n" | 
| 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 456 | proof (induct n rule: less_induct) | 
| 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 457 | fix n | 
| 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 458 | assume ind: "!!j. j < n \<Longrightarrow> bv_to_nat (nat_to_bv j) = j" | 
| 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 459 | show "bv_to_nat (nat_to_bv n) = n" | 
| 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 460 | proof (rule n_div_2_cases [of n]) | 
| 25134 
3d4953e88449
Eliminated most of the neq0_conv occurrences. As a result, many
 nipkow parents: 
25112diff
changeset | 461 | assume "n = 0" then show ?thesis by simp | 
| 15325 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 462 | next | 
| 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 463 | assume nn: "n div 2 < n" | 
| 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 464 | assume n0: "0 < n" | 
| 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 465 | from ind and nn | 
| 23375 | 466 | have ind': "bv_to_nat (nat_to_bv (n div 2)) = n div 2" by blast | 
| 467 | from n0 have n0': "n \<noteq> 0" by simp | |
| 15325 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 468 | show ?thesis | 
| 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 469 | apply (subst nat_to_bv_def) | 
| 15481 | 470 | apply (simp only: nat_to_bv_helper.simps [of n]) | 
| 15325 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 471 | apply (simp only: n0' if_False) | 
| 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 472 | apply (subst unfold_nat_to_bv_helper) | 
| 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 473 | apply (subst bv_to_nat_dist_append) | 
| 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 474 | apply (fold nat_to_bv_def) | 
| 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 475 | apply (simp add: ind' split del: split_if) | 
| 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 476 | apply (cases "n mod 2 = 0") | 
| 25134 
3d4953e88449
Eliminated most of the neq0_conv occurrences. As a result, many
 nipkow parents: 
25112diff
changeset | 477 | proof (simp_all) | 
| 19736 | 478 | assume "n mod 2 = 0" | 
| 479 | with mod_div_equality [of n 2] | |
| 25134 
3d4953e88449
Eliminated most of the neq0_conv occurrences. As a result, many
 nipkow parents: 
25112diff
changeset | 480 | show "n div 2 * 2 = n" by simp | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 481 | next | 
| 25162 | 482 | assume "n mod 2 = Suc 0" | 
| 19736 | 483 | with mod_div_equality [of n 2] | 
| 25134 
3d4953e88449
Eliminated most of the neq0_conv occurrences. As a result, many
 nipkow parents: 
25112diff
changeset | 484 | show "Suc (n div 2 * 2) = n" by arith | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 485 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 486 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 487 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 488 | |
| 17650 
44b135d04cc4
Made sure all lemmas now have names (especially so that certain of them
 skalberg parents: 
16796diff
changeset | 489 | lemma bv_to_nat_type [simp]: "bv_to_nat (norm_unsigned w) = bv_to_nat w" | 
| 23375 | 490 | by (rule bit_list_induct) simp_all | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 491 | |
| 17650 
44b135d04cc4
Made sure all lemmas now have names (especially so that certain of them
 skalberg parents: 
16796diff
changeset | 492 | lemma length_norm_unsigned_le [simp]: "length (norm_unsigned w) \<le> length w" | 
| 23375 | 493 | by (rule bit_list_induct) simp_all | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 494 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 495 | lemma bv_to_nat_rew_msb: "bv_msb w = \<one> ==> bv_to_nat w = 2 ^ (length w - 1) + bv_to_nat (tl w)" | 
| 23375 | 496 | by (rule bit_list_cases [of w]) simp_all | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 497 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 498 | lemma norm_unsigned_result: "norm_unsigned xs = [] \<or> bv_msb (norm_unsigned xs) = \<one>" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 499 | proof (rule length_induct [of _ xs]) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 500 | fix xs :: "bit list" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 501 | assume ind: "\<forall>ys. length ys < length xs --> norm_unsigned ys = [] \<or> bv_msb (norm_unsigned ys) = \<one>" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 502 | show "norm_unsigned xs = [] \<or> bv_msb (norm_unsigned xs) = \<one>" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 503 | proof (rule bit_list_cases [of xs],simp_all) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 504 | fix bs | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 505 | assume [simp]: "xs = \<zero>#bs" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 506 | from ind | 
| 23375 | 507 | have "length bs < length xs --> norm_unsigned bs = [] \<or> bv_msb (norm_unsigned bs) = \<one>" .. | 
| 508 | thus "norm_unsigned bs = [] \<or> bv_msb (norm_unsigned bs) = \<one>" by simp | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 509 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 510 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 511 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 512 | lemma norm_empty_bv_to_nat_zero: | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 513 | assumes nw: "norm_unsigned w = []" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 514 | shows "bv_to_nat w = 0" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 515 | proof - | 
| 23375 | 516 | have "bv_to_nat w = bv_to_nat (norm_unsigned w)" by simp | 
| 517 | also have "... = bv_to_nat []" by (subst nw) (rule refl) | |
| 518 | also have "... = 0" by simp | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 519 | finally show ?thesis . | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 520 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 521 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 522 | lemma bv_to_nat_lower_limit: | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 523 | assumes w0: "0 < bv_to_nat w" | 
| 23375 | 524 | shows "2 ^ (length (norm_unsigned w) - 1) \<le> bv_to_nat w" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 525 | proof - | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 526 | from w0 and norm_unsigned_result [of w] | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 527 | have msbw: "bv_msb (norm_unsigned w) = \<one>" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 528 | by (auto simp add: norm_empty_bv_to_nat_zero) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 529 | have "2 ^ (length (norm_unsigned w) - 1) \<le> bv_to_nat (norm_unsigned w)" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 530 | by (subst bv_to_nat_rew_msb [OF msbw],simp) | 
| 23375 | 531 | thus ?thesis by simp | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 532 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 533 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 534 | lemmas [simp del] = nat_to_bv_non0 | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 535 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 536 | lemma norm_unsigned_length [intro!]: "length (norm_unsigned w) \<le> length w" | 
| 25134 
3d4953e88449
Eliminated most of the neq0_conv occurrences. As a result, many
 nipkow parents: 
25112diff
changeset | 537 | by (subst norm_unsigned_def,rule rem_initial_length) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 538 | |
| 25134 
3d4953e88449
Eliminated most of the neq0_conv occurrences. As a result, many
 nipkow parents: 
25112diff
changeset | 539 | lemma norm_unsigned_equal: | 
| 
3d4953e88449
Eliminated most of the neq0_conv occurrences. As a result, many
 nipkow parents: 
25112diff
changeset | 540 | "length (norm_unsigned w) = length w ==> norm_unsigned w = w" | 
| 
3d4953e88449
Eliminated most of the neq0_conv occurrences. As a result, many
 nipkow parents: 
25112diff
changeset | 541 | by (simp add: norm_unsigned_def,rule rem_initial_equal) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 542 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 543 | lemma bv_extend_norm_unsigned: "bv_extend (length w) \<zero> (norm_unsigned w) = w" | 
| 25134 
3d4953e88449
Eliminated most of the neq0_conv occurrences. As a result, many
 nipkow parents: 
25112diff
changeset | 544 | by (simp add: norm_unsigned_def,rule bv_extend_rem_initial) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 545 | |
| 23375 | 546 | lemma norm_unsigned_append1 [simp]: | 
| 25134 
3d4953e88449
Eliminated most of the neq0_conv occurrences. As a result, many
 nipkow parents: 
25112diff
changeset | 547 | "norm_unsigned xs \<noteq> [] ==> norm_unsigned (xs @ ys) = norm_unsigned xs @ ys" | 
| 
3d4953e88449
Eliminated most of the neq0_conv occurrences. As a result, many
 nipkow parents: 
25112diff
changeset | 548 | by (simp add: norm_unsigned_def,rule rem_initial_append1) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 549 | |
| 23375 | 550 | lemma norm_unsigned_append2 [simp]: | 
| 25134 
3d4953e88449
Eliminated most of the neq0_conv occurrences. As a result, many
 nipkow parents: 
25112diff
changeset | 551 | "norm_unsigned xs = [] ==> norm_unsigned (xs @ ys) = norm_unsigned ys" | 
| 
3d4953e88449
Eliminated most of the neq0_conv occurrences. As a result, many
 nipkow parents: 
25112diff
changeset | 552 | by (simp add: norm_unsigned_def,rule rem_initial_append2) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 553 | |
| 23375 | 554 | lemma bv_to_nat_zero_imp_empty: | 
| 25134 
3d4953e88449
Eliminated most of the neq0_conv occurrences. As a result, many
 nipkow parents: 
25112diff
changeset | 555 | "bv_to_nat w = 0 \<Longrightarrow> norm_unsigned w = []" | 
| 
3d4953e88449
Eliminated most of the neq0_conv occurrences. As a result, many
 nipkow parents: 
25112diff
changeset | 556 | by (atomize (full), induct w rule: bit_list_induct) simp_all | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 557 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 558 | lemma bv_to_nat_nzero_imp_nempty: | 
| 23375 | 559 | "bv_to_nat w \<noteq> 0 \<Longrightarrow> norm_unsigned w \<noteq> []" | 
| 25134 
3d4953e88449
Eliminated most of the neq0_conv occurrences. As a result, many
 nipkow parents: 
25112diff
changeset | 560 | by (induct w rule: bit_list_induct) simp_all | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 561 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 562 | lemma nat_helper1: | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 563 | assumes ass: "nat_to_bv (bv_to_nat w) = norm_unsigned w" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 564 | shows "nat_to_bv (2 * bv_to_nat w + bitval x) = norm_unsigned (w @ [x])" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 565 | proof (cases x) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 566 | assume [simp]: "x = \<one>" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 567 | show ?thesis | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 568 | apply (simp add: nat_to_bv_non0) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 569 | apply safe | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 570 | proof - | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 571 | fix q | 
| 15325 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 572 | assume "Suc (2 * bv_to_nat w) = 2 * q" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 573 | hence orig: "(2 * bv_to_nat w + 1) mod 2 = 2 * q mod 2" (is "?lhs = ?rhs") | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 574 | by simp | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 575 | have "?lhs = (1 + 2 * bv_to_nat w) mod 2" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 576 | by (simp add: add_commute) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 577 | also have "... = 1" | 
| 30224 | 578 | by (subst mod_add_eq) simp | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 579 | finally have eq1: "?lhs = 1" . | 
| 23375 | 580 | have "?rhs = 0" by simp | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 581 | with orig and eq1 | 
| 15325 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 582 | show "nat_to_bv (Suc (2 * bv_to_nat w) div 2) @ [\<zero>] = norm_unsigned (w @ [\<one>])" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 583 | by simp | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 584 | next | 
| 23375 | 585 | have "nat_to_bv (Suc (2 * bv_to_nat w) div 2) @ [\<one>] = | 
| 586 | nat_to_bv ((1 + 2 * bv_to_nat w) div 2) @ [\<one>]" | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 587 | by (simp add: add_commute) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 588 | also have "... = nat_to_bv (bv_to_nat w) @ [\<one>]" | 
| 23375 | 589 | by (subst div_add1_eq) simp | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 590 | also have "... = norm_unsigned w @ [\<one>]" | 
| 23375 | 591 | by (subst ass) (rule refl) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 592 | also have "... = norm_unsigned (w @ [\<one>])" | 
| 23375 | 593 | by (cases "norm_unsigned w") simp_all | 
| 594 | finally show "nat_to_bv (Suc (2 * bv_to_nat w) div 2) @ [\<one>] = norm_unsigned (w @ [\<one>])" . | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 595 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 596 | next | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 597 | assume [simp]: "x = \<zero>" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 598 | show ?thesis | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 599 | proof (cases "bv_to_nat w = 0") | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 600 | assume "bv_to_nat w = 0" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 601 | thus ?thesis | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 602 | by (simp add: bv_to_nat_zero_imp_empty) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 603 | next | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 604 | assume "bv_to_nat w \<noteq> 0" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 605 | thus ?thesis | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 606 | apply simp | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 607 | apply (subst nat_to_bv_non0) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 608 | apply simp | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 609 | apply auto | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 610 | apply (subst ass) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 611 | apply (cases "norm_unsigned w") | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 612 | apply (simp_all add: norm_empty_bv_to_nat_zero) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 613 | done | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 614 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 615 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 616 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 617 | lemma nat_helper2: "nat_to_bv (2 ^ length xs + bv_to_nat xs) = \<one> # xs" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 618 | proof - | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 619 | have "\<forall>xs. nat_to_bv (2 ^ length (rev xs) + bv_to_nat (rev xs)) = \<one> # (rev xs)" (is "\<forall>xs. ?P xs") | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 620 | proof | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 621 | fix xs | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 622 | show "?P xs" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 623 | proof (rule length_induct [of _ xs]) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 624 | fix xs :: "bit list" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 625 | assume ind: "\<forall>ys. length ys < length xs --> ?P ys" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 626 | show "?P xs" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 627 | proof (cases xs) | 
| 23375 | 628 | assume "xs = []" | 
| 629 | then show ?thesis by (simp add: nat_to_bv_non0) | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 630 | next | 
| 19736 | 631 | fix y ys | 
| 632 | assume [simp]: "xs = y # ys" | |
| 633 | show ?thesis | |
| 634 | apply simp | |
| 635 | apply (subst bv_to_nat_dist_append) | |
| 636 | apply simp | |
| 637 | proof - | |
| 638 | have "nat_to_bv (2 * 2 ^ length ys + (bv_to_nat (rev ys) * 2 + bitval y)) = | |
| 639 | nat_to_bv (2 * (2 ^ length ys + bv_to_nat (rev ys)) + bitval y)" | |
| 640 | by (simp add: add_ac mult_ac) | |
| 641 | also have "... = nat_to_bv (2 * (bv_to_nat (\<one>#rev ys)) + bitval y)" | |
| 642 | by simp | |
| 643 | also have "... = norm_unsigned (\<one>#rev ys) @ [y]" | |
| 644 | proof - | |
| 645 | from ind | |
| 646 | have "nat_to_bv (2 ^ length (rev ys) + bv_to_nat (rev ys)) = \<one> # rev ys" | |
| 647 | by auto | |
| 648 | hence [simp]: "nat_to_bv (2 ^ length ys + bv_to_nat (rev ys)) = \<one> # rev ys" | |
| 649 | by simp | |
| 650 | show ?thesis | |
| 651 | apply (subst nat_helper1) | |
| 652 | apply simp_all | |
| 653 | done | |
| 654 | qed | |
| 655 | also have "... = (\<one>#rev ys) @ [y]" | |
| 656 | by simp | |
| 657 | also have "... = \<one> # rev ys @ [y]" | |
| 658 | by simp | |
| 23375 | 659 | finally show "nat_to_bv (2 * 2 ^ length ys + (bv_to_nat (rev ys) * 2 + bitval y)) = | 
| 660 | \<one> # rev ys @ [y]" . | |
| 19736 | 661 | qed | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 662 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 663 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 664 | qed | 
| 23375 | 665 | hence "nat_to_bv (2 ^ length (rev (rev xs)) + bv_to_nat (rev (rev xs))) = | 
| 666 | \<one> # rev (rev xs)" .. | |
| 667 | thus ?thesis by simp | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 668 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 669 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 670 | lemma nat_bv_nat [simp]: "nat_to_bv (bv_to_nat w) = norm_unsigned w" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 671 | proof (rule bit_list_induct [of _ w],simp_all) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 672 | fix xs | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 673 | assume "nat_to_bv (bv_to_nat xs) = norm_unsigned xs" | 
| 23375 | 674 | have "bv_to_nat xs = bv_to_nat (norm_unsigned xs)" by simp | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 675 | have "bv_to_nat xs < 2 ^ length xs" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 676 | by (rule bv_to_nat_upper_range) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 677 | show "nat_to_bv (2 ^ length xs + bv_to_nat xs) = \<one> # xs" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 678 | by (rule nat_helper2) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 679 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 680 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 681 | lemma bv_to_nat_qinj: | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 682 | assumes one: "bv_to_nat xs = bv_to_nat ys" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 683 | and len: "length xs = length ys" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 684 | shows "xs = ys" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 685 | proof - | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 686 | from one | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 687 | have "nat_to_bv (bv_to_nat xs) = nat_to_bv (bv_to_nat ys)" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 688 | by simp | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 689 | hence xsys: "norm_unsigned xs = norm_unsigned ys" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 690 | by simp | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 691 | have "xs = bv_extend (length xs) \<zero> (norm_unsigned xs)" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 692 | by (simp add: bv_extend_norm_unsigned) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 693 | also have "... = bv_extend (length ys) \<zero> (norm_unsigned ys)" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 694 | by (simp add: xsys len) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 695 | also have "... = ys" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 696 | by (simp add: bv_extend_norm_unsigned) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 697 | finally show ?thesis . | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 698 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 699 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 700 | lemma norm_unsigned_nat_to_bv [simp]: | 
| 15325 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 701 | "norm_unsigned (nat_to_bv n) = nat_to_bv n" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 702 | proof - | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 703 | have "norm_unsigned (nat_to_bv n) = nat_to_bv (bv_to_nat (norm_unsigned (nat_to_bv n)))" | 
| 23375 | 704 | by (subst nat_bv_nat) simp | 
| 705 | also have "... = nat_to_bv n" by simp | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 706 | finally show ?thesis . | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 707 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 708 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 709 | lemma length_nat_to_bv_upper_limit: | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 710 | assumes nk: "n \<le> 2 ^ k - 1" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 711 | shows "length (nat_to_bv n) \<le> k" | 
| 15325 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 712 | proof (cases "n = 0") | 
| 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 713 | case True | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 714 | thus ?thesis | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 715 | by (simp add: nat_to_bv_def nat_to_bv_helper.simps) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 716 | next | 
| 15325 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 717 | case False | 
| 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 718 | hence n0: "0 < n" by simp | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 719 | show ?thesis | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 720 | proof (rule ccontr) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 721 | assume "~ length (nat_to_bv n) \<le> k" | 
| 23375 | 722 | hence "k < length (nat_to_bv n)" by simp | 
| 723 | hence "k \<le> length (nat_to_bv n) - 1" by arith | |
| 724 | hence "(2::nat) ^ k \<le> 2 ^ (length (nat_to_bv n) - 1)" by simp | |
| 725 | also have "... = 2 ^ (length (norm_unsigned (nat_to_bv n)) - 1)" by simp | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 726 | also have "... \<le> bv_to_nat (nat_to_bv n)" | 
| 23375 | 727 | by (rule bv_to_nat_lower_limit) (simp add: n0) | 
| 728 | also have "... = n" by simp | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 729 | finally have "2 ^ k \<le> n" . | 
| 23375 | 730 | with n0 have "2 ^ k - 1 < n" by arith | 
| 731 | with nk show False by simp | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 732 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 733 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 734 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 735 | lemma length_nat_to_bv_lower_limit: | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 736 | assumes nk: "2 ^ k \<le> n" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 737 | shows "k < length (nat_to_bv n)" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 738 | proof (rule ccontr) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 739 | assume "~ k < length (nat_to_bv n)" | 
| 23375 | 740 | hence lnk: "length (nat_to_bv n) \<le> k" by simp | 
| 741 | have "n = bv_to_nat (nat_to_bv n)" by simp | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 742 | also have "... < 2 ^ length (nat_to_bv n)" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 743 | by (rule bv_to_nat_upper_range) | 
| 23375 | 744 | also from lnk have "... \<le> 2 ^ k" by simp | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 745 | finally have "n < 2 ^ k" . | 
| 23375 | 746 | with nk show False by simp | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 747 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 748 | |
| 23375 | 749 | |
| 14589 | 750 | subsection {* Unsigned Arithmetic Operations *}
 | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 751 | |
| 19736 | 752 | definition | 
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 753 | bv_add :: "[bit list, bit list ] => bit list" where | 
| 19736 | 754 | "bv_add w1 w2 = nat_to_bv (bv_to_nat w1 + bv_to_nat w2)" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 755 | |
| 17650 
44b135d04cc4
Made sure all lemmas now have names (especially so that certain of them
 skalberg parents: 
16796diff
changeset | 756 | lemma bv_add_type1 [simp]: "bv_add (norm_unsigned w1) w2 = bv_add w1 w2" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 757 | by (simp add: bv_add_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 758 | |
| 17650 
44b135d04cc4
Made sure all lemmas now have names (especially so that certain of them
 skalberg parents: 
16796diff
changeset | 759 | lemma bv_add_type2 [simp]: "bv_add w1 (norm_unsigned w2) = bv_add w1 w2" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 760 | by (simp add: bv_add_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 761 | |
| 17650 
44b135d04cc4
Made sure all lemmas now have names (especially so that certain of them
 skalberg parents: 
16796diff
changeset | 762 | lemma bv_add_returntype [simp]: "norm_unsigned (bv_add w1 w2) = bv_add w1 w2" | 
| 15325 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 763 | by (simp add: bv_add_def) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 764 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 765 | lemma bv_add_length: "length (bv_add w1 w2) \<le> Suc (max (length w1) (length w2))" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 766 | proof (unfold bv_add_def,rule length_nat_to_bv_upper_limit) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 767 | from bv_to_nat_upper_range [of w1] and bv_to_nat_upper_range [of w2] | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 768 | have "bv_to_nat w1 + bv_to_nat w2 \<le> (2 ^ length w1 - 1) + (2 ^ length w2 - 1)" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 769 | by arith | 
| 23375 | 770 | also have "... \<le> | 
| 771 | max (2 ^ length w1 - 1) (2 ^ length w2 - 1) + max (2 ^ length w1 - 1) (2 ^ length w2 - 1)" | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 772 | by (rule add_mono,safe intro!: le_maxI1 le_maxI2) | 
| 23375 | 773 | also have "... = 2 * max (2 ^ length w1 - 1) (2 ^ length w2 - 1)" by simp | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 774 | also have "... \<le> 2 ^ Suc (max (length w1) (length w2)) - 2" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 775 | proof (cases "length w1 \<le> length w2") | 
| 15325 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 776 | assume w1w2: "length w1 \<le> length w2" | 
| 23375 | 777 | hence "(2::nat) ^ length w1 \<le> 2 ^ length w2" by simp | 
| 778 | hence "(2::nat) ^ length w1 - 1 \<le> 2 ^ length w2 - 1" by arith | |
| 15325 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 779 | with w1w2 show ?thesis | 
| 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 780 | by (simp add: diff_mult_distrib2 split: split_max) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 781 | next | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 782 | assume [simp]: "~ (length w1 \<le> length w2)" | 
| 15325 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 783 | have "~ ((2::nat) ^ length w1 - 1 \<le> 2 ^ length w2 - 1)" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 784 | proof | 
| 15325 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 785 | assume "(2::nat) ^ length w1 - 1 \<le> 2 ^ length w2 - 1" | 
| 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 786 | hence "((2::nat) ^ length w1 - 1) + 1 \<le> (2 ^ length w2 - 1) + 1" | 
| 19736 | 787 | by (rule add_right_mono) | 
| 23375 | 788 | hence "(2::nat) ^ length w1 \<le> 2 ^ length w2" by simp | 
| 789 | hence "length w1 \<le> length w2" by simp | |
| 790 | thus False by simp | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 791 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 792 | thus ?thesis | 
| 15325 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 793 | by (simp add: diff_mult_distrib2 split: split_max) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 794 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 795 | finally show "bv_to_nat w1 + bv_to_nat w2 \<le> 2 ^ Suc (max (length w1) (length w2)) - 1" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 796 | by arith | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 797 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 798 | |
| 19736 | 799 | definition | 
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 800 | bv_mult :: "[bit list, bit list ] => bit list" where | 
| 19736 | 801 | "bv_mult w1 w2 = nat_to_bv (bv_to_nat w1 * bv_to_nat w2)" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 802 | |
| 17650 
44b135d04cc4
Made sure all lemmas now have names (especially so that certain of them
 skalberg parents: 
16796diff
changeset | 803 | lemma bv_mult_type1 [simp]: "bv_mult (norm_unsigned w1) w2 = bv_mult w1 w2" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 804 | by (simp add: bv_mult_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 805 | |
| 17650 
44b135d04cc4
Made sure all lemmas now have names (especially so that certain of them
 skalberg parents: 
16796diff
changeset | 806 | lemma bv_mult_type2 [simp]: "bv_mult w1 (norm_unsigned w2) = bv_mult w1 w2" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 807 | by (simp add: bv_mult_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 808 | |
| 17650 
44b135d04cc4
Made sure all lemmas now have names (especially so that certain of them
 skalberg parents: 
16796diff
changeset | 809 | lemma bv_mult_returntype [simp]: "norm_unsigned (bv_mult w1 w2) = bv_mult w1 w2" | 
| 15325 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 810 | by (simp add: bv_mult_def) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 811 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 812 | lemma bv_mult_length: "length (bv_mult w1 w2) \<le> length w1 + length w2" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 813 | proof (unfold bv_mult_def,rule length_nat_to_bv_upper_limit) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 814 | from bv_to_nat_upper_range [of w1] and bv_to_nat_upper_range [of w2] | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 815 | have h: "bv_to_nat w1 \<le> 2 ^ length w1 - 1 \<and> bv_to_nat w2 \<le> 2 ^ length w2 - 1" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 816 | by arith | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 817 | have "bv_to_nat w1 * bv_to_nat w2 \<le> (2 ^ length w1 - 1) * (2 ^ length w2 - 1)" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 818 | apply (cut_tac h) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 819 | apply (rule mult_mono) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 820 | apply auto | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 821 | done | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 822 | also have "... < 2 ^ length w1 * 2 ^ length w2" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 823 | by (rule mult_strict_mono,auto) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 824 | also have "... = 2 ^ (length w1 + length w2)" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 825 | by (simp add: power_add) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 826 | finally show "bv_to_nat w1 * bv_to_nat w2 \<le> 2 ^ (length w1 + length w2) - 1" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 827 | by arith | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 828 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 829 | |
| 14589 | 830 | subsection {* Signed Vectors *}
 | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 831 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 832 | consts | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 833 | norm_signed :: "bit list => bit list" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 834 | primrec | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 835 | norm_signed_Nil: "norm_signed [] = []" | 
| 23375 | 836 | norm_signed_Cons: "norm_signed (b#bs) = | 
| 837 | (case b of | |
| 838 | \<zero> => if norm_unsigned bs = [] then [] else b#norm_unsigned bs | |
| 839 | | \<one> => b#rem_initial b bs)" | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 840 | |
| 17650 
44b135d04cc4
Made sure all lemmas now have names (especially so that certain of them
 skalberg parents: 
16796diff
changeset | 841 | lemma norm_signed0 [simp]: "norm_signed [\<zero>] = []" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 842 | by simp | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 843 | |
| 17650 
44b135d04cc4
Made sure all lemmas now have names (especially so that certain of them
 skalberg parents: 
16796diff
changeset | 844 | lemma norm_signed1 [simp]: "norm_signed [\<one>] = [\<one>]" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 845 | by simp | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 846 | |
| 17650 
44b135d04cc4
Made sure all lemmas now have names (especially so that certain of them
 skalberg parents: 
16796diff
changeset | 847 | lemma norm_signed01 [simp]: "norm_signed (\<zero>#\<one>#xs) = \<zero>#\<one>#xs" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 848 | by simp | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 849 | |
| 17650 
44b135d04cc4
Made sure all lemmas now have names (especially so that certain of them
 skalberg parents: 
16796diff
changeset | 850 | lemma norm_signed00 [simp]: "norm_signed (\<zero>#\<zero>#xs) = norm_signed (\<zero>#xs)" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 851 | by simp | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 852 | |
| 17650 
44b135d04cc4
Made sure all lemmas now have names (especially so that certain of them
 skalberg parents: 
16796diff
changeset | 853 | lemma norm_signed10 [simp]: "norm_signed (\<one>#\<zero>#xs) = \<one>#\<zero>#xs" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 854 | by simp | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 855 | |
| 17650 
44b135d04cc4
Made sure all lemmas now have names (especially so that certain of them
 skalberg parents: 
16796diff
changeset | 856 | lemma norm_signed11 [simp]: "norm_signed (\<one>#\<one>#xs) = norm_signed (\<one>#xs)" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 857 | by simp | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 858 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 859 | lemmas [simp del] = norm_signed_Cons | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 860 | |
| 19736 | 861 | definition | 
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 862 | int_to_bv :: "int => bit list" where | 
| 19736 | 863 | "int_to_bv n = (if 0 \<le> n | 
| 15325 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 864 | then norm_signed (\<zero>#nat_to_bv (nat n)) | 
| 19736 | 865 | else norm_signed (bv_not (\<zero>#nat_to_bv (nat (-n- 1)))))" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 866 | |
| 15325 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 867 | lemma int_to_bv_ge0 [simp]: "0 \<le> n ==> int_to_bv n = norm_signed (\<zero> # nat_to_bv (nat n))" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 868 | by (simp add: int_to_bv_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 869 | |
| 23375 | 870 | lemma int_to_bv_lt0 [simp]: | 
| 871 | "n < 0 ==> int_to_bv n = norm_signed (bv_not (\<zero>#nat_to_bv (nat (-n- 1))))" | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 872 | by (simp add: int_to_bv_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 873 | |
| 17650 
44b135d04cc4
Made sure all lemmas now have names (especially so that certain of them
 skalberg parents: 
16796diff
changeset | 874 | lemma norm_signed_idem [simp]: "norm_signed (norm_signed w) = norm_signed w" | 
| 23375 | 875 | proof (rule bit_list_induct [of _ w], simp_all) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 876 | fix xs | 
| 23375 | 877 | assume eq: "norm_signed (norm_signed xs) = norm_signed xs" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 878 | show "norm_signed (norm_signed (\<zero>#xs)) = norm_signed (\<zero>#xs)" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 879 | proof (rule bit_list_cases [of xs],simp_all) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 880 | fix ys | 
| 23375 | 881 | assume "xs = \<zero>#ys" | 
| 882 | from this [symmetric] and eq | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 883 | show "norm_signed (norm_signed (\<zero>#ys)) = norm_signed (\<zero>#ys)" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 884 | by simp | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 885 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 886 | next | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 887 | fix xs | 
| 23375 | 888 | assume eq: "norm_signed (norm_signed xs) = norm_signed xs" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 889 | show "norm_signed (norm_signed (\<one>#xs)) = norm_signed (\<one>#xs)" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 890 | proof (rule bit_list_cases [of xs],simp_all) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 891 | fix ys | 
| 23375 | 892 | assume "xs = \<one>#ys" | 
| 893 | from this [symmetric] and eq | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 894 | show "norm_signed (norm_signed (\<one>#ys)) = norm_signed (\<one>#ys)" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 895 | by simp | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 896 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 897 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 898 | |
| 19736 | 899 | definition | 
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 900 | bv_to_int :: "bit list => int" where | 
| 19736 | 901 | "bv_to_int w = | 
| 902 | (case bv_msb w of \<zero> => int (bv_to_nat w) | |
| 903 | | \<one> => - int (bv_to_nat (bv_not w) + 1))" | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 904 | |
| 17650 
44b135d04cc4
Made sure all lemmas now have names (especially so that certain of them
 skalberg parents: 
16796diff
changeset | 905 | lemma bv_to_int_Nil [simp]: "bv_to_int [] = 0" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 906 | by (simp add: bv_to_int_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 907 | |
| 17650 
44b135d04cc4
Made sure all lemmas now have names (especially so that certain of them
 skalberg parents: 
16796diff
changeset | 908 | lemma bv_to_int_Cons0 [simp]: "bv_to_int (\<zero>#bs) = int (bv_to_nat bs)" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 909 | by (simp add: bv_to_int_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 910 | |
| 17650 
44b135d04cc4
Made sure all lemmas now have names (especially so that certain of them
 skalberg parents: 
16796diff
changeset | 911 | lemma bv_to_int_Cons1 [simp]: "bv_to_int (\<one>#bs) = - int (bv_to_nat (bv_not bs) + 1)" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 912 | by (simp add: bv_to_int_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 913 | |
| 17650 
44b135d04cc4
Made sure all lemmas now have names (especially so that certain of them
 skalberg parents: 
16796diff
changeset | 914 | lemma bv_to_int_type [simp]: "bv_to_int (norm_signed w) = bv_to_int w" | 
| 23375 | 915 | proof (rule bit_list_induct [of _ w], simp_all) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 916 | fix xs | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 917 | assume ind: "bv_to_int (norm_signed xs) = bv_to_int xs" | 
| 15325 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 918 | show "bv_to_int (norm_signed (\<zero>#xs)) = int (bv_to_nat xs)" | 
| 23375 | 919 | proof (rule bit_list_cases [of xs], simp_all) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 920 | fix ys | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 921 | assume [simp]: "xs = \<zero>#ys" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 922 | from ind | 
| 15325 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 923 | show "bv_to_int (norm_signed (\<zero>#ys)) = int (bv_to_nat ys)" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 924 | by simp | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 925 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 926 | next | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 927 | fix xs | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 928 | assume ind: "bv_to_int (norm_signed xs) = bv_to_int xs" | 
| 23431 
25ca91279a9b
change simp rules for of_nat to work like int did previously (reorient of_nat_Suc, remove of_nat_mult [simp]); preserve original variable names in legacy int theorems
 huffman parents: 
23375diff
changeset | 929 | show "bv_to_int (norm_signed (\<one>#xs)) = -1 - int (bv_to_nat (bv_not xs))" | 
| 23375 | 930 | proof (rule bit_list_cases [of xs], simp_all) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 931 | fix ys | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 932 | assume [simp]: "xs = \<one>#ys" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 933 | from ind | 
| 23431 
25ca91279a9b
change simp rules for of_nat to work like int did previously (reorient of_nat_Suc, remove of_nat_mult [simp]); preserve original variable names in legacy int theorems
 huffman parents: 
23375diff
changeset | 934 | show "bv_to_int (norm_signed (\<one>#ys)) = -1 - int (bv_to_nat (bv_not ys))" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 935 | by simp | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 936 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 937 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 938 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 939 | lemma bv_to_int_upper_range: "bv_to_int w < 2 ^ (length w - 1)" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 940 | proof (rule bit_list_cases [of w],simp_all) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 941 | fix bs | 
| 15325 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 942 | from bv_to_nat_upper_range | 
| 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 943 | show "int (bv_to_nat bs) < 2 ^ length bs" | 
| 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 944 | by (simp add: int_nat_two_exp) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 945 | next | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 946 | fix bs | 
| 23431 
25ca91279a9b
change simp rules for of_nat to work like int did previously (reorient of_nat_Suc, remove of_nat_mult [simp]); preserve original variable names in legacy int theorems
 huffman parents: 
23375diff
changeset | 947 | have "-1 - int (bv_to_nat (bv_not bs)) \<le> 0" by simp | 
| 23375 | 948 | also have "... < 2 ^ length bs" by (induct bs) simp_all | 
| 23431 
25ca91279a9b
change simp rules for of_nat to work like int did previously (reorient of_nat_Suc, remove of_nat_mult [simp]); preserve original variable names in legacy int theorems
 huffman parents: 
23375diff
changeset | 949 | finally show "-1 - int (bv_to_nat (bv_not bs)) < 2 ^ length bs" . | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 950 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 951 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 952 | lemma bv_to_int_lower_range: "- (2 ^ (length w - 1)) \<le> bv_to_int w" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 953 | proof (rule bit_list_cases [of w],simp_all) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 954 | fix bs :: "bit list" | 
| 23375 | 955 | have "- (2 ^ length bs) \<le> (0::int)" by (induct bs) simp_all | 
| 956 | also have "... \<le> int (bv_to_nat bs)" by simp | |
| 957 | finally show "- (2 ^ length bs) \<le> int (bv_to_nat bs)" . | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 958 | next | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 959 | fix bs | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 960 | from bv_to_nat_upper_range [of "bv_not bs"] | 
| 23431 
25ca91279a9b
change simp rules for of_nat to work like int did previously (reorient of_nat_Suc, remove of_nat_mult [simp]); preserve original variable names in legacy int theorems
 huffman parents: 
23375diff
changeset | 961 | show "- (2 ^ length bs) \<le> -1 - int (bv_to_nat (bv_not bs))" | 
| 15325 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 962 | by (simp add: int_nat_two_exp) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 963 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 964 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 965 | lemma int_bv_int [simp]: "int_to_bv (bv_to_int w) = norm_signed w" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 966 | proof (rule bit_list_cases [of w],simp) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 967 | fix xs | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 968 | assume [simp]: "w = \<zero>#xs" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 969 | show ?thesis | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 970 | apply simp | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 971 | apply (subst norm_signed_Cons [of "\<zero>" "xs"]) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 972 | apply simp | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 973 | using norm_unsigned_result [of xs] | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 974 | apply safe | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 975 | apply (rule bit_list_cases [of "norm_unsigned xs"]) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 976 | apply simp_all | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 977 | done | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 978 | next | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 979 | fix xs | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 980 | assume [simp]: "w = \<one>#xs" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 981 | show ?thesis | 
| 15325 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 982 | apply (simp del: int_to_bv_lt0) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 983 | apply (rule bit_list_induct [of _ xs]) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 984 | apply simp | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 985 | apply (subst int_to_bv_lt0) | 
| 15325 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 986 | apply (subgoal_tac "- int (bv_to_nat (bv_not (\<zero> # bs))) + -1 < 0 + 0") | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 987 | apply simp | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 988 | apply (rule add_le_less_mono) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 989 | apply simp | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 990 | apply simp | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 991 | apply (simp del: bv_to_nat1 bv_to_nat_helper) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 992 | apply simp | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 993 | done | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 994 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 995 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 996 | lemma bv_int_bv [simp]: "bv_to_int (int_to_bv i) = i" | 
| 23375 | 997 | by (cases "0 \<le> i") simp_all | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 998 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 999 | lemma bv_msb_norm [simp]: "bv_msb (norm_signed w) = bv_msb w" | 
| 23375 | 1000 | by (rule bit_list_cases [of w]) (simp_all add: norm_signed_Cons) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1001 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1002 | lemma norm_signed_length: "length (norm_signed w) \<le> length w" | 
| 23375 | 1003 | apply (cases w, simp_all) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1004 | apply (subst norm_signed_Cons) | 
| 23375 | 1005 | apply (case_tac a, simp_all) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1006 | apply (rule rem_initial_length) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1007 | done | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1008 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1009 | lemma norm_signed_equal: "length (norm_signed w) = length w ==> norm_signed w = w" | 
| 23375 | 1010 | proof (rule bit_list_cases [of w], simp_all) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1011 | fix xs | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1012 | assume "length (norm_signed (\<zero>#xs)) = Suc (length xs)" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1013 | thus "norm_signed (\<zero>#xs) = \<zero>#xs" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1014 | apply (simp add: norm_signed_Cons) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1015 | apply safe | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1016 | apply simp_all | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1017 | apply (rule norm_unsigned_equal) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1018 | apply assumption | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1019 | done | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1020 | next | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1021 | fix xs | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1022 | assume "length (norm_signed (\<one>#xs)) = Suc (length xs)" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1023 | thus "norm_signed (\<one>#xs) = \<one>#xs" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1024 | apply (simp add: norm_signed_Cons) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1025 | apply (rule rem_initial_equal) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1026 | apply assumption | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1027 | done | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1028 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1029 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1030 | lemma bv_extend_norm_signed: "bv_msb w = b ==> bv_extend (length w) b (norm_signed w) = w" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1031 | proof (rule bit_list_cases [of w],simp_all) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1032 | fix xs | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1033 | show "bv_extend (Suc (length xs)) \<zero> (norm_signed (\<zero>#xs)) = \<zero>#xs" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1034 | proof (simp add: norm_signed_list_def,auto) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1035 | assume "norm_unsigned xs = []" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1036 | hence xx: "rem_initial \<zero> xs = []" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1037 | by (simp add: norm_unsigned_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1038 | have "bv_extend (Suc (length xs)) \<zero> (\<zero>#rem_initial \<zero> xs) = \<zero>#xs" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1039 | apply (simp add: bv_extend_def replicate_app_Cons_same) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1040 | apply (fold bv_extend_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1041 | apply (rule bv_extend_rem_initial) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1042 | done | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1043 | thus "bv_extend (Suc (length xs)) \<zero> [\<zero>] = \<zero>#xs" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1044 | by (simp add: xx) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1045 | next | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1046 | show "bv_extend (Suc (length xs)) \<zero> (\<zero>#norm_unsigned xs) = \<zero>#xs" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1047 | apply (simp add: norm_unsigned_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1048 | apply (simp add: bv_extend_def replicate_app_Cons_same) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1049 | apply (fold bv_extend_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1050 | apply (rule bv_extend_rem_initial) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1051 | done | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1052 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1053 | next | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1054 | fix xs | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1055 | show "bv_extend (Suc (length xs)) \<one> (norm_signed (\<one>#xs)) = \<one>#xs" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1056 | apply (simp add: norm_signed_Cons) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1057 | apply (simp add: bv_extend_def replicate_app_Cons_same) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1058 | apply (fold bv_extend_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1059 | apply (rule bv_extend_rem_initial) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1060 | done | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1061 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1062 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1063 | lemma bv_to_int_qinj: | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1064 | assumes one: "bv_to_int xs = bv_to_int ys" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1065 | and len: "length xs = length ys" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1066 | shows "xs = ys" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1067 | proof - | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1068 | from one | 
| 23375 | 1069 | have "int_to_bv (bv_to_int xs) = int_to_bv (bv_to_int ys)" by simp | 
| 1070 | hence xsys: "norm_signed xs = norm_signed ys" by simp | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1071 | hence xsys': "bv_msb xs = bv_msb ys" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1072 | proof - | 
| 23375 | 1073 | have "bv_msb xs = bv_msb (norm_signed xs)" by simp | 
| 1074 | also have "... = bv_msb (norm_signed ys)" by (simp add: xsys) | |
| 1075 | also have "... = bv_msb ys" by simp | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1076 | finally show ?thesis . | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1077 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1078 | have "xs = bv_extend (length xs) (bv_msb xs) (norm_signed xs)" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1079 | by (simp add: bv_extend_norm_signed) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1080 | also have "... = bv_extend (length ys) (bv_msb ys) (norm_signed ys)" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1081 | by (simp add: xsys xsys' len) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1082 | also have "... = ys" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1083 | by (simp add: bv_extend_norm_signed) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1084 | finally show ?thesis . | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1085 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1086 | |
| 17650 
44b135d04cc4
Made sure all lemmas now have names (especially so that certain of them
 skalberg parents: 
16796diff
changeset | 1087 | lemma int_to_bv_returntype [simp]: "norm_signed (int_to_bv w) = int_to_bv w" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1088 | by (simp add: int_to_bv_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1089 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1090 | lemma bv_to_int_msb0: "0 \<le> bv_to_int w1 ==> bv_msb w1 = \<zero>" | 
| 15325 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 1091 | by (rule bit_list_cases,simp_all) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1092 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1093 | lemma bv_to_int_msb1: "bv_to_int w1 < 0 ==> bv_msb w1 = \<one>" | 
| 15325 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 1094 | by (rule bit_list_cases,simp_all) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1095 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1096 | lemma bv_to_int_lower_limit_gt0: | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1097 | assumes w0: "0 < bv_to_int w" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1098 | shows "2 ^ (length (norm_signed w) - 2) \<le> bv_to_int w" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1099 | proof - | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1100 | from w0 | 
| 23375 | 1101 | have "0 \<le> bv_to_int w" by simp | 
| 1102 | hence [simp]: "bv_msb w = \<zero>" by (rule bv_to_int_msb0) | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1103 | have "2 ^ (length (norm_signed w) - 2) \<le> bv_to_int (norm_signed w)" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1104 | proof (rule bit_list_cases [of w]) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1105 | assume "w = []" | 
| 23375 | 1106 | with w0 show ?thesis by simp | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1107 | next | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1108 | fix w' | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1109 | assume weq: "w = \<zero> # w'" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1110 | thus ?thesis | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1111 | proof (simp add: norm_signed_Cons,safe) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1112 | assume "norm_unsigned w' = []" | 
| 23375 | 1113 | with weq and w0 show False | 
| 1114 | by (simp add: norm_empty_bv_to_nat_zero) | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1115 | next | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1116 | assume w'0: "norm_unsigned w' \<noteq> []" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1117 | have "0 < bv_to_nat w'" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1118 | proof (rule ccontr) | 
| 19736 | 1119 | assume "~ (0 < bv_to_nat w')" | 
| 1120 | hence "bv_to_nat w' = 0" | |
| 1121 | by arith | |
| 1122 | hence "norm_unsigned w' = []" | |
| 1123 | by (simp add: bv_to_nat_zero_imp_empty) | |
| 1124 | with w'0 | |
| 23375 | 1125 | show False by simp | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1126 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1127 | with bv_to_nat_lower_limit [of w'] | 
| 15325 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 1128 | show "2 ^ (length (norm_unsigned w') - Suc 0) \<le> int (bv_to_nat w')" | 
| 19736 | 1129 | by (simp add: int_nat_two_exp) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1130 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1131 | next | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1132 | fix w' | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1133 | assume "w = \<one> # w'" | 
| 23375 | 1134 | from w0 have "bv_msb w = \<zero>" by simp | 
| 1135 | with prems show ?thesis by simp | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1136 | qed | 
| 23375 | 1137 | also have "... = bv_to_int w" by simp | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1138 | finally show ?thesis . | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1139 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1140 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1141 | lemma norm_signed_result: "norm_signed w = [] \<or> norm_signed w = [\<one>] \<or> bv_msb (norm_signed w) \<noteq> bv_msb (tl (norm_signed w))" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1142 | apply (rule bit_list_cases [of w],simp_all) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1143 | apply (case_tac "bs",simp_all) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1144 | apply (case_tac "a",simp_all) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1145 | apply (simp add: norm_signed_Cons) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1146 | apply safe | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1147 | apply simp | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1148 | proof - | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1149 | fix l | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1150 | assume msb: "\<zero> = bv_msb (norm_unsigned l)" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1151 | assume "norm_unsigned l \<noteq> []" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1152 | with norm_unsigned_result [of l] | 
| 23375 | 1153 | have "bv_msb (norm_unsigned l) = \<one>" by simp | 
| 1154 | with msb show False by simp | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1155 | next | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1156 | fix xs | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1157 | assume p: "\<one> = bv_msb (tl (norm_signed (\<one> # xs)))" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1158 | have "\<one> \<noteq> bv_msb (tl (norm_signed (\<one> # xs)))" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1159 | by (rule bit_list_induct [of _ xs],simp_all) | 
| 23375 | 1160 | with p show False by simp | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1161 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1162 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1163 | lemma bv_to_int_upper_limit_lem1: | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1164 | assumes w0: "bv_to_int w < -1" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1165 | shows "bv_to_int w < - (2 ^ (length (norm_signed w) - 2))" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1166 | proof - | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1167 | from w0 | 
| 23375 | 1168 | have "bv_to_int w < 0" by simp | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1169 | hence msbw [simp]: "bv_msb w = \<one>" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1170 | by (rule bv_to_int_msb1) | 
| 23375 | 1171 | have "bv_to_int w = bv_to_int (norm_signed w)" by simp | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1172 | also from norm_signed_result [of w] | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1173 | have "... < - (2 ^ (length (norm_signed w) - 2))" | 
| 23375 | 1174 | proof safe | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1175 | assume "norm_signed w = []" | 
| 23375 | 1176 | hence "bv_to_int (norm_signed w) = 0" by simp | 
| 1177 | with w0 show ?thesis by simp | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1178 | next | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1179 | assume "norm_signed w = [\<one>]" | 
| 23375 | 1180 | hence "bv_to_int (norm_signed w) = -1" by simp | 
| 1181 | with w0 show ?thesis by simp | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1182 | next | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1183 | assume "bv_msb (norm_signed w) \<noteq> bv_msb (tl (norm_signed w))" | 
| 23375 | 1184 | hence msb_tl: "\<one> \<noteq> bv_msb (tl (norm_signed w))" by simp | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1185 | show "bv_to_int (norm_signed w) < - (2 ^ (length (norm_signed w) - 2))" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1186 | proof (rule bit_list_cases [of "norm_signed w"]) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1187 | assume "norm_signed w = []" | 
| 23375 | 1188 | hence "bv_to_int (norm_signed w) = 0" by simp | 
| 1189 | with w0 show ?thesis by simp | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1190 | next | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1191 | fix w' | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1192 | assume nw: "norm_signed w = \<zero> # w'" | 
| 23375 | 1193 | from msbw have "bv_msb (norm_signed w) = \<one>" by simp | 
| 1194 | with nw show ?thesis by simp | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1195 | next | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1196 | fix w' | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1197 | assume weq: "norm_signed w = \<one> # w'" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1198 | show ?thesis | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1199 | proof (rule bit_list_cases [of w']) | 
| 19736 | 1200 | assume w'eq: "w' = []" | 
| 23375 | 1201 | from w0 have "bv_to_int (norm_signed w) < -1" by simp | 
| 1202 | with w'eq and weq show ?thesis by simp | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1203 | next | 
| 19736 | 1204 | fix w'' | 
| 1205 | assume w'eq: "w' = \<zero> # w''" | |
| 1206 | show ?thesis | |
| 1207 | apply (simp add: weq w'eq) | |
| 1208 | apply (subgoal_tac "- int (bv_to_nat (bv_not w'')) + -1 < 0 + 0") | |
| 1209 | apply (simp add: int_nat_two_exp) | |
| 1210 | apply (rule add_le_less_mono) | |
| 1211 | apply simp_all | |
| 1212 | done | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1213 | next | 
| 19736 | 1214 | fix w'' | 
| 1215 | assume w'eq: "w' = \<one> # w''" | |
| 23375 | 1216 | with weq and msb_tl show ?thesis by simp | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1217 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1218 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1219 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1220 | finally show ?thesis . | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1221 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1222 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1223 | lemma length_int_to_bv_upper_limit_gt0: | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1224 | assumes w0: "0 < i" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1225 | and wk: "i \<le> 2 ^ (k - 1) - 1" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1226 | shows "length (int_to_bv i) \<le> k" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1227 | proof (rule ccontr) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1228 | from w0 wk | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1229 | have k1: "1 < k" | 
| 20217 
25b068a99d2b
linear arithmetic splits certain operators (e.g. min, max, abs)
 webertj parents: 
19736diff
changeset | 1230 | by (cases "k - 1",simp_all) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1231 | assume "~ length (int_to_bv i) \<le> k" | 
| 23375 | 1232 | hence "k < length (int_to_bv i)" by simp | 
| 1233 | hence "k \<le> length (int_to_bv i) - 1" by arith | |
| 1234 | hence a: "k - 1 \<le> length (int_to_bv i) - 2" by arith | |
| 15067 | 1235 | hence "(2::int) ^ (k - 1) \<le> 2 ^ (length (int_to_bv i) - 2)" by simp | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1236 | also have "... \<le> i" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1237 | proof - | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1238 | have "2 ^ (length (norm_signed (int_to_bv i)) - 2) \<le> bv_to_int (int_to_bv i)" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1239 | proof (rule bv_to_int_lower_limit_gt0) | 
| 23375 | 1240 | from w0 show "0 < bv_to_int (int_to_bv i)" by simp | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1241 | qed | 
| 23375 | 1242 | thus ?thesis by simp | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1243 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1244 | finally have "2 ^ (k - 1) \<le> i" . | 
| 23375 | 1245 | with wk show False by simp | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1246 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1247 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1248 | lemma pos_length_pos: | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1249 | assumes i0: "0 < bv_to_int w" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1250 | shows "0 < length w" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1251 | proof - | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1252 | from norm_signed_result [of w] | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1253 | have "0 < length (norm_signed w)" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1254 | proof (auto) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1255 | assume ii: "norm_signed w = []" | 
| 23375 | 1256 | have "bv_to_int (norm_signed w) = 0" by (subst ii) simp | 
| 1257 | hence "bv_to_int w = 0" by simp | |
| 1258 | with i0 show False by simp | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1259 | next | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1260 | assume ii: "norm_signed w = []" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1261 | assume jj: "bv_msb w \<noteq> \<zero>" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1262 | have "\<zero> = bv_msb (norm_signed w)" | 
| 23375 | 1263 | by (subst ii) simp | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1264 | also have "... \<noteq> \<zero>" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1265 | by (simp add: jj) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1266 | finally show False by simp | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1267 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1268 | also have "... \<le> length w" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1269 | by (rule norm_signed_length) | 
| 23375 | 1270 | finally show ?thesis . | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1271 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1272 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1273 | lemma neg_length_pos: | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1274 | assumes i0: "bv_to_int w < -1" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1275 | shows "0 < length w" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1276 | proof - | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1277 | from norm_signed_result [of w] | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1278 | have "0 < length (norm_signed w)" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1279 | proof (auto) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1280 | assume ii: "norm_signed w = []" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1281 | have "bv_to_int (norm_signed w) = 0" | 
| 23375 | 1282 | by (subst ii) simp | 
| 1283 | hence "bv_to_int w = 0" by simp | |
| 1284 | with i0 show False by simp | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1285 | next | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1286 | assume ii: "norm_signed w = []" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1287 | assume jj: "bv_msb w \<noteq> \<zero>" | 
| 23375 | 1288 | have "\<zero> = bv_msb (norm_signed w)" by (subst ii) simp | 
| 1289 | also have "... \<noteq> \<zero>" by (simp add: jj) | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1290 | finally show False by simp | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1291 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1292 | also have "... \<le> length w" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1293 | by (rule norm_signed_length) | 
| 23375 | 1294 | finally show ?thesis . | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1295 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1296 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1297 | lemma length_int_to_bv_lower_limit_gt0: | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1298 | assumes wk: "2 ^ (k - 1) \<le> i" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1299 | shows "k < length (int_to_bv i)" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1300 | proof (rule ccontr) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1301 | have "0 < (2::int) ^ (k - 1)" | 
| 23375 | 1302 | by (rule zero_less_power) simp | 
| 1303 | also have "... \<le> i" by (rule wk) | |
| 1304 | finally have i0: "0 < i" . | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1305 | have lii0: "0 < length (int_to_bv i)" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1306 | apply (rule pos_length_pos) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1307 | apply (simp,rule i0) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1308 | done | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1309 | assume "~ k < length (int_to_bv i)" | 
| 23375 | 1310 | hence "length (int_to_bv i) \<le> k" by simp | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1311 | with lii0 | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1312 | have a: "length (int_to_bv i) - 1 \<le> k - 1" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1313 | by arith | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1314 | have "i < 2 ^ (length (int_to_bv i) - 1)" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1315 | proof - | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1316 | have "i = bv_to_int (int_to_bv i)" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1317 | by simp | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1318 | also have "... < 2 ^ (length (int_to_bv i) - 1)" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1319 | by (rule bv_to_int_upper_range) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1320 | finally show ?thesis . | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1321 | qed | 
| 15067 | 1322 | also have "(2::int) ^ (length (int_to_bv i) - 1) \<le> 2 ^ (k - 1)" using a | 
| 23375 | 1323 | by simp | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1324 | finally have "i < 2 ^ (k - 1)" . | 
| 23375 | 1325 | with wk show False by simp | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1326 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1327 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1328 | lemma length_int_to_bv_upper_limit_lem1: | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1329 | assumes w1: "i < -1" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1330 | and wk: "- (2 ^ (k - 1)) \<le> i" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1331 | shows "length (int_to_bv i) \<le> k" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1332 | proof (rule ccontr) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1333 | from w1 wk | 
| 23375 | 1334 | have k1: "1 < k" by (cases "k - 1") simp_all | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1335 | assume "~ length (int_to_bv i) \<le> k" | 
| 23375 | 1336 | hence "k < length (int_to_bv i)" by simp | 
| 1337 | hence "k \<le> length (int_to_bv i) - 1" by arith | |
| 1338 | hence a: "k - 1 \<le> length (int_to_bv i) - 2" by arith | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1339 | have "i < - (2 ^ (length (int_to_bv i) - 2))" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1340 | proof - | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1341 | have "i = bv_to_int (int_to_bv i)" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1342 | by simp | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1343 | also have "... < - (2 ^ (length (norm_signed (int_to_bv i)) - 2))" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1344 | by (rule bv_to_int_upper_limit_lem1,simp,rule w1) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1345 | finally show ?thesis by simp | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1346 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1347 | also have "... \<le> -(2 ^ (k - 1))" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1348 | proof - | 
| 23375 | 1349 | have "(2::int) ^ (k - 1) \<le> 2 ^ (length (int_to_bv i) - 2)" using a by simp | 
| 1350 | thus ?thesis by simp | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1351 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1352 | finally have "i < -(2 ^ (k - 1))" . | 
| 23375 | 1353 | with wk show False by simp | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1354 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1355 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1356 | lemma length_int_to_bv_lower_limit_lem1: | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1357 | assumes wk: "i < -(2 ^ (k - 1))" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1358 | shows "k < length (int_to_bv i)" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1359 | proof (rule ccontr) | 
| 23375 | 1360 | from wk have "i \<le> -(2 ^ (k - 1)) - 1" by simp | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1361 | also have "... < -1" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1362 | proof - | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1363 | have "0 < (2::int) ^ (k - 1)" | 
| 23375 | 1364 | by (rule zero_less_power) simp | 
| 1365 | hence "-((2::int) ^ (k - 1)) < 0" by simp | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1366 | thus ?thesis by simp | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1367 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1368 | finally have i1: "i < -1" . | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1369 | have lii0: "0 < length (int_to_bv i)" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1370 | apply (rule neg_length_pos) | 
| 23375 | 1371 | apply (simp, rule i1) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1372 | done | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1373 | assume "~ k < length (int_to_bv i)" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1374 | hence "length (int_to_bv i) \<le> k" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1375 | by simp | 
| 23375 | 1376 | with lii0 have a: "length (int_to_bv i) - 1 \<le> k - 1" by arith | 
| 15067 | 1377 | hence "(2::int) ^ (length (int_to_bv i) - 1) \<le> 2 ^ (k - 1)" by simp | 
| 23375 | 1378 | hence "-((2::int) ^ (k - 1)) \<le> - (2 ^ (length (int_to_bv i) - 1))" by simp | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1379 | also have "... \<le> i" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1380 | proof - | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1381 | have "- (2 ^ (length (int_to_bv i) - 1)) \<le> bv_to_int (int_to_bv i)" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1382 | by (rule bv_to_int_lower_range) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1383 | also have "... = i" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1384 | by simp | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1385 | finally show ?thesis . | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1386 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1387 | finally have "-(2 ^ (k - 1)) \<le> i" . | 
| 23375 | 1388 | with wk show False by simp | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1389 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1390 | |
| 23375 | 1391 | |
| 14589 | 1392 | subsection {* Signed Arithmetic Operations *}
 | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1393 | |
| 14589 | 1394 | subsubsection {* Conversion from unsigned to signed *}
 | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1395 | |
| 19736 | 1396 | definition | 
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 1397 | utos :: "bit list => bit list" where | 
| 19736 | 1398 | "utos w = norm_signed (\<zero> # w)" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1399 | |
| 17650 
44b135d04cc4
Made sure all lemmas now have names (especially so that certain of them
 skalberg parents: 
16796diff
changeset | 1400 | lemma utos_type [simp]: "utos (norm_unsigned w) = utos w" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1401 | by (simp add: utos_def norm_signed_Cons) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1402 | |
| 17650 
44b135d04cc4
Made sure all lemmas now have names (especially so that certain of them
 skalberg parents: 
16796diff
changeset | 1403 | lemma utos_returntype [simp]: "norm_signed (utos w) = utos w" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1404 | by (simp add: utos_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1405 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1406 | lemma utos_length: "length (utos w) \<le> Suc (length w)" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1407 | by (simp add: utos_def norm_signed_Cons) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1408 | |
| 15325 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 1409 | lemma bv_to_int_utos: "bv_to_int (utos w) = int (bv_to_nat w)" | 
| 23375 | 1410 | proof (simp add: utos_def norm_signed_Cons, safe) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1411 | assume "norm_unsigned w = []" | 
| 23375 | 1412 | hence "bv_to_nat (norm_unsigned w) = 0" by simp | 
| 1413 | thus "bv_to_nat w = 0" by simp | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1414 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1415 | |
| 23375 | 1416 | |
| 14589 | 1417 | subsubsection {* Unary minus *}
 | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1418 | |
| 19736 | 1419 | definition | 
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 1420 | bv_uminus :: "bit list => bit list" where | 
| 19736 | 1421 | "bv_uminus w = int_to_bv (- bv_to_int w)" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1422 | |
| 17650 
44b135d04cc4
Made sure all lemmas now have names (especially so that certain of them
 skalberg parents: 
16796diff
changeset | 1423 | lemma bv_uminus_type [simp]: "bv_uminus (norm_signed w) = bv_uminus w" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1424 | by (simp add: bv_uminus_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1425 | |
| 17650 
44b135d04cc4
Made sure all lemmas now have names (especially so that certain of them
 skalberg parents: 
16796diff
changeset | 1426 | lemma bv_uminus_returntype [simp]: "norm_signed (bv_uminus w) = bv_uminus w" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1427 | by (simp add: bv_uminus_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1428 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1429 | lemma bv_uminus_length: "length (bv_uminus w) \<le> Suc (length w)" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1430 | proof - | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1431 | 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" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1432 | by arith | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1433 | thus ?thesis | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1434 | proof safe | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1435 | assume p: "1 < - bv_to_int w" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1436 | have lw: "0 < length w" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1437 | apply (rule neg_length_pos) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1438 | using p | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1439 | apply simp | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1440 | done | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1441 | show ?thesis | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1442 | proof (simp add: bv_uminus_def,rule length_int_to_bv_upper_limit_gt0,simp_all) | 
| 23375 | 1443 | from prems show "bv_to_int w < 0" by simp | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1444 | next | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1445 | have "-(2^(length w - 1)) \<le> bv_to_int w" | 
| 19736 | 1446 | by (rule bv_to_int_lower_range) | 
| 23375 | 1447 | hence "- bv_to_int w \<le> 2^(length w - 1)" by simp | 
| 1448 | also from lw have "... < 2 ^ length w" by simp | |
| 1449 | finally show "- bv_to_int w < 2 ^ length w" by simp | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1450 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1451 | next | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1452 | assume p: "- bv_to_int w = 1" | 
| 23375 | 1453 | hence lw: "0 < length w" by (cases w) simp_all | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1454 | from p | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1455 | show ?thesis | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1456 | apply (simp add: bv_uminus_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1457 | using lw | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1458 | apply (simp (no_asm) add: nat_to_bv_non0) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1459 | done | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1460 | next | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1461 | assume "- bv_to_int w = 0" | 
| 23375 | 1462 | thus ?thesis by (simp add: bv_uminus_def) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1463 | next | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1464 | assume p: "- bv_to_int w = -1" | 
| 23375 | 1465 | thus ?thesis by (simp add: bv_uminus_def) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1466 | next | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1467 | assume p: "- bv_to_int w < -1" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1468 | show ?thesis | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1469 | apply (simp add: bv_uminus_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1470 | apply (rule length_int_to_bv_upper_limit_lem1) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1471 | apply (rule p) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1472 | apply simp | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1473 | proof - | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1474 | have "bv_to_int w < 2 ^ (length w - 1)" | 
| 19736 | 1475 | by (rule bv_to_int_upper_range) | 
| 15067 | 1476 | also have "... \<le> 2 ^ length w" by simp | 
| 23375 | 1477 | finally show "bv_to_int w \<le> 2 ^ length w" by simp | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1478 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1479 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1480 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1481 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1482 | lemma bv_uminus_length_utos: "length (bv_uminus (utos w)) \<le> Suc (length w)" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1483 | proof - | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1484 | have "-bv_to_int (utos w) = 0 \<or> -bv_to_int (utos w) = -1 \<or> -bv_to_int (utos w) < -1" | 
| 23375 | 1485 | by (simp add: bv_to_int_utos, arith) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1486 | thus ?thesis | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1487 | proof safe | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1488 | assume "-bv_to_int (utos w) = 0" | 
| 23375 | 1489 | thus ?thesis by (simp add: bv_uminus_def) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1490 | next | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1491 | assume "-bv_to_int (utos w) = -1" | 
| 23375 | 1492 | thus ?thesis by (simp add: bv_uminus_def) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1493 | next | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1494 | assume p: "-bv_to_int (utos w) < -1" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1495 | show ?thesis | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1496 | apply (simp add: bv_uminus_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1497 | apply (rule length_int_to_bv_upper_limit_lem1) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1498 | apply (rule p) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1499 | apply (simp add: bv_to_int_utos) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1500 | using bv_to_nat_upper_range [of w] | 
| 15325 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 1501 | apply (simp add: int_nat_two_exp) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1502 | done | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1503 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1504 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1505 | |
| 19736 | 1506 | definition | 
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 1507 | bv_sadd :: "[bit list, bit list ] => bit list" where | 
| 19736 | 1508 | "bv_sadd w1 w2 = int_to_bv (bv_to_int w1 + bv_to_int w2)" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1509 | |
| 17650 
44b135d04cc4
Made sure all lemmas now have names (especially so that certain of them
 skalberg parents: 
16796diff
changeset | 1510 | lemma bv_sadd_type1 [simp]: "bv_sadd (norm_signed w1) w2 = bv_sadd w1 w2" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1511 | by (simp add: bv_sadd_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1512 | |
| 17650 
44b135d04cc4
Made sure all lemmas now have names (especially so that certain of them
 skalberg parents: 
16796diff
changeset | 1513 | lemma bv_sadd_type2 [simp]: "bv_sadd w1 (norm_signed w2) = bv_sadd w1 w2" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1514 | by (simp add: bv_sadd_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1515 | |
| 17650 
44b135d04cc4
Made sure all lemmas now have names (especially so that certain of them
 skalberg parents: 
16796diff
changeset | 1516 | lemma bv_sadd_returntype [simp]: "norm_signed (bv_sadd w1 w2) = bv_sadd w1 w2" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1517 | by (simp add: bv_sadd_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1518 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1519 | lemma adder_helper: | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1520 | assumes lw: "0 < max (length w1) (length w2)" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1521 | shows "((2::int) ^ (length w1 - 1)) + (2 ^ (length w2 - 1)) \<le> 2 ^ max (length w1) (length w2)" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1522 | proof - | 
| 23375 | 1523 | have "((2::int) ^ (length w1 - 1)) + (2 ^ (length w2 - 1)) \<le> | 
| 1524 | 2 ^ (max (length w1) (length w2) - 1) + 2 ^ (max (length w1) (length w2) - 1)" | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1525 | apply (cases "length w1 \<le> length w2") | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1526 | apply (auto simp add: max_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1527 | done | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1528 | also have "... = 2 ^ max (length w1) (length w2)" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1529 | proof - | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1530 | from lw | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1531 | show ?thesis | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1532 | apply simp | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1533 | apply (subst power_Suc [symmetric]) | 
| 25961 | 1534 | apply (simp del: power_int.simps) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1535 | done | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1536 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1537 | finally show ?thesis . | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1538 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1539 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1540 | lemma bv_sadd_length: "length (bv_sadd w1 w2) \<le> Suc (max (length w1) (length w2))" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1541 | proof - | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1542 | let ?Q = "bv_to_int w1 + bv_to_int w2" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1543 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1544 | have helper: "?Q \<noteq> 0 ==> 0 < max (length w1) (length w2)" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1545 | proof - | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1546 | assume p: "?Q \<noteq> 0" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1547 | show "0 < max (length w1) (length w2)" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1548 | proof (simp add: less_max_iff_disj,rule) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1549 | assume [simp]: "w1 = []" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1550 | show "w2 \<noteq> []" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1551 | proof (rule ccontr,simp) | 
| 19736 | 1552 | assume [simp]: "w2 = []" | 
| 23375 | 1553 | from p show False by simp | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1554 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1555 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1556 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1557 | |
| 23375 | 1558 | have "0 < ?Q \<or> ?Q = 0 \<or> ?Q = -1 \<or> ?Q < -1" by arith | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1559 | thus ?thesis | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1560 | proof safe | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1561 | assume "?Q = 0" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1562 | thus ?thesis | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1563 | by (simp add: bv_sadd_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1564 | next | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1565 | assume "?Q = -1" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1566 | thus ?thesis | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1567 | by (simp add: bv_sadd_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1568 | next | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1569 | assume p: "0 < ?Q" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1570 | show ?thesis | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1571 | apply (simp add: bv_sadd_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1572 | apply (rule length_int_to_bv_upper_limit_gt0) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1573 | apply (rule p) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1574 | proof simp | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1575 | from bv_to_int_upper_range [of w2] | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1576 | have "bv_to_int w2 \<le> 2 ^ (length w2 - 1)" | 
| 19736 | 1577 | by simp | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1578 | with bv_to_int_upper_range [of w1] | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1579 | have "bv_to_int w1 + bv_to_int w2 < (2 ^ (length w1 - 1)) + (2 ^ (length w2 - 1))" | 
| 19736 | 1580 | by (rule zadd_zless_mono) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1581 | also have "... \<le> 2 ^ max (length w1) (length w2)" | 
| 19736 | 1582 | apply (rule adder_helper) | 
| 1583 | apply (rule helper) | |
| 1584 | using p | |
| 1585 | apply simp | |
| 1586 | done | |
| 23375 | 1587 | finally show "?Q < 2 ^ max (length w1) (length w2)" . | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1588 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1589 | next | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1590 | assume p: "?Q < -1" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1591 | show ?thesis | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1592 | apply (simp add: bv_sadd_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1593 | apply (rule length_int_to_bv_upper_limit_lem1,simp_all) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1594 | apply (rule p) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1595 | proof - | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1596 | have "(2 ^ (length w1 - 1)) + 2 ^ (length w2 - 1) \<le> (2::int) ^ max (length w1) (length w2)" | 
| 19736 | 1597 | apply (rule adder_helper) | 
| 1598 | apply (rule helper) | |
| 1599 | using p | |
| 1600 | apply simp | |
| 1601 | done | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1602 | hence "-((2::int) ^ max (length w1) (length w2)) \<le> - (2 ^ (length w1 - 1)) + -(2 ^ (length w2 - 1))" | 
| 19736 | 1603 | by simp | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1604 | also have "- (2 ^ (length w1 - 1)) + -(2 ^ (length w2 - 1)) \<le> ?Q" | 
| 19736 | 1605 | apply (rule add_mono) | 
| 1606 | apply (rule bv_to_int_lower_range [of w1]) | |
| 1607 | apply (rule bv_to_int_lower_range [of w2]) | |
| 1608 | done | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1609 | finally show "- (2^max (length w1) (length w2)) \<le> ?Q" . | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1610 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1611 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1612 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1613 | |
| 19736 | 1614 | definition | 
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 1615 | bv_sub :: "[bit list, bit list] => bit list" where | 
| 19736 | 1616 | "bv_sub w1 w2 = bv_sadd w1 (bv_uminus w2)" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1617 | |
| 17650 
44b135d04cc4
Made sure all lemmas now have names (especially so that certain of them
 skalberg parents: 
16796diff
changeset | 1618 | lemma bv_sub_type1 [simp]: "bv_sub (norm_signed w1) w2 = bv_sub w1 w2" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1619 | by (simp add: bv_sub_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1620 | |
| 17650 
44b135d04cc4
Made sure all lemmas now have names (especially so that certain of them
 skalberg parents: 
16796diff
changeset | 1621 | lemma bv_sub_type2 [simp]: "bv_sub w1 (norm_signed w2) = bv_sub w1 w2" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1622 | by (simp add: bv_sub_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1623 | |
| 17650 
44b135d04cc4
Made sure all lemmas now have names (especially so that certain of them
 skalberg parents: 
16796diff
changeset | 1624 | lemma bv_sub_returntype [simp]: "norm_signed (bv_sub w1 w2) = bv_sub w1 w2" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1625 | by (simp add: bv_sub_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1626 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1627 | lemma bv_sub_length: "length (bv_sub w1 w2) \<le> Suc (max (length w1) (length w2))" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1628 | proof (cases "bv_to_int w2 = 0") | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1629 | assume p: "bv_to_int w2 = 0" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1630 | show ?thesis | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1631 | proof (simp add: bv_sub_def bv_sadd_def bv_uminus_def p) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1632 | have "length (norm_signed w1) \<le> length w1" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1633 | by (rule norm_signed_length) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1634 | also have "... \<le> max (length w1) (length w2)" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1635 | by (rule le_maxI1) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1636 | also have "... \<le> Suc (max (length w1) (length w2))" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1637 | by arith | 
| 23375 | 1638 | finally show "length (norm_signed w1) \<le> Suc (max (length w1) (length w2))" . | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1639 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1640 | next | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1641 | assume "bv_to_int w2 \<noteq> 0" | 
| 23375 | 1642 | hence "0 < length w2" by (cases w2,simp_all) | 
| 1643 | hence lmw: "0 < max (length w1) (length w2)" by arith | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1644 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1645 | let ?Q = "bv_to_int w1 - bv_to_int w2" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1646 | |
| 23375 | 1647 | have "0 < ?Q \<or> ?Q = 0 \<or> ?Q = -1 \<or> ?Q < -1" by arith | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1648 | thus ?thesis | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1649 | proof safe | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1650 | assume "?Q = 0" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1651 | thus ?thesis | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1652 | by (simp add: bv_sub_def bv_sadd_def bv_uminus_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1653 | next | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1654 | assume "?Q = -1" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1655 | thus ?thesis | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1656 | by (simp add: bv_sub_def bv_sadd_def bv_uminus_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1657 | next | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1658 | assume p: "0 < ?Q" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1659 | show ?thesis | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1660 | apply (simp add: bv_sub_def bv_sadd_def bv_uminus_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1661 | apply (rule length_int_to_bv_upper_limit_gt0) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1662 | apply (rule p) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1663 | proof simp | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1664 | from bv_to_int_lower_range [of w2] | 
| 23375 | 1665 | have v2: "- bv_to_int w2 \<le> 2 ^ (length w2 - 1)" by simp | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1666 | have "bv_to_int w1 + - bv_to_int w2 < (2 ^ (length w1 - 1)) + (2 ^ (length w2 - 1))" | 
| 19736 | 1667 | apply (rule zadd_zless_mono) | 
| 1668 | apply (rule bv_to_int_upper_range [of w1]) | |
| 1669 | apply (rule v2) | |
| 1670 | done | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1671 | also have "... \<le> 2 ^ max (length w1) (length w2)" | 
| 19736 | 1672 | apply (rule adder_helper) | 
| 1673 | apply (rule lmw) | |
| 1674 | done | |
| 23375 | 1675 | finally show "?Q < 2 ^ max (length w1) (length w2)" by simp | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1676 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1677 | next | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1678 | assume p: "?Q < -1" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1679 | show ?thesis | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1680 | apply (simp add: bv_sub_def bv_sadd_def bv_uminus_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1681 | apply (rule length_int_to_bv_upper_limit_lem1) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1682 | apply (rule p) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1683 | proof simp | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1684 | have "(2 ^ (length w1 - 1)) + 2 ^ (length w2 - 1) \<le> (2::int) ^ max (length w1) (length w2)" | 
| 19736 | 1685 | apply (rule adder_helper) | 
| 1686 | apply (rule lmw) | |
| 1687 | done | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1688 | hence "-((2::int) ^ max (length w1) (length w2)) \<le> - (2 ^ (length w1 - 1)) + -(2 ^ (length w2 - 1))" | 
| 19736 | 1689 | by simp | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1690 | also have "- (2 ^ (length w1 - 1)) + -(2 ^ (length w2 - 1)) \<le> bv_to_int w1 + -bv_to_int w2" | 
| 19736 | 1691 | apply (rule add_mono) | 
| 1692 | apply (rule bv_to_int_lower_range [of w1]) | |
| 1693 | using bv_to_int_upper_range [of w2] | |
| 1694 | apply simp | |
| 1695 | done | |
| 23375 | 1696 | finally show "- (2^max (length w1) (length w2)) \<le> ?Q" by simp | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1697 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1698 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1699 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1700 | |
| 19736 | 1701 | definition | 
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 1702 | bv_smult :: "[bit list, bit list] => bit list" where | 
| 19736 | 1703 | "bv_smult w1 w2 = int_to_bv (bv_to_int w1 * bv_to_int w2)" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1704 | |
| 17650 
44b135d04cc4
Made sure all lemmas now have names (especially so that certain of them
 skalberg parents: 
16796diff
changeset | 1705 | lemma bv_smult_type1 [simp]: "bv_smult (norm_signed w1) w2 = bv_smult w1 w2" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1706 | by (simp add: bv_smult_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1707 | |
| 17650 
44b135d04cc4
Made sure all lemmas now have names (especially so that certain of them
 skalberg parents: 
16796diff
changeset | 1708 | lemma bv_smult_type2 [simp]: "bv_smult w1 (norm_signed w2) = bv_smult w1 w2" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1709 | by (simp add: bv_smult_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1710 | |
| 17650 
44b135d04cc4
Made sure all lemmas now have names (especially so that certain of them
 skalberg parents: 
16796diff
changeset | 1711 | lemma bv_smult_returntype [simp]: "norm_signed (bv_smult w1 w2) = bv_smult w1 w2" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1712 | by (simp add: bv_smult_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1713 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1714 | lemma bv_smult_length: "length (bv_smult w1 w2) \<le> length w1 + length w2" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1715 | proof - | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1716 | let ?Q = "bv_to_int w1 * bv_to_int w2" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1717 | |
| 23375 | 1718 | have lmw: "?Q \<noteq> 0 ==> 0 < length w1 \<and> 0 < length w2" by auto | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1719 | |
| 23375 | 1720 | have "0 < ?Q \<or> ?Q = 0 \<or> ?Q = -1 \<or> ?Q < -1" by arith | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1721 | thus ?thesis | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1722 | proof (safe dest!: iffD1 [OF mult_eq_0_iff]) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1723 | assume "bv_to_int w1 = 0" | 
| 23375 | 1724 | thus ?thesis by (simp add: bv_smult_def) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1725 | next | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1726 | assume "bv_to_int w2 = 0" | 
| 23375 | 1727 | thus ?thesis by (simp add: bv_smult_def) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1728 | next | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1729 | assume p: "?Q = -1" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1730 | show ?thesis | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1731 | apply (simp add: bv_smult_def p) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1732 | apply (cut_tac lmw) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1733 | apply arith | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1734 | using p | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1735 | apply simp | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1736 | done | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1737 | next | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1738 | assume p: "0 < ?Q" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1739 | thus ?thesis | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1740 | proof (simp add: zero_less_mult_iff,safe) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1741 | assume bi1: "0 < bv_to_int w1" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1742 | assume bi2: "0 < bv_to_int w2" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1743 | show ?thesis | 
| 19736 | 1744 | apply (simp add: bv_smult_def) | 
| 1745 | apply (rule length_int_to_bv_upper_limit_gt0) | |
| 1746 | apply (rule p) | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1747 | proof simp | 
| 19736 | 1748 | have "?Q < 2 ^ (length w1 - 1) * 2 ^ (length w2 - 1)" | 
| 1749 | apply (rule mult_strict_mono) | |
| 1750 | apply (rule bv_to_int_upper_range) | |
| 1751 | apply (rule bv_to_int_upper_range) | |
| 1752 | apply (rule zero_less_power) | |
| 1753 | apply simp | |
| 1754 | using bi2 | |
| 1755 | apply simp | |
| 1756 | done | |
| 1757 | also have "... \<le> 2 ^ (length w1 + length w2 - Suc 0)" | |
| 1758 | apply simp | |
| 1759 | apply (subst zpower_zadd_distrib [symmetric]) | |
| 1760 | apply simp | |
| 1761 | done | |
| 23375 | 1762 | finally show "?Q < 2 ^ (length w1 + length w2 - Suc 0)" . | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1763 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1764 | next | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1765 | assume bi1: "bv_to_int w1 < 0" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1766 | assume bi2: "bv_to_int w2 < 0" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1767 | show ?thesis | 
| 19736 | 1768 | apply (simp add: bv_smult_def) | 
| 1769 | apply (rule length_int_to_bv_upper_limit_gt0) | |
| 1770 | apply (rule p) | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1771 | proof simp | 
| 19736 | 1772 | have "-bv_to_int w1 * -bv_to_int w2 \<le> 2 ^ (length w1 - 1) * 2 ^(length w2 - 1)" | 
| 1773 | apply (rule mult_mono) | |
| 1774 | using bv_to_int_lower_range [of w1] | |
| 1775 | apply simp | |
| 1776 | using bv_to_int_lower_range [of w2] | |
| 1777 | apply simp | |
| 1778 | apply (rule zero_le_power,simp) | |
| 1779 | using bi2 | |
| 1780 | apply simp | |
| 1781 | done | |
| 1782 | hence "?Q \<le> 2 ^ (length w1 - 1) * 2 ^(length w2 - 1)" | |
| 1783 | by simp | |
| 1784 | also have "... < 2 ^ (length w1 + length w2 - Suc 0)" | |
| 1785 | apply simp | |
| 1786 | apply (subst zpower_zadd_distrib [symmetric]) | |
| 1787 | apply simp | |
| 1788 | apply (cut_tac lmw) | |
| 1789 | apply arith | |
| 1790 | apply (cut_tac p) | |
| 1791 | apply arith | |
| 1792 | done | |
| 1793 | finally show "?Q < 2 ^ (length w1 + length w2 - Suc 0)" . | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1794 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1795 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1796 | next | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1797 | assume p: "?Q < -1" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1798 | show ?thesis | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1799 | apply (subst bv_smult_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1800 | apply (rule length_int_to_bv_upper_limit_lem1) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1801 | apply (rule p) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1802 | proof simp | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1803 | have "(2::int) ^ (length w1 - 1) * 2 ^(length w2 - 1) \<le> 2 ^ (length w1 + length w2 - Suc 0)" | 
| 19736 | 1804 | apply simp | 
| 1805 | apply (subst zpower_zadd_distrib [symmetric]) | |
| 1806 | apply simp | |
| 1807 | done | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1808 | hence "-((2::int) ^ (length w1 + length w2 - Suc 0)) \<le> -(2^(length w1 - 1) * 2 ^ (length w2 - 1))" | 
| 19736 | 1809 | by simp | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1810 | also have "... \<le> ?Q" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1811 | proof - | 
| 19736 | 1812 | from p | 
| 1813 | have q: "bv_to_int w1 * bv_to_int w2 < 0" | |
| 1814 | by simp | |
| 1815 | thus ?thesis | |
| 1816 | proof (simp add: mult_less_0_iff,safe) | |
| 1817 | assume bi1: "0 < bv_to_int w1" | |
| 1818 | assume bi2: "bv_to_int w2 < 0" | |
| 1819 | have "-bv_to_int w2 * bv_to_int w1 \<le> ((2::int)^(length w2 - 1)) * (2 ^ (length w1 - 1))" | |
| 1820 | apply (rule mult_mono) | |
| 1821 | using bv_to_int_lower_range [of w2] | |
| 1822 | apply simp | |
| 1823 | using bv_to_int_upper_range [of w1] | |
| 1824 | apply simp | |
| 1825 | apply (rule zero_le_power,simp) | |
| 1826 | using bi1 | |
| 1827 | apply simp | |
| 1828 | done | |
| 1829 | hence "-?Q \<le> ((2::int)^(length w1 - 1)) * (2 ^ (length w2 - 1))" | |
| 1830 | by (simp add: zmult_ac) | |
| 1831 | thus "-(((2::int)^(length w1 - Suc 0)) * (2 ^ (length w2 - Suc 0))) \<le> ?Q" | |
| 1832 | by simp | |
| 1833 | next | |
| 1834 | assume bi1: "bv_to_int w1 < 0" | |
| 1835 | assume bi2: "0 < bv_to_int w2" | |
| 1836 | have "-bv_to_int w1 * bv_to_int w2 \<le> ((2::int)^(length w1 - 1)) * (2 ^ (length w2 - 1))" | |
| 1837 | apply (rule mult_mono) | |
| 1838 | using bv_to_int_lower_range [of w1] | |
| 1839 | apply simp | |
| 1840 | using bv_to_int_upper_range [of w2] | |
| 1841 | apply simp | |
| 1842 | apply (rule zero_le_power,simp) | |
| 1843 | using bi2 | |
| 1844 | apply simp | |
| 1845 | done | |
| 1846 | hence "-?Q \<le> ((2::int)^(length w1 - 1)) * (2 ^ (length w2 - 1))" | |
| 1847 | by (simp add: zmult_ac) | |
| 1848 | thus "-(((2::int)^(length w1 - Suc 0)) * (2 ^ (length w2 - Suc 0))) \<le> ?Q" | |
| 1849 | by simp | |
| 1850 | qed | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1851 | qed | 
| 23375 | 1852 | finally show "-(2 ^ (length w1 + length w2 - Suc 0)) \<le> ?Q" . | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1853 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1854 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1855 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1856 | |
| 25134 
3d4953e88449
Eliminated most of the neq0_conv occurrences. As a result, many
 nipkow parents: 
25112diff
changeset | 1857 | lemma bv_msb_one: "bv_msb w = \<one> ==> bv_to_nat w \<noteq> 0" | 
| 
3d4953e88449
Eliminated most of the neq0_conv occurrences. As a result, many
 nipkow parents: 
25112diff
changeset | 1858 | by (cases w) simp_all | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1859 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1860 | lemma bv_smult_length_utos: "length (bv_smult (utos w1) w2) \<le> length w1 + length w2" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1861 | proof - | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1862 | let ?Q = "bv_to_int (utos w1) * bv_to_int w2" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1863 | |
| 23375 | 1864 | have lmw: "?Q \<noteq> 0 ==> 0 < length (utos w1) \<and> 0 < length w2" by auto | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1865 | |
| 23375 | 1866 | have "0 < ?Q \<or> ?Q = 0 \<or> ?Q = -1 \<or> ?Q < -1" by arith | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1867 | thus ?thesis | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1868 | proof (safe dest!: iffD1 [OF mult_eq_0_iff]) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1869 | assume "bv_to_int (utos w1) = 0" | 
| 23375 | 1870 | thus ?thesis by (simp add: bv_smult_def) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1871 | next | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1872 | assume "bv_to_int w2 = 0" | 
| 23375 | 1873 | thus ?thesis by (simp add: bv_smult_def) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1874 | next | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1875 | assume p: "0 < ?Q" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1876 | thus ?thesis | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1877 | proof (simp add: zero_less_mult_iff,safe) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1878 | assume biw2: "0 < bv_to_int w2" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1879 | show ?thesis | 
| 19736 | 1880 | apply (simp add: bv_smult_def) | 
| 1881 | apply (rule length_int_to_bv_upper_limit_gt0) | |
| 1882 | apply (rule p) | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1883 | proof simp | 
| 19736 | 1884 | have "?Q < 2 ^ length w1 * 2 ^ (length w2 - 1)" | 
| 1885 | apply (rule mult_strict_mono) | |
| 1886 | apply (simp add: bv_to_int_utos int_nat_two_exp) | |
| 1887 | apply (rule bv_to_nat_upper_range) | |
| 1888 | apply (rule bv_to_int_upper_range) | |
| 1889 | apply (rule zero_less_power,simp) | |
| 1890 | using biw2 | |
| 1891 | apply simp | |
| 1892 | done | |
| 1893 | also have "... \<le> 2 ^ (length w1 + length w2 - Suc 0)" | |
| 1894 | apply simp | |
| 1895 | apply (subst zpower_zadd_distrib [symmetric]) | |
| 1896 | apply simp | |
| 1897 | apply (cut_tac lmw) | |
| 1898 | apply arith | |
| 1899 | using p | |
| 1900 | apply auto | |
| 1901 | done | |
| 23375 | 1902 | finally show "?Q < 2 ^ (length w1 + length w2 - Suc 0)" . | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1903 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1904 | next | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1905 | assume "bv_to_int (utos w1) < 0" | 
| 23375 | 1906 | thus ?thesis by (simp add: bv_to_int_utos) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1907 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1908 | next | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1909 | assume p: "?Q = -1" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1910 | thus ?thesis | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1911 | apply (simp add: bv_smult_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1912 | apply (cut_tac lmw) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1913 | apply arith | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1914 | apply simp | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1915 | done | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1916 | next | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1917 | assume p: "?Q < -1" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1918 | show ?thesis | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1919 | apply (subst bv_smult_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1920 | apply (rule length_int_to_bv_upper_limit_lem1) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1921 | apply (rule p) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1922 | proof simp | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1923 | have "(2::int) ^ length w1 * 2 ^(length w2 - 1) \<le> 2 ^ (length w1 + length w2 - Suc 0)" | 
| 19736 | 1924 | apply simp | 
| 1925 | apply (subst zpower_zadd_distrib [symmetric]) | |
| 1926 | apply simp | |
| 1927 | apply (cut_tac lmw) | |
| 1928 | apply arith | |
| 1929 | apply (cut_tac p) | |
| 1930 | apply arith | |
| 1931 | done | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1932 | hence "-((2::int) ^ (length w1 + length w2 - Suc 0)) \<le> -(2^ length w1 * 2 ^ (length w2 - 1))" | 
| 19736 | 1933 | by simp | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1934 | also have "... \<le> ?Q" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1935 | proof - | 
| 19736 | 1936 | from p | 
| 1937 | have q: "bv_to_int (utos w1) * bv_to_int w2 < 0" | |
| 1938 | by simp | |
| 1939 | thus ?thesis | |
| 1940 | proof (simp add: mult_less_0_iff,safe) | |
| 1941 | assume bi1: "0 < bv_to_int (utos w1)" | |
| 1942 | assume bi2: "bv_to_int w2 < 0" | |
| 1943 | have "-bv_to_int w2 * bv_to_int (utos w1) \<le> ((2::int)^(length w2 - 1)) * (2 ^ length w1)" | |
| 1944 | apply (rule mult_mono) | |
| 1945 | using bv_to_int_lower_range [of w2] | |
| 1946 | apply simp | |
| 1947 | apply (simp add: bv_to_int_utos) | |
| 1948 | using bv_to_nat_upper_range [of w1] | |
| 1949 | apply (simp add: int_nat_two_exp) | |
| 1950 | apply (rule zero_le_power,simp) | |
| 1951 | using bi1 | |
| 1952 | apply simp | |
| 1953 | done | |
| 1954 | hence "-?Q \<le> ((2::int)^length w1) * (2 ^ (length w2 - 1))" | |
| 1955 | by (simp add: zmult_ac) | |
| 1956 | thus "-(((2::int)^length w1) * (2 ^ (length w2 - Suc 0))) \<le> ?Q" | |
| 1957 | by simp | |
| 1958 | next | |
| 1959 | assume bi1: "bv_to_int (utos w1) < 0" | |
| 1960 | thus "-(((2::int)^length w1) * (2 ^ (length w2 - Suc 0))) \<le> ?Q" | |
| 1961 | by (simp add: bv_to_int_utos) | |
| 1962 | qed | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1963 | qed | 
| 23375 | 1964 | finally show "-(2 ^ (length w1 + length w2 - Suc 0)) \<le> ?Q" . | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1965 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1966 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1967 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1968 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1969 | lemma bv_smult_sym: "bv_smult w1 w2 = bv_smult w2 w1" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1970 | by (simp add: bv_smult_def zmult_ac) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1971 | |
| 14589 | 1972 | subsection {* Structural operations *}
 | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1973 | |
| 19736 | 1974 | definition | 
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 1975 | bv_select :: "[bit list,nat] => bit" where | 
| 19736 | 1976 | "bv_select w i = w ! (length w - 1 - i)" | 
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 1977 | |
| 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 1978 | definition | 
| 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 1979 | bv_chop :: "[bit list,nat] => bit list * bit list" where | 
| 19736 | 1980 | "bv_chop w i = (let len = length w in (take (len - i) w,drop (len - i) w))" | 
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 1981 | |
| 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 1982 | definition | 
| 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 1983 | bv_slice :: "[bit list,nat*nat] => bit list" where | 
| 19736 | 1984 | "bv_slice w = (\<lambda>(b,e). fst (bv_chop (snd (bv_chop w (b+1))) e))" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1985 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1986 | lemma bv_select_rev: | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1987 | assumes notnull: "n < length w" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1988 | shows "bv_select w n = rev w ! n" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1989 | proof - | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1990 | have "\<forall>n. n < length w --> bv_select w n = rev w ! n" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1991 | proof (rule length_induct [of _ w],auto simp add: bv_select_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1992 | fix xs :: "bit list" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1993 | fix n | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1994 | assume ind: "\<forall>ys::bit list. length ys < length xs --> (\<forall>n. n < length ys --> ys ! (length ys - Suc n) = rev ys ! n)" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1995 | assume notx: "n < length xs" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1996 | show "xs ! (length xs - Suc n) = rev xs ! n" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1997 | proof (cases xs) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 1998 | assume "xs = []" | 
| 23375 | 1999 | with notx show ?thesis by simp | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2000 | next | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2001 | fix y ys | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2002 | assume [simp]: "xs = y # ys" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2003 | show ?thesis | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2004 | proof (auto simp add: nth_append) | 
| 19736 | 2005 | assume noty: "n < length ys" | 
| 2006 | from spec [OF ind,of ys] | |
| 2007 | have "\<forall>n. n < length ys --> ys ! (length ys - Suc n) = rev ys ! n" | |
| 2008 | by simp | |
| 23375 | 2009 | hence "n < length ys --> ys ! (length ys - Suc n) = rev ys ! n" .. | 
| 2010 | from this and noty | |
| 2011 | have "ys ! (length ys - Suc n) = rev ys ! n" .. | |
| 19736 | 2012 | thus "(y # ys) ! (length ys - n) = rev ys ! n" | 
| 2013 | by (simp add: nth_Cons' noty linorder_not_less [symmetric]) | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2014 | next | 
| 19736 | 2015 | assume "~ n < length ys" | 
| 23375 | 2016 | hence x: "length ys \<le> n" by simp | 
| 2017 | from notx have "n < Suc (length ys)" by simp | |
| 2018 | hence "n \<le> length ys" by simp | |
| 2019 | with x have "length ys = n" by simp | |
| 2020 | thus "y = [y] ! (n - length ys)" by simp | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2021 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2022 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2023 | qed | 
| 23375 | 2024 | then have "n < length w --> bv_select w n = rev w ! n" .. | 
| 2025 | from this and notnull show ?thesis .. | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2026 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2027 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2028 | lemma bv_chop_append: "bv_chop (w1 @ w2) (length w2) = (w1,w2)" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2029 | by (simp add: bv_chop_def Let_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2030 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2031 | lemma append_bv_chop_id: "fst (bv_chop w l) @ snd (bv_chop w l) = w" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2032 | by (simp add: bv_chop_def Let_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2033 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2034 | lemma bv_chop_length_fst [simp]: "length (fst (bv_chop w i)) = length w - i" | 
| 20217 
25b068a99d2b
linear arithmetic splits certain operators (e.g. min, max, abs)
 webertj parents: 
19736diff
changeset | 2035 | by (simp add: bv_chop_def Let_def) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2036 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2037 | lemma bv_chop_length_snd [simp]: "length (snd (bv_chop w i)) = min i (length w)" | 
| 20217 
25b068a99d2b
linear arithmetic splits certain operators (e.g. min, max, abs)
 webertj parents: 
19736diff
changeset | 2038 | by (simp add: bv_chop_def Let_def) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2039 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2040 | lemma bv_slice_length [simp]: "[| j \<le> i; i < length w |] ==> length (bv_slice w (i,j)) = i - j + 1" | 
| 20217 
25b068a99d2b
linear arithmetic splits certain operators (e.g. min, max, abs)
 webertj parents: 
19736diff
changeset | 2041 | by (auto simp add: bv_slice_def) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2042 | |
| 19736 | 2043 | definition | 
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 2044 | length_nat :: "nat => nat" where | 
| 28562 | 2045 | [code del]: "length_nat x = (LEAST n. x < 2 ^ n)" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2046 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2047 | lemma length_nat: "length (nat_to_bv n) = length_nat n" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2048 | apply (simp add: length_nat_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2049 | apply (rule Least_equality [symmetric]) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2050 | prefer 2 | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2051 | apply (rule length_nat_to_bv_upper_limit) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2052 | apply arith | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2053 | apply (rule ccontr) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2054 | proof - | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2055 | assume "~ n < 2 ^ length (nat_to_bv n)" | 
| 23375 | 2056 | hence "2 ^ length (nat_to_bv n) \<le> n" by simp | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2057 | hence "length (nat_to_bv n) < length (nat_to_bv n)" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2058 | by (rule length_nat_to_bv_lower_limit) | 
| 23375 | 2059 | thus False by simp | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2060 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2061 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2062 | lemma length_nat_0 [simp]: "length_nat 0 = 0" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2063 | by (simp add: length_nat_def Least_equality) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2064 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2065 | lemma length_nat_non0: | 
| 25134 
3d4953e88449
Eliminated most of the neq0_conv occurrences. As a result, many
 nipkow parents: 
25112diff
changeset | 2066 | assumes n0: "n \<noteq> 0" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2067 | shows "length_nat n = Suc (length_nat (n div 2))" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2068 | apply (simp add: length_nat [symmetric]) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2069 | apply (subst nat_to_bv_non0 [of n]) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2070 | apply (simp_all add: n0) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2071 | done | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2072 | |
| 19736 | 2073 | definition | 
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 2074 | length_int :: "int => nat" where | 
| 19736 | 2075 | "length_int x = | 
| 2076 | (if 0 < x then Suc (length_nat (nat x)) | |
| 2077 | else if x = 0 then 0 | |
| 2078 | else Suc (length_nat (nat (-x - 1))))" | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2079 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2080 | lemma length_int: "length (int_to_bv i) = length_int i" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2081 | proof (cases "0 < i") | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2082 | assume i0: "0 < i" | 
| 23375 | 2083 | hence "length (int_to_bv i) = | 
| 2084 | length (norm_signed (\<zero> # norm_unsigned (nat_to_bv (nat i))))" by simp | |
| 15325 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 2085 | also from norm_unsigned_result [of "nat_to_bv (nat i)"] | 
| 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 2086 | have "... = Suc (length_nat (nat i))" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2087 | apply safe | 
| 15325 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 2088 | apply (simp del: norm_unsigned_nat_to_bv) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2089 | apply (drule norm_empty_bv_to_nat_zero) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2090 | using prems | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2091 | apply simp | 
| 15325 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 2092 | apply (cases "norm_unsigned (nat_to_bv (nat i))") | 
| 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 2093 | apply (drule norm_empty_bv_to_nat_zero [of "nat_to_bv (nat i)"]) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2094 | using prems | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2095 | apply simp | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2096 | apply simp | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2097 | using prems | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2098 | apply (simp add: length_nat [symmetric]) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2099 | done | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2100 | finally show ?thesis | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2101 | using i0 | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2102 | by (simp add: length_int_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2103 | next | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2104 | assume "~ 0 < i" | 
| 23375 | 2105 | hence i0: "i \<le> 0" by simp | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2106 | show ?thesis | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2107 | proof (cases "i = 0") | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2108 | assume "i = 0" | 
| 23375 | 2109 | thus ?thesis by (simp add: length_int_def) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2110 | next | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2111 | assume "i \<noteq> 0" | 
| 23375 | 2112 | with i0 have i0: "i < 0" by simp | 
| 2113 | hence "length (int_to_bv i) = | |
| 2114 | length (norm_signed (\<one> # bv_not (norm_unsigned (nat_to_bv (nat (- i) - 1)))))" | |
| 15325 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 2115 | by (simp add: int_to_bv_def nat_diff_distrib) | 
| 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 2116 | also from norm_unsigned_result [of "nat_to_bv (nat (- i) - 1)"] | 
| 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 2117 | have "... = Suc (length_nat (nat (- i) - 1))" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2118 | apply safe | 
| 15325 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 2119 | apply (simp del: norm_unsigned_nat_to_bv) | 
| 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 2120 | apply (drule norm_empty_bv_to_nat_zero [of "nat_to_bv (nat (-i) - Suc 0)"]) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2121 | using prems | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2122 | apply simp | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2123 | apply (cases "- i - 1 = 0") | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2124 | apply simp | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2125 | apply (simp add: length_nat [symmetric]) | 
| 15325 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 2126 | apply (cases "norm_unsigned (nat_to_bv (nat (- i) - 1))") | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2127 | apply simp | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2128 | apply simp | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2129 | done | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2130 | finally | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2131 | show ?thesis | 
| 23375 | 2132 | using i0 by (simp add: length_int_def nat_diff_distrib del: int_to_bv_lt0) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2133 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2134 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2135 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2136 | lemma length_int_0 [simp]: "length_int 0 = 0" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2137 | by (simp add: length_int_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2138 | |
| 15325 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 2139 | lemma length_int_gt0: "0 < i ==> length_int i = Suc (length_nat (nat i))" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2140 | by (simp add: length_int_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2141 | |
| 15325 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 2142 | lemma length_int_lt0: "i < 0 ==> length_int i = Suc (length_nat (nat (- i) - 1))" | 
| 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 2143 | by (simp add: length_int_def nat_diff_distrib) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2144 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2145 | lemma bv_chopI: "[| w = w1 @ w2 ; i = length w2 |] ==> bv_chop w i = (w1,w2)" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2146 | by (simp add: bv_chop_def Let_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2147 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2148 | lemma bv_sliceI: "[| j \<le> i ; i < length w ; w = w1 @ w2 @ w3 ; Suc i = length w2 + j ; j = length w3 |] ==> bv_slice w (i,j) = w2" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2149 | apply (simp add: bv_slice_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2150 | apply (subst bv_chopI [of "w1 @ w2 @ w3" w1 "w2 @ w3"]) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2151 | apply simp | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2152 | apply simp | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2153 | apply simp | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2154 | apply (subst bv_chopI [of "w2 @ w3" w2 w3],simp_all) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2155 | done | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2156 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2157 | lemma bv_slice_bv_slice: | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2158 | assumes ki: "k \<le> i" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2159 | and ij: "i \<le> j" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2160 | and jl: "j \<le> l" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2161 | and lw: "l < length w" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2162 | shows "bv_slice w (j,i) = bv_slice (bv_slice w (l,k)) (j-k,i-k)" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2163 | proof - | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2164 | def w1 == "fst (bv_chop w (Suc l))" | 
| 19736 | 2165 | and w2 == "fst (bv_chop (snd (bv_chop w (Suc l))) (Suc j))" | 
| 2166 | and w3 == "fst (bv_chop (snd (bv_chop (snd (bv_chop w (Suc l))) (Suc j))) i)" | |
| 2167 | and w4 == "fst (bv_chop (snd (bv_chop (snd (bv_chop (snd (bv_chop w (Suc l))) (Suc j))) i)) k)" | |
| 2168 | and w5 == "snd (bv_chop (snd (bv_chop (snd (bv_chop (snd (bv_chop w (Suc l))) (Suc j))) i)) k)" | |
| 2169 | note w_defs = this | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2170 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2171 | have w_def: "w = w1 @ w2 @ w3 @ w4 @ w5" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2172 | by (simp add: w_defs append_bv_chop_id) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2173 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2174 | from ki ij jl lw | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2175 | show ?thesis | 
| 15488 | 2176 | apply (subst bv_sliceI [where ?j = i and ?i = j and ?w = w and ?w1.0 = "w1 @ w2" and ?w2.0 = w3 and ?w3.0 = "w4 @ w5"]) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2177 | apply simp_all | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2178 | apply (rule w_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2179 | apply (simp add: w_defs min_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2180 | apply (simp add: w_defs min_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2181 | apply (subst bv_sliceI [where ?j = k and ?i = l and ?w = w and ?w1.0 = w1 and ?w2.0 = "w2 @ w3 @ w4" and ?w3.0 = w5]) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2182 | apply simp_all | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2183 | apply (rule w_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2184 | apply (simp add: w_defs min_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2185 | apply (simp add: w_defs min_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2186 | apply (subst bv_sliceI [where ?j = "i-k" and ?i = "j-k" and ?w = "w2 @ w3 @ w4" and ?w1.0 = w2 and ?w2.0 = w3 and ?w3.0 = w4]) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2187 | apply simp_all | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2188 | apply (simp_all add: w_defs min_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2189 | done | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2190 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2191 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2192 | lemma bv_to_nat_extend [simp]: "bv_to_nat (bv_extend n \<zero> w) = bv_to_nat w" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2193 | apply (simp add: bv_extend_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2194 | apply (subst bv_to_nat_dist_append) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2195 | apply simp | 
| 19736 | 2196 | apply (induct "n - length w") | 
| 2197 | apply simp_all | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2198 | done | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2199 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2200 | lemma bv_msb_extend_same [simp]: "bv_msb w = b ==> bv_msb (bv_extend n b w) = b" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2201 | apply (simp add: bv_extend_def) | 
| 19736 | 2202 | apply (induct "n - length w") | 
| 2203 | apply simp_all | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2204 | done | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2205 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2206 | lemma bv_to_int_extend [simp]: | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2207 | assumes a: "bv_msb w = b" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2208 | shows "bv_to_int (bv_extend n b w) = bv_to_int w" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2209 | proof (cases "bv_msb w") | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2210 | assume [simp]: "bv_msb w = \<zero>" | 
| 23375 | 2211 | with a have [simp]: "b = \<zero>" by simp | 
| 2212 | show ?thesis by (simp add: bv_to_int_def) | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2213 | next | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2214 | assume [simp]: "bv_msb w = \<one>" | 
| 23375 | 2215 | with a have [simp]: "b = \<one>" by simp | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2216 | show ?thesis | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2217 | apply (simp add: bv_to_int_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2218 | apply (simp add: bv_extend_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2219 | apply (induct "n - length w",simp_all) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2220 | done | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2221 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2222 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2223 | lemma length_nat_mono [simp]: "x \<le> y ==> length_nat x \<le> length_nat y" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2224 | proof (rule ccontr) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2225 | assume xy: "x \<le> y" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2226 | assume "~ length_nat x \<le> length_nat y" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2227 | hence lxly: "length_nat y < length_nat x" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2228 | by simp | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2229 | hence "length_nat y < (LEAST n. x < 2 ^ n)" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2230 | by (simp add: length_nat_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2231 | hence "~ x < 2 ^ length_nat y" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2232 | by (rule not_less_Least) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2233 | hence xx: "2 ^ length_nat y \<le> x" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2234 | by simp | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2235 | have yy: "y < 2 ^ length_nat y" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2236 | apply (simp add: length_nat_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2237 | apply (rule LeastI) | 
| 15325 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 2238 | apply (subgoal_tac "y < 2 ^ y",assumption) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2239 | apply (cases "0 \<le> y") | 
| 15325 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 2240 | apply (induct y,simp_all) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2241 | done | 
| 23375 | 2242 | with xx have "y < x" by simp | 
| 2243 | with xy show False by simp | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2244 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2245 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2246 | lemma length_nat_mono_int [simp]: "x \<le> y ==> length_nat x \<le> length_nat y" | 
| 23375 | 2247 | by (rule length_nat_mono) arith | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2248 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2249 | lemma length_nat_pos [simp,intro!]: "0 < x ==> 0 < length_nat x" | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2250 | by (simp add: length_nat_non0) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2251 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2252 | lemma length_int_mono_gt0: "[| 0 \<le> x ; x \<le> y |] ==> length_int x \<le> length_int y" | 
| 23375 | 2253 | by (cases "x = 0") (simp_all add: length_int_gt0 nat_le_eq_zle) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2254 | |
| 23375 | 2255 | lemma length_int_mono_lt0: "[| x \<le> y ; y \<le> 0 |] ==> length_int y \<le> length_int x" | 
| 2256 | by (cases "y = 0") (simp_all add: length_int_lt0) | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2257 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2258 | lemmas [simp] = length_nat_non0 | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2259 | |
| 25919 
8b1c0d434824
joined theories IntDef, Numeral, IntArith to theory Int
 haftmann parents: 
25595diff
changeset | 2260 | lemma "nat_to_bv (number_of Int.Pls) = []" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2261 | by simp | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2262 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2263 | consts | 
| 20485 | 2264 | fast_bv_to_nat_helper :: "[bit list, int] => int" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2265 | primrec | 
| 20485 | 2266 | fast_bv_to_nat_Nil: "fast_bv_to_nat_helper [] k = k" | 
| 23375 | 2267 | fast_bv_to_nat_Cons: "fast_bv_to_nat_helper (b#bs) k = | 
| 26086 
3c243098b64a
New simpler representation of numerals, using Bit0 and Bit1 instead of BIT, B0, and B1
 huffman parents: 
25961diff
changeset | 2268 | fast_bv_to_nat_helper bs ((bit_case Int.Bit0 Int.Bit1 b) k)" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2269 | |
| 28562 | 2270 | declare fast_bv_to_nat_helper.simps [code del] | 
| 28229 | 2271 | |
| 23375 | 2272 | lemma fast_bv_to_nat_Cons0: "fast_bv_to_nat_helper (\<zero>#bs) bin = | 
| 26086 
3c243098b64a
New simpler representation of numerals, using Bit0 and Bit1 instead of BIT, B0, and B1
 huffman parents: 
25961diff
changeset | 2273 | fast_bv_to_nat_helper bs (Int.Bit0 bin)" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2274 | by simp | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2275 | |
| 23375 | 2276 | lemma fast_bv_to_nat_Cons1: "fast_bv_to_nat_helper (\<one>#bs) bin = | 
| 26086 
3c243098b64a
New simpler representation of numerals, using Bit0 and Bit1 instead of BIT, B0, and B1
 huffman parents: 
25961diff
changeset | 2277 | fast_bv_to_nat_helper bs (Int.Bit1 bin)" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2278 | by simp | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2279 | |
| 23375 | 2280 | lemma fast_bv_to_nat_def: | 
| 25919 
8b1c0d434824
joined theories IntDef, Numeral, IntArith to theory Int
 haftmann parents: 
25595diff
changeset | 2281 | "bv_to_nat bs == number_of (fast_bv_to_nat_helper bs Int.Pls)" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2282 | proof (simp add: bv_to_nat_def) | 
| 15325 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 2283 | have "\<forall> bin. \<not> (neg (number_of bin :: int)) \<longrightarrow> (foldl (%bn b. 2 * bn + bitval b) (number_of bin) bs) = number_of (fast_bv_to_nat_helper bs bin)" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2284 | apply (induct bs,simp) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2285 | apply (case_tac a,simp_all) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2286 | done | 
| 25919 
8b1c0d434824
joined theories IntDef, Numeral, IntArith to theory Int
 haftmann parents: 
25595diff
changeset | 2287 | thus "foldl (\<lambda>bn b. 2 * bn + bitval b) 0 bs \<equiv> number_of (fast_bv_to_nat_helper bs Int.Pls)" | 
| 15325 
50ac7d2c34c9
Functions nat_to_bv and bv_to_nat now really operate on natural numbers.
 berghofe parents: 
15140diff
changeset | 2288 | by (simp del: nat_numeral_0_eq_0 add: nat_numeral_0_eq_0 [symmetric]) | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2289 | qed | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2290 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2291 | declare fast_bv_to_nat_Cons [simp del] | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2292 | declare fast_bv_to_nat_Cons0 [simp] | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2293 | declare fast_bv_to_nat_Cons1 [simp] | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2294 | |
| 22993 | 2295 | setup {*
 | 
| 2296 | (*comments containing lcp are the removal of fast_bv_of_nat*) | |
| 2297 | let | |
| 2298 |   fun is_const_bool (Const("True",_)) = true
 | |
| 2299 |     | is_const_bool (Const("False",_)) = true
 | |
| 2300 | | is_const_bool _ = false | |
| 2301 |   fun is_const_bit (Const("Word.bit.Zero",_)) = true
 | |
| 2302 |     | is_const_bit (Const("Word.bit.One",_)) = true
 | |
| 2303 | | is_const_bit _ = false | |
| 25919 
8b1c0d434824
joined theories IntDef, Numeral, IntArith to theory Int
 haftmann parents: 
25595diff
changeset | 2304 |   fun num_is_usable (Const(@{const_name Int.Pls},_)) = true
 | 
| 
8b1c0d434824
joined theories IntDef, Numeral, IntArith to theory Int
 haftmann parents: 
25595diff
changeset | 2305 |     | num_is_usable (Const(@{const_name Int.Min},_)) = false
 | 
| 26086 
3c243098b64a
New simpler representation of numerals, using Bit0 and Bit1 instead of BIT, B0, and B1
 huffman parents: 
25961diff
changeset | 2306 |     | num_is_usable (Const(@{const_name Int.Bit0},_) $ w) =
 | 
| 
3c243098b64a
New simpler representation of numerals, using Bit0 and Bit1 instead of BIT, B0, and B1
 huffman parents: 
25961diff
changeset | 2307 | num_is_usable w | 
| 
3c243098b64a
New simpler representation of numerals, using Bit0 and Bit1 instead of BIT, B0, and B1
 huffman parents: 
25961diff
changeset | 2308 |     | num_is_usable (Const(@{const_name Int.Bit1},_) $ w) =
 | 
| 
3c243098b64a
New simpler representation of numerals, using Bit0 and Bit1 instead of BIT, B0, and B1
 huffman parents: 
25961diff
changeset | 2309 | num_is_usable w | 
| 22993 | 2310 | | num_is_usable _ = false | 
| 2311 |   fun vec_is_usable (Const("List.list.Nil",_)) = true
 | |
| 2312 |     | vec_is_usable (Const("List.list.Cons",_) $ b $ bs) =
 | |
| 2313 | vec_is_usable bs andalso is_const_bit b | |
| 2314 | | vec_is_usable _ = false | |
| 2315 | (*lcp** val fast1_th = PureThy.get_thm thy "Word.fast_nat_to_bv_def"*) | |
| 2316 |   val fast2_th = @{thm "Word.fast_bv_to_nat_def"};
 | |
| 25919 
8b1c0d434824
joined theories IntDef, Numeral, IntArith to theory Int
 haftmann parents: 
25595diff
changeset | 2317 |   (*lcp** fun f sg thms (Const("Word.nat_to_bv",_) $ (Const(@{const_name Int.number_of},_) $ t)) =
 | 
| 22993 | 2318 | if num_is_usable t | 
| 25919 
8b1c0d434824
joined theories IntDef, Numeral, IntArith to theory Int
 haftmann parents: 
25595diff
changeset | 2319 |       then SOME (Drule.cterm_instantiate [(cterm_of sg (Var (("w", 0), @{typ int})), cterm_of sg t)] fast1_th)
 | 
| 22993 | 2320 | else NONE | 
| 2321 | | f _ _ _ = NONE *) | |
| 2322 |   fun g sg thms (Const("Word.bv_to_nat",_) $ (t as (Const("List.list.Cons",_) $ _ $ _))) =
 | |
| 2323 | if vec_is_usable t then | |
| 2324 |           SOME (Drule.cterm_instantiate [(cterm_of sg (Var(("bs",0),Type("List.list",[Type("Word.bit",[])]))),cterm_of sg t)] fast2_th)
 | |
| 2325 | else NONE | |
| 2326 | | g _ _ _ = NONE | |
| 2327 | (*lcp** val simproc1 = Simplifier.simproc thy "nat_to_bv" ["Word.nat_to_bv (number_of w)"] f *) | |
| 2328 |   val simproc2 = Simplifier.simproc @{theory} "bv_to_nat" ["Word.bv_to_nat (x # xs)"] g
 | |
| 2329 | in | |
| 26496 
49ae9456eba9
purely functional setup of claset/simpset/clasimpset;
 wenzelm parents: 
26086diff
changeset | 2330 | Simplifier.map_simpset (fn ss => ss addsimprocs [(*lcp*simproc1,*)simproc2]) | 
| 22993 | 2331 | end*} | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2332 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2333 | declare bv_to_nat1 [simp del] | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2334 | declare bv_to_nat_helper [simp del] | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2335 | |
| 19736 | 2336 | definition | 
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 2337 | bv_mapzip :: "[bit => bit => bit,bit list, bit list] => bit list" where | 
| 19736 | 2338 | "bv_mapzip f w1 w2 = | 
| 2339 | (let g = bv_extend (max (length w1) (length w2)) \<zero> | |
| 2340 | in map (split f) (zip (g w1) (g w2)))" | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2341 | |
| 19736 | 2342 | lemma bv_length_bv_mapzip [simp]: | 
| 23375 | 2343 | "length (bv_mapzip f w1 w2) = max (length w1) (length w2)" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2344 | by (simp add: bv_mapzip_def Let_def split: split_max) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2345 | |
| 17650 
44b135d04cc4
Made sure all lemmas now have names (especially so that certain of them
 skalberg parents: 
16796diff
changeset | 2346 | lemma bv_mapzip_Nil [simp]: "bv_mapzip f [] [] = []" | 
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2347 | by (simp add: bv_mapzip_def Let_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2348 | |
| 19736 | 2349 | lemma bv_mapzip_Cons [simp]: "length w1 = length w2 ==> | 
| 2350 | bv_mapzip f (x#w1) (y#w2) = f x y # bv_mapzip f w1 w2" | |
| 14494 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2351 | by (simp add: bv_mapzip_def Let_def) | 
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2352 | |
| 
48ae8d678d88
Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
 skalberg parents: diff
changeset | 2353 | end |