我们正在使用Microsoft Z3 C和C#API(我有2个程序)。
在Microsoft Z3中,当我们尝试解决公式时,当有两个或更多可满足的解决方案时,Z3始终以相同的顺序返回结果。
是否有可能从Z3获得随机结果,以便对于相同的输入,它将在不同的执行中生成不同的输出序列。
请注意,我不能直接使用smt2代码。我这issue,人们建议使用“random_seed”和“smt.arith.random_initial_value”参数。
(set-option:smt.arith.random_initial_value true)
(declare-const x Int)
(declare-const y Int)
(断言(>(+ x y)0))
(check-sat-using(using-params qflra:random_seed 1))
(获取模型)
(check-sat-using(using-params qflra:random_seed 2))
(获取模型)
(check-sat-using(using-params qflra:random_seed 3))
(获得的模型)
此smt2解决方案有效,我已设法使用rise4fun进行验证。但是这些参数在Z3 C或C#API中不可用。
在C代码中,我尝试使用函数“ Z3_set_param_value ”设置这些参数,我会收到这样的警告。
警告:未知参数'smt.arith.random_initial_value'
警告:未知参数'random_seed'
任何人都可以指导我如何使用这些参数吗?另外,有没有其他方法可以从Z3 c-api或C#api代码执行中获得随机结果?
答案 0 :(得分:1)
从未考虑过随机结果,但我们可以"欺骗"通过设置随机种子等选项,Z3做了一点点。如果您需要多种解决方案,但不需要多种解决方案。随机解决方案,只是断言第一个解决方案的否定,并要求Z3再次解决问题,增加约束。
问题中提到的那些特定选项也可以通过API设置,但必须在正确的对象上设置。如文档(头文件注释)中所述,Z3_set_param_value
只能用于那里提到的那10个选项。必须在Z3_params对象上设置其他选项,以后可以使用Z3_params_set_*
将其移交给战术和解算器。如果需要,还可以通过Z3_global_param_set
更改这些选项的全局默认值来设置它们。