如何将算术表达式转换为 Python 算术函数?
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 理解)并使用它更新本地字典。
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 上公开)用值替换它们,
然后调用 simplify() 方法,然后检索 python 值。
假设我在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 理解)并使用它更新本地字典。
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 上公开)用值替换它们, 然后调用 simplify() 方法,然后检索 python 值。