在 Z3py 中创建公式花费太多时间

Creating formula taking too much time in Z3py

使用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 sec

更改代码并将公式推入列表使其变得更好。但仍然是 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 sec

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

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