强制Z3首先探索某些候选空间?

时间:2018-12-22 03:26:15

标签: z3 smt

我对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应该首先尝试探索哪些候选空间(变量集)?

1 个答案:

答案 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)上提问,作者可能会向您指出更好的方向。