我希望以一种返回所有可能匹配的方式将模式匹配到表达式。使用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}}
请注意,表示了每个可能的分区。 我愿意自己实施。什么是模式匹配的标准算法,产生所有可能的匹配?
答案 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函数)。