我目前使用Z3 C++ API解决位向量查询问题。一些查询可能包含顶级的存在量词。使用Z3确定BV查询的量词消除难度
量词消除通常很简单,可以通过Z3快速执行。然而,在那些量词消去回归到数千种可行解决方案的情况下,我想放弃这种策略并以其他方式自己处理查询。
我试着用'尝试'的策略来包装'qe'-tactic,希望如果量词消除失败(比如说100ms),我会知道我最好在一些情况下处理查询另一种方式。不幸的是,'尝试'的策略未能消除量词消除(任何时间限制)。
在old post讨论了类似的问题,并且'smt'策略被指责为没有响应。同样的推理是否适用于'qe'战术?同一篇文章表明,'未来'版本应该更加敏感。 有没有什么方法或启发式来确定量词消除是否需要很长时间(除了在单独的线程中运行求解器并在超时时将其消除)?
我们已经附上一个小例子,所以你可以尝试一下自己:
z3::context ctx;
z3::expr bv1 = ctx.bv_const("bv1", 10);
z3::expr bv2 = ctx.bv_const("bv2", 10);
z3::goal goal(ctx);
goal.add(z3::exists(bv1, bv1 != bv2));
z3::tactic t = z3::try_for(z3::tactic(ctx,"qe"), 100);
auto res = t.apply(goal);
std::cout << res << std::endl;
谢谢!