使用Z3确定BV查询的量化消除难度

时间:2015-09-06 12:24:27

标签: z3 smt quantifiers

我目前正在使用Z3 C ++ API来解决bitvectors的查询问题。有些查询可能在顶层包含一个存在量词。

量词消除通常很简单,可以快速执行Z3。然而,在量化消除回归到列举成千上万个可行解决方案的情况下,我想放弃这个策略并以其他方式自己处理查询。

我尝试用'try-for'策略包装'qe'战术,希望如果量词消除失败(比如说100ms)我会知道我最好在其他方面处理查询办法。不幸的是,'try-for'策略未能取消量化消除(任何时间限制)。

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;

谢谢!

1 个答案:

答案 0 :(得分:1)

必须通过正在运行的策略定期检查超时取消。 我们基本上必须确保代码检查取消并且不会在没有检查的情况下进入长时间运行的循环。您可以通过在调试器中运行代码来确定无法检查取消的代码段,中断然后确定它所在的程序。然后在GitHub上提交一个错误,以便在有帮助的地方检查取消标记。 总的来说,当涉及到位向量时,量词消除策略目前相当简单,所以最好避免除了简单情况之外的所有qe。