| author | wenzelm | 
| Sun, 11 Sep 2022 23:37:05 +0200 | |
| changeset 76117 | 531248fd8952 | 
| parent 74817 | 1fd8705503b4 | 
| child 76183 | 8089593a364a | 
| permissions | -rw-r--r-- | 
| 58061 | 1 | (* Title: HOL/Word/Tools/smt_word.ML | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 2 | Author: Sascha Boehme, TU Muenchen | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 3 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 4 | SMT setup for words. | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 5 | *) | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 6 | |
| 72508 | 7 | signature SMT_WORD = | 
| 8 | sig | |
| 9 | val add_word_shift': term * string -> Context.generic -> Context.generic | |
| 10 | end | |
| 11 | ||
| 12 | structure SMT_Word : SMT_WORD = | |
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 13 | struct | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 14 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 15 | open Word_Lib | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 16 | |
| 57229 | 17 | |
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 18 | (* SMT-LIB logic *) | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 19 | |
| 57696 
fb71c6f100f8
do not embed 'nat' into 'int's in 'smt2' method -- this is highly inefficient and decreases the Sledgehammer success rate significantly
 blanchet parents: 
57553diff
changeset | 20 | (* "QF_AUFBV" is too restrictive for Isabelle's problems, which contain aritmetic and quantifiers. | 
| 57553 
2a6c31ac1c9a
don't generate a 'set-logic' command when generating problems in a non-standard (but Z3-supported) union-of-everything logic
 blanchet parents: 
57229diff
changeset | 21 | Better set the logic to "" and make at least Z3 happy. *) | 
| 74817 
1fd8705503b4
generate problems with correct logic for veriT
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: 
74097diff
changeset | 22 | fun smtlib_logic "z3" ts = | 
| 
1fd8705503b4
generate problems with correct logic for veriT
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: 
74097diff
changeset | 23 | if exists (Term.exists_type (Term.exists_subtype is_wordT)) ts then SOME "" else NONE | 
| 
1fd8705503b4
generate problems with correct logic for veriT
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: 
74097diff
changeset | 24 | | smtlib_logic "verit" _ = NONE | 
| 
1fd8705503b4
generate problems with correct logic for veriT
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: 
74097diff
changeset | 25 | | smtlib_logic _ ts = | 
| 
1fd8705503b4
generate problems with correct logic for veriT
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: 
74097diff
changeset | 26 | if exists (Term.exists_type (Term.exists_subtype is_wordT)) ts then SOME "AUFBVLIRA" else NONE | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 27 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 28 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 29 | (* SMT-LIB builtins *) | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 30 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 31 | local | 
| 74817 
1fd8705503b4
generate problems with correct logic for veriT
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: 
74097diff
changeset | 32 | val smtlibC = SMTLIB_Interface.smtlibC @ SMTLIB_Interface.bvsmlibC | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 33 | |
| 69597 | 34 | val wordT = \<^typ>\<open>'a::len word\<close> | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 35 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 36 | fun index1 s i = "(_ " ^ s ^ " " ^ string_of_int i ^ ")" | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 37 | fun index2 s i j = "(_ " ^ s ^ " " ^ string_of_int i ^ " " ^ string_of_int j ^ ")" | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 38 | |
| 69597 | 39 | fun word_typ (Type (\<^type_name>\<open>word\<close>, [T])) = | 
| 66551 | 40 | Option.map (rpair [] o index1 "BitVec") (try dest_binT T) | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 41 | | word_typ _ = NONE | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 42 | |
| 72909 
f9424ceea3c3
don't generate not-fully-defined bit-vector constants in SMT problems
 Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: 
72515diff
changeset | 43 | (*CVC4 does not support "_bvk T" when k does not fit in the BV of size T, so remove the bits that | 
| 
f9424ceea3c3
don't generate not-fully-defined bit-vector constants in SMT problems
 Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: 
72515diff
changeset | 44 | will be ignored according to the SMT-LIB*) | 
| 69597 | 45 | fun word_num (Type (\<^type_name>\<open>word\<close>, [T])) k = | 
| 72909 
f9424ceea3c3
don't generate not-fully-defined bit-vector constants in SMT problems
 Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: 
72515diff
changeset | 46 | let | 
| 
f9424ceea3c3
don't generate not-fully-defined bit-vector constants in SMT problems
 Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: 
72515diff
changeset | 47 | val size = try dest_binT T | 
| 73021 
f602a380e4f2
tuned signature -- prefer Isabelle/ML structure Integer (despite minor confusion due to canonical argument order of "pow");
 wenzelm parents: 
72909diff
changeset | 48 | fun max_int size = Integer.pow size 2 | 
| 72909 
f9424ceea3c3
don't generate not-fully-defined bit-vector constants in SMT problems
 Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: 
