la continuación sólo funciona si se quita el atributo plana de NonCommutativeMultiply (Lo cual es algo que hice por error durante la prueba ... un error de novato!)
lo más sencillo que hacer es
Unprotect[NonCommutativeMultiply];
NonCommutativeMultiply[a___, 1, b___] := a ** b
NonCommutativeMultiply[___, 0, ___] := 0
NonCommutativeMultiply[a_] := a
Protect[NonCommutativeMultiply];
se necesita la expresión final de manera que se simplifica a a**1
a
en lugar de NonCommutativeMultiply[a]
. Es posible que también necesite NonCommutativeMultiply[]:=1
para que las expresiones como 1**1
se simplifiquen correctamente (*). El único problema con todo esto, es para expresiones grandes, el patrón se compara con todo y esto se vuelve realmente lento.
Las dos definiciones anteriores para 0 y 1 se pueden combinar y generalizarse a
NonCommutativeMultiply[a___, n_?NumericQ, b___] := n a ** b
qué factores a cabo cualquiera de los términos numéricos dentro de la expresión. Pero esto ralentiza las cosas aún más en expresiones grandes, ya que cada término se verifica para ver si es numérico.
para simplificar su a**a
-a^2
, necesita algo así como
NonCommutativeMultiply[a___, b_, b_, c___] := a ** b^2 ** c
o más generalmente
NonCommutativeMultiply[a___, b_^n_., b_^m_., c___] := a ** b^(n + m) ** c
(*) Tenga en cuenta que esto es sólo porque el orden predeterminado que pone de Mathematica su DownValues
no es necesariamente el mejor en este caso. Cambie el orden para que NonCommutativeMultiply[a_]
venga antes que a___ ** n_?NumericQ ** b___
, luego NonCommutativeMultiply[]
no será generado por las reglas, y no necesitará ese último patrón (a menos que produzca NonCommutativeMultiply[]
de otra manera).
tenga en cuenta que "\ *" se utiliza como un [metacarácter de marcado] (http://stackoverflow.com/editing-help) en SO. Puede tener un literal "\ *" escapándolo con una barra diagonal inversa ("\") o (si corresponde) marcando el texto como código con un backtick ("\" ") para el código en línea o sangría líneas con cuatro espacios. Si hace clic en el enlace "editar" para su pregunta, puede examinar el origen de la pregunta para ver cómo se hace. Puede leer más sobre el lenguaje de marcado (llamado Markdown) haciendo clic en el signo de interrogación naranja en la barra de herramientas del editor. – outis