Z3-如何从给定公式中提取变量? 我使用Z3C++ API(版本4.3.1),我想提取公式的变量(类型 Exp>)。我找到了一个,但它在Z3py中。我想知道Z3C/C++API中是否有一种方法可以从expr对象中提取变量。谢谢

Z3-如何从给定公式中提取变量? 我使用Z3C++ API(版本4.3.1),我想提取公式的变量(类型 Exp>)。我找到了一个,但它在Z3py中。我想知道Z3C/C++API中是否有一种方法可以从expr对象中提取变量。谢谢,z3,Z3,例如(省略了一些细节): expr fs=implies(x+y==0,z*x代码> VARTISE//COD>应该包含x,y,z,/p>< p>分布中的C++示例(示例/C++ +示例.CPP)显示了一个示例访问者模式。 这是非常简单的,但会给出一个想法 我在这里重复如下: void visit(expr const & e) { if (e.is_app()) { unsigned num = e.num_args(); for (unsigned i = 0; i

例如(省略了一些细节):

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

<> >代码> VARTISE//COD>应该包含x,y,z,/p>< p>分布中的C++示例(示例/C++ +示例.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
}
}
无效访问(expr const&e){
如果(e.is_app()){
unsigned num=e.num_args();
for(无符号i=0;i非常感谢,我还有一个问题。我注意到
e.is\u app()
e.is\u var()
是两个不同的分支。但是,变量也是一个应用程序。那么什么样的表达式
e
可以输入
e.is\u var()
分支而不是
e.is\u app()
branch?表达式可以是应用程序、量词或绑定变量。e.is_var()检查仅对绑定变量成功。Z3对绑定变量使用索引。因此,e.is_app和e.is_var的情况从不重叠。
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
}
}