Ключом к этому является осознание того, что Mathematica представляет a-b
как a+((-1)*b)
, как вы можете видеть из
In[1]= FullForm[a-b]
Out[2]= Plus[a,Times[-1,b]]
Для первой части вашего вопроса все, что вам нужно сделать, этодобавьте это правило:
NonCommutativeMultiply[Times[-1, a_], b__] := - a ** b
или вы даже можете поймать знак из любой позиции:
NonCommutativeMultiply[a___, Times[-1, b_], c___] := - a ** b ** c
Обновление - часть 2. Общая проблема с получениемСкаляры на передний план - это то, что шаблон _Integer
в вашем текущем правиле будет определять только те вещи, которые явно целые.Он даже не заметит, что q
является целым числом в конструкции, подобной Assuming[{Element[q, Integers]}, a**q**b]
.
. Чтобы достичь этого, вам необходимо изучить предположения, процесс, который, вероятно, стоит дорого поместить в таблицу глобальных преобразований.Вместо этого я написал бы функцию преобразования, которую я мог бы применить вручную (и, возможно, удалить текущее правило из глобальной таблицы).Примерно так может сработать:
NCMScalarReduce[e_] := e //. {
NonCommutativeMultiply[a___, i_ /; Simplify@Element[i, Reals],b___]
:> i a ** b
}
Используемое выше правило использует Simplify
для явного запроса допущений, которые можно установить глобально, назначив $Assumptions
или локально, используя Assuming
:
Assuming[{q \[Element] Reals},
NCMScalarReduce[c ** (-q) ** c]]
возвращает -q c**c
.
HTH