我想使用Alloy Analyzer来枚举给定范围内谓词的所有解决方案。 Alloy是否支持此功能?如果可以,如何从命令行调用它?
谢谢
答案 0 :(得分:1)
这是执行此操作的代码。在此示例中,您编写常规Alloy模型文件(您指定范围)并使用此代码运行它,即枚举模型文件中存在的每个命令的所有解法。
public void run(String filename) {
A4Reporter rep = new A4Reporter();
Module world = CompUtil.parseEverything_fromFile(rep, null, filename);
A4Options options = new A4Options();
options.solver = A4Options.SatSolver.SAT4J;
// options.symmetry = 0; // optionally turn off symmetry breaking
for (Command command: world.getAllCommands()) {
// Execute the command
A4Solution sol = TranslateAlloyToKodkod.execute_command(rep, world.getAllReachableSigs(), command, options);
while (sol.satisfiable()) {
System.out.println("[Solution]:");
System.out.println(sol.toString());
sol = sol.next();
}
}
}
答案 1 :(得分:0)
是的,Alloy确实允许您在有限的范围内枚举所有“可能的”解决方案。但是,它使用对称破坏(SB)算法来打破所有对称性(好吧,大多数都是这样)。因此,您将无法枚举每个可能的解决方案。另一方面,即使您可以关闭SB,您的模型也可能会获得相当多的实例。它最终将终止,但你只是不知道什么时候,它真的取决于你的范围。我记得在jar文件中(ExampleUsingTheCompiler.java和ExampleUsingTheAPI),有一些关于使用API来调用合金的例子,你可以使用它来枚举你的解决方案。