我正在使用Z3 Python界面为我的实验创建公式。然后我将该公式发送给Z3求解器。如果我是正确的Z3使用自己的解算器!
如何在Z3py上使用不同的SAT / SMT求解器?
我在CBMC(C有界模型检查器)中使用它的方式:运行程序并吐出中间DIMAC表示(在文件中),然后使用该文件作为其他SAT求解器的输入。我可以在Z3中做类似的事情。谢谢。
答案 0 :(得分:4)
听起来你真的应该使用解算器不可知的SMT接口而不是Z3py。已经有多次尝试创建这样的接口,对多个解算器有不同程度的支持:
https://github.com/pysmt/pysmt是针对SMT求解器的求解器不可知的Python API。我自己没有使用它,但它听起来很有希望,特别是如果你想要Python作为顶级API。
https://github.com/sosy-lab/java-smt是一个使用Java作为主持语言的类似项目。
http://leventerkok.github.io/sbv/是我自己尝试为使用SMT求解器提供求解器不可知的API,这个用Haskell编写。
绝不是一份详尽的清单。我确信还有其他一些主语言也有不同程度的成熟度。您应该选择哪一个取决于您的主机语言偏好以及每个系统提供的功能;可能差别很大。
答案 1 :(得分:2)
所有SMT求解器都支持SMT2输入格式,因此您可以对Z3和其他SMT求解器执行相同操作。 Z3py可以将Solver和Goal对象转换为符合SMT2的字符串(一些复杂的变量声明,例如某些数据类型可能会丢失)。
Z3py是Z3特定的API(顾名思义)它没有提供使用其他SMT求解器的方法。