| author | paulson <lp15@cam.ac.uk> | 
| Tue, 25 Jan 2022 14:13:33 +0000 | |
| changeset 75008 | 43b3d5318d72 | 
| 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 |