我打算与Microsoft Research的Z3 SMT解算器一起工作,该解算器将在具有执行时间限制的计算服务器上运行。我希望这份工作能超过这个限制。该计算中心的推荐政策是使用"检查点"并调用一系列作业,每个作业从上一个作业中获取检查点并继续工作。通过这种方式,任何进程都不会超过执行时间限制,因此其他用户也有机会运行其作业,但所使用的计算时间总量可能超过单个作业的超时时间。
Z3是否支持读写检查点?
通过" checkpoint",我的意思是一个序列化(某些部分)Z3求解器内部状态的文件,这样如果Z3进程写入一个检查点并退出,然后是第二个Z3进程启动时会读取检查点文件,在读回之后,新Z3进程的状态与前一个进程的状态相同(因此解算器不会再次启动,但会从中断处继续求解)。
作为替代方案,是否可以读取学习条款(或Z3内部构建的其他推理数据库)的数据库,而不是检查整个求解器?这可以通过使用学习的子句扩充输入文件来进行检查点的形式,尽管它可能不如真实的"整个内部状态的检查点。
答案 0 :(得分:1)
不,Z3没有实现已经内置的所有目标的工具.Z3目标和解算器对象可以通过Z3_goal_to_string和Z3_solver_to_string函数序列化为SMT2格式的字符串;这些可以用于检查指向,但是它们不会保存在最后一次搜索开始之前在目标或解算器中没有学到的任何条款。
如果主要目标是重新开始复杂的交互,那么Z3交互日志可能会有所帮助(参见Z3_open_log)。可以重播这些日志,但不会保存学习条款等。