我使用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。
答案 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示例。
希望这有帮助