如何列举所有解决方案?

时间:2013-06-14 08:47:36

标签: alloy

我想使用Alloy Analyzer来枚举给定范围内谓词的所有解决方案。 Alloy是否支持此功能?如果可以,如何从命令行调用它?

谢谢

2 个答案:

答案 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​​来调用合金的例子,你可以使用它来枚举你的解决方案。