将z3 C ++ API ast(或解算器)对象转换为SMTLIB字符串

时间:2014-03-28 23:53:49

标签: c++ api z3 smt

我正在玩z3和其他SMT求解器,想要检查其他求解器如boolector胜过z3的情况,反之亦然。为此,我需要一种方法将声明和断言转换为SMT-LIB2格式,而其他SMT求解器可以识别这种格式。

例如,对于此示例

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";
}

我得到类似的东西: 饱和

解决方案是: (解算器   (&gt; = 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但是这篇文章Input arguments of Z3_benchmark_to_smtlib_string()表明它只支持SMTLIB 1.0。

1 个答案:

答案 0 :(得分:1)

Z3_benchmark_to_smtlib_string是Z3为此目的唯一的功能。就像你提到的那些帖子一样,它已经扩展到SMTLIB2。正如Leo在对该帖子的回复中所说,它是一个很少使用的旧函数,它可能不支持转储所有功能(例如,求解器上的参数)。最近,还有另一篇与此功能有关的帖子以及旧版Z3中的问题/错误(见here)。