z3:将具有超越函数的表达式从z3py转换为smt-lib2

时间:2015-10-05 18:50:38

标签: z3 z3py

据我所知,由于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

任何出路?或帮忙?

感谢。

1 个答案:

答案 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 functionsZ3 supports for nonlinear arithmeticsZ3 Performance with Non-Linear Arithmetic中的限制评论。