据我所知,由于z3不识别超越函数,因此在使用以下代码进行转换时会给我一个错误。
def convertor(f, status="unknown", name="benchmark", logic=""):
v = (Ast * 0)()
if isinstance(f, Solver):
a = f.assertions()
if len(a) == 0:
f = BoolVal(True)
else:
f = And(*a)
return Z3_benchmark_to_smtlib_string(f.ctx_ref(), name, logic, status, "", 0, v, f.as_ast())
pi, EI, kA , kB, N = Reals('pi EI kA kB N')
s= Solver()
s.add(pi == 3.1415926525)
s.add(EI == 175.2481)
s.add(kA>= 0)
s.add(kA<= 100)
s.add(kB>= 0)
s.add(kB<= 100)
s.add(N>= 100)
s.add(N<= 200)
请更改输入文件&#34; beamfinv3.bch&#34;的路径,可在以下位置找到:link
continue_read=False
input_file = open('/home/mani/downloads/new_z3/beamfinv3.bch', 'r')
for line in input_file:
if line.strip()=="Constraints":
continue_read=True
continue
if line.strip()=="end":
continue_read=False
if continue_read==True:
parts = line.split(';')
if (parts[0]!="end"):
#print parts[0]
s.add(eval(parts[0]))
input_file.close()
file=open('cyber.smt2','w')
result=convertor(s, logic="None")
file.write (result)
错误:
File "<string>", line 1, in <module>
NameError: name 'sin' is not defined
任何出路?或帮忙?
感谢。
答案 0 :(得分:0)
这个问题的核心是eval
尝试执行Python脚本,即parts[0]
内发生的所有函数必须具有相同名称的相应Python函数,但事实并非如此对于三角函数(既不在Python API也不在C API,前者基于后者)。现在你可以尝试自己添加这些函数,可能是基于parse_smt2_string的实现,或者可能通过用SMT2字符串替换Python字符串。
Z3可以表示包含三角函数的表达式,但是当逻辑设置为某个东西时它会拒绝这样做;见arith_decl_plugin。我不太了解Python,但它可能必须是None
而不是""
。
虽然Z3可以代表这些表达,但它可能不是很擅长解决它们。请参阅Can Z3 handle sinusoidal and exponential functions,Z3 supports for nonlinear arithmetics和Z3 Performance with Non-Linear Arithmetic中的限制评论。