2012-10-23 21 views
3

我想以某種方式將模式匹配到表達式,以便返回所有可能的匹配。使用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}} 

注意,每個可能的分區被表示。 我會願意自己實現這一點。什麼是模式匹配的標準算法可以產生所有可能的匹配?

回答

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}] 

subsetssympy.utilities.iterables的SymPy功能)。

+0

請注意,這些字典中的每個「p」和「q」的比較都不同,因爲它們有不同的「排除」。所以你需要跟蹤'p's和'q's以後訪問它們。 – asmeurer

+0

這個解決方案將如何推廣到更復雜的表達式和更多野性的模式? – MRocklin

+0

我不清楚更一般的表達會是什麼樣子。顯然,你可以通過直接使用子集來獲得上述內容。 – asmeurer