创建所有令人满意的模型,Z3 .Net API

时间:2017-07-12 12:30:39

标签: z3

我正在使用Z3 .Net API。我有一段简单的代码,我想在其中创建所有令人满意的模型。代码是这样的:

    Solver solver = ctx.MkSolver();

    Expr x = ctx.MkConst("x", ctx.MkBoolSort());
    Expr y = ctx.MkConst("y", ctx.MkBoolSort());

    BoolExpr constraint1 = ctx.MkBoolConst("Constraint1");
    solver.AssertAndTrack(ctx.MkOr((BoolExpr)x, (BoolExpr)y), constraint1);

问题是,在我想要枚举所有模型的代码中,我将使用此代码:

        Model resultModel = pSolver.Model;
        Console.WriteLine("x = {0}, y = {1}",
            resultModel.Evaluate(pX),
            resultModel.Evaluate(pY));

但是有一些模型,例如if(X = true)然后(Y = Y)。对于这些情况,我想表明,实际上有两个模型,如:

X = true, Y = true
X = true, Y = false

API中是否有能力给我这些答案,或者我应该使用内部编码来获得这些答案。

1 个答案:

答案 0 :(得分:0)

不一般,没有。至少不是以SMT-Lib认可的方式。当求解器呈现模型时,它们总是与地面值相关联,并且SMTLib没有提供任何有关最小值的规定。楷模。请注意,此处的最小含义也不明确:在您的示例中,xy都已足够,并且在另一个之前修复一个可以影响其他变量的选择。你希望求解者更喜欢哪一个?

如果您对这种最小型号感兴趣,基于BDD的求解器就是您的朋友。由于您在BDD中修改了变量订单,因此您可以读取" minimal"根据该变量顺序模型很容易。但SMT解决方案通常不会公开这些细节,如果他们有这样的引擎,他们也不会让你轻松访问。在Z3的特定情况下,您可能想在https://github.com/Z3Prover/z3/issues询问是否可能存在低级API以获得更有用的内容;但获得这样的"象征性的"模型不是SMT求解器提供的。