如何从Microsoft Z3获得随机结果?

时间:2016-02-12 00:17:37

标签: z3

在Microsoft Z3中,当我们尝试解决公式时,当有两个或更多可满足的解决方案时,Z3始终以相同的顺序返回结果。

是否有可能从Z3获得随机结果,以便对于相同的输入,它将在不同的执行中生成不同的输出序列。

请注意,我使用的是C或C#API。我没有使用smt2lib使用Z3。因此,如果您可以给我一个可以添加随机化的C或C#API函数示例,它将更有用。

2 个答案:

答案 0 :(得分:1)

(set-option :smt.arith.random_initial_value true)
(declare-const x Int)
(declare-const y Int)
(assert (> (+ x y) 0))
(check-sat-using (using-params qflra :random_seed 1))
(get-model)
(check-sat-using (using-params qflra :random_seed 2))
(get-model)
(check-sat-using (using-params qflra :random_seed 3))
(get-model)

取自here

答案 1 :(得分:0)

您可以编写一个while循环来查找所有解决方案,并且,如果您随机需要它们,您可以做的是编写一个简单的约束,该约束将隐藏(在现实世界中“求反”)其先前获得的解决方案。喜欢:

int numSolution = 0;
while (true)
{
 do something;.....
 BoolExpr[] args = new BoolExpr[];
 args[i] = your solution variable;
 numSolution++;
 if (numSolution == MAX_NUM_SOLUTION)
  {               
    break;
   }                
 slvr.Assert(z3.MkNot(z3.MkAnd(args)));
}