z3:带超越函数的表达式从z3py到smt-lib2的转换

z3:带超越函数的表达式从z3py到smt-lib2的转换,z3,z3py,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)

据我所知,由于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)
错误:

File "<string>", line 1, in <module>
NameError: name 'sin' is not defined
文件“”,第1行,在
NameError:未定义名称“sin”
有出路吗?还是帮忙


谢谢。

这个问题的核心是
eval
试图执行一个Python脚本,即
部分[0]
中出现的所有函数都必须有一个同名的对应Python函数,这与三角函数不同(函数既不在中也不在中,前者基于后者). 现在,您可以尝试自己添加这些函数,或者使用基于的实现,或者用SMT2字符串替换Python字符串

Z3可以表示包含三角函数的表达式,但当逻辑设置为某个值时,它将拒绝这样做;看见我对Python不太了解,但它可能必须是
None
,而不是


虽然Z3可以表示这些表达式,但它可能不太擅长求解它们。请参阅和中有关限制的评论。

谢谢,但仍然不起作用,抛出了相同的错误。您还尝试了什么以及输入了哪些表达式?我尝试将“”更改为None/None/“None”等。我不知道:如何工作,但如果定义了三角函数,那么它就不会给我带来任何错误,它应该识别“sin”。我提供给它的表达式非常大。如果你能创建一个小复制,它会有所帮助。我已经更新了帖子,并提供了到输入文件的链接。请看一看
File "<string>", line 1, in <module>
NameError: name 'sin' is not defined