72515diff
changeset | 49 | in | 
| 
f9424ceea3c3
don't generate not-fully-defined bit-vector constants in SMT problems
 Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: 
72515diff
changeset | 50 | (case size of | 
| 
f9424ceea3c3
don't generate not-fully-defined bit-vector constants in SMT problems
 Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: 
72515diff
changeset | 51 | NONE => NONE | 
| 
f9424ceea3c3
don't generate not-fully-defined bit-vector constants in SMT problems
 Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: 
72515diff
changeset | 52 |           | SOME size => SOME (index1 ("bv" ^ string_of_int (Int.rem(k, max_int size))) size))
 | 
| 
f9424ceea3c3
don't generate not-fully-defined bit-vector constants in SMT problems
 Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: 
72515diff
changeset | 53 | end | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 54 | | word_num _ _ = NONE | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 55 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 56 | fun if_fixed pred m n T ts = | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 57 | let val (Us, U) = Term.strip_type T | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 58 | in | 
| 57696 
fb71c6f100f8
do not embed 'nat' into 'int's in 'smt2' method -- this is highly inefficient and decreases the Sledgehammer success rate significantly
 blanchet parents: 
57553diff
changeset | 59 | if pred (U, Us) then SOME (n, length Us, ts, Term.list_comb o pair (Const (m, T))) else NONE | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 60 | end | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 61 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 62 | fun if_fixed_all m = if_fixed (forall (can dest_wordT) o (op ::)) m | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 63 | fun if_fixed_args m = if_fixed (forall (can dest_wordT) o snd) m | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 64 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 65 | fun add_word_fun f (t, n) = | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 66 | let val (m, _) = Term.dest_Const t | 
| 58061 | 67 | in SMT_Builtin.add_builtin_fun smtlibC (Term.dest_Const t, K (f m n)) end | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 68 | |
| 69597 | 69 | val mk_nat = HOLogic.mk_number \<^typ>\<open>nat\<close> | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 70 | |
| 72514 | 71 | fun mk_shift c [u, t] = Const c $ mk_nat (snd (HOLogic.dest_number u)) $ t | 
| 72 |     | mk_shift c ts = raise TERM ("bad arguments", Const c :: ts)
 | |
| 73 | ||
| 74 | fun shift m n T ts = | |
| 75 | let val U = Term.domain_type (Term.range_type T) | |
| 76 | in | |
| 77 | (case (can dest_wordT U, try (snd o HOLogic.dest_number o hd) ts) of | |
| 78 | (true, SOME i) => | |
| 79 | SOME (n, 2, [hd (tl ts), HOLogic.mk_number U i], mk_shift (m, T)) | |
| 80 | | _ => NONE) (* FIXME: also support non-numerical shifts *) | |
| 81 | end | |
| 82 | ||
| 72489 | 83 | fun mk_shift' c [t, u] = Const c $ t $ mk_nat (snd (HOLogic.dest_number u)) | 
| 84 |     | mk_shift' c ts = raise TERM ("bad arguments", Const c :: ts)
 | |
