| author | wenzelm | 
| Thu, 09 Jun 2011 23:12:02 +0200 | |
| changeset 43333 | 2bdec7f430d3 | 
| parent 39221 | 70fd4a3c41ed | 
| child 45077 | 3cb902212af5 | 
| permissions | -rw-r--r-- | 
| 33982 | 1 | (* Title: HOL/Tools/Nitpick/kodkod_sat.ML | 
| 33192 | 2 | Author: Jasmin Blanchette, TU Muenchen | 
| 34982 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
33982diff
changeset | 3 | Copyright 2009, 2010 | 
| 33192 | 4 | |
| 5 | Kodkod SAT solver integration. | |
| 6 | *) | |
| 7 | ||
| 8 | signature KODKOD_SAT = | |
| 9 | sig | |
| 10 | val configured_sat_solvers : bool -> string list | |
| 11 | val smart_sat_solver_name : bool -> string | |
| 35177 | 12 | val sat_solver_spec : string -> string * string list | 
| 33192 | 13 | end; | 
| 14 | ||
| 33232 
f93390060bbe
internal renaming in Nitpick and fixed Kodkodi invokation on Linux;
 blanchet parents: 
33229diff
changeset | 15 | structure Kodkod_SAT : KODKOD_SAT = | 
| 33192 | 16 | struct | 
| 17 | ||
| 34998 | 18 | open Kodkod | 
| 19 | ||
| 33192 | 20 | datatype sink = ToStdout | ToFile | 
| 33229 
fba7527c3ef1
made Nitpick aware of the KODKODI_JAVA_LIBRARY_PATH, for detecting and properly invoking JNI-based SAT solvers
 blanchet parents: 
33192diff
changeset | 21 | datatype availability = Java | JNI | 
| 
fba7527c3ef1
made Nitpick aware of the KODKODI_JAVA_LIBRARY_PATH, for detecting and properly invoking JNI-based SAT solvers
 blanchet parents: 
33192diff
changeset | 22 | datatype mode = Batch | Incremental | 
| 33192 | 23 | |
| 24 | datatype sat_solver_info = | |
| 33229 
fba7527c3ef1
made Nitpick aware of the KODKODI_JAVA_LIBRARY_PATH, for detecting and properly invoking JNI-based SAT solvers
 blanchet parents: 
33192diff
changeset | 25 | Internal of availability * mode * string list | | 
| 33192 | 26 | External of sink * string * string * string list | | 
| 27 | ExternalV2 of sink * string * string * string list * string * string * string | |
| 28 | ||
| 38125 
b178a63df952
change the order of the SAT solvers, from fastest to slowest
 blanchet parents: 
38122diff
changeset | 29 | (* for compatibility with "SatSolver" *) | 
| 33192 | 30 | val berkmin_exec = getenv "BERKMIN_EXE" | 
| 31 | ||
| 32 | (* (string * sat_solver_info) list *) | |
| 33 | val static_list = | |
| 38125 
b178a63df952
change the order of the SAT solvers, from fastest to slowest
 blanchet parents: 
