source: Deliverables/D4.1/Matita/BitVector.ma @ 353

Last change on this file since 353 was 353, checked in by mulligan, 9 years ago
  • pc was initialized to 7 in place of sp
  • bitvector_of_nat was totally bugged: fixed
File size: 6.8 KB
Line 
1(* -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= *)
2(* BitVector.ma: Fixed length bitvectors, and common operations on them.      *)
3(*               Most functions are specialised versions of those found in    *)
4(*               Vector.ma as a courtesy, or Boolean functions lifted into    *)
5(*               BitVector variants.                                          *)
6(* -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= *)
7
8include "Universes.ma".
9
10include "Vector.ma".
11include "List.ma".
12include "Nat.ma".
13include "Bool.ma".
14
15(* -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= *)
16(* Common synonyms.                                                           *)
17(* -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= *)
18
19ndefinition BitVector ≝ λn: Nat. Vector Bool n.
20ndefinition Bit ≝ Bool.
21ndefinition Nibble ≝ BitVector (S (S (S (S Z)))).
22ndefinition Byte7 ≝ BitVector (S (S (S (S (S (S (S Z))))))).
23ndefinition Byte ≝ BitVector (S (S (S (S (S (S (S (S Z)))))))).
24ndefinition Word ≝ BitVector (S (S (S (S (S (S (S (S (S (S (S (S (S (S (S (S Z)))))))))))))))).
25ndefinition Word11 ≝ BitVector (S (S (S (S (S (S (S (S (S (S (S Z))))))))))).
26
27(* -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= *)
28(* Lookup.                                                                    *)
29(* -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= *)
30
31ndefinition get_index_bv ≝
32  λn: Nat.
33  λb: BitVector n.
34  λm: Nat.
35  λp: m < n.
36    get_index Bool n b m p.
37   
38interpretation "BitVector get_index" 'get_index b n = (get_index ? b n).
39   
40ndefinition set_index_bv ≝
41  λn: Nat.
42  λb: BitVector n.
43  λm: Nat.
44  λp: m < n.
45  λc: Bool.
46    set_index Bool n b m c.
47   
48ndefinition drop ≝
49  λn: Nat.
50  λb: BitVector n.
51  λm: Nat.
52    drop Bool n b m.
53
54(* -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= *)
55(* Creating bitvectors from scratch.                                          *)
56(* -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= *)
57
58ndefinition zero ≝
59  λn: Nat.
60    ((replicate Bool n false): BitVector n).
61   
62ndefinition max ≝
63  λn: Nat.
64    ((replicate Bool n true): BitVector n).
65   
66ndefinition append ≝
67  λm, n: Nat.
68  λb: BitVector m.
69  λc: BitVector n.
70    append Bool m n b c.
71   
72ndefinition pad ≝
73  λm, n: Nat.
74  λb: BitVector n.
75    let padding ≝ replicate Bool m false in
76      append Bool m n padding b.
77     
78(* -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= *)
79(* Other manipulations.                                                       *)
80(* -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= *)
81
82ndefinition reverse ≝
83  λn: Nat.
84  λb: BitVector n.
85    reverse Bool n b.
86
87ndefinition length ≝
88  λn: Nat.
89  λb: BitVector n.
90    length Bool n b.
91
92(* -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= *)
93(* Logical operations.                                                        *)
94(* -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= *)
95   
96ndefinition conjunction_bv ≝
97  λn: Nat.
98  λb: BitVector n.
99  λc: BitVector n.
100    zip_with Bool Bool Bool n conjunction b c.
101   
102interpretation "BitVector conjunction" 'conjunction b c = (conjunction ? b c).
103   
104ndefinition inclusive_disjunction_bv ≝
105  λn: Nat.
106  λb: BitVector n.
107  λc: BitVector n.
108    zip_with Bool Bool Bool n inclusive_disjunction b c.
109   
110interpretation "BitVector inclusive disjunction"
111  'inclusive_disjunction b c = (inclusive_disjunction ? b c).
112         
113ndefinition exclusive_disjunction_bv ≝
114  λn: Nat.
115  λb: BitVector n.
116  λc: BitVector n.
117    zip_with Bool Bool Bool n exclusive_disjunction b c.
118   
119interpretation "BitVector exclusive disjunction"
120  'exclusive_disjunction b c = (exclusive_disjunction ? b c).
121   
122ndefinition negation_bv ≝
123  λn: Nat.
124  λb: BitVector n.
125    map Bool Bool n (negation) b.
126   
127interpretation "BitVector negation" 'negation b c = (negation ? b c).
128
129(* -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= *)
130(* Rotates and shifts.                                                        *)
131(* -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= *)
132
133ndefinition rotate_left_bv ≝
134  λn, m: Nat.
135  λb: BitVector n.
136    rotate_left Bool n m b.
137
138ndefinition rotate_right_bv ≝
139  λn, m: Nat.
140  λb: BitVector n.
141    rotate_right Bool n m b.
142   
143ndefinition shift_left_bv ≝
144  λn, m: Nat.
145  λb: BitVector n.
146  λc: Bool.
147    shift_left Bool n m b c.
148   
149ndefinition shift_right_bv ≝
150  λn, m: Nat.
151  λb: BitVector n.
152  λc: Bool.
153    shift_right Bool n m b c.
154   
155(* -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= *)
156(* Conversions to and from lists and natural numbers.                         *)
157(* -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= *)
158
159ndefinition list_of_bitvector ≝
160  λn: Nat.
161  λb: BitVector n.
162    list_of_vector Bool n b.
163   
164ndefinition bitvector_of_list ≝
165  λl: List Bool.
166    vector_of_list Bool l.
167
168nlet rec bitvector_of_nat_aux (n: Nat) (bound: Nat) on bound ≝
169 match bound with
170  [ Z ⇒ Empty Bool (* IT WILL NOT HAPPEN *)
171  | S bound ⇒
172    let divrem ≝ divide_with_remainder n (S (S Z)) in
173    let div ≝ first Nat Nat divrem in
174    let rem ≝ second Nat Nat divrem in
175      match div with
176        [ Z ⇒
177          match rem with
178            [ Z ⇒ Empty Bool
179            | S r ⇒ true :: (bitvector_of_nat_aux Z bound)
180            ]
181        | S d ⇒
182          match rem with
183            [ Z ⇒ false :: (bitvector_of_nat_aux (S d) bound)
184            | S r ⇒ true :: (bitvector_of_nat_aux (S d) bound)
185            ]
186        ]].
187
188ndefinition eq_bv ≝
189  λn: Nat.
190  λb, c: BitVector n.
191    eq_v Bool n (λd, e.
192      if inclusive_disjunction (conjunction d e) (conjunction (negation d)
193                                                              (negation e)) then
194        true
195      else
196        false) b c.
197
198nlet rec bitvector_of_nat (n: Nat) (m: Nat): BitVector n ≝
199  let biglist ≝ reverse ? (bitvector_of_nat_aux m m) in
200  let size ≝ length ? biglist in
201  let bitvector ≝ bitvector_of_list biglist in
202  let difference ≝ n - size in
203   less_than_or_equal_b_elim …
204    (λH:size ≤ n. ((pad difference size bitvector)⌈BitVector n ↦ BitVector (difference+size)⌉))
205    (λH:¬(size ≤ n). max n).
206 nnormalize; nrewrite > (plus_minus_inverse_right n ?); //; nassumption.
207nqed.
208
209nlet rec nat_of_bitvector (n: Nat) (b: BitVector n) on b ≝
210  match b with
211    [ Empty ⇒ Z
212    | Cons o hd tl ⇒
213      let hdval ≝ match hd with [ true ⇒ S Z | false ⇒ Z ] in
214        ((exponential (S (S Z)) o) * hdval) + nat_of_bitvector o tl
215    ].
Note: See TracBrowser for help on using the repository browser.