Z3和策略:使用哪种策略?

时间:2018-08-30 23:03:46

标签: z3 smt z3py

所以我正在尝试使用z3解决调度问题。我有一组需要完成的工作,以及一组能够完成这些工作的资源。作业是有序的(总顺序),通常使用线性算术方程式(=,<,>)和布尔表达式(例如:job1和job2分配给不同的资源=>它们可以并行运行)来表示问题。

约束本身并不复杂,但是我向求解器抛出的约束数量成千上万,可能会增加10倍。

因此,我遇到的问题之一是Z3似乎不确定如何解决相同的问题(但是在不同的运行过程中)。有时它会在几秒钟内产生结果,但有时却需要时间。然后,我经常要做的是终止当前运行并重新启动,然后再次给我几乎瞬时的结果。 我想知道,使用某些策略/战术是否有助于更一致地将Z3引导到正确的方向?

我正在使用z3py(具有优化功能),当我执行print(len(z3.tactics()))时,我发现有107种不同的策略。而且,如果我使用print(z3.tactics())打印这些策略的描述,那将是非常不堪重负的。

有没有人知道一个纸质/网站,基本上可以根据我使用的约束类型提示我使用哪种策略? (在我的情况下:线性算术和一些没有量词的布尔约束)

1 个答案:

答案 0 :(得分:0)

不幸的是,

Z3战术文献不多。但是开发人员并没有真正受到指责:基于策略的定理证明固有地与实现的具体细节相关:无论是优秀的旧手动证明器(Isabelle,HOL,Coq等)还是更现代化/自动化的证明器/求解器,例如例如精益/ Z3等。最好的策略是继续应用它们,看看是否可以找到合适的组合。诚然,这不是最有用的建议,但是在这一点上,选择正确的策略比艺术更是一门艺术,而不是科学,并且需要对求解器本身有深入的了解。

话虽如此,这里有一些基本文档:http://www.cs.tau.ac.il/~msagiv/courses/asv/z3py/strategies-examples.htm

如果您要实验并记录您的发现,我相信其他跟随z3的人会发现它有用!