| author | wenzelm | 
| Sat, 28 Sep 2024 16:11:30 +0200 | |
| changeset 80987 | e7a926b5b5be | 
| parent 80910 | 406a85a25189 | 
| child 83191 | 76878779e355 | 
| permissions | -rw-r--r-- | 
| 58061 | 1 | (* Title: HOL/Tools/SMT/smtlib_interface.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 | Author: Jasmin Blanchette, TU Muenchen | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 4 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 5 | Interface to SMT solvers based on the SMT-LIB 2 format. | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 6 | *) | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 7 | |
| 58061 | 8 | signature SMTLIB_INTERFACE = | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 9 | sig | 
| 58061 | 10 | val smtlibC: SMT_Util.class | 
| 66551 | 11 | val hosmtlibC: SMT_Util.class | 
| 74817 
1fd8705503b4
generate problems with correct logic for veriT
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: 
74561diff
changeset | 12 | val bvsmlibC: SMT_Util.class | 
| 78177 
ea7a3cc64df5
early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
 Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: 
75365diff
changeset | 13 | val realsmlibC: SMT_Util.class | 
| 74817 
1fd8705503b4
generate problems with correct logic for veriT
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: 
74561diff
changeset | 14 | val add_logic: int * (string -> term list -> string option) -> Context.generic -> Context.generic | 
| 
1fd8705503b4
generate problems with correct logic for veriT
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: 
74561diff
changeset | 15 | val del_logic: int * (string -> term list -> string option) -> Context.generic -> Context.generic | 
| 66551 | 16 | val translate_config: SMT_Util.order -> Proof.context -> SMT_Translate.config | 
| 75274 
e89709b80b6e
used more descriptive assert names in SMT-Lib output
 desharna parents: 
74817diff
changeset | 17 | val assert_name_of_role_and_index: SMT_Util.role -> int -> string | 
| 
e89709b80b6e
used more descriptive assert names in SMT-Lib output
 desharna parents: 
74817diff
changeset | 18 | val role_and_index_of_assert_name: string -> SMT_Util.role * int | 
| 57229 | 19 | end; | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 20 | |
| 58061 | 21 | structure SMTLIB_Interface: SMTLIB_INTERFACE = | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 22 | struct | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 23 | |
| 66551 | 24 | val hoC = ["ho"] | 
| 25 | ||
| 26 | val smtlibC = ["smtlib"] (* SMT-LIB 2 *) | |
| 27 | val hosmtlibC = smtlibC @ hoC (* possibly SMT-LIB 3 *) | |
| 74817 
1fd8705503b4
generate problems with correct logic for veriT
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: 
74561diff
changeset | 28 | val bvsmlibC = smtlibC @ ["BV"] (* if BV are supported *) | 
| 78177 
ea7a3cc64df5
early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
 Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: 
75365diff
changeset | 29 | val realsmlibC = ["Real"] | 
| 56078 
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 | (* builtins *) | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 32 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 33 | local | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 34 | fun int_num _ i = SOME (string_of_int i) | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 35 | |
| 58061 | 36 | fun is_linear [t] = SMT_Util.is_number t | 
| 37 | | is_linear [t, u] = SMT_Util.is_number t orelse SMT_Util.is_number u | |
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 38 | | is_linear _ = false | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 39 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 40 | fun times _ _ ts = | 
| 74382 | 41 | let val mk = Term.list_comb o pair \<^Const>\<open>times \<^Type>\<open>int\<close>\<close> | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 42 |     in if is_linear ts then SOME ("*", 2, ts, mk) else NONE end
 | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 43 | in | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 44 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 45 | val setup_builtins = | 
| 66551 | 46 | SMT_Builtin.add_builtin_typ hosmtlibC | 
| 69593 | 47 |     (\<^typ>\<open>'a => 'b\<close>, fn Type (\<^type_name>\<open>fun\<close>, Ts) => SOME ("->", Ts), K (K NONE)) #>
 | 
