Набор всех возможных совпадений в 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}}

Обратите внимание, что представлены все возможные разбиения. Я был бы готов реализовать это сам. Каковы стандартные алгоритмы сопоставления с образцом, которые производят все возможные совпадения?


person MRocklin    schedule 23.10.2012    source источник


Ответы (1)


Я думаю, вам нужно настроить таргетинг на совпадения со всеми возможными наборами исключений, например

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).

person asmeurer    schedule 24.10.2012
comment
Обратите внимание, что каждый p и q в этих словарях будет сравниваться по-разному, потому что у них разные exclude. Поэтому вам нужно будет отслеживать p и q, чтобы получить к ним доступ позже. - person asmeurer; 24.10.2012
comment
Как это решение обобщается на более сложные выражения и шаблоны с большим количеством подстановочных знаков? - person MRocklin; 24.10.2012
comment
Мне не ясно, как бы выглядело для вас более общее выражение. Очевидно, вы могли бы получить вышеперечисленное, просто используя подмножества напрямую. - person asmeurer; 25.10.2012