在Z3py中创建公式占用太多时间

时间:2017-05-21 08:49:02

标签: python z3 z3py theorem-proving

使用Z3py生成公式,但公式生成需要花费太多时间。这是正常的吗? 在下面的代码中,我只是采用M-1参数并创建一个具有相等性的公式。我发现了与Implies类似的时间。

from z3 import *
import time
import sys

M = 32 
N = 8

p  = [ [Bool ("p_{}_{}".format(i,k)) for k in range(M)] for i in range(N)]
a  = [ [Bool ("a_{}_{}".format(i,k)) for k in range(M)] for i in range(N)]

sorts = [BoolSort() for m in range(M)]
f = [Function ("f_{}".format(m), *sorts) for m in range(M)]

starttime = time.time()

B = True
for i in range(N):
   for j in range(M):
     s = []
     for k in range(M):
        if j == k:
          continue
        s.append(p[i][k])
     B = And (a[i][j] == f[j](*s), B)
print "B", str(time.time() - starttime)

例如上面的代码:

  

59.5714960098秒

更改代码并将公式推送到列表使其变得更好。但还是8秒..!

 ....   
 A_list = []
 s = []
 for i in range(N):
   for j in range(M):
     del [:]
     .....
     l = And (a[i][j] == f_n[j](*s))
     A_list.append(l)
A0 = And( A_list )

print "A0", str(time.time() - starttime)
  

8.89373087883秒

我是第一次使用Z3py Api的用户。有人可以解释为什么它花了太多时间,这是常态吗?

1 个答案:

答案 0 :(得分:1)

有一个立即解决方法,即在禁用调试的情况下运行python。这是您可以从命令行使用的标志。 我现在也修复了Z3以避免时间开销。它将打印表达式并格式化从未在断言语句中使用的字符串(因为_z3_assert不是宏,它使用典型的值评估语义调用,因此也会花费成本来评估丢弃的参数)。 即使使用Z3的调试版本,第一个示例现在也不到一秒。