使用Z3从受约束的空间中进行采样

时间:2016-08-30 06:23:57

标签: z3 constraint-programming

我对变量有一堆约束,我正在寻找一种方法来有效地在这个受约束的空间中进行采样。我尝试了Z3,它似乎能够告诉我这个空间是否非常重要(即如果约束条件是可以满足的)但是我没有看到从空间获取示例的方法,除非我最小化或最大化某些东西。

我错过了什么或者这不是Z3的用途吗?

2 个答案:

答案 0 :(得分:2)

Z3可以为您提供一个模型,即为满足约束的变量赋值的一个示例(在SMT2中尝试(get-model)命令或在.NET API中尝试Solver.Model(并且同样命名其他API中的那些))。然后,您可以断言模型的否定,以强制求解器为下一个查询生成不同的赋值。许多应用程序都使用这种方案,但它不一定“有效”,但这实际上取决于您尝试实现的采样类型(例如,Z3模型不会在搜索空间中随机分布)。

答案 1 :(得分:0)

有些技术可用于从SAT解决方案空间进行采样。参见https://simons.berkeley.edu/sites/default/files/docs/4393/moshevardi.pdf

也许可以在Z3之上实施其中一些技术。

还有一个existing implementation of the UniGen algorithm for almost-uniform sampling of SAT solution space on github,但是它基于不同的SAT求解器,不确定是否支持SMT求解。

编辑:这里似乎有基于Z3的SMT采样器:https://github.com/RafaelTupynamba/SMTSampler