重放“会话”的最佳方式是什么

时间:2013-05-03 06:55:47

标签: z3

在第一阶段,我收集一系列约束。然后,我想存储这个“会话”,即所有约束,但所有相关变量也存储在一个文件中,这样我就可以在第二阶段回读约束并断言它们,甚至否定它们中的一些在断言之前。

将这样的“会话”存储在文件中并将其读回的最佳方法(快速且可靠)是什么? Z3_parse_smtlib2_file()API是否正确?我尝试过Z3_open_log()API,但是我没有找到API来读取Z3_open_log()生成的日志文件。那z3_log_replay()呢。此API似乎尚未公开。

提前致谢。

AG

1 个答案:

答案 0 :(得分:1)

Z3_open_log()创建的日志文件可以通过命令行选项/ log myfile与Z3.exe(独立解释器,而不是lib)一起重放。截至今天,我还没有在Z3库中看到任何允许这种重放的API。目前,我已经了解重播被认为是用于调试分析。

但是,您可以破解库(只需在z3_replayer.h中公开z3_replayer类)并使用它来重放任何日志文件,这很容易。我的小可行性证明的源代码如下所示,据我所知,工作正常。我认为能够做到这一点非常好,因为有时我需要重放会话以进行调试。能够从文件中重放它是好的,而不是从我整个程序中重放它。

任何反馈都会非常受欢迎。此外,我有兴趣知道是否可以将此功能集成到lib中。

AG。

#include <fstream>
#include <iostream>
#include "api/z3_replayer.h"


int main(int argc, char * argv[])
{
   const char * filename = argv[1];
   std::ifstream in(filename);
   if (in.bad() || in.fail()) {
       std::cerr << "Error: failed to open file: " << filename << "\n";
       exit(EXIT_FAILURE);
}
    z3_replayer r(in);
    r.parse();

    Z3_context ctx = reinterpret_cast<Z3_context>(r.get_obj(0));

    check(ctx,Z3_L_TRUE); // this function is taken from the c examples 

    return 0;
}