Z3求解器的效率低下问题

时间:2018-06-19 12:38:43

标签: z3 solver smt

作为静态时间编译器分析的一部分,我正在使用Z3求解器(的Java API)检查(不)方程式的系统是否令人满意。一切似乎正常工作。但是,求解器太慢。对于下面发布的系统,Z3大约需要109秒才能宣布该系统不令人满意。 我没有使用Z3的任何经验。是否有任何经验法则可以帮助求解器合理地有效?

前缀形式的一组(不等式)如下: (注意:ITE表示if-then-else,并接受三个操作数。)

[ < , i_imopVarPre1,  ITE ,  > ,  - ,  + ,  + , 0,  * , tid2,  + ,  / ,  - , 100, 0, numTh,  % ,  - , 100, 0, numTh,  + ,  / ,  - , 100, 0, numTh,  % ,  - , 100, 0, numTh, 100, 0, 100,  + ,  + , 0,  * , tid2,  + ,  / ,  - , 100, 0, numTh,  % ,  - , 100, 0, numTh,  + ,  / ,  - , 100, 0, numTh,  % ,  - , 100, 0, numTh]
[ >= , i_imopVarPre1,  + , 0,  * , tid2,  + ,  / ,  - , 100, 0, numTh,  % ,  - , 100, 0, numTh]
[ < , i_imopVarPre0,  ITE ,  > ,  - ,  + ,  + , 0,  * , tid1,  + ,  / ,  - , 100, 0, numTh,  % ,  - , 100, 0, numTh,  + ,  / ,  - , 100, 0, numTh,  % ,  - , 100, 0, numTh, 100, 0, 100,  + ,  + , 0,  * , tid1,  + ,  / ,  - , 100, 0, numTh,  % ,  - , 100, 0, numTh,  + ,  / ,  - , 100, 0, numTh,  % ,  - , 100, 0, numTh]
[ >= , i_imopVarPre0,  + , 0,  * , tid1,  + ,  / ,  - , 100, 0, numTh,  % ,  - , 100, 0, numTh]
[ = , i_imopVarPre0, i_imopVarPre1]
[ > , numTh, 0]
[ >= , tid2, 0]
[ < , tid2, numTh]
[ >= , tid1, 0]
[ < , tid1, numTh]
[ != , tid2, tid1]

我已声明所有变量均为Int类。 将这些表达式添加到Z3之后,当我在求解器中打印断言时,将得到以下输出:

(let ((a!1 (+ (div (- 100 0) numTh) (mod (- 100 0) numTh))))
(let ((a!2 (> (- (+ 0 (* tid2 a!1) a!1) 100) 0)))
  (< i_imopVarPre1 (ite a!2 100 (+ 0 (* tid2 a!1) a!1)))))
(let ((a!1 (* tid2 (+ (div (- 100 0) numTh) (mod (- 100 0) numTh)))))    
  (>= i_imopVarPre1 (+ 0 a!1)))
(let ((a!1 (+ (div (- 100 0) numTh) (mod (- 100 0) numTh))))
(let ((a!2 (> (- (+ 0 (* tid1 a!1) a!1) 100) 0)))
  (< i_imopVarPre0 (ite a!2 100 (+ 0 (* tid1 a!1) a!1)))))
(let ((a!1 (* tid1 (+ (div (- 100 0) numTh) (mod (- 100 0) numTh)))))
  (>= i_imopVarPre0 (+ 0 a!1)))
(= i_imopVarPre0 i_imopVarPre1)
(> numTh 0)
(>= tid2 0)
(< tid2 numTh)
(>= tid1 0)
(< tid1 numTh)
(not (= tid2 tid1))

此外,请在以下位置找到调用check()方法后获得的统计信息:https://pastebin.com/cKimtm7g

对于上述系统,Z3预计会花费100秒左右吗?如果没有,我会缺少什么吗?

  1. 我是否应尽可能创建更短的(不)等式?那会帮助吗?
  2. 添加约束的顺序重要吗?

在这方面的任何建议都会很有帮助。此类查询的数量可能在数百个左右。

此外,由于许多Z3查询可能是同构的,因此有重用Z3查询的方法吗?由于标识符名称可以不同,因此我觉得记忆/搜索本身的任务可能会很昂贵。

0 个答案:

没有答案