从命令行中选择SAT求解器

时间:2016-04-26 17:52:31

标签: alloy

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可执行文件)复制到正确的位置来解决此问题。

2 个答案:

答案 0 :(得分:2)

感谢Tarciana's answer链接的问题,我成功地在我的机器(Mac)上工作了。

  • 为了使用分发为 Plingeling 的解算器 可执行文件,应该运行

    export PATH=<path_to_solver_binaries_and_libraries>:$PATH
    

    在运行java

  • 之前
  • 为了使用分发为 MiniSat 的解算器 动态库,应该添加参数

    -Djava.library.path=<path_to_solver_binaries_and_libraries>
    
    运行java

答案 1 :(得分:1)

我的问题与你的问题相同,如我的问题所示: 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时,我会发现错误发生了变化,例如:

&#34;找不到所需的JNI库:java.lang.UnsatisfiedLinkError:java.library.path中没有zchaffx5&#34;

并且对于所有其他求解器,它正在寻找的库(例如:zchaffx5)比x86-linux文件夹中的现有库(在合金4.2.jar中)更新:zchaffx1。我认为其他求解器的现有库已经过时了。如果您找到解决此问题的方法,请告诉我们。