2013-05-03 1 views
1

Я пытаюсь использовать Дирак Бра и кет в Maxima, используя код здесь 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

+0

Я думаю, '.' не является ассоциативным. Рассмотрим этот пример '[a, b]: [[1, 0], [0, 1]]; a. (b. b); (a. B). b; ' – slitvinov

+0

Из руководства: Опционная переменная: dotassoc Значение по умолчанию: true Когда dotassoc истинно, выражение (A.B) .C упрощается до A. (B.C). – cwitte