z3py 函数 "from_file()" 的问题
Problem with function "from_file()" at z3py
假设我们有以下文件:
- 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"的变量中,每次我想得到一个新模型,我将总共需要做60次"s.from_string (func + spec + aux)",我不知道是否可以提高效率。
如您所见,单独读取文件并加载到求解器是最好的选择。
除非效率是最重要的,否则我不会担心尝试进一步优化它。对于任何合理的问题,您的求解器时间将支配从几个(或几千个!)文件加载断言所花费的时间。您是否有真正需要这部分明显更快的用例?
假设我们有以下文件:
- 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"的变量中,每次我想得到一个新模型,我将总共需要做60次"s.from_string (func + spec + aux)",我不知道是否可以提高效率。
如您所见,单独读取文件并加载到求解器是最好的选择。
除非效率是最重要的,否则我不会担心尝试进一步优化它。对于任何合理的问题,您的求解器时间将支配从几个(或几千个!)文件加载断言所花费的时间。您是否有真正需要这部分明显更快的用例?