z3py处函数“ from_file()”的问题

问题描述 投票:0回答:1

假设我们有以下文件:

  • 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'

似乎求解器“ 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个回答
0
投票

如您所知,最好单独读取文件并将其加载到求解器是最好的选择。

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

© www.soinside.com 2019 - 2024. All rights reserved.