2016-02-12 41 views
5

在Microsoft Z3中,当我们试图解决一个公式时,当存在两个或更多可满足的解决方案时,Z3总是以相同的顺序返回结果。如何从Microsoft Z3获得随机结果?

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

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

+1

听起来像你需要设置种子。 – Carcigenicate

回答

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

+0

这是什么语言?看起来计划-y – Carcigenicate

+0

它是smt2,没有任何API的Z3的正常输入。 请查看rise4fun.com/Z3。 – mmpourhashem

+0

我尝试了以上参数,使用C API代码 ... cfg = Z3_mk_config(); Z3_set_param_value(cfg,“MODEL”,“true”); Z3_set_param_value(cfg,“TIMEOUT”,TIME_OUT); Z3_set_param_value(cfg,“SMT.ARITH.RANDOM_INITIAL_VALUE”,“true”); Z3_set_param_value(cfg,“RANDOM_SEED”,“1”); solver = Z3_mk_context(cfg); ... 不幸的是我无法让它工作。当我运行代码,我得到这样的警告... 警告:未知参数'smt.arith.random_initial_value'警告:未知参数'random_seed' 任何想法,我做错了? –