在Microsoft Z3中,当我们尝试解决公式时,当有两个或更多可满足的解决方案时,Z3始终以相同的顺序返回结果。
是否有可能从Z3获得随机结果,以便对于相同的输入,它将在不同的执行中生成不同的输出序列。
请注意,我使用的是C或C#API。我没有使用smt2lib使用Z3。因此,如果您可以给我一个可以添加随机化的C或C#API函数示例,它将更有用。
答案 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)));
}