仅当您删除 NonCommutativeMultiply 的 Flat 属性时,以下内容才有效(这是我在测试过程中错误地做的事情......一个菜鸟错误!)
最简单的事情是
Unprotect[NonCommutativeMultiply];
NonCommutativeMultiply[a___, 1, b___] := a ** b
NonCommutativeMultiply[___, 0, ___] := 0
NonCommutativeMultiply[a_] := a
Protect[NonCommutativeMultiply];
需要最终的表达式,以便a**1
简化为a
代替NonCommutativeMultiply[a]
。您可能还需要NonCommutativeMultiply[]:=1
这样表达式就像1**1
适当简化(*)。
所有这一切的唯一问题是,对于大型表达式,模式会根据所有内容进行检查,这会变得非常慢。
上述 0 和 1 的两个定义可以组合并推广为
NonCommutativeMultiply[a___, n_?NumericQ, b___] := n a ** b
它将表达式中的所有数字项分解出来。
但这在大型表达式中会进一步减慢速度,因为每个项都会被检查以查看其是否为数值。
为了简化您的a**a
to a^2
,你需要类似的东西
NonCommutativeMultiply[a___, b_, b_, c___] := a ** b^2 ** c
或者更一般地说
NonCommutativeMultiply[a___, b_^n_., b_^m_., c___] := a ** b^(n + m) ** c
(*) 请注意,这只是因为 Mathematica 的默认顺序DownValues
在这种情况下, in 不一定是最好的。更改顺序以便NonCommutativeMultiply[a_]
出现在之前a___ ** n_?NumericQ ** b___
then NonCommutativeMultiply[]
不会由规则生成,并且您不需要最后一个模式(除非您生成NonCommutativeMultiply[]
其他方式)。