我正在使用Z3py,我必须创建数千个And()和Or()对象以提供给Z3 Solver。似乎大部分时间都是创建这些对象(将它们添加到求解器并解决它们要快得多)。作为极端情况,我试过这个:
assertion = True
for i in range(10000):
assertion = Or(assertion, True)
执行大约需要0.8秒(对于And()),这对于生成或断言对象来说似乎相当高。
Z3在创建And / Or对象时是否执行任何预处理,或者这种行为是否意外?我在Macbook Pro(2.4 GHz Intel i5,8 Gb RAM)上使用Z3py运行Z3。
答案 0 :(得分:1)
功能
def And(..):
...
def Or(..):
...
在文件z3.py中对计算类型的参数执行许多检查。 它们还包括一些调试断言。您可以通过设置内置参数或使用-O标志调用python来禁用python中的调试断言。
最终,这些函数调用Z3_mk_and和Z3_mk_or函数。您可以 也直接从python调用这些并绕过额外的检查和强制。例如,您可以按以下行定义内容 实现绕过几个健全性检查的功能,所以如果你的 代码有错误,错误消息不会提供信息。
def myAnd(es):
if es = []:
return BoolVal(True, get_ctx())
num = len(es)
ctx = es[0].ctx()
_es = (Ast * num)()
for I in range(num):
_es[I] = es[I].as_ast()
return BoolRef(Z3_mk_and(ctx.ref(), num, _es), ctx)