38122diff
changeset | 34 |   [("MiniSat", ExternalV2 (ToFile, "MINISAT_HOME", "minisat", [], "SAT", "",
 | 
| 
b178a63df952
change the order of the SAT solvers, from fastest to slowest
 blanchet parents: 
38122diff
changeset | 35 | "UNSAT")), | 
| 
b178a63df952
change the order of the SAT solvers, from fastest to slowest
 blanchet parents: 
38122diff
changeset | 36 |    ("MiniSat_JNI", Internal (JNI, Incremental, ["MiniSat"])),
 | 
| 
b178a63df952
change the order of the SAT solvers, from fastest to slowest
 blanchet parents: 
38122diff
changeset | 37 |    ("CryptoMiniSat", External (ToStdout, "CRYPTOMINISAT_HOME", "cryptominisat",
 | 
| 38122 | 38 | [])), | 
| 33192 | 39 |    ("PicoSAT", External (ToStdout, "PICOSAT_HOME", "picosat", [])),
 | 
| 40 |    ("zChaff", ExternalV2 (ToStdout, "ZCHAFF_HOME", "zchaff", [],
 | |
| 41 | "Instance Satisfiable", "", | |
| 42 | "Instance Unsatisfiable")), | |
| 38125 
b178a63df952
change the order of the SAT solvers, from fastest to slowest
 blanchet parents: 
38122diff
changeset | 43 |    ("zChaff_JNI", Internal (JNI, Batch, ["zChaff"])),
 | 
| 33192 | 44 |    ("RSat", ExternalV2 (ToStdout, "RSAT_HOME", "rsat", ["-s"],
 | 
| 45 | "s SATISFIABLE", "v ", "s UNSATISFIABLE")), | |
| 46 |    ("BerkMin", ExternalV2 (ToStdout, "BERKMIN_HOME",
 | |
| 47 | if berkmin_exec = "" then "BerkMin561" | |
| 48 | else berkmin_exec, [], "Satisfiable !!", | |
| 49 | "solution =", "UNSATISFIABLE !!")), | |
| 35078 
6fd1052fe463
optimization to quantifiers in Nitpick's handling of simp rules + renamed some SAT solvers
 blanchet parents: 
34998diff
changeset | 50 |    ("BerkMin_Alloy", External (ToStdout, "BERKMINALLOY_HOME", "berkmin", [])),
 | 
| 33192 | 51 |    ("Jerusat", External (ToStdout, "JERUSAT_HOME", "Jerusat1.3", [])),
 | 
| 33229 
fba7527c3ef1
made Nitpick aware of the KODKODI_JAVA_LIBRARY_PATH, for detecting and properly invoking JNI-based SAT solvers
 blanchet parents: 
33192diff
changeset | 52 |    ("SAT4J", Internal (Java, Incremental, ["DefaultSAT4J"])),
 | 
| 36923 
538cf3fdfe4d
remove support for crashing beta solver HaifaSat
 blanchet parents: 
36385diff
changeset | 53 |    ("SAT4J_Light", Internal (Java, Incremental, ["LightSAT4J"]))]
 | 
| 33192 | 54 | |
| 35177 | 55 | fun dynamic_entry_for_external name dev home exec args markers = | 
| 33192 | 56 | case getenv home of | 
| 57 | "" => NONE | |
| 34998 | 58 | | dir => | 
| 59 | SOME (name, fn () => | |
| 60 | let | |
| 35177 | 61 | val serial_str = serial_string () | 
| 34998 | 62 | val base = name ^ serial_str | 
| 63 | val out_file = base ^ ".out" | |
| 64 | val dir_sep = | |
| 65 | if String.isSubstring "\\" dir andalso | |
| 66 | not (String.isSubstring "/" dir) then | |
| 67 | "\\" | |
| 68 | else | |
| 69 | "/" | |
| 70 | in | |
| 71 | [if null markers then "External" else "ExternalV2", | |
| 72 | dir ^ dir_sep ^ exec, base ^ ".cnf", | |
| 73 | if dev = ToFile then out_file else ""] @ markers @ | |
| 39221 
70fd4a3c41ed
remove "minipick" (the toy version of Nitpick) and some tests;
 blanchet parents: 
38125diff
changeset | 74 | (if dev = ToFile then [out_file] else []) @ args | 
| 34998 | 75 | end) | 
| 35177 | 76 | fun dynamic_entry_for_info incremental (name, Internal (Java, mode, ss)) = | 
| 33229 
fba7527c3ef1
made Nitpick aware of the KODKODI_JAVA_LIBRARY_PATH, for detecting and properly invoking JNI-based SAT solvers
 blanchet parents: 
33192diff
changeset | 77 | if incremental andalso mode = Batch then NONE else SOME (name, K ss) | 
| 35177 | 78 | | dynamic_entry_for_info incremental (name, Internal (JNI, mode, ss)) = | 
| 33229 
fba7527c3ef1
made Nitpick aware of the KODKODI_JAVA_LIBRARY_PATH, for detecting and properly invoking JNI-based SAT solvers
 blanchet parents: 
33192diff
changeset | 79 | if incremental andalso mode = Batch then | 
| 
fba7527c3ef1
made Nitpick aware of the KODKODI_JAVA_LIBRARY_PATH, for detecting and properly invoking JNI-based SAT solvers
 blanchet parents: 
33192diff
changeset | 80 | NONE | 
| 
fba7527c3ef1
made Nitpick aware of the KODKODI_JAVA_LIBRARY_PATH, for detecting and properly invoking JNI-based SAT solvers
 blanchet parents: 
33192diff
changeset | 81 | else | 
| 
fba7527c3ef1
made Nitpick aware of the KODKODI_JAVA_LIBRARY_PATH, for detecting and properly invoking JNI-based SAT solvers
 blanchet parents: 
