“功能问题”;从“U文件()”开始;在z3py

“功能问题”;从“U文件()”开始;在z3py,z3,solver,z3py,Z3,Solver,Z3py,假设我们有以下文件: 函数smt 特别是smt 以及以下代码: from z3 import * s = Solver() s.from_file("func.smt") s.from_file("espec.smt") 当执行指令“s.from_file(“spect.smt”)”时,z3抛出下一个异常: z3.z3types.Z3Exception: b'(error "line 1 column 18: unknown sort \'AVL\'

假设我们有以下文件:

  • 函数smt
  • 特别是smt
以及以下代码:

    from z3 import *

    s = Solver()

    s.from_file("func.smt")
    s.from_file("espec.smt")
当执行指令“s.from_file(“spect.smt”)”时,z3抛出下一个异常:

z3.z3types.Z3Exception: b'(error "line 1 column 18: unknown sort \'AVL\'")\n'
似乎解算器“s”没有保存数据类型(以及函数)的信息。这就是他抛出异常的原因(我猜)

以下代码是解决此问题的一种方法:

    s = Solver()

    file = open("func.smt", "r")
    func = file.read()
    file.close()

    file = open("espec.smt", "r")
    espec = file.read()
    file.close()

    s.from_string(func + espec)
但这样做效率不高

有没有另一种更有效的方法来解决这个问题,并使z3保存数据类型和函数以供将来的断言和声明

编辑:

例如,在我的实际案例中,“func.smt”文件在函数和数据类型之间总共有54个声明(有些相当复杂)。“spec.smt”文件几乎没有声明和断言。最后,我有一个文件,其中有很多断言,我必须一点一点地阅读,并生成一个模型


也就是说,假设我有600行断言,我从10到10读取,所以每10行我生成一个模型。也就是说,如果我们假设我读过的那些断言存储在一个名为“aux”的变量中,每次我想要得到一个新模型,我将不得不总共执行“s.from_string(func+spec+aux)”60次,我不知道这是否能更有效。

单独读取文件并加载到解算器是最好的选择,正如你发现的


除非效率是最重要的,否则我不会担心尝试进一步优化它。对于任何合理的问题,您的求解时间将支配从几个(或几千个!)文件加载断言所花费的任何时间。你有没有一个用例真的需要这部分的速度大大加快?

我用一个真实的用例编辑了我的文章,这个用例看起来非常大,这样做可能会很慢。我非常怀疑这是否会引起关注。为什么不做一些分析,看看读取+加载与解决相比需要多长时间。如果没有实际的性能数据,您很可能会追求错误的优化目标。请注意,必须有人读取所有这些文件:无论是您还是z3,IO的成本都将存在。如有必要,请使用可变字符串连接。再快不过了。
z3.z3types.Z3Exception: b'(error "line 1 column 18: unknown sort \'AVL\'")\n'
    s = Solver()

    file = open("func.smt", "r")
    func = file.read()
    file.close()

    file = open("espec.smt", "r")
    espec = file.read()
    file.close()

    s.from_string(func + espec)