author | desharna |
Mon, 13 Jun 2022 20:02:00 +0200 | |
changeset 75560 | aeb797356de0 |
parent 72515 | c7038c397ae3 |
child 76183 | 8089593a364a |
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 |
69597 | 20 |
Type (\<^type_name>\<open>Numeral_Type.num0\<close>, _) => 0 |
21 |
| Type (\<^type_name>\<open>Numeral_Type.num1\<close>, _) => 1 |
|
22 |
| Type (\<^type_name>\<open>Numeral_Type.bit0\<close>, [T]) => 2 * dest_binT T |
|
23 |
| Type (\<^type_name>\<open>Numeral_Type.bit1\<close>, [T]) => 1 + 2 * dest_binT T |
|
47567
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 |
|
69597 | 26 |
fun is_wordT (Type (\<^type_name>\<open>word\<close>, _)) = true |
47567
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 |
|
69597 | 29 |
fun dest_wordT (Type (\<^type_name>\<open>word\<close>, [T])) = dest_binT T |
47567
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 |
|
69597 | 35 |
then Type (\<^type_name>\<open>Numeral_Type.bit0\<close>, [T]) |
36 |
else Type (\<^type_name>\<open>Numeral_Type.bit1\<close>, [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 = |
69597 | 39 |
if size = 0 then \<^typ>\<open>Numeral_Type.num0\<close> |
40 |
else if size = 1 then \<^typ>\<open>Numeral_Type.num1\<close> |
|
59806 | 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 = |
69597 | 44 |
if size >= 0 then Type (\<^type_name>\<open>word\<close>, [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 |