33192diff
changeset | 82 | let | 
| 
fba7527c3ef1
made Nitpick aware of the KODKODI_JAVA_LIBRARY_PATH, for detecting and properly invoking JNI-based SAT solvers
 blanchet parents: 
33192diff
changeset | 83 | val lib_paths = getenv "KODKODI_JAVA_LIBRARY_PATH" | 
| 
fba7527c3ef1
made Nitpick aware of the KODKODI_JAVA_LIBRARY_PATH, for detecting and properly invoking JNI-based SAT solvers
 blanchet parents: 
33192diff
changeset | 84 | |> space_explode ":" | 
| 
fba7527c3ef1
made Nitpick aware of the KODKODI_JAVA_LIBRARY_PATH, for detecting and properly invoking JNI-based SAT solvers
 blanchet parents: 
33192diff
changeset | 85 | in | 
| 
fba7527c3ef1
made Nitpick aware of the KODKODI_JAVA_LIBRARY_PATH, for detecting and properly invoking JNI-based SAT solvers
 blanchet parents: 
33192diff
changeset | 86 | if exists (fn path => File.exists (Path.explode (path ^ "/"))) | 
| 
fba7527c3ef1
made Nitpick aware of the KODKODI_JAVA_LIBRARY_PATH, for detecting and properly invoking JNI-based SAT solvers
 blanchet parents: 
33192diff
changeset | 87 | lib_paths then | 
| 
fba7527c3ef1
made Nitpick aware of the KODKODI_JAVA_LIBRARY_PATH, for detecting and properly invoking JNI-based SAT solvers
 blanchet parents: 
33192diff
changeset | 88 | SOME (name, K ss) | 
| 
fba7527c3ef1
made Nitpick aware of the KODKODI_JAVA_LIBRARY_PATH, for detecting and properly invoking JNI-based SAT solvers
 blanchet parents: 
33192diff
changeset | 89 | else | 
| 
fba7527c3ef1
made Nitpick aware of the KODKODI_JAVA_LIBRARY_PATH, for detecting and properly invoking JNI-based SAT solvers
 blanchet parents: 
33192diff
changeset | 90 | NONE | 
| 
fba7527c3ef1
made Nitpick aware of the KODKODI_JAVA_LIBRARY_PATH, for detecting and properly invoking JNI-based SAT solvers
 blanchet parents: 
33192diff
changeset | 91 | end | 
| 35177 | 92 | | dynamic_entry_for_info false (name, External (dev, home, exec, args)) = | 
| 93 | dynamic_entry_for_external name dev home exec args [] | |
| 94 | | dynamic_entry_for_info false | |
| 34998 | 95 | (name, ExternalV2 (dev, home, exec, args, m1, m2, m3)) = | 
| 35177 | 96 | dynamic_entry_for_external name dev home exec args [m1, m2, m3] | 
| 97 | | dynamic_entry_for_info true _ = NONE | |
| 98 | fun dynamic_list incremental = | |
| 99 | map_filter (dynamic_entry_for_info incremental) static_list | |
| 33192 | 100 | |
| 35177 | 101 | val configured_sat_solvers = map fst o dynamic_list | 
| 102 | val smart_sat_solver_name = fst o hd o dynamic_list | |
| 33192 | 103 | |
| 35177 | 104 | fun sat_solver_spec name = | 
| 34998 | 105 | let | 
| 35177 | 106 | val dyn_list = dynamic_list false | 
| 34998 | 107 | fun enum_solvers solvers = | 
| 108 | commas (distinct (op =) (map (quote o fst) solvers)) | |
| 109 | in | |
| 110 | (name, the (AList.lookup (op =) dyn_list name) ()) | |
| 33192 | 111 | handle Option.Option => | 
| 112 | error (if AList.defined (op =) static_list name then | |
| 113 | "The SAT solver " ^ quote name ^ " is not configured. The \ | |
| 114 | \following solvers are configured:\n" ^ | |
| 34998 | 115 | enum_solvers dyn_list ^ "." | 
| 33192 | 116 | else | 
| 117 | "Unknown SAT solver " ^ quote name ^ ". The following \ | |
| 118 | \solvers are supported:\n" ^ enum_solvers static_list ^ ".") | |
| 119 | end | |
| 120 | ||
| 121 | end; |