【发布时间】:2015-12-02 02:47:11
【问题描述】:
我目前正在使用 Z3 C++ API 来解决对位向量的查询。某些查询可能在顶层包含存在量词。
量词消除通常很简单,可以由 Z3 快速执行。但是,在量词消除回退到枚举数千个可行解决方案的情况下,我想中止这种策略并自己以其他方式处理查询。
我已经尝试用 'try-for' 策略包装 'qe' 策略,希望如果量词消除失败(比如 100 毫秒)我会知道我最好用其他方式处理查询大大地。不幸的是,“尝试”策略无法取消量词消除(对于任何时间限制)。
在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;
谢谢!
【问题讨论】:
标签: z3 smt quantifiers