作为静态时间编译器分析的一部分,我正在使用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秒左右吗?如果没有,我会缺少什么吗?
在这方面的任何建议都会很有帮助。此类查询的数量可能在数百个左右。
此外,由于许多Z3查询可能是同构的,因此有重用Z3查询的方法吗?由于标识符名称可以不同,因此我觉得记忆/搜索本身的任务可能会很昂贵。