将z3个c++ API ast(或求解器)对象转换为SMTLIB字符串
Converting z3 C++ API ast (or solver) objects to SMTLIB string
我正在使用z3和其他SMT求解器,并希望检查其他求解器(如boolector)胜过z3的情况,反之亦然。为此,我需要一种方法将声明和断言转换为其他SMT求解器可以识别的SMT- lib2格式。
例如,对于这个例子
void print_as_smtlib2_string() {
context c;
expr x = c.int_const("x");
expr y = c.int_const("y");
solver s(c);
s.add(x >= 1);
s.add(y < x + 3);
std::cout << s.check() << "n";
Z3_set_ast_print_mode(c, Z3_PRINT_SMTLIB_COMPLIANT);
std::cout << "nSolver is:n";
std::cout << s << "n";
}
我得到像这样的东西:坐在
解决者是:(解算器(>= x 1)(& lt;Y (+ x 3))
我想要的是这样的东西(rise4fun link: http://rise4fun.com/Z3/aznC8):
(declare-const x Int)
(declare-const y Int)
(assert (>= x 1))
(assert (< y (+ x 3)))
(check-sat)
我尝试过C API函数,如Z3_set_ast_print_mode, Z3_ast_to_string,但没有成功。我看了看Z3_benchmark_to_smtlib_string,但是这个帖子的Z3_benchmark_to_smtlib_string()的输入参数表明它只支持SMTLIB 1.0。
Z3_benchmark_to_smtlib_string是Z3用于此目的的唯一函数。就像你提到的那篇文章一样,它已经扩展到SMTLIB2。正如Leo在他对那篇文章的回复中所说,这是一个很少使用的旧函数,它可能不支持转储所有的特征(例如,解算器的参数)。最近,也有另一篇关于这个函数和旧版本Z3中的问题/bug的帖子(见这里)。
相关文章:
- 在 C++ 中将对象转换为派生类型
- Swig无法将python3的字节对象转换为std::string
- 如何将 Python 对象转换为 Cython 扩展类型的 std::vector 并返回?
- 使用 c++ 将 2d CAD 对象转换为 TIFF 格式
- 将对象转换为指向对象的指针?
- 将使用基类 Ctor创建的对象转换为派生类
- C++中的重载歧义,用于自动将对象转换为"printable"格式
- 无法将类对象转换为函数默认参数中的参考
- 无法将对象转换为初始化中的对象*
- 使用提升序列化将类对象转换为矢量无符号字符<>
- 防止在执行时将两个类中的两个对象转换为 bool:if(a!=b)
- 如何在Cython中将Python对象转换为C++类型
- 重载运算符 -- 无法在赋值中将对象转换为基类型
- Cpp:Cpp中的JSON解析器,提供支持序列化/反序列化功能,将JSON对象转换为用户定义的类
- 如何将 'int *' 类型的 swig 对象转换为 ctypes int*
- 将对象转换为 char,然后"uncasting it back"
- 如何在C++中使用boost库将类对象转换为json字符串
- 在 c++ 中使用重载运算符将父对象转换为子对象
- 字符串流 - 将对象转换为字符串
- 将Mat对象转换为双arr(OpenCV)