3

可能なすべての一致を返すような方法でパターンを式に一致させたいと思います。SymPy を使用すると、任意に選択した 1 つの方法でパターンを式に一致させることができます。パターン マッチングを使用してセット全体を取得するにはどうすればよいですか (任意の名前変更まで)

現在、私はこれを行うことができます

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

考えられる各パーティショニングが示されていることに注意してください。私はこれを自分で実装したいと思います。可能なすべての一致を生成するパターン マッチングの標準アルゴリズムは何ですか?

4

1 に答える 1

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 関数ですsympy.utilities.iterables)。

于 2012-10-24T06:24:20.613 に答える