| 58061 | 48 | fold (SMT_Builtin.add_builtin_typ smtlibC) [ | 
| 69593 | 49 |     (\<^typ>\<open>bool\<close>, K (SOME ("Bool", [])), K (K NONE)),
 | 
| 50 |     (\<^typ>\<open>int\<close>, K (SOME ("Int", [])), int_num)] #>
 | |
| 58061 | 51 | fold (SMT_Builtin.add_builtin_fun' smtlibC) [ | 
| 74382 | 52 | (\<^Const>\<open>True\<close>, "true"), | 
| 53 | (\<^Const>\<open>False\<close>, "false"), | |
| 54 | (\<^Const>\<open>Not\<close>, "not"), | |
| 55 | (\<^Const>\<open>conj\<close>, "and"), | |
| 56 | (\<^Const>\<open>disj\<close>, "or"), | |
| 57 | (\<^Const>\<open>implies\<close>, "=>"), | |
| 58 | (\<^Const>\<open>HOL.eq \<^typ>\<open>'a\<close>\<close>, "="), | |
| 59 | (\<^Const>\<open>If \<^typ>\<open>'a\<close>\<close>, "ite"), | |
| 60 | (\<^Const>\<open>less \<^Type>\<open>int\<close>\<close>, "<"), | |
| 61 | (\<^Const>\<open>less_eq \<^Type>\<open>int\<close>\<close>, "<="), | |
| 62 | (\<^Const>\<open>uminus \<^Type>\<open>int\<close>\<close>, "-"), | |
| 63 | (\<^Const>\<open>plus \<^Type>\<open>int\<close>\<close>, "+"), | |
| 64 | (\<^Const>\<open>minus \<^Type>\<open>int\<close>\<close>, "-")] #> | |
| 58061 | 65 | SMT_Builtin.add_builtin_fun smtlibC | 
| 74382 | 66 | (Term.dest_Const \<^Const>\<open>times \<^Type>\<open>int\<close>\<close>, times) | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 67 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 68 | end | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 69 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 70 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 71 | (* serialization *) | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 72 | |
| 57238 | 73 | (** logic **) | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 74 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 75 | fun fst_int_ord ((i1, _), (i2, _)) = int_ord (i1, i2) | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 76 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 77 | structure Logics = Generic_Data | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 78 | ( | 
| 74817 
1fd8705503b4
generate problems with correct logic for veriT
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: 
74561diff
changeset | 79 | type T = (int * (string -> term list -> string option)) list | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 80 | val empty = [] | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 81 | fun merge data = Ord_List.merge fst_int_ord data | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 82 | ) | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 83 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 84 | fun add_logic pf = Logics.map (Ord_List.insert fst_int_ord pf) | 
| 74817 
1fd8705503b4
generate problems with correct logic for veriT
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: 
74561diff
changeset | 85 | fun del_logic pf = Logics.map (Ord_List.remove fst_int_ord pf) | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 86 | |
| 74817 
1fd8705503b4
generate problems with correct logic for veriT
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: 
74561diff
changeset | 87 | fun choose_logic ctxt prover ts = | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 88 | let | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 89 | fun choose [] = "AUFLIA" | 
| 74817 
1fd8705503b4
generate problems with correct logic for veriT
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: 
74561diff
changeset | 90 | | choose ((_, f) :: fs) = (case f prover ts of SOME s => s | NONE => choose fs) | 
| 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: 
57239diff
changeset | 91 | in | 
| 
2a6c31ac1c9a
don't generate a 'set-logic' command when generating problems in a non-standard (but Z3-supported) union-of-everything logic
 blanchet parents: 
57239diff
changeset | 92 | (case choose (Logics.get (Context.Proof ctxt)) of | 
| 
2a6c31ac1c9a
don't generate a 'set-logic' command when generating problems in a non-standard (but Z3-supported) union-of-everything logic
 blanchet parents: 
57239diff
changeset | 93 | "" => "" (* for default Z3 logic, a subset of everything *) | 
| 
2a6c31ac1c9a
don't generate a 'set-logic' command when generating problems in a non-standard (but Z3-supported) union-of-everything logic
 blanchet parents: 
57239diff
changeset | 94 | | logic => "(set-logic " ^ logic ^ ")\n") | 
| 
2a6c31ac1c9a
don't generate a 'set-logic' command when generating problems in a non-standard (but Z3-supported) union-of-everything logic
 blanchet parents: 
57239diff
changeset | 95 | end | 
| 56078 
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 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 98 | (** serialization **) | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 99 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 100 | fun var i = "?v" ^ string_of_int i | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 101 | |
| 66551 | 102 | fun tree_of_sterm l (SMT_Translate.SVar (i, [])) = SMTLIB.Sym (var (l - i - 1)) | 
| 103 | | tree_of_sterm l (SMT_Translate.SVar (i, ts)) = | |
| 104 | SMTLIB.S (SMTLIB.Sym (var (l - i - 1)) :: map (tree_of_sterm l) ts) | |
| 105 | | tree_of_sterm _ (SMT_Translate.SConst (n, [])) = SMTLIB.Sym n | |
| 106 | | tree_of_sterm l (SMT_Translate.SConst (n, ts)) = | |
| 58061 | 107 | SMTLIB.S (SMTLIB.Sym n :: map (tree_of_sterm l) ts) | 
| 108 | | tree_of_sterm l (SMT_Translate.SQua (q, ss, pats, t)) = | |
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 109 | let | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 110 | val l' = l + length ss | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 111 | |
| 58061 | 112 | fun quant_name SMT_Translate.SForall = "forall" | 
| 113 | | quant_name SMT_Translate.SExists = "exists" | |
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 114 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 115 | fun gen_trees_of_pat keyword ps = | 
| 59021 
b29281d6d1db
always generate patterns as lists of lists, to avoid confusing CVC4 (and stick to what SMT-LIB 2 actually says)
 blanchet parents: 
59015diff
changeset | 116 | [SMTLIB.Key keyword, SMTLIB.S (map (tree_of_sterm l') ps)] | 
| 58061 | 117 | fun trees_of_pat (SMT_Translate.SPat ps) = gen_trees_of_pat "pattern" ps | 
| 118 | | trees_of_pat (SMT_Translate.SNoPat ps) = gen_trees_of_pat "no-pattern" ps | |
| 57165 
7b1bf424ec5f
removed SMT weights -- their impact was very inconclusive anyway
 blanchet parents: 
56091diff
changeset | 119 | fun tree_of_pats [] t = t | 
| 58061 | 120 | | tree_of_pats pats t = SMTLIB.S (SMTLIB.Sym "!" :: t :: maps trees_of_pat pats) | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 121 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 122 | val vs = map_index (fn (i, ty) => | 
| 58061 | 123 | SMTLIB.S [SMTLIB.Sym (var (l + i)), SMTLIB.Sym ty]) ss | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 124 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 125 | val body = t | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 126 | |> tree_of_sterm l' | 
| 57165 
7b1bf424ec5f
removed SMT weights -- their impact was very inconclusive anyway
 blanchet parents: 
56091diff
changeset | 127 | |> tree_of_pats pats | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 128 | in | 
| 58061 | 129 | SMTLIB.S [SMTLIB.Sym (quant_name q), SMTLIB.S vs, body] | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 130 | end | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 131 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 132 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 133 | fun sctrarg (sel, typ) = "(" ^ sel ^ " " ^ typ ^ ")"
 | 
| 80910 | 134 | fun sctr (name, args) = enclose "(" ")" (implode_space (name :: map sctrarg args))
 | 
| 135 | fun sdatatype (name, ctrs) = enclose "(" ")" (implode_space (name :: map sctr ctrs))
 | |
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 136 | |
| 80910 | 137 | fun string_of_fun (f, (ss, s)) = f ^ " (" ^ implode_space ss ^ ") " ^ s
 | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 138 | |
| 58061 | 139 | fun named_sterm s t = SMTLIB.S [SMTLIB.Sym "!", t, SMTLIB.Key "named", SMTLIB.Sym s] | 
| 57203 
171fa7d56c4f
generate ':named' attributes in SMT-LIB 2 problems, to facilitate reconstruction
 blanchet parents: 
57165diff
changeset | 140 | |
| 75274 
e89709b80b6e
used more descriptive assert names in SMT-Lib output
 desharna parents: 
74817diff
changeset | 141 | val conjecture_prefix = "conjecture" (* FUDGE *) | 
| 
e89709b80b6e
used more descriptive assert names in SMT-Lib output
 desharna parents: 
74817diff
changeset | 142 | val hypothesis_prefix = "hypothesis" (* FUDGE *) | 
| 78177 
ea7a3cc64df5
early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
 Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: 
75365diff
changeset | 143 | val axiom_prefix = "a" (* matching Alethe's convention *) | 
| 75274 
e89709b80b6e
used more descriptive assert names in SMT-Lib output
 desharna parents: 
74817diff
changeset | 144 | |
| 
e89709b80b6e
used more descriptive assert names in SMT-Lib output
 desharna parents: 
74817diff
changeset | 145 | fun assert_prefix_of_role SMT_Util.Conjecture = conjecture_prefix | 
| 
e89709b80b6e
used more descriptive assert names in SMT-Lib output
 desharna parents: 
74817diff
changeset | 146 | | assert_prefix_of_role SMT_Util.Hypothesis = hypothesis_prefix | 
| 
e89709b80b6e
used more descriptive assert names in SMT-Lib output
 desharna parents: 
74817diff
changeset | 147 | | assert_prefix_of_role SMT_Util.Axiom = axiom_prefix | 
| 57203 
171fa7d56c4f
generate ':named' attributes in SMT-LIB 2 problems, to facilitate reconstruction
 blanchet parents: 
57165diff
changeset | 148 | |
| 75274 
e89709b80b6e
used more descriptive assert names in SMT-Lib output
 desharna parents: 
74817diff
changeset | 149 | fun assert_name_of_role_and_index role i = assert_prefix_of_role role ^ string_of_int i | 
| 
e89709b80b6e
used more descriptive assert names in SMT-Lib output
 desharna parents: 
74817diff
changeset | 150 | |
| 
e89709b80b6e
used more descriptive assert names in SMT-Lib output
 desharna parents: 
74817diff
changeset | 151 | fun unprefix_axiom s = | 
| 
e89709b80b6e
used more descriptive assert names in SMT-Lib output
 desharna parents: 
74817diff
changeset | 152 | try (pair SMT_Util.Conjecture o unprefix conjecture_prefix) s | 
| 75365 | 153 | |> curry merge_options (try (pair SMT_Util.Hypothesis o unprefix hypothesis_prefix) s) | 
| 154 | |> curry merge_options (try (pair SMT_Util.Axiom o unprefix axiom_prefix) s) | |
| 75274 
e89709b80b6e
used more descriptive assert names in SMT-Lib output
 desharna parents: 
74817diff
changeset | 155 | |> the | 
| 
e89709b80b6e
used more descriptive assert names in SMT-Lib output
 desharna parents: 
74817diff
changeset | 156 | |
| 
e89709b80b6e
used more descriptive assert names in SMT-Lib output
 desharna parents: 
74817diff
changeset | 157 | fun role_and_index_of_assert_name s = | 
| 
e89709b80b6e
used more descriptive assert names in SMT-Lib output
 desharna parents: 
74817diff
changeset | 158 | apsnd (the_default ~1 o Int.fromString) (unprefix_axiom s) | 
| 57203 
171fa7d56c4f
generate ':named' attributes in SMT-LIB 2 problems, to facilitate reconstruction
 blanchet parents: 
57165diff
changeset | 159 | |
| 58429 
0b94858325a5
interleave (co)datatypes in the right order w.r.t. dependencies
 blanchet parents: 
58361diff
changeset | 160 | fun sdtyp (fp, dtyps) = | 
| 
0b94858325a5
interleave (co)datatypes in the right order w.r.t. dependencies
 blanchet parents: 
58361diff
changeset | 161 |   Buffer.add (enclose ("(declare-" ^ BNF_FP_Util.co_prefix fp ^ "datatypes () (") "))\n"
 | 
| 
0b94858325a5
interleave (co)datatypes in the right order w.r.t. dependencies
 blanchet parents: 
58361diff
changeset | 162 | (space_implode "\n " (map sdatatype dtyps))) | 
| 
0b94858325a5
interleave (co)datatypes in the right order w.r.t. dependencies
 blanchet parents: 
58361diff
changeset | 163 | |
| 
0b94858325a5
interleave (co)datatypes in the right order w.r.t. dependencies
 blanchet parents: 
58361diff
changeset | 164 | fun serialize smt_options comments {logic, sorts, dtyps, funcs} ts =
 | 
| 59015 | 165 | let | 
| 67405 
e9ab4ad7bd15
uniform use of Standard ML op-infix -- eliminated warnings;
 wenzelm parents: 
67399diff
changeset | 166 |     val unsat_core = member (op =) smt_options (":produce-unsat-cores", "true")
 | 
| 59015 | 167 | in | 
| 168 | Buffer.empty | |
| 169 | |> fold (Buffer.add o enclose "; " "\n") comments | |
| 170 |     |> fold (fn (k, v) => Buffer.add ("(set-option " ^ k ^ " " ^ v ^ ")\n")) smt_options
 | |
| 171 | |> Buffer.add logic | |
| 172 | |> fold (Buffer.add o enclose "(declare-sort " " 0)\n") (sort fast_string_ord sorts) | |
| 173 | |> fold sdtyp (AList.coalesce (op =) dtyps) | |
| 174 | |> fold (Buffer.add o enclose "(declare-fun " ")\n" o string_of_fun) | |
| 59058 
a78612c67ec0
renamed "pairself" to "apply2", in accordance to @{apply 2};
 wenzelm parents: 
59021diff
changeset | 175 | (sort (fast_string_ord o apply2 fst) funcs) | 
| 75274 
e89709b80b6e
used more descriptive assert names in SMT-Lib output
 desharna parents: 
74817diff
changeset | 176 | |> fold (fn (i, (role, t)) => Buffer.add (enclose "(assert " ")\n" | 
| 
e89709b80b6e
used more descriptive assert names in SMT-Lib output
 desharna parents: 
74817diff
changeset | 177 | (SMTLIB.str_of (named_sterm (assert_name_of_role_and_index role i) (tree_of_sterm 0 t))))) | 
| 
e89709b80b6e
used more descriptive assert names in SMT-Lib output
 desharna parents: 
74817diff
changeset | 178 | (map_index I ts) | 
| 59015 | 179 | |> Buffer.add "(check-sat)\n" | 
| 180 | |> Buffer.add (if unsat_core then "(get-unsat-core)\n" else "(get-proof)\n") | |
| 181 | |> Buffer.content | |
| 182 | end | |
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 183 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 184 | (* interface *) | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 185 | |
| 66551 | 186 | fun translate_config order ctxt = {
 | 
| 187 | order = order, | |
| 57238 | 188 | logic = choose_logic ctxt, | 
| 58360 | 189 | fp_kinds = [], | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 190 | serialize = serialize} | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 191 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 192 | val _ = Theory.setup (Context.theory_map | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 193 | (setup_builtins #> | 
| 66551 | 194 | SMT_Translate.add_config (smtlibC, translate_config SMT_Util.First_Order) #> | 
| 195 | SMT_Translate.add_config (hosmtlibC, translate_config SMT_Util.Higher_Order))) | |
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 196 | |
| 57229 | 197 | end; |