| author | wenzelm | 
| Tue, 27 Nov 2018 23:44:05 +0100 | |
| changeset 69353 | a6e83dcc00e6 | 
| parent 69205 | 8050734eee3e | 
| child 69593 | 3dda49e08b9d | 
| permissions | -rw-r--r-- | 
| 58061 | 1 | (* Title: HOL/Tools/SMT/smt_systems.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 | Setup SMT solvers. | 
| 
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_SYSTEMS = | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 8 | sig | 
| 59960 
372ddff01244
updated SMT module and Sledgehammer to fully open source Z3
 blanchet parents: 
59035diff
changeset | 9 | val cvc4_extensions: bool Config.T | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 10 | val z3_extensions: bool Config.T | 
| 57229 | 11 | end; | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 12 | |
| 58061 | 13 | structure SMT_Systems: SMT_SYSTEMS = | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 14 | struct | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 15 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 16 | (* helper functions *) | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 17 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 18 | fun make_avail name () = getenv (name ^ "_SOLVER") <> "" | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 19 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 20 | fun make_command name () = [getenv (name ^ "_SOLVER")] | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 21 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 22 | fun outcome_of unsat sat unknown solver_name line = | 
| 58061 | 23 | if String.isPrefix unsat line then SMT_Solver.Unsat | 
| 24 | else if String.isPrefix sat line then SMT_Solver.Sat | |
| 25 | else if String.isPrefix unknown line then SMT_Solver.Unknown | |
| 26 |   else raise SMT_Failure.SMT (SMT_Failure.Other_Failure ("Solver " ^ quote solver_name ^
 | |
| 27 | " failed -- enable tracing using the " ^ quote (Config.name_of SMT_Config.trace) ^ | |
| 56094 | 28 | " option for details")) | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 29 | |
| 60201 | 30 | fun is_blank_or_error_line "" = true | 
| 31 | | is_blank_or_error_line s = String.isPrefix "(error " s | |
| 32 | ||
| 57239 | 33 | fun on_first_line test_outcome solver_name lines = | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 34 | let | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 35 |     val split_first = (fn [] => ("", []) | l :: ls => (l, ls))
 | 
| 67522 | 36 | val (l, ls) = split_first (drop_prefix is_blank_or_error_line lines) | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 37 | in (test_outcome solver_name l, ls) end | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 38 | |
| 57704 | 39 | fun on_first_non_unsupported_line test_outcome solver_name lines = | 
| 67405 
e9ab4ad7bd15
uniform use of Standard ML op-infix -- eliminated warnings;
 wenzelm parents: 
67399diff
changeset | 40 | on_first_line test_outcome solver_name (filter (curry (op <>) "unsupported") lines) | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 41 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 42 | (* CVC3 *) | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 43 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 44 | local | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 45 | fun cvc3_options ctxt = [ | 
| 58061 | 46 | "-seed", string_of_int (Config.get ctxt SMT_Config.random_seed), | 
| 57239 | 47 | "-lang", "smt2", | 
| 58061 | 48 | "-timeout", string_of_int (Real.ceil (Config.get ctxt SMT_Config.timeout))] | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 49 | in | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 50 | |
| 58061 | 51 | val cvc3: SMT_Solver.solver_config = {
 | 
| 57209 
7ffa0f7e2775
removed '_new' sufffix in SMT2 solver names (in some cases)
 blanchet parents: 
57168diff
changeset | 52 | name = "cvc3", | 
| 58061 | 53 | class = K SMTLIB_Interface.smtlibC, | 
| 57210 
5d61d875076a
rationalized CVC3 and Yices environment variable -- no need (unlike for Z3) to distinguish between old and new versions
 blanchet parents: 
57209diff
changeset | 54 | avail = make_avail "CVC3", | 
| 
5d61d875076a
rationalized CVC3 and Yices environment variable -- no need (unlike for Z3) to distinguish between old and new versions
 blanchet parents: 
57209diff
changeset | 55 | command = make_command "CVC3", | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 56 | options = cvc3_options, | 
| 57239 | 57 | smt_options = [], | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 58 | default_max_relevant = 400 (* FUDGE *), | 
| 57239 | 59 | outcome = on_first_line (outcome_of "unsat" "sat" "unknown"), | 
| 57157 | 60 | parse_proof = NONE, | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 61 | replay = NONE } | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 62 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 63 | end | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 64 | |
| 66551 | 65 | |
| 57240 | 66 | (* CVC4 *) | 
| 67 | ||
| 58360 | 68 | val cvc4_extensions = Attrib.setup_config_bool @{binding cvc4_extensions} (K false)
 | 
| 69 | ||
| 57240 | 70 | local | 
| 71 | fun cvc4_options ctxt = [ | |
| 64461 
be149db8207a
disable CVC4 statistics, and hence crashes upon user interruptions
 blanchet parents: 
63102diff
changeset | 72 | "--no-statistics", | 
| 58061 | 73 | "--random-seed=" ^ string_of_int (Config.get ctxt SMT_Config.random_seed), | 
| 57240 | 74 | "--lang=smt2", | 
| 60201 | 75 | "--continued-execution", | 
| 58061 | 76 | "--tlimit", string_of_int (Real.ceil (1000.0 * Config.get ctxt SMT_Config.timeout))] | 
| 58360 | 77 | |
| 78 | fun select_class ctxt = | |
| 66551 | 79 | if Config.get ctxt cvc4_extensions then | 
| 80 | if Config.get ctxt SMT_Config.higher_order then | |
| 81 | CVC4_Interface.hosmtlib_cvc4C | |
| 82 | else | |
| 83 | CVC4_Interface.smtlib_cvc4C | |
| 84 | else | |
| 85 | if Config.get ctxt SMT_Config.higher_order then | |
| 86 | SMTLIB_Interface.hosmtlibC | |
| 87 | else | |
| 88 | SMTLIB_Interface.smtlibC | |
| 57240 | 89 | in | 
| 90 | ||
| 58061 | 91 | val cvc4: SMT_Solver.solver_config = {
 | 
| 57240 | 92 | name = "cvc4", | 
| 58360 | 93 | class = select_class, | 
| 57240 | 94 | avail = make_avail "CVC4", | 
| 95 | command = make_command "CVC4", | |
| 96 | options = cvc4_options, | |
| 59015 | 97 |   smt_options = [(":produce-unsat-cores", "true")],
 | 
| 57240 | 98 | default_max_relevant = 400 (* FUDGE *), | 
| 99 | outcome = on_first_line (outcome_of "unsat" "sat" "unknown"), | |
| 59015 | 100 | parse_proof = SOME (K CVC4_Proof_Parse.parse_proof), | 
| 57240 | 101 | replay = NONE } | 
| 102 | ||
| 103 | end | |
| 104 | ||
| 66551 | 105 | |
| 57704 | 106 | (* veriT *) | 
| 107 | ||
| 66551 | 108 | local | 
| 109 | fun select_class ctxt = | |
| 110 | if Config.get ctxt SMT_Config.higher_order then | |
| 111 | SMTLIB_Interface.hosmtlibC | |
| 112 | else | |
| 113 | SMTLIB_Interface.smtlibC | |
| 114 | in | |
| 115 | ||
| 58061 | 116 | val veriT: SMT_Solver.solver_config = {
 | 
| 59035 
3a2153676705
renamed 'veriT' to 'verit', to stick to all-lowercase rule for prover names
 blanchet parents: 
59015diff
changeset | 117 | name = "verit", | 
| 66551 | 118 | class = select_class, | 
| 57704 | 119 | avail = make_avail "VERIT", | 
| 120 | command = make_command "VERIT", | |
| 121 | options = (fn ctxt => [ | |
| 69205 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: 
67522diff
changeset | 122 | "--proof-version=2", | 
| 57704 | 123 | "--proof-prune", | 
| 124 | "--proof-merge", | |
| 125 | "--disable-print-success", | |
| 126 | "--disable-banner", | |
| 58061 | 127 | "--max-time=" ^ string_of_int (Real.ceil (Config.get ctxt SMT_Config.timeout))]), | 
| 61587 
c3974cd2d381
updating options to verit
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: 
60201diff
changeset | 128 |   smt_options = [(":produce-proofs", "true")],
 | 
| 58496 
2ba52ecc4996
give more facts to veriT -- it seems to be able to cope with them
 blanchet parents: 
58491diff
changeset | 129 | default_max_relevant = 200 (* FUDGE *), | 
| 63102 
71059cf60658
better handling of veriT's 'unknown' status
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: 
61611diff
changeset | 130 | outcome = on_first_non_unsupported_line (outcome_of "unsat" "sat" "unknown"), | 
| 58491 | 131 | parse_proof = SOME (K VeriT_Proof_Parse.parse_proof), | 
| 69205 
8050734eee3e
add reconstruction by veriT in method smt
 fleury <Mathias.Fleury@mpi-inf.mpg.de> parents: 
67522diff
changeset | 132 | replay = SOME Verit_Replay.replay } | 
| 57240 | 133 | |
| 66551 | 134 | end | 
| 135 | ||
| 136 | ||
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 137 | (* Z3 *) | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 138 | |
| 58061 | 139 | val z3_extensions = Attrib.setup_config_bool @{binding z3_extensions} (K false)
 | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 140 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 141 | local | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 142 | fun z3_options ctxt = | 
| 58061 | 143 | ["smt.random_seed=" ^ string_of_int (Config.get ctxt SMT_Config.random_seed), | 
| 57168 | 144 | "smt.refine_inj_axioms=false", | 
| 58061 | 145 | "-T:" ^ string_of_int (Real.ceil (Config.get ctxt SMT_Config.timeout)), | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 146 | "-smt2"] | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 147 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 148 | fun select_class ctxt = | 
| 58061 | 149 | if Config.get ctxt z3_extensions then Z3_Interface.smtlib_z3C else SMTLIB_Interface.smtlibC | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 150 | in | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 151 | |
| 58061 | 152 | val z3: SMT_Solver.solver_config = {
 | 
| 57209 
7ffa0f7e2775
removed '_new' sufffix in SMT2 solver names (in some cases)
 blanchet parents: 
57168diff
changeset | 153 | name = "z3", | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 154 | class = select_class, | 
| 59960 
372ddff01244
updated SMT module and Sledgehammer to fully open source Z3
 blanchet parents: 
59035diff
changeset | 155 | avail = make_avail "Z3", | 
| 
372ddff01244
updated SMT module and Sledgehammer to fully open source Z3
 blanchet parents: 
59035diff
changeset | 156 | command = make_command "Z3", | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 157 | options = z3_options, | 
| 57239 | 158 |   smt_options = [(":produce-proofs", "true")],
 | 
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 159 | default_max_relevant = 350 (* FUDGE *), | 
| 57239 | 160 | outcome = on_first_line (outcome_of "unsat" "sat" "unknown"), | 
| 58061 | 161 | parse_proof = SOME Z3_Replay.parse_proof, | 
| 162 | replay = SOME Z3_Replay.replay } | |
| 56078 
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 | end | 
| 
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 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 167 | (* overall setup *) | 
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 168 | |
| 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 169 | val _ = Theory.setup ( | 
| 58061 | 170 | SMT_Solver.add_solver cvc3 #> | 
| 171 | SMT_Solver.add_solver cvc4 #> | |
| 172 | SMT_Solver.add_solver veriT #> | |
| 173 | SMT_Solver.add_solver z3) | |
| 56078 
624faeda77b5
moved 'SMT2' (SMT-LIB-2-based SMT module) into Isabelle
 blanchet parents: diff
changeset | 174 | |
| 57229 | 175 | end; |