SymPy中所有可能的匹配集

时间:2012-10-23 17:53:17

标签: pattern-matching sympy

我希望以一种返回所有可能匹配的方式将模式匹配到表达式。使用SymPy我可以用一种任意选择的方式将我的模式与我的表达相匹配。如何使用模式匹配来获取整个集合(最多为任意重命名)

目前我可以这样做

>>> p, q = Wild('p'), Wild('q')
>>> x, y, z = symbols('x,y,z')

>>> (p+q).matches(x+y+z)
{p: y + z, q: x}

我想这样做

>>> (p+q).allmatches(x+y+z)
{{p: x, q: y + z}, {p: y, q: x + z}, {p: z, q: x + y}}

请注意,表示了每个可能的分区。 我愿意自己实施。什么是模式匹配的标准算法,产生所有可能的匹配?

1 个答案:

答案 0 :(得分:2)

我认为您必须将匹配与所有可能的排除组合定位,例如

In [16]: [(x + y + z).match(Wild('p', exclude=i) + Wild('q', exclude=set([x, y, z]) - set(i))) for i in subsets([x, y, z])]
Out[16]: [{p: x + y + z, q: 0}, {p: y + z, q: x}, {p: x + z, q: y}, {p: x + y, q: z}, {p: z, q: x + y}, {p: y, q: x + z}, {p: x, q: y + z}, {p: 0, q: x + y + z}]

subsets是来自sympy.utilities.iterables的SymPy函数)。