以下僅工作,如果您刪除NonCommutativeMultiply 的平屬性(這是一件好事測試...一個新手的錯誤時我做了錯誤!)
最簡單的事情做的是
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
到a^2
,你需要像
NonCommutativeMultiply[a___, b_, b_, c___] := a ** b^2 ** c
或者更一般
NonCommutativeMultiply[a___, b_^n_., b_^m_., c___] := a ** b^(n + m) ** c
(*)請注意,這僅僅是因爲默認的順序是數學看跌期權其DownValues
在這種情況下不一定是最好的。更改訂單,以便NonCommutativeMultiply[a_]
在a___ ** n_?NumericQ ** b___
之前,然後NonCommutativeMultiply[]
不會由規則生成,並且您不需要最後一個模式(除非您以其他方式生成NonCommutativeMultiply[]
)。
請注意,「\ *」在SO上用作[標記元字符](http://stackoverflow.com/editing-help)。通過用反斜槓(「\」)或(如果適用)將文本標記爲代碼,使用反斜槓(「\`」)對於內聯代碼或具有四個空格的縮進行,可以具有文字「\ *」。如果您點擊您的問題的「編輯」鏈接,您可以檢查問題來源,看看它是如何完成的。您可以通過單擊編輯器工具欄中的橙色問號來閱讀有關標記語言(稱爲Markdown)的更多信息。 – outis 2011-02-17 02:18:22