Z3 - 如何从给定的公式中提取变量?

时间:2014-09-22 13:51:53

标签: z3

我使用Z3 C ++ API(版本4.3.1),我想提取公式的变量(类型为expr的对象)。我找到了similar question,但它在Z3py中。我很想知道Z3 C / C ++ API中是否有一个方法可以从expr对象中提取变量。谢谢!

例如(省略一些细节):

    expr fs = implies(x + y == 0, z * x < 15);
    std::vector<expr> varlist = get_vars(fs);

然后varlist应包含x,y,z。

1 个答案:

答案 0 :(得分:3)

分发中的C ++示例(examples / c ++ / example.cpp)显示了一个示例访问者模式。 这非常简单,但会提出这个想法。

我在下面重复一遍:

void visit(expr const & e) {
if (e.is_app()) {
    unsigned num = e.num_args();
    for (unsigned i = 0; i < num; i++) {
        visit(e.arg(i));
    }
    // do something
    // Example: print the visited expression
    func_decl f = e.decl();
    std::cout << "application of " << f.name() << ": " << e << "\n";
}
else if (e.is_quantifier()) {
    visit(e.body());
    // do something
}
else { 
    assert(e.is_var());
    // do something
}
}

访问者功能可以通过使用来改进 先前访问过的表达式的缓存,因为通常Z3使用共享子表达式。 这类似于Python示例。

希望这有帮助