从命令行选择 SAT 求解器
Selecting SAT solver from command line
class edu.mit.csail.sdg.alloy4whole.ExampleUsingTheCompiler
提供了如何从命令行执行 Alloy 命令的示例。本例中使用的后端求解器是 Sat4J。我很想将求解器更改为更快的求解器之一,例如 Plingeling。不幸的是,我无法弄清楚如何实现这一目标。只需更改行
options.solver = A4Options.SatSolver.SAT4J;
进入
options.solver = A4Options.SatSolver.PLingelingJNI;
不起作用;我收到以下错误消息:
Exception in thread "main" Fatal error:
Unknown exception occurred: kodkod.engine.AbortedException: kodkod.engine.satlab.SATAbortedException: java.io.IOException: Cannot run program "plingeling": error=2, No such file or directory
at edu.mit.csail.sdg.alloy4compiler.translator.TranslateAlloyToKodkod.executeCommand(TranslateAlloyToKodkod.java:1079)
at edu.mit.csail.sdg.alloy4compiler.translator.TranslateAlloyToKodkod.executeCommand(TranslateAlloyToKodkod.java:1065)
at edu.mit.csail.sdg.alloy4compiler.translator.TranslateAlloyToKodkod.execute_command(TranslateAlloyToKodkod.java:381)
at edu.mit.csail.sdg.alloy4whole.ExampleUsingTheCompiler.main(ExampleUsingTheCompiler.java:72)
Caused by: kodkod.engine.AbortedException: kodkod.engine.satlab.SATAbortedException: java.io.IOException: Cannot run program "plingeling": error=2, No such file or directory
at kodkod.engine.Solver.solve(Solver.java:147)
at edu.mit.csail.sdg.alloy4compiler.translator.A4Solution.solve(A4Solution.java:1058)
at edu.mit.csail.sdg.alloy4compiler.translator.TranslateAlloyToKodkod.executeCommand(TranslateAlloyToKodkod.java:1070)
... 3 more
Caused by: kodkod.engine.satlab.SATAbortedException: java.io.IOException: Cannot run program "plingeling": error=2, No such file or directory
at kodkod.engine.satlab.ExternalSolver.solve(ExternalSolver.java:255)
at kodkod.engine.Solver.solve(Solver.java:140)
... 5 more
Caused by: java.io.IOException: Cannot run program "plingeling": error=2, No such file or directory
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
at java.lang.Runtime.exec(Runtime.java:620)
at java.lang.Runtime.exec(Runtime.java:485)
at kodkod.engine.satlab.ExternalSolver.solve(ExternalSolver.java:221)
... 6 more
Caused by: java.io.IOException: error=2, No such file or directory
at java.lang.UNIXProcess.forkAndExec(Native Method)
at java.lang.UNIXProcess.<init>(UNIXProcess.java:248)
at java.lang.ProcessImpl.start(ProcessImpl.java:134)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
... 9 more
Alloy GUI 似乎通过在运行前将一些文件(包括 plingeling
可执行文件)复制到正确的位置来解决这个问题。
如我的问题所示,我遇到的问题与您的问题相同:
Execution Error when change the SATSolver from SAT4J to MiniSAT
@Aleksandar在上一个问题中指出的解决方案,请参见
Alloy API resulting in java.lang.UnsatisfiedLinkError
,适用于较旧的 ubuntu 版本 (10.0.0),但不适用于较早的 ubuntu 版本(例如 14.04 或 16.04)。
选择其他求解器(例如Zchaff或MinisatProver I),我会观察到错误会发生变化:
"The required JNI library cannot be found: java.lang.UnsatisfiedLinkError: no zchaffx5 in java.library.path"
对于所有其他求解器,它正在寻找的库(例如:zchaffx5)似乎比 x86-linux 文件夹(在 alloy-4.2.jar): zchaffx1.我认为其他求解器的现有库已经过时了。如果您找到了解决此问题的方法,请告诉我们。
感谢 链接的问题,我成功地在我的机器上运行了它(Mac)。
为了使用像 Plingeling 这样的求解器
可执行文件,应该 运行
export PATH=<path_to_solver_binaries_and_libraries>:$PATH
宁运行之前java
.
为了使用分布为 MiniSat 的求解器
动态库,应该添加参数
-Djava.library.path=<path_to_solver_binaries_and_libraries>
当运行宁java
.
class edu.mit.csail.sdg.alloy4whole.ExampleUsingTheCompiler
提供了如何从命令行执行 Alloy 命令的示例。本例中使用的后端求解器是 Sat4J。我很想将求解器更改为更快的求解器之一,例如 Plingeling。不幸的是,我无法弄清楚如何实现这一目标。只需更改行
options.solver = A4Options.SatSolver.SAT4J;
进入
options.solver = A4Options.SatSolver.PLingelingJNI;
不起作用;我收到以下错误消息:
Exception in thread "main" Fatal error:
Unknown exception occurred: kodkod.engine.AbortedException: kodkod.engine.satlab.SATAbortedException: java.io.IOException: Cannot run program "plingeling": error=2, No such file or directory
at edu.mit.csail.sdg.alloy4compiler.translator.TranslateAlloyToKodkod.executeCommand(TranslateAlloyToKodkod.java:1079)
at edu.mit.csail.sdg.alloy4compiler.translator.TranslateAlloyToKodkod.executeCommand(TranslateAlloyToKodkod.java:1065)
at edu.mit.csail.sdg.alloy4compiler.translator.TranslateAlloyToKodkod.execute_command(TranslateAlloyToKodkod.java:381)
at edu.mit.csail.sdg.alloy4whole.ExampleUsingTheCompiler.main(ExampleUsingTheCompiler.java:72)
Caused by: kodkod.engine.AbortedException: kodkod.engine.satlab.SATAbortedException: java.io.IOException: Cannot run program "plingeling": error=2, No such file or directory
at kodkod.engine.Solver.solve(Solver.java:147)
at edu.mit.csail.sdg.alloy4compiler.translator.A4Solution.solve(A4Solution.java:1058)
at edu.mit.csail.sdg.alloy4compiler.translator.TranslateAlloyToKodkod.executeCommand(TranslateAlloyToKodkod.java:1070)
... 3 more
Caused by: kodkod.engine.satlab.SATAbortedException: java.io.IOException: Cannot run program "plingeling": error=2, No such file or directory
at kodkod.engine.satlab.ExternalSolver.solve(ExternalSolver.java:255)
at kodkod.engine.Solver.solve(Solver.java:140)
... 5 more
Caused by: java.io.IOException: Cannot run program "plingeling": error=2, No such file or directory
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
at java.lang.Runtime.exec(Runtime.java:620)
at java.lang.Runtime.exec(Runtime.java:485)
at kodkod.engine.satlab.ExternalSolver.solve(ExternalSolver.java:221)
... 6 more
Caused by: java.io.IOException: error=2, No such file or directory
at java.lang.UNIXProcess.forkAndExec(Native Method)
at java.lang.UNIXProcess.<init>(UNIXProcess.java:248)
at java.lang.ProcessImpl.start(ProcessImpl.java:134)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
... 9 more
Alloy GUI 似乎通过在运行前将一些文件(包括 plingeling
可执行文件)复制到正确的位置来解决这个问题。
如我的问题所示,我遇到的问题与您的问题相同: Execution Error when change the SATSolver from SAT4J to MiniSAT
@Aleksandar在上一个问题中指出的解决方案,请参见 Alloy API resulting in java.lang.UnsatisfiedLinkError
,适用于较旧的 ubuntu 版本 (10.0.0),但不适用于较早的 ubuntu 版本(例如 14.04 或 16.04)。
选择其他求解器(例如Zchaff或MinisatProver I),我会观察到错误会发生变化:
"The required JNI library cannot be found: java.lang.UnsatisfiedLinkError: no zchaffx5 in java.library.path"
对于所有其他求解器,它正在寻找的库(例如:zchaffx5)似乎比 x86-linux 文件夹(在 alloy-4.2.jar): zchaffx1.我认为其他求解器的现有库已经过时了。如果您找到了解决此问题的方法,请告诉我们。
感谢
为了使用像 Plingeling 这样的求解器 可执行文件,应该 运行
export PATH=<path_to_solver_binaries_and_libraries>:$PATH
宁运行之前
java
.为了使用分布为 MiniSat 的求解器 动态库,应该添加参数
-Djava.library.path=<path_to_solver_binaries_and_libraries>
当运行宁
java
.