使用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的用户。有人可以解释为什么它花了太多时间,这是常态吗?
答案 0 :(得分:1)
有一个立即解决方法,即在禁用调试的情况下运行python。这是您可以从命令行使用的标志。 我现在也修复了Z3以避免时间开销。它将打印表达式并格式化从未在断言语句中使用的字符串(因为_z3_assert不是宏,它使用典型的值评估语义调用,因此也会花费成本来评估丢弃的参数)。 即使使用Z3的调试版本,第一个示例现在也不到一秒。