Nikolaj 已经指出可以使用策略来执行量词消除。在这篇文章中,我想强调如何安全地混合 C++ 和 C API。 Z3 C++ API 使用引用计数来管理内存。expr
本质上是一个“智能指针”,它自动为我们管理引用计数器。我在以下帖子中讨论了这个问题:使用 C++ API 进行数组选择和存储 https://stackoverflow.com/questions/12995317/array-select-and-store-using-the-c-api.
因此,当我们调用返回 Z3_ast 的 C API 时,我们应该使用函数包装结果to_expr
, to_sort
or to_func_decl
。的签名to_expr
is:
inline expr to_expr(context & c, Z3_ast a);
通过使用此函数,我们可以避免内存泄漏和崩溃(当访问已被 Z3 垃圾收集的对象时)。这是使用的完整示例to_expr()
。您可以通过复制此函数来测试它example.cpp
文件在c++
Z3 发行版中的文件夹。
void tst_quantifier() {
context ctx;
expr x = ctx.int_const("x");
expr y = ctx.int_const("y");
expr sub_expr = (x <= y) && (y <= 2*x);
Z3_app vars[] = {(Z3_app) x};
expr qf = to_expr(ctx, Z3_mk_exists_const(ctx, 0, 1, vars,
0, 0, // patterns don't seem to make sense here.
sub_expr)); //No C++ API for quantifiers :(
tactic qe(ctx, "qe");
goal g(ctx);
g.add(qf);
std::cout << qe.apply(g);
}