【发布时间】:2017-01-06 07:21:10
【问题描述】:
我对变量有很多限制,我正在寻找一种在这个受限空间中有效采样的方法。我尝试了 Z3,它似乎能够告诉我空间是否重要(即约束是否可以满足)但我看不到从空间中获取示例的方法,除非我正在最小化或最大化某些东西.
是我遗漏了什么还是这不是 Z3 的用途?
【问题讨论】:
我对变量有很多限制,我正在寻找一种在这个受限空间中有效采样的方法。我尝试了 Z3,它似乎能够告诉我空间是否重要(即约束是否可以满足)但我看不到从空间中获取示例的方法,除非我正在最小化或最大化某些东西.
是我遗漏了什么还是这不是 Z3 的用途?
【问题讨论】:
您可以使用一些技术从 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
【讨论】:
Z3 可以为您提供一个模型,即分配给满足约束的变量的一个示例(尝试 SMT2 中的 (get-model) 命令或 .NET API 中的 Solver.Model(在另一个中类似命名的命令)蜜蜂))。然后,您可以断言模型的否定,以强制求解器为下一个查询生成不同的分配。这种方案被许多应用程序使用,但它不一定“高效”,但这实际上取决于您尝试实现的采样类型(例如,Z3 模型不会在搜索空间中随机分布)。
【讨论】: