如何将算术表达式转换为Python算术函数?

时间:2015-12-04 20:09:57

标签: python z3 z3py

假设我在Z3中进行了算术比较。遵循Z3py的语法,这是:

e=z3.Int('x') <=3

是否有一种简单的方法(而不是繁琐的逐案解析过程)将Z3表达式(以Z3py表示)转换为Python函数,例如:

def e(x):
  return x<=3

? 感谢。

2 个答案:

答案 0 :(得分:2)

我并不特别了解z3,但您可以尝试类似这样的例子:

import operator
from functools import partial    

f_dict = {"e"+str(i):f for i,f in 
          enumerate([partial(op, n) 
                     for n in range(10) 
                         for op in [operator.lt ,operator.le , operator.eq]])}

locals().update(f_dict)

这里我自动创建函数,并组合到0到9之间的数字,如果小于,等于或等于,则比较另一个数字。 让我们把它分成概念:

要使用的运营商列表

[operator.lt ,operator.le , operator.eq]

绑定到名称的通用函数,它接受一个数字并使用运算符和理解数:

lambda x: op(x, n)

然后我们只需要将它们绑定到字典中的名称(dict comprehension)并使用它更新本地字典。

locals().update(f_dict)

使用控制台:

>>> import operator
f_dict = {"e"+str(i):f for i,f in enumerate([lambda x: op(x, n) for n in range(10) for op in [operator.lt ,operator.le , operator.eq]])}
locals().update(f_dict)

>>> e1(3)
False

如果z3对象被正确提升以便与操作员一起使用,这个功能甚至可以工作。

答案 1 :(得分:0)

我们不会暴露任何反射设施(从python到Z3或其他方式),因此您必须遍历表达式并确定如何反映它们您想要生成本机python。

或者,您可以使用Z3公开的简化器来计算表达式。 因此,如果您在公式中有自由变量的值,那么您可以使用 替换函数(也通过Python公开)用值替换它们, 然后调用simplify()方法,然后检索python值。