我在Z3中提出了一个SMT公式,它只使用固定长度的BitVectors和IntVectors输出一个解决约束问题的解决方案。我用于IntVectors的逻辑只是简单的Presburger算法(对于某些x和z,形式为(x[i] - x[i + 1] <=/>= z)
)。我还取位向量中所有位的总和(不是二进制值),并将该值设置在[a,b]的范围内。
这完美无缺。唯一的问题是,由于z3始终采取最简单的方法来确定可满足性,我总是得到相同的答案,而在我的领域我想找到各种截然不同的解决方案(我知道一个事实上存在多种非常不同的解决方案)。我想使用我发现的https://bitbucket.org/kuldeepmeel/weightgen这个漂亮的工具,它可以让你使用SAT统一采样一个受限的可能性空间。但是要使用它,我需要将我的SMT公式转换为SAT公式。
您知道有哪些资源可以帮助我学习如何执行Presburger算法并将bitvector的位添加为SAT实例吗?或者,您是否知道任何SMT求解器作为中间步骤输出问题的可读描述作为SAT实例?
非常感谢!
[编辑反映我确实需要统一采样功能的事实。]