二項演算子の引数が1つのとき

a**b**cNonCommutativeMultiply[a,b,c]の略記であり,またNonCommutativeMultiplyの属性Flatのためにa**(b**c)等とも同値である.NonCommutativeMultiplyには属性OneIdentityも設定されているため,NonCommutativeMultiplyの引数をパタンマッチで取り出すとき,取り出した結果には自動的にNonCommutativeMultiplyが頭部として付く.a**(b**c)が常にa**b**cに読み替えられるならば,NonCommutativeMultiply[a,b,c]b,c部分を取り出したとき,それは元々b**cだったのかもしれない訳で,そういう扱いが属性OneIdentityの役割である.
さて**二項演算子だと思うとNonCommutativeMultiply[a_]:=aは自然である.しかしこれが属性OneIdentityと組み合わさると,NonCommutativeMultiplyの引数を取り出したつもりが,得たaにはNonCommutativeMultiply[a]が入ってくるため,無限ループになってしまう.これはどうしたものか... ClearAttributesを使ってOneIdentityを除いても振る舞いが変わらない! (Attributesによれば確かに消えているのに! Times[a]はひとりでにaに等しくなるのに!)
これじゃtensor積の実装で困る.無論,入力するときには**を常に使うと思うとNonCommutativeMultiply[a]の形の式は現れない.しかし...|j4,m4>の形の内積を,内側から順に評価するときNonCommutativeMultiply[a__,e1_] NonCommutativeMultiply[e2_,b__]:=e1 e2 NonCommutativeMultiply[a] NonCommutativeMultiply[b]のようにするとNonCommutativeMultiply[a]の形の式が現れてしまう.昨日は愚直にa_**e1_ e2_**b_:=e1 e2 a b /;FreeQ[e1,NonCommutativeMultiply]∧FreeQ[e1,NonCommutativeMultiply]とやったらうまく行った.