做到这一点的关键是要认识到 Mathematica 代表a-b
as 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]]
returns -q c**c
.
HTH