| author | nipkow | 
| Tue, 27 Feb 2024 11:59:47 +0100 | |
| changeset 79737 | 9c00a46d69d0 | 
| parent 78177 | ea7a3cc64df5 | 
| child 80910 | 406a85a25189 | 
| permissions | -rw-r--r-- | 
| 58061 | 1 | (* Title: HOL/Tools/SMT/smt_config.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 | Configuration options and diagnostic tools for SMT. | 
| 
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 | |
| 58061 | 7 | signature SMT_CONFIG = | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 8 | sig | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 9 | (*solver*) | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 10 |   type solver_info = {
 | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 11 | name: string, | 
| 58061 | 12 | class: Proof.context -> SMT_Util.class, | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 13 | avail: unit -> bool, | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 14 | options: Proof.context -> string list } | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 15 | val add_solver: solver_info -> Context.generic -> Context.generic | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 16 | val set_solver_options: string * string -> Context.generic -> Context.generic | 
| 75036 | 17 | val all_solvers_of: Proof.context -> string list | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 18 | val is_available: Proof.context -> string -> bool | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 19 | val available_solvers_of: Proof.context -> string list | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 20 | val select_solver: string -> Context.generic -> Context.generic | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 21 | val solver_of: Proof.context -> string | 
| 58061 | 22 | val solver_class_of: Proof.context -> SMT_Util.class | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 23 | val solver_options_of: Proof.context -> string list | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 24 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 25 | (*options*) | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 26 | val oracle: bool Config.T | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 27 | val timeout: real Config.T | 
| 59213 
ef5e68575bc4
limit reconstruction time of Z3 proof steps to be able to detect long-running reconstruction steps
 boehmes parents: 
58893diff
changeset | 28 | val reconstruction_step_timeout: real Config.T | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 29 | val random_seed: int Config.T | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 30 | val read_only_certificates: bool Config.T | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 31 | val verbose: bool Config.T | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 32 | val trace: bool Config.T | 
| 59215 
35c13f4995b1
optionally display statistics for Z3 proof reconstruction
 boehmes parents: 
59214diff
changeset | 33 | val statistics: bool Config.T | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 34 | val monomorph_limit: int Config.T | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 35 | val monomorph_instances: int Config.T | 
| 66738 
793e7a9c30c5
properly take quantifiers into account (cf. my Ph.D. thesis, Section 6.4.1) and offer three modes of completeness (for experiments mostly)
 blanchet parents: 
66551diff
changeset | 36 | val explicit_application: int Config.T | 
| 66551 | 37 | val higher_order: bool Config.T | 
| 74817 
1fd8705503b4
generate problems with correct logic for veriT
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: 
74561diff
changeset | 38 | val native_bv: bool Config.T | 
| 66298 | 39 | val nat_as_int: bool Config.T | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 40 | val infer_triggers: bool Config.T | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 41 | val debug_files: string Config.T | 
| 56816 
2f3756ccba41
use internal proof-producing SAT solver for more efficient SMT proof replay
 boehmes parents: 
56294diff
changeset | 42 | val sat_solver: string Config.T | 
| 72458 
b44e894796d5
add reconstruction for the SMT solver veriT
 Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: 
72343diff
changeset | 43 | val compress_verit_proofs: Proof.context -> bool | 
| 56078 
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 | (*tools*) | 
| 73388 
a40e69fde2b4
clarified smt: support Timeout.ignored and Timeout.scale_time;
 wenzelm parents: 
72908diff
changeset | 46 | val get_timeout: Proof.context -> Time.time option | 
| 59213 
ef5e68575bc4
limit reconstruction time of Z3 proof steps to be able to detect long-running reconstruction steps
 boehmes parents: 
58893diff
changeset | 47 |   val with_time_limit: Proof.context -> real Config.T -> ('a -> 'b) -> 'a -> 'b
 | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 48 |   val with_timeout: Proof.context -> ('a -> 'b) -> 'a -> 'b
 | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 49 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 50 | (*diagnostics*) | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 51 |   val trace_msg: Proof.context -> ('a -> string) -> 'a -> unit
 | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 52 |   val verbose_msg: Proof.context -> ('a -> string) -> 'a -> unit
 | 
| 59215 
35c13f4995b1
optionally display statistics for Z3 proof reconstruction
 boehmes parents: 
59214diff
changeset | 53 |   val statistics_msg: Proof.context -> ('a -> string) -> 'a -> unit
 | 
| 72458 
b44e894796d5
add reconstruction for the SMT solver veriT
 Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: 
72343diff
changeset | 54 | val verit_msg: Proof.context -> (unit -> 'a) -> unit | 
| 
b44e894796d5
add reconstruction for the SMT solver veriT
 Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: 
72343diff
changeset | 55 | val verit_arith_msg: Proof.context -> (unit -> 'a) -> unit | 
| 
b44e894796d5
add reconstruction for the SMT solver veriT
 Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: 
72343diff
changeset | 56 | val spy_verit: Proof.context -> bool | 
| 
b44e894796d5
add reconstruction for the SMT solver veriT
 Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: 
72343diff
changeset | 57 | val spy_Z3: Proof.context -> bool | 
| 78177 
ea7a3cc64df5
early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
 Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: 
75063diff
changeset | 58 | val use_lethe_proof_from_cvc: Proof.context -> bool | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 59 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 60 | (*certificates*) | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 61 | val select_certificates: string -> Context.generic -> Context.generic | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 62 | val certificates_of: Proof.context -> Cache_IO.cache option | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 63 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 64 | (*setup*) | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 65 | val print_setup: Proof.context -> unit | 
| 57229 | 66 | end; | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 67 | |
| 58061 | 68 | structure SMT_Config: SMT_CONFIG = | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 69 | struct | 
| 
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 | (* solver *) | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 72 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 73 | type solver_info = {
 | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 74 | name: string, | 
| 58061 | 75 | class: Proof.context -> SMT_Util.class, | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 76 | avail: unit -> bool, | 
| 56090 | 77 | options: Proof.context -> string list} | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 78 | |
| 59214 | 79 | type data = {
 | 
| 80 | solvers: (solver_info * string list) Symtab.table, | |
| 81 | solver: string option, | |
| 82 | certs: Cache_IO.cache option} | |
| 83 | ||
| 84 | fun mk_data solvers solver certs: data = {solvers=solvers, solver=solver, certs=certs}
 | |
| 85 | ||
| 86 | val empty_data = mk_data Symtab.empty NONE NONE | |
| 87 | ||
| 88 | fun solvers_of ({solvers, ...}: data) = solvers
 | |
| 89 | fun solver_of ({solver, ...}: data) = solver
 | |
| 90 | fun certs_of ({certs, ...}: data) = certs
 | |
| 91 | ||
| 92 | fun map_solvers f ({solvers, solver, certs}: data) = mk_data (f solvers) solver certs
 | |
| 93 | fun map_solver f ({solvers, solver, certs}: data) = mk_data solvers (f solver) certs
 | |
| 94 | fun put_certs c ({solvers, solver, ...}: data) = mk_data solvers solver c
 | |
| 95 | ||
| 96 | fun merge_data ({solvers=ss1,solver=s1,certs=c1}: data, {solvers=ss2,solver=s2,certs=c2}: data) =
 | |
| 97 | mk_data (Symtab.merge (K true) (ss1, ss2)) (merge_options (s1, s2)) (merge_options (c1, c2)) | |
| 98 | ||
| 99 | structure Data = Generic_Data | |
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 100 | ( | 
| 59214 | 101 | type T = data | 
| 102 | val empty = empty_data | |
| 103 | val merge = merge_data | |
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 104 | ) | 
| 
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 set_solver_options (name, options) = | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 107 | let val opts = String.tokens (Symbol.is_ascii_blank o str) options | 
| 59214 | 108 | in Data.map (map_solvers (Symtab.map_entry name (apsnd (K opts)))) end | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 109 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 110 | fun add_solver (info as {name, ...} : solver_info) context =
 | 
| 59214 | 111 | if Symtab.defined (solvers_of (Data.get context)) name then | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 112 |     error ("Solver already registered: " ^ quote name)
 | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 113 | else | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 114 | context | 
| 59214 | 115 | |> Data.map (map_solvers (Symtab.update (name, (info, [])))) | 
| 58061 | 116 | |> Context.map_theory (Attrib.setup (Binding.name (name ^ "_options")) | 
| 67149 | 117 | (Scan.lift (\<^keyword>\<open>=\<close> |-- Args.name) >> | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 118 | (Thm.declaration_attribute o K o set_solver_options o pair name)) | 
| 75063 
7ff39293e265
added possibility of extra options to SMT slices
 blanchet parents: 
75036diff
changeset | 119 |         ("additional command-line options for SMT solver " ^ quote name))
 | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 120 | |
| 59214 | 121 | fun all_solvers_of ctxt = Symtab.keys (solvers_of (Data.get (Context.Proof ctxt))) | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 122 | |
| 59214 | 123 | fun solver_name_of ctxt = solver_of (Data.get (Context.Proof ctxt)) | 
| 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 | fun is_available ctxt name = | 
| 59214 | 126 | (case Symtab.lookup (solvers_of (Data.get (Context.Proof ctxt))) name of | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 127 |     SOME ({avail, ...}, _) => avail ()
 | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 128 | | NONE => false) | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 129 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 130 | fun available_solvers_of ctxt = | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 131 | filter (is_available ctxt) (all_solvers_of ctxt) | 
| 
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 warn_solver (Context.Proof ctxt) name = | 
| 56294 
85911b8a6868
prefer Context_Position where a context is available;
 wenzelm parents: 
56208diff
changeset | 134 | if Context_Position.is_visible ctxt then | 
| 57199 | 135 |         warning ("The SMT solver " ^ quote name ^ " is not installed")
 | 
| 56294 
85911b8a6868
prefer Context_Position where a context is available;
 wenzelm parents: 
56208diff
changeset | 136 | else () | 
| 57199 | 137 | | warn_solver _ _ = () | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 138 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 139 | fun select_solver name context = | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 140 | let | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 141 | val ctxt = Context.proof_of context | 
| 59214 | 142 | val upd = Data.map (map_solver (K (SOME name))) | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 143 | in | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 144 | if not (member (op =) (all_solvers_of ctxt) name) then | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 145 |       error ("Trying to select unknown solver: " ^ quote name)
 | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 146 | else if not (is_available ctxt name) then | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 147 | (warn_solver context name; upd context) | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 148 | else upd context | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 149 | end | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 150 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 151 | fun no_solver_err () = error "No SMT solver selected" | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 152 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 153 | fun solver_of ctxt = | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 154 | (case solver_name_of ctxt of | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 155 | SOME name => name | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 156 | | NONE => no_solver_err ()) | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 157 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 158 | fun solver_info_of default select ctxt = | 
| 59214 | 159 | (case solver_name_of ctxt of | 
| 160 | NONE => default () | |
| 161 | | SOME name => select (Symtab.lookup (solvers_of (Data.get (Context.Proof ctxt))) name)) | |
| 56078 
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 | fun solver_class_of ctxt = | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 164 |   let fun class_of ({class, ...}: solver_info, _) = class ctxt
 | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 165 | in solver_info_of no_solver_err (class_of o the) ctxt end | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 166 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 167 | fun solver_options_of ctxt = | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 168 | let | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 169 | fun all_options NONE = [] | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 170 |       | all_options (SOME ({options, ...} : solver_info, opts)) =
 | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 171 | opts @ options ctxt | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 172 | in solver_info_of (K []) all_options ctxt end | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 173 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 174 | val setup_solver = | 
| 67149 | 175 | Attrib.setup \<^binding>\<open>smt_solver\<close> | 
| 176 | (Scan.lift (\<^keyword>\<open>=\<close> |-- Args.name) >> | |
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 177 | (Thm.declaration_attribute o K o select_solver)) | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 178 | "SMT solver configuration" | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 179 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 180 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 181 | (* options *) | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 182 | |
| 67149 | 183 | val oracle = Attrib.setup_config_bool \<^binding>\<open>smt_oracle\<close> (K true) | 
| 73389 | 184 | val timeout = Attrib.setup_config_real \<^binding>\<open>smt_timeout\<close> (K 0.0) | 
| 67149 | 185 | val reconstruction_step_timeout = Attrib.setup_config_real \<^binding>\<open>smt_reconstruction_step_timeout\<close> (K 10.0) | 
| 186 | val random_seed = Attrib.setup_config_int \<^binding>\<open>smt_random_seed\<close> (K 1) | |
| 187 | val read_only_certificates = Attrib.setup_config_bool \<^binding>\<open>smt_read_only_certificates\<close> (K false) | |
| 188 | val verbose = Attrib.setup_config_bool \<^binding>\<open>smt_verbose\<close> (K true) | |
| 189 | val trace = Attrib.setup_config_bool \<^binding>\<open>smt_trace\<close> (K false) | |
| 72458 
b44e894796d5
add reconstruction for the SMT solver veriT
 Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: 
72343diff
changeset | 190 | val trace_verit = Attrib.setup_config_bool \<^binding>\<open>smt_debug_verit\<close> (K false) | 
| 
b44e894796d5
add reconstruction for the SMT solver veriT
 Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: 
72343diff
changeset | 191 | val spy_verit_attr = Attrib.setup_config_bool \<^binding>\<open>smt_spy_verit\<close> (K false) | 
| 
b44e894796d5
add reconstruction for the SMT solver veriT
 Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: 
72343diff
changeset | 192 | val spy_z3 = Attrib.setup_config_bool \<^binding>\<open>smt_spy_z3\<close> (K false) | 
| 
b44e894796d5
add reconstruction for the SMT solver veriT
 Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: 
72343diff
changeset | 193 | val trace_arith_verit = Attrib.setup_config_bool \<^binding>\<open>smt_debug_arith_verit\<close> (K false) | 
| 72908 
6a26a955308e
improve and activate compression for veriT proof reconstruction
 Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: 
72511diff
changeset | 194 | val trace_verit_compression = Attrib.setup_config_bool \<^binding>\<open>verit_compress_proofs\<close> (K true) | 
| 67149 | 195 | val statistics = Attrib.setup_config_bool \<^binding>\<open>smt_statistics\<close> (K false) | 
| 196 | val monomorph_limit = Attrib.setup_config_int \<^binding>\<open>smt_monomorph_limit\<close> (K 10) | |
| 197 | val monomorph_instances = Attrib.setup_config_int \<^binding>\<open>smt_monomorph_instances\<close> (K 500) | |
| 198 | val explicit_application = Attrib.setup_config_int \<^binding>\<open>smt_explicit_application\<close> (K 1) | |
| 199 | val higher_order = Attrib.setup_config_bool \<^binding>\<open>smt_higher_order\<close> (K false) | |
| 74817 
1fd8705503b4
generate problems with correct logic for veriT
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: 
74561diff
changeset | 200 | val native_bv = Attrib.setup_config_bool \<^binding>\<open>native_bv\<close> (K true) | 
| 67149 | 201 | val nat_as_int = Attrib.setup_config_bool \<^binding>\<open>smt_nat_as_int\<close> (K false) | 
| 202 | val infer_triggers = Attrib.setup_config_bool \<^binding>\<open>smt_infer_triggers\<close> (K false) | |
| 203 | val debug_files = Attrib.setup_config_string \<^binding>\<open>smt_debug_files\<close> (K "") | |
| 204 | val sat_solver = Attrib.setup_config_string \<^binding>\<open>smt_sat_solver\<close> (K "cdclite") | |
| 78177 
ea7a3cc64df5
early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
 Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: 
75063diff
changeset | 205 | val cvc_experimental_lethe = Attrib.setup_config_bool \<^binding>\<open>smt_cvc_lethe\<close> (K false) | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 206 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 207 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 208 | (* diagnostics *) | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 209 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 210 | fun cond_trace flag f x = if flag then tracing ("SMT: " ^ f x) else ()
 | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 211 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 212 | fun verbose_msg ctxt = cond_trace (Config.get ctxt verbose) | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 213 | fun trace_msg ctxt = cond_trace (Config.get ctxt trace) | 
| 59215 
35c13f4995b1
optionally display statistics for Z3 proof reconstruction
 boehmes parents: 
59214diff
changeset | 214 | fun statistics_msg ctxt = cond_trace (Config.get ctxt statistics) | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 215 | |
| 72458 
b44e894796d5
add reconstruction for the SMT solver veriT
 Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: 
72343diff
changeset | 216 | fun verit_msg ctxt (x : unit -> 'a) = if (Config.get ctxt trace_verit) then ignore(x ()) else () | 
| 
b44e894796d5
add reconstruction for the SMT solver veriT
 Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: 
72343diff
changeset | 217 | fun verit_arith_msg ctxt (x : unit -> 'a) = if (Config.get ctxt trace_arith_verit) then ignore(x ()) else () | 
| 
b44e894796d5
add reconstruction for the SMT solver veriT
 Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: 
72343diff
changeset | 218 | |
| 
b44e894796d5
add reconstruction for the SMT solver veriT
 Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: 
72343diff
changeset | 219 | fun spy_verit ctxt = Config.get ctxt spy_verit_attr | 
| 
b44e894796d5
add reconstruction for the SMT solver veriT
 Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: 
72343diff
changeset | 220 | fun spy_Z3 ctxt = Config.get ctxt spy_z3 | 
| 
b44e894796d5
add reconstruction for the SMT solver veriT
 Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: 
72343diff
changeset | 221 | fun compress_verit_proofs ctxt = Config.get ctxt trace_verit_compression | 
| 69205 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: 
67149diff
changeset | 222 | |
| 78177 
ea7a3cc64df5
early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
 Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: 
75063diff
changeset | 223 | fun use_lethe_proof_from_cvc ctxt = Config.get ctxt cvc_experimental_lethe | 
| 
ea7a3cc64df5
early inclusion of cvc5 proof reconstruction; slightly reorganize smt/z3_reals;
 Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: 
75063diff
changeset | 224 | |
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 225 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 226 | (* tools *) | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 227 | |
| 73388 
a40e69fde2b4
clarified smt: support Timeout.ignored and Timeout.scale_time;
 wenzelm parents: 
72908diff
changeset | 228 | fun get_timeout ctxt = | 
| 
a40e69fde2b4
clarified smt: support Timeout.ignored and Timeout.scale_time;
 wenzelm parents: 
72908diff
changeset | 229 | let val t = seconds (Config.get ctxt timeout); | 
| 
a40e69fde2b4
clarified smt: support Timeout.ignored and Timeout.scale_time;
 wenzelm parents: 
72908diff
changeset | 230 | in if Timeout.ignored t then NONE else SOME (Timeout.scale_time t) end; | 
| 
a40e69fde2b4
clarified smt: support Timeout.ignored and Timeout.scale_time;
 wenzelm parents: 
72908diff
changeset | 231 | |
| 59213 
ef5e68575bc4
limit reconstruction time of Z3 proof steps to be able to detect long-running reconstruction steps
 boehmes parents: 
58893diff
changeset | 232 | fun with_time_limit ctxt timeout_config f x = | 
| 62519 | 233 | Timeout.apply (seconds (Config.get ctxt timeout_config)) f x | 
| 234 | handle Timeout.TIMEOUT _ => raise SMT_Failure.SMT SMT_Failure.Time_Out | |
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 235 | |
| 59213 
ef5e68575bc4
limit reconstruction time of Z3 proof steps to be able to detect long-running reconstruction steps
 boehmes parents: 
58893diff
changeset | 236 | fun with_timeout ctxt = with_time_limit ctxt timeout | 
| 
ef5e68575bc4
limit reconstruction time of Z3 proof steps to be able to detect long-running reconstruction steps
 boehmes parents: 
58893diff
changeset | 237 | |
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 238 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 239 | (* certificates *) | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 240 | |
| 59214 | 241 | val certificates_of = certs_of o Data.get o Context.Proof | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 242 | |
| 59214 | 243 | val get_certificates_path = Option.map (Cache_IO.cache_path_of) o certificates_of | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 244 | |
| 59214 | 245 | fun select_certificates name context = context |> Data.map (put_certs ( | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 246 | if name = "" then NONE | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 247 | else | 
| 72511 
460d743010bc
clarified signature: overloaded "+" for Path.append;
 wenzelm parents: 
72458diff
changeset | 248 | (Resources.master_directory (Context.theory_of context) + Path.explode name) | 
| 59214 | 249 | |> SOME o Cache_IO.unsynchronized_init)) | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 250 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 251 | val setup_certificates = | 
| 67149 | 252 | Attrib.setup \<^binding>\<open>smt_certificates\<close> | 
| 253 | (Scan.lift (\<^keyword>\<open>=\<close> |-- Args.name) >> | |
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 254 | (Thm.declaration_attribute o K o select_certificates)) | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 255 | "SMT certificates configuration" | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 256 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 257 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 258 | (* setup *) | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 259 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 260 | val _ = Theory.setup ( | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 261 | setup_solver #> | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 262 | setup_certificates) | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 263 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 264 | fun print_setup ctxt = | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 265 | let | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 266 | fun string_of_bool b = if b then "true" else "false" | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 267 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 268 | val names = available_solvers_of ctxt | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 269 | val ns = if null names then ["(none)"] else sort_strings names | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 270 | val n = the_default "(none)" (solver_name_of ctxt) | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 271 | val opts = solver_options_of ctxt | 
| 57230 | 272 | |
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 273 | val t = string_of_real (Config.get ctxt timeout) | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 274 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 275 | val certs_filename = | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 276 | (case get_certificates_path ctxt of | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 277 | SOME path => Path.print path | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 278 | | NONE => "(disabled)") | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 279 | in | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 280 | Pretty.writeln (Pretty.big_list "SMT setup:" [ | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 281 |       Pretty.str ("Current SMT solver: " ^ n),
 | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 282 |       Pretty.str ("Current SMT solver options: " ^ space_implode " " opts),
 | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 283 | Pretty.str_list "Available SMT solvers: " "" ns, | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 284 |       Pretty.str ("Current timeout: " ^ t ^ " seconds"),
 | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 285 |       Pretty.str ("With proofs: " ^
 | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 286 | string_of_bool (not (Config.get ctxt oracle))), | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 287 |       Pretty.str ("Certificates cache: " ^ certs_filename),
 | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 288 |       Pretty.str ("Fixed certificates: " ^
 | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 289 | string_of_bool (Config.get ctxt read_only_certificates))]) | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 290 | end | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 291 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 292 | val _ = | 
| 67149 | 293 | Outer_Syntax.command \<^command_keyword>\<open>smt_status\<close> | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 294 | "show the available SMT solvers, the currently selected SMT solver, \ | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 295 | \and the values of SMT configuration options" | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 296 | (Scan.succeed (Toplevel.keep (print_setup o Toplevel.context_of))) | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 297 | |
| 57229 | 298 | end; |