Java API中使用parseSMTLIB2String的Z3一旦它驱逐一个UNSAT就会发送错误的UNSAT

时间:2018-03-26 11:48:06

标签: z3 smt

我对Z3 SMT解算器的实现很粗糙,但我发现Java API非常难以访问。 我使用parseSMTLIB2String并且它可以很好地完成工作,直到SAT检查返回一个UNSATISFIABLE。然后它继续返回UNSATISFIABLE,即使之前的值返回SATISFIABLE。我使用解算器错了吗?

public static Boolean checkSat(int checkMakespan, Flowshop fs) {
    String smtString = FlowShopSmtGen.generateSMTFromFlowshop(fs, checkMakespan);
    HashMap<String, String> cfg = new HashMap<>();
    Context ctx = new Context(cfg);
    BoolExpr fsresult = ctx.parseSMTLIB2String(smtString, null, null, null, null);

    Solver solver = ctx.mkSolver();
    solver.add(fsresult);
    Status s = solver.check();
    System.out.println(s);

    if (s == Status.SATISFIABLE) {
        return true;
    } else {
        return false;
    }
}

1 个答案:

答案 0 :(得分:0)

如果您将断言添加到已经不可满足的断言集中,那么您应该继续获得不可满足的答案。

但如果你在中间弹出一些断言,那么可能会有一些可疑的东西。