Z3:在java

时间:2015-08-29 17:25:37

标签: z3 smt

以下解决方案我无法在java中实现。请帮我。下面是我试图实现的代码片段。

我发现了同样的问题:     Z3: finding all satisfying models

(Z3Py) checking all solutions for equation

BitVecExpr a = ctx.mkBVConst("a",8);
BitVecExpr b = ctx.mkBVConst("b",8);
BitVecExpr c = ctx.mkBVConst("c",8);
Solver s = ctx.mkSolver();

//s.add(ctx.mkEq(c,ctx.mkBVXOR(a,b)));      // I am able to get distinct value for a and b for XOR.
//s.add(ctx.mkEq(c,ctx.mkBVOR(b,a)));       // If i swap the position of the a and b then i was able to generate distinct pattern. For example for this add method of OR my code was working.
s.add(ctx.mkEq(c,ctx.mkBVOR(a,b)));         // Not working getting same model.
s.add(ctx.mkEq(c,ctx.mkBV(11,8)));

if (s.check() == Status.SATISFIABLE)
{
System.out.println("status :"+ s.check());
Model m = s.getModel();
System.out.println("Model :"+ m);
}

BitVecExpr test1[] = {a,b};

s.add(ctx.mkDistinct(test1));     // If i use this line then only i get distinct pattern

if (s.check() == Status.SATISFIABLE)
{
System.out.println("status :"+ s.check());
Model m = s.getModel();
System.out.println("Model :"+ m);
}

此外,我在java中没有model()[]方法。在java中我有没有任何参数的getModel()方法。

还有一个问题。我们如何在add中实现'!='。例如。

s.add(Or(a!= s.model()[a],b!= s.model()[b])) 对于==我们有mkEq()方法,但我无法找到任何与'!='相关的方法。

我尝试过使用:   s.add(ctx.mkOr(ctx.mkEq(一个,ctx.mkNot(s.getModel())),ctx.mkEq(一个,ctx.mkNot(s.getModel()))));

我正在收到编译错误。我应该得到它,因为它不可能以这种方式实现。

1 个答案:

答案 0 :(得分:0)

BitVecExpr a = ctx.mkBVConst("a",2);
BitVecExpr b = ctx.mkBVConst("b",2);
BitVecExpr c = ctx.mkBVConst("c",2);
Model m = null;
Solver s = ctx.mkSolver();

s.add(ctx.mkEq(c,ctx.mkBVXOR(a,b)));
s.add(ctx.mkEq(c,ctx.mkBV(3,2)));

while(s.check() == Status.SATISFIABLE){
    System.out.println("status :"+ s.check());
    m = s.getModel();
    System.out.println("m.eval(a) " + m.eval(a,false));
    System.out.println("m.eval(b) " + m.eval(b,false));
    System.out.println("m.eval(c) " + m.eval(c,false));

    Integer b_int = Integer.parseInt(m.eval(b,false).toString());   
    Integer a_int = Integer.parseInt(m.eval(a,false).toString());   
    BoolExpr b_bol = ctx.mkEq(b,(BitVecExpr) ctx.mkBV(b_int,2));
    BoolExpr a_bol = ctx.mkEq(a,(BitVecExpr) ctx.mkBV(a_int,2));
    s.add(ctx.mkOr(ctx.mkEq(b_bol,ctx.mkFalse()),ctx.mkEq(a_bol,ctx.mkFalse())));
}

上面的代码对我有用。你们有什么建议吗?