2013-05-03 50 views
1

我想使用的代碼從這裏http://raoul.koalatux.ch/sites/ladderoperator/ladder_operator.html簡化規則不適用正常

declare(bra, nonscalar); 
declare(ket, nonscalar); 
dotscrules:true; 
matchdeclare(m,lambda([t],featurep(t,integer))); 
matchdeclare(n,lambda([t],featurep(t,integer))); 

tellsimp(bra(m).ket(n), kron_delta(m,n)); 

對於大多數表達它的工作原理採用狄拉克狄拉克符號在千里馬:

bra(0) . ket(0); 
ket(1) . bra(0) . ket(0); 
bra(1) . ket(1) . bra(0) . ket(0); 

所有簡化正確,但

bra(1) . ket(1) . bra(0); 

未能簡化爲胸罩(0)。我如何獲得Maxima來簡化這種情況?

回答

2

我認爲你可以這樣開始:

declare(bra, nonscalar); 
declare(ket, nonscalar); 
dotscrules:true; 
matchdeclare(m,lambda([t],featurep(t,integer))); 
matchdeclare(n,lambda([t],featurep(t,integer))); 

tellsimp(bra(m).ket(n), kron_delta(m,n)); 

simp:false; 
matchdeclare(aa, true); 
matchdeclare(bb, true); 
matchdeclare(cc, true); 
tellsimp (aa.(bb.cc),(aa.bb).cc); 
simp:true; 

/* Tests */ 
bra(0) . ket(0); 
ket(1) . bra(0) . ket(0); 
bra(1) . ket(1) . bra(0) . ket(0); 
bra(1) . ket(1) . bra(0); 
ket(1) . bra(1) . ket(1); 
+0

優秀,這樣的作品,但爲什麼我需要重新定義的'.'的關聯性? – cwitte 2013-05-06 09:27:50

+0

我認爲'.'不是聯想。考慮這個例子'[a,b]:[[1,0],[0,1]]; a。 (b。b); (a。b)。 B;' – slitvinov 2013-05-07 10:41:31

+0

從手冊:選項變量:dotassoc 缺省值:true 當dotassoc爲真,表達式(A·B).C簡化爲A.(B.C)。 – cwitte 2013-05-07 15:45:37