生成的模型值的Z3随机性

时间:2014-06-20 13:05:54

标签: z3 z3py

我试图影响Z3生成的模型值的结果的随机性。据我所知,这方面的选项非常有限:在线性算法的情况下,单纯形求解器不允许仍然满足给定约束的随机结果。但是,有一个选项smt.arith.random_initial_value(“在基于单纯形式的线性算法程序中使用随机初始值(默认值:false)”),我似乎无法正常工作:

from z3 import *
set_option('smt.arith.random_initial_value',True)
x = Int('x')
y = Int('y')
s = Solver()
s.add( x+y > 0)
s.check()
s.model()

这似乎总是产生[y = 0,x = 1]。即使在给定约束中未使用的变量的模型完成似乎也始终产生确定性结果。

有关此选项如何运作的任何想法或提示?

1 个答案:

答案 0 :(得分:1)

感谢您的关注!确实有一个错误导致随机种子不能传递给算术理论。现在,这已在unstable分支中修复(修复here)。

这个例子:

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

现在生产三种不同的模型:

sat
model
  (define-fun y () Int
    4294966763)
  (define-fun x () Int
    4294966337)
)
sat
(model
  (define-fun y () Int
    216)
  (define-fun x () Int
    4294966341)
)
sat
(model
  (define-fun y () Int
    196)
  (define-fun x () Int
    4294966344)
)

看起来可能有另一个地方没有正确传递此选项(例如,当使用set-logic而不是直接调用qflra策略时),我们仍然在研究它。