保存并重新加载z3py解算器约束

保存并重新加载z3py解算器约束,z3,z3py,Z3,Z3py,我是否可以保存为z3解算器创建的约束,然后重新加载它们以继续寻找更多解决方案 我了解到有SMT-LIB2格式可用于此类内容,z3和z3py有一个API可用于以该格式保存和加载。不幸的是,我不能让它工作 下面是我的示例程序,它无意义地保存和重新加载: import z3 filename = 'z3test.smt' # Make a solver with some arbitrary useless constraint solver = z3.Solver() solver.add(Tr

我是否可以保存为z3解算器创建的约束,然后重新加载它们以继续寻找更多解决方案

我了解到有SMT-LIB2格式可用于此类内容,z3和z3py有一个API可用于以该格式保存和加载。不幸的是,我不能让它工作

下面是我的示例程序,它无意义地保存和重新加载:

import z3

filename = 'z3test.smt'

# Make a solver with some arbitrary useless constraint
solver = z3.Solver()
solver.add(True)

# Save to file
smt2 = solver.sexpr()
with open(filename, mode='w', encoding='ascii') as f: # overwrite
    f.write(smt2)
    f.close()

# Load from file
solver.reset()
solver.from_file(filename)
它失败于:

Exception has occurred: ctypes.ArgumentError
argument 3: <class 'TypeError'>: wrong type
  File "C:\Users\Marian Aldenhövel\Desktop\FridgeIQ\z3\z3-4.8.4.d6df51951f4c-x64-win\bin\python\z3\z3core.py", line 3449, in Z3_solver_from_file
    _elems.f(a0, a1, _to_ascii(a2))
  File "C:\Users\Marian Aldenhövel\Desktop\FridgeIQ\z3\z3-4.8.4.d6df51951f4c-x64-win\bin\python\z3\z3.py", line 6670, in from_file
    _handle_parse_error(e, self.ctx)
  File "C:\Users\Marian Aldenhövel\Desktop\FridgeIQ\src\z3test.py", line 17, in <module>
    solver.from_file(filename)
发生异常:ctypes.ArgumentError 参数3::类型错误 文件“C:\Users\Marian Aldenhövel\Desktop\friedgeiq\z3\z3-4.8.4.d6df51951f4c-x64-win\bin\python\z3\z3core.py”,第3449行,位于z3_solver_文件中 _元素f(a0,a1,_至_ascii(a2)) 文件“C:\Users\Marian Aldenhövel\Desktop\friedgeiq\z3\z3-4.8.4.d6df51951f4c-x64-win\bin\python\z3\z3.py”,第6670行,在from_文件中 _句柄解析错误(e,self.ctx) 文件“C:\Users\Marian Aldenhövel\Desktop\FridgeIQ\src\z3test.py”,第17行,在 解算器。从_文件(文件名) 这是我的理解问题还是我的代码问题?可以这样做吗?
sexpr()
from_file()
的API调用对对吗

我正在Windows 10 64位上使用z3和z3py 4.8.4

更多详细信息(如需要):

我正在用Python中的z3为一个大的疾病难题寻找解决方案

要找到所有解决方案,我正在调用
solver.check()
。当它返回一个
sat
结论时,我将模型解释为我的谜题解决方案的图像。然后,我添加一个阻止子句,排除特定的解决方案,并再次调用
solver.check()

这很好,我很高兴

找到所有解决方案的运行时间将是很多天,或者直到我感到厌烦为止。我担心我的机器不会连续运行那么长时间。它可能会崩溃、耗尽电源或因其他原因重新启动

我可以很容易地重新创建初始约束,这是程序的全部要点。但是blocking子句是一个运行时产品,是我们所取得进展的函数

我想我可以保存解算器的状态,如果在运行时我发现这样一个文件重新启动,我可以完整地加载该文件,然后继续寻找更多的解决方案,而不必重新开始

感谢您花时间阅读和思考


Marian

使用
z34.4.1
z34.8.5
,我将以
smt2
格式转储(并重新加载)约束,如下所示:

导入z3
filename=“z3test.smt2”
x1=z3.实数(“x1”)
x2=z3.实(“x2”)
solver=z3.solver()
求解器添加(x1!=x2)
#
#贮藏
#
将open(filename,mode='w')作为f:
f、 写入(solver.to_smt2())
#
#重新装载
#
reset()解算器
constraints=z3.parse_smt2_文件(文件名,排序={},decls={})
添加(约束)
打印(解算器)
输出:

~$ python t.py 
[And(x1 != x2, True)]
文件
z3test.smt2

(set-info :status unknown)
(declare-fun x2 () Real)
(declare-fun x1 () Real)
(assert
 (and (distinct x1 x2) true))
(check-sat)

我不知道API是否在您使用的版本中发生了更改。欢迎反馈。

非常感谢。不幸的是,您的测试代码失败,错误消息与我的相同。在我未经培训的眼中,所写的文件看起来不错(抱歉,无法在评论中格式化):;从python API生成的基准测试(set info:status unknown)(declare-fun-x2()Real)(declare-fun-x1()Real)(assert(and(distinct-x1-x2)true))(check-sat)@MarianAldenhövel刚刚用
z3 4.8.5
进行了测试,比您的版本更新,并且有效。非常感谢。我将尝试查找该版本,它当前不在我获取4.8.4的地方。@MarianAldenhövel我克隆了
github
。事实上,我对来自_file的
和来自_string
也有问题,文档中对如何使用它们有些不清楚,但在我上面的玩具示例中,我使用了
z3.parse_smt2_file()
,效果很好。