我对smt求解器(例如Z3)有一个疑问,想知道您是否知道任何可以帮助我实现目标的Z3策略。
我想知道是否有可能在探索其他变量之前强迫Z3探索某些变量。
例如,我的MaxSMT问题具有以下硬约束
X1 + X4 >=3
X2 + 7 >=3
X3 + 8 >=3
软约束为
X4 == 0
在这里,我想强制smt-solver首先探索变量X1具有不同值的候选空间。 (我相信默认情况下Z3会随机探索X1,X2,X3,X4的不同值)
所以我的问题是-Z3中是否有任何策略可以让我告诉Z3-solver应该首先尝试探索哪些候选空间(变量集)?
答案 0 :(得分:0)
max-smt引擎允许在z3中进行用户参数化,但是不幸的是,尚不清楚这些调整中的任何一项是否允许您执行所需的操作。但是您至少可以通过使用z3 -p
命令并查看列表来询问“调整”是什么。我发现以下参数:
[module] opt, description: optimization parameters
maxres.add_upper_bound_block (bool) (default: false)
maxres.hill_climb (bool) (default: true)
maxres.max_core_size (unsigned int) (default: 3)
maxres.max_correction_set_size (unsigned int) (default: 3)
maxres.max_num_cores (unsigned int) (default: 4294967295)
maxres.maximize_assignment (bool) (default: false)
maxres.pivot_on_correction_set (bool) (default: true)
maxres.wmax (bool) (default: false)
maxsat_engine (symbol) (default: maxres)
(还有其他,但这些似乎最相关。)
要了解这些因素如何影响搜索,最好的选择是通读源代码:https://github.com/Z3Prover/z3/blob/master/src/opt/maxres.cpp
或者,您可以尝试在z3 github网站(https://github.com/Z3Prover/z3/issues)上提问,作者可能会向您指出更好的方向。