Z3生成模型值的随机性
我试图影响Z3生成的模型值结果的随机性。据我所知,这方面的选项非常有限:在线性算术的情况下,单纯形解算器不允许仍然满足给定约束的随机结果。但是,有一个选项smt.arith.random_initial_value(“在基于单纯形的线性算术过程中使用随机初始值(默认值:false)”),我似乎无法使用该选项:Z3生成模型值的随机性,z3,z3py,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
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]作为结果。即使是给定约束中未使用的变量的模型完成似乎也会始终产生确定性结果
关于此选项的工作原理有什么想法或提示吗?谢谢您的关注!确实有一个错误导致随机种子无法传递给算术理论。这在不稳定分支(fix)中已修复 这个例子:
(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)
)
看起来可能还有另一个地方没有正确地传递此选项(例如,当使用集合逻辑而不是直接调用qflra策略时),我们仍在研究这一点。您是否有兴趣通过迭代方式来实现某种随机模型?您可以通过添加随机约束(如
x>=rand()
)来优化给定的模型,直到得到unsat。在使用z3py时,如何在python中使用(使用参数qflra:random_seed 2)指定check-sat?我到处找都找不到。。。我只能找到与check-sat等价的,它只是solver.check()。