sympy:如何简化多个表达式

时间:2019-02-01 02:54:39

标签: python sympy

我有一组sympy这样的表达式(其中有数百个):

>>> foo = parse_expr('X | Y')
>>> bar = parse_expr('(Z & X) | (Z & Y)')
>>> baz = parse_expt('AAA & BBB') # not needed for this example; just filler

我可以单独简化一个:

>>> simplify(bar)
Z & (X | Y)

有没有一种方法可以简化,包括整个可用变量集?

>>> mysimplify(bar, include=(foo,bar,baz))
Z & foo

1 个答案:

答案 0 :(得分:4)

您可以利用Common Subexpresion Elimination。您必须通过将所有表达式组合成一个人工表达式(例如,将它们作为参数传递给虚拟函数)来与simplify结合使用。我认为它不会一直按预期运行,但是在您的示例的宽松模拟中,它会产生预期的结果:

In [1]: from sympy import *

In [2]: myexprlist = sympify('listofexpr(x|y, (z&x)|(z&y))')

In [3]: cse(simplify(myexprlist))
Out[3]: ([(x0, Or(x, y))], [listofexpr(x0, And(x0, z))])

结果中的第一项是已引入子表达式的列表。在这种情况下 子表达式x|yx0表示。结果的第二部分是简化表达式(打包到列表中,因为输入可以是表达式列表)。