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

如何从Microsoft Z3获得随机结果?,z3,Z3,在Microsoft Z3中,当我们尝试求解公式时,当存在两个或多个可满足的解时,Z3总是以相同的顺序返回结果 是否可能从Z3获得随机结果,以便对于相同的输入,它将在不同的执行中生成不同的输出序列 请注意,我使用的是C或C#API。我没有使用Z3和smt2lib。因此,如果你能给我一个C或C#API函数的例子,可以添加随机化,它会更有用 (set-option :smt.arith.random_initial_value true) (declare-const x Int) (declare

在Microsoft Z3中,当我们尝试求解公式时,当存在两个或多个可满足的解时,Z3总是以相同的顺序返回结果

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

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

(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)

摘自。

您可以编写一个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)));
}

听起来你需要播下种子。这是什么语言?看起来是yIt的smt2,Z3的正常输入,没有任何API。查看rise4fun.com/Z3。我使用C API代码尝试了上述参数。。。cfg=Z3_mk_config();Z3设置参数值(cfg,“模型”,“真”);Z3设置参数值(cfg,“超时”,超时);Z3设置参数值(cfg,“算术随机初始值”,“真”);Z3集参数值(cfg,“随机种子”,“1”);解算器=Z3_mk_上下文(cfg)。。。不幸的是,我不能让它工作。当我运行代码时,我得到如下警告。。。警告:未知参数'smt.arith.random_initial_value'警告:未知参数'random_seed'知道我哪里做错了吗?