以 SMT2 格式保存 Z3 求解器的 "state"

Saving the "state" of a Z3 solver in SMT2 format

是否可以使用Z3API(例如PythonAPI)来保存求解器的当前状态,包括求解器的内容在 SMT2 格式的文件中学习了 (在 SAT 解决中我们会说 "learned clauses")?

因为我希望能够将求解器的状态保存在一个临时文件中,以便稍后恢复求解,以便有一些时间了解我应该对其进行哪些进一步的查询。

非常感谢...

SMT2 没有保存给定求解器状态的规定,这无疑会因求解器而异。然而,每个求解器可能有不同的机制,但它肯定不会采用 SMTLib2 格式。

由于您的问题完全是针对 Z3 的,我建议您在 https://github.com/Z3Prover/z3/issues 上提问,看看他们是否有任何有趣的问题。然而,据我所知,目前这是不可能的。

最后 Levent 是对的:)

以下是来自 Z3 github 网站的 Nikolaj Bjorner 的一些观察。

"解算器的状态不能完全序列化为 SMT2 格式。 您可以根据当前断言将求解器打印为 smt2 格式, 但未学习 clauses/units 在 Solver 对象上使用 sexpr() 方法。"

...

"We don't expose ways to print internal state. You could perhaps interrupt the solver, then clone it using the "translate" 方法并使用内部打印实用程序访问转换后的求解器状态。您必须稍微更改代码才能进入此状态。 求解器上的打印功能不访问任何求解器的内部状态,而是查看断言的公式并打印它们。 我不翻译学过的词条。例如,smt_context.cpp 第 176 行中的代码被禁用,因为它对任何性能增强没有帮助。同样,sat_solver 中的复制代码不会复制已学习的子句,即使它保留了已学习的单位文字和二进制子句。"

您可以在 link.

查看 Nicolaj 的上述评论