1 (* Title: HOL/Tools/SMT/cvc3_solver.ML
2 Author: Sascha Boehme, TU Muenchen
4 Interface of the SMT solver CVC3.
7 signature CVC3_SOLVER =
9 val setup: theory -> theory
12 structure CVC3_Solver: CVC3_SOLVER =
15 val solver_name = "cvc3"
16 val env_var = "CVC3_SOLVER"
18 val options = ["-lang", "smtlib", "-output-lang", "presentation"]
20 val is_sat = String.isPrefix "Satisfiable."
21 val is_unsat = String.isPrefix "Unsatisfiable."
22 val is_unknown = String.isPrefix "Unknown."
24 fun raise_cex real = raise SMT_Solver.SMT_COUNTEREXAMPLE (real, [])
26 fun core_oracle (output, _) =
28 val empty_line = (fn "" => true | _ => false)
29 val split_first = (fn [] => ("", []) | l :: ls => (l, ls))
30 val (l, _) = split_first (dropwhile empty_line output)
32 if is_unsat l then @{cprop False}
33 else if is_sat l then raise_cex true
34 else if is_unknown l then raise_cex false
35 else raise SMT_Solver.SMT (solver_name ^ " failed")
38 fun smtlib_solver oracle _ = {
39 command = {env_var=env_var, remote_name=SOME solver_name},
41 interface = SMTLIB_Interface.interface,
42 reconstruct = pair o oracle }
45 Thm.add_oracle (Binding.name solver_name, core_oracle) #-> (fn (_, oracle) =>
46 SMT_Solver.add_solver (solver_name, smtlib_solver oracle))