| 85 | ||
| 86 | fun shift' m n T ts = | |
| 87 | let val U = Term.domain_type T | |
| 88 | in | |
| 89 | (case (can dest_wordT U, try (snd o HOLogic.dest_number o hd o tl) ts) of | |
| 90 | (true, SOME i) => | |
| 91 | SOME (n, 2, [hd ts, HOLogic.mk_number U i], mk_shift' (m, T)) | |
| 92 | | _ => NONE) (* FIXME: also support non-numerical shifts *) | |
| 93 | end | |
| 94 | ||
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 95 | fun mk_extract c i ts = Term.list_comb (Const c, mk_nat i :: ts) | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 96 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 97 | fun extract m n T ts = | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 98 | let val U = Term.range_type (Term.range_type T) | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 99 | in | 
| 57696 
fb71c6f100f8
do not embed 'nat' into 'int's in 'smt2' method -- this is highly inefficient and decreases the Sledgehammer success rate significantly
 blanchet parents: 
57553diff
changeset | 100 | (case (try (snd o HOLogic.dest_number o hd) ts, try dest_wordT U) of | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 101 | (SOME lb, SOME i) => | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 102 | SOME (index2 n (i + lb - 1) lb, 1, tl ts, mk_extract (m, T) lb) | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 103 | | _ => NONE) | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 104 | end | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 105 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 106 | fun mk_extend c ts = Term.list_comb (Const c, ts) | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 107 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 108 | fun extend m n T ts = | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 109 | let val (U1, U2) = Term.dest_funT T | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 110 | in | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 111 | (case (try dest_wordT U1, try dest_wordT U2) of | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 112 | (SOME i, SOME j) => | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 113 | if j-i >= 0 then SOME (index1 n (j-i), 1, ts, mk_extend (m, T)) | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 114 | else NONE | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 115 | | _ => NONE) | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 116 | end | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 117 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 118 | fun mk_rotate c i ts = Term.list_comb (Const c, mk_nat i :: ts) | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 119 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 120 | fun rotate m n T ts = | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 121 | let val U = Term.domain_type (Term.range_type T) | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 122 | in | 
| 57696 
fb71c6f100f8
do not embed 'nat' into 'int's in 'smt2' method -- this is highly inefficient and decreases the Sledgehammer success rate significantly
 blanchet parents: 
57553diff
changeset | 123 | (case (can dest_wordT U, try (snd o HOLogic.dest_number o hd) ts) of | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 124 | (true, SOME i) => SOME (index1 n i, 1, tl ts, mk_rotate (m, T) i) | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 125 | | _ => NONE) | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 126 | end | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 127 | in | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 128 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 129 | val setup_builtins = | 
| 58061 | 130 | SMT_Builtin.add_builtin_typ smtlibC (wordT, word_typ, word_num) #> | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 131 | fold (add_word_fun if_fixed_all) [ | 
| 69597 | 132 | (\<^term>\<open>uminus :: 'a::len word \<Rightarrow> _\<close>, "bvneg"), | 
| 133 | (\<^term>\<open>plus :: 'a::len word \<Rightarrow> _\<close>, "bvadd"), | |
| 134 | (\<^term>\<open>minus :: 'a::len word \<Rightarrow> _\<close>, "bvsub"), | |
| 135 | (\<^term>\<open>times :: 'a::len word \<Rightarrow> _\<close>, "bvmul"), | |
| 74097 | 136 | (\<^term>\<open>not :: 'a::len word \<Rightarrow> _\<close>, "bvnot"), | 
| 137 | (\<^term>\<open>and :: 'a::len word \<Rightarrow> _\<close>, "bvand"), | |
| 138 | (\<^term>\<open>or :: 'a::len word \<Rightarrow> _\<close>, "bvor"), | |
| 139 | (\<^term>\<open>xor :: 'a::len word \<Rightarrow> _\<close>, "bvxor"), | |
| 69597 | 140 | (\<^term>\<open>word_cat :: 'a::len word \<Rightarrow> _\<close>, "concat") ] #> | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 141 | fold (add_word_fun shift) [ | 
| 72489 | 142 | (\<^term>\<open>push_bit :: nat \<Rightarrow> 'a::len word \<Rightarrow> _ \<close>, "bvshl"), | 
| 143 | (\<^term>\<open>drop_bit :: nat \<Rightarrow> 'a::len word \<Rightarrow> _\<close>, "bvlshr"), | |
| 144 | (\<^term>\<open>signed_drop_bit :: nat \<Rightarrow> 'a::len word \<Rightarrow> _\<close>, "bvashr") ] #> | |
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 145 | add_word_fun extract | 
| 69597 | 146 | (\<^term>\<open>slice :: _ \<Rightarrow> 'a::len word \<Rightarrow> _\<close>, "extract") #> | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 147 | fold (add_word_fun extend) [ | 
| 69597 | 148 | (\<^term>\<open>ucast :: 'a::len word \<Rightarrow> _\<close>, "zero_extend"), | 
| 149 | (\<^term>\<open>scast :: 'a::len word \<Rightarrow> _\<close>, "sign_extend") ] #> | |
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 150 | fold (add_word_fun rotate) [ | 
| 69597 | 151 | (\<^term>\<open>word_rotl\<close>, "rotate_left"), | 
| 152 | (\<^term>\<open>word_rotr\<close>, "rotate_right") ] #> | |
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 153 | fold (add_word_fun if_fixed_args) [ | 
| 69597 | 154 | (\<^term>\<open>less :: 'a::len word \<Rightarrow> _\<close>, "bvult"), | 
| 155 | (\<^term>\<open>less_eq :: 'a::len word \<Rightarrow> _\<close>, "bvule"), | |
| 156 | (\<^term>\<open>word_sless\<close>, "bvslt"), | |
| 157 | (\<^term>\<open>word_sle\<close>, "bvsle") ] | |
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 158 | |
| 72508 | 159 | val add_word_shift' = add_word_fun shift' | 
| 160 | ||
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 161 | end | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 162 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 163 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 164 | (* setup *) | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 165 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 166 | val _ = Theory.setup (Context.theory_map ( | 
| 58061 | 167 | SMTLIB_Interface.add_logic (20, smtlib_logic) #> | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 168 | setup_builtins)) | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 169 | |
| 57229 | 170 | end; |