Python 保存;“国家”;SMT2格式的Z3解算器的设计

Python 保存;“国家”;SMT2格式的Z3解算器的设计,python,z3,z3py,Python,Z3,Z3py,是否可以使用Z3 API(例如Python API)将解算器的当前状态保存在SMT2格式的文件中,包括解算器学到的内容(在SAT解算中,我们称之为“学到的子句”) 因为我希望能够将解算器的状态保存在一个临时文件中,以便以后继续解算,以便有时间了解我应该对其进行哪些进一步的查询 非常感谢…SMT2没有保存给定解算器状态的规定,这无疑会因解算器而异。但是,每个解算器可能有不同的机制,但它肯定不是SMTLib2格式 因为你的问题完全是针对Z3的,我建议你继续问下去,看看他们是否有什么有趣的地方。然而,

是否可以使用Z3 API(例如Python API)将解算器的当前状态保存在SMT2格式的文件中,包括解算器学到的内容(在SAT解算中,我们称之为“学到的子句”)

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


非常感谢…SMT2没有保存给定解算器状态的规定,这无疑会因解算器而异。但是,每个解算器可能有不同的机制,但它肯定不是SMTLib2格式


因为你的问题完全是针对Z3的,我建议你继续问下去,看看他们是否有什么有趣的地方。然而,据我所知,这在目前是不可能的。

最后,Levent是对的:)

以下是Nikolaj Bjorner在Z3 github网站上的一些观察结果

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

“我们不公开打印内部状态的方法。您可以中断解算器,然后使用“translate”方法克隆解算器,并使用内部打印实用程序访问已翻译的解算器状态。您必须稍微更改代码才能达到此状态。 解算器上的打印功能不访问任何解算器的内部状态,而是查看断言的公式并打印它们。 我不翻译学习的引理。例如,smt_context.cpp第176行中的代码被禁用,因为它无助于任何性能增强。类似地,sat_solver中的复制代码不会复制学习的子句,即使它保留了学习的单位文字和二进制子句。”


您可以在此处看到Nicolaj的上述评论。

非常感谢您的评论!我想的是,所谓的习得从句应该只是解算器添加的一些附加断言,比如SAT解算中的习得从句,我错了吗?如果没有,有没有办法打印出来?即使不是SMT2格式(我更喜欢SMT2格式只是为了更舒适),即使这是可能的,它无疑会引用许多在解算器执行上下文之外没有意义的内部变量/数据结构。至少绝对不是任何文本/ascii格式。尽管如此,在Z3Github页面上询问是你最好的选择,看看他们是否有任何建议。@LeventErkok我不明白你的意思,从句只是从句。。应该有什么样的数据结构?@PatrickTrentin我怀疑解算器会将它的学习引理表示为可以以SMTLib或ASCII可读格式轻松转储的子句。它将出现在解算器的内部数据类型中,这几乎不可能按照OP的要求呈现供外部使用。@LeventErkok我不明白你想象的这个内部数据类型是什么,在其他解算器中,我只经历过一些索引、向量和映射,但是,它有一个非常简单的子句映射。。在这些解算器中,外部和内部生成的解算器使用相同的表示。