[英]How to transform a arithmetic expression to a Python arithmetic function?
假设我在Z3中进行了算术比较。 按照Z3py的语法,这是:
e=z3.Int('x') <=3
是否有一种简单的方法(而不是乏味的,逐个案例的解析过程)将Z3表达式(以Z3py表达)转换为Python函数,例如:
def e(x):
return x<=3
? 谢谢。
我不太了解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理解),然后使用它来更新本地dict。
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对象以供操作员使用,则此功能甚至应适用于z3对象。
我们没有公开任何反射工具(从python到Z3或其他方式),因此您将不得不遍历表达式并确定要生成本地python时如何反映它们。
或者,您可以使用Z3公开的简化程序来评估表达式。 因此,如果您在公式中具有自由变量的值,则可以使用替代函数(也通过Python公开)用这些值替换它们,然后调用simple()方法,然后检索python值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.