【发布时间】:2015-11-24 03:57:16
【问题描述】:
以下解决方案我无法在 java 中实现。请帮我。下面是我正在尝试实现的 sn-p 代码。
我发现了同样的问题: 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(或(a != s.model()[a], b != s.model()[b])) 对于 == 我们有 mkEq() 方法,但是我找不到任何与 '!=' 相关的方法。
我尝试使用: s.add(ctx.mkOr(ctx.mkEq(a,ctx.mkNot(s.getModel())),ctx.mkEq(a,ctx.mkNot(s.getModel()))));
为此我收到编译错误。我应该得到它,因为它不可能以这种方式实现。
【问题讨论】: