【发布时间】:2018-04-13 15:22:12
【问题描述】:
我想访问z3::expr。示例目录提供了这个 sn-p:
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
}
}
函数应用部分我没问题,但是遇到量词时我错过了一些。
当
e.is_quantifier()为真时,我如何获得我拥有的量词(存在或全部)?我了解 Z3 内部使用 De Bruijn 索引,我可以接受。但是
e.is_var()为真时如何获取索引呢?不太重要,但 Z3 仍然保留绑定变量的名称,即使知道 De Bruijn 索引在技术上使其冗余,因为如果我将表达式发送到 std::cout 变量名称就会出现。我如何得到它?我可以假设它们是一致的,即,如果我盲目地用每个变量的名称替换每个变量,那么变量会以正确的方式绑定吗? (如果我没记错的话,这相当于没有变量在其使用和原始绑定位点之间再次被量化)
【问题讨论】: