Вступление.
Пишу обобщенную функцию
H, которая весьма терпима ко входу, анализирует его, частично упрощает, и передаёт те же данные в неком унифицированном виде.
По смысле в качестве аргумента передаётся нечто примерно вида
n1 a1 + n2 a2 + ..., где n1 и n2 — числовые (впрочем, не обязательно Numeric) коэффициенты, a1 и a2 — сложные объекты с известной структурой.
Нужно привести подобные члены, при необходимости пораскрывать скобки по дистрибутивности вроде
n1 (a1 + a2) -> n1 a1 + n1 a2 и попереставлять члены вроде
n1 a1 n2 -> (n1 n2) a1. Для этого я использую
Plus и
Times, потому что они сами всё это делают. Остаётся результат распарсить и представить, например, в виде таблицы
{{n1, a1}, {n2, a2}, ...}.
Вопрос.
Код:
Clear[H];
SetAttributes[H, {Flat, Orderless}];
H[terms_List] := H[Simplify[Plus @@ terms]];
H[Plus[terms : PatternSequence[_, __]]] := H[terms];
В последней строке я хочу сложение на верхнем уровне поглотить. Если я напишу
H[Plus[terms__]] := H[terms], возникнет бесконечная рекурсия. Поэтому я в правиле указываю, что количество слагаемых должно быть больше 1. Однако, приведённый код не работает. Почему? Как это исправить?
P.S. другие советы тоже приветствую.