author | wenzelm |
Wed, 25 Mar 2015 10:41:53 +0100 | |
changeset 59806 | d3d4ec6c21ef |
parent 47567 | 407cabf66f21 |
child 69597 | ff784d5a5bfb |
permissions | -rw-r--r-- |
47567
407cabf66f21
New tactic "word_bitwise" expands word equalities/inequalities into logic.
Thomas Sewell <thomas.sewell@nicta.com.au>
parents:
diff
changeset
|
1 |
(* Title: HOL/Word/Tools/word_lib.ML |
407cabf66f21
New tactic "word_bitwise" expands word equalities/inequalities into logic.
Thomas Sewell <thomas.sewell@nicta.com.au>
parents:
diff
changeset
|
2 |
Author: Sascha Boehme, TU Muenchen and Thomas Sewell, NICTA |
407cabf66f21
New tactic "word_bitwise" expands word equalities/inequalities into logic.
Thomas Sewell <thomas.sewell@nicta.com.au>
parents:
diff
changeset
|
3 |
|
59806 | 4 |
Helper routines for operating on the word type. |
47567
407cabf66f21
New tactic "word_bitwise" expands word equalities/inequalities into logic.
Thomas Sewell <thomas.sewell@nicta.com.au>
parents:
diff
changeset
|
5 |
*) |
407cabf66f21
New tactic "word_bitwise" expands word equalities/inequalities into logic.
Thomas Sewell <thomas.sewell@nicta.com.au>
parents:
diff
changeset
|
6 |
|
59806 | 7 |
signature WORD_LIB = |
8 |
sig |
|
9 |
val dest_binT: typ -> int |
|
10 |
val is_wordT: typ -> bool |
|
11 |
val dest_wordT: typ -> int |
|
12 |
val mk_wordT: int -> typ |
|
13 |
end |
|
47567
407cabf66f21
New tactic "word_bitwise" expands word equalities/inequalities into logic.
Thomas Sewell <thomas.sewell@nicta.com.au>
parents:
diff
changeset
|
14 |
|
59806 | 15 |
structure Word_Lib: WORD_LIB = |
16 |
struct |
|
47567
407cabf66f21
New tactic "word_bitwise" expands word equalities/inequalities into logic.
Thomas Sewell <thomas.sewell@nicta.com.au>
parents:
diff
changeset
|
17 |
|
407cabf66f21
New tactic "word_bitwise" expands word equalities/inequalities into logic.
Thomas Sewell <thomas.sewell@nicta.com.au>
parents:
diff
changeset
|
18 |
fun dest_binT T = |
407cabf66f21
New tactic "word_bitwise" expands word equalities/inequalities into logic.
Thomas Sewell <thomas.sewell@nicta.com.au>
parents:
diff
changeset
|
19 |
(case T of |
407cabf66f21
New tactic "word_bitwise" expands word equalities/inequalities into logic.
Thomas Sewell <thomas.sewell@nicta.com.au>
parents:
diff
changeset
|
20 |
Type (@{type_name "Numeral_Type.num0"}, _) => 0 |
407cabf66f21
New tactic "word_bitwise" expands word equalities/inequalities into logic.
Thomas Sewell <thomas.sewell@nicta.com.au>
parents:
diff
changeset
|
21 |
| Type (@{type_name "Numeral_Type.num1"}, _) => 1 |
407cabf66f21
New tactic "word_bitwise" expands word equalities/inequalities into logic.
Thomas Sewell <thomas.sewell@nicta.com.au>
parents:
diff
changeset
|
22 |
| Type (@{type_name "Numeral_Type.bit0"}, [T]) => 2 * dest_binT T |
407cabf66f21
New tactic "word_bitwise" expands word equalities/inequalities into logic.
Thomas Sewell <thomas.sewell@nicta.com.au>
parents:
diff
changeset
|
23 |
| Type (@{type_name "Numeral_Type.bit1"}, [T]) => 1 + 2 * dest_binT T |
407cabf66f21
New tactic "word_bitwise" expands word equalities/inequalities into logic.
Thomas Sewell <thomas.sewell@nicta.com.au>
parents:
diff
changeset
|
24 |
| _ => raise TYPE ("dest_binT", [T], [])) |
407cabf66f21
New tactic "word_bitwise" expands word equalities/inequalities into logic.
Thomas Sewell <thomas.sewell@nicta.com.au>
parents:
diff
changeset
|
25 |
|
407cabf66f21
New tactic "word_bitwise" expands word equalities/inequalities into logic.
Thomas Sewell <thomas.sewell@nicta.com.au>
parents:
diff
changeset
|
26 |
fun is_wordT (Type (@{type_name word}, _)) = true |
407cabf66f21
New tactic "word_bitwise" expands word equalities/inequalities into logic.
Thomas Sewell <thomas.sewell@nicta.com.au>
parents:
diff
changeset
|
27 |
| is_wordT _ = false |
407cabf66f21
New tactic "word_bitwise" expands word equalities/inequalities into logic.
Thomas Sewell <thomas.sewell@nicta.com.au>
parents:
diff
changeset
|
28 |
|
407cabf66f21
New tactic "word_bitwise" expands word equalities/inequalities into logic.
Thomas Sewell <thomas.sewell@nicta.com.au>
parents:
diff
changeset
|
29 |
fun dest_wordT (Type (@{type_name word}, [T])) = dest_binT T |
407cabf66f21
New tactic "word_bitwise" expands word equalities/inequalities into logic.
Thomas Sewell <thomas.sewell@nicta.com.au>
parents:
diff
changeset
|
30 |
| dest_wordT T = raise TYPE ("dest_wordT", [T], []) |
407cabf66f21
New tactic "word_bitwise" expands word equalities/inequalities into logic.
Thomas Sewell <thomas.sewell@nicta.com.au>
parents:
diff
changeset
|
31 |
|
59806 | 32 |
|
33 |
fun mk_bitT i T = |
|
34 |
if i = 0 |
|
35 |
then Type (@{type_name "Numeral_Type.bit0"}, [T]) |
|
36 |
else Type (@{type_name "Numeral_Type.bit1"}, [T]) |
|
47567
407cabf66f21
New tactic "word_bitwise" expands word equalities/inequalities into logic.
Thomas Sewell <thomas.sewell@nicta.com.au>
parents:
diff
changeset
|
37 |
|
59806 | 38 |
fun mk_binT size = |
39 |
if size = 0 then @{typ "Numeral_Type.num0"} |
|
40 |
else if size = 1 then @{typ "Numeral_Type.num1"} |
|
41 |
else let val (q, r) = Integer.div_mod size 2 in mk_bitT r (mk_binT q) end |
|
42 |
||
47567
407cabf66f21
New tactic "word_bitwise" expands word equalities/inequalities into logic.
Thomas Sewell <thomas.sewell@nicta.com.au>
parents:
diff
changeset
|
43 |
fun mk_wordT size = |
407cabf66f21
New tactic "word_bitwise" expands word equalities/inequalities into logic.
Thomas Sewell <thomas.sewell@nicta.com.au>
parents:
diff
changeset
|
44 |
if size >= 0 then Type (@{type_name "word"}, [mk_binT size]) |
59806 | 45 |
else raise TYPE ("mk_wordT: " ^ string_of_int size, [], []) |
47567
407cabf66f21
New tactic "word_bitwise" expands word equalities/inequalities into logic.
Thomas Sewell <thomas.sewell@nicta.com.au>
parents:
diff
changeset
|
46 |
|
407cabf66f21
New tactic "word_bitwise" expands word equalities/inequalities into logic.
Thomas Sewell <thomas.sewell@nicta.com.au>
parents:
diff
changeset
|
47 |
end |