我有一组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
答案 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|y
用x0
表示。结果的第二部分是简化表达式(打包到列表中,因为输入可以是表达式列表)。