【问题标题】:Problem with function "from_file()" at z3pyz3py 中函数“from_file()”的问题
【发布时间】:2019-11-30 17:54:07
【问题描述】:

假设我们有以下文件:

  • func.smt
    (declare-datatypes (T) ((AVL leafA (nodeA (val T) (alt Int) (izq AVL) (der AVL)))))
  • espec.smt
     (declare-const t (AVL  Int))

还有如下代码:

    from z3 import *

    s = Solver()

    s.from_file("func.smt")
    s.from_file("espec.smt")

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

z3.z3types.Z3Exception: b'(error "line 1 column 18: unknown sort \'AVL\'")\n'

Solver "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 solver z3py


    【解决方案1】:

    如您所见,分别读取文件并加载到求解器是您最好的选择。

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

    【讨论】:

    • 我用一个真实的用例编辑了我的帖子,这个用例看起来很大,这样可能会很慢。
    • 我非常怀疑这会是一个问题。你为什么不做一些分析来看看阅读+加载与解决相比需要多长时间。如果没有实际的性能数据,您很可能会追求错误的优化。请注意,必须有人阅读所有这些文件:无论是您还是 z3,IO 的成本都将在那里。如有必要,使用可变字符串进行连接。它不会比这更快。
    猜你喜欢
    • 1970-01-01
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-23
    相关资源
    最近更新 更多