expand before simplification?



Oops!
It seems I oversimplified the example, and my mistake of writing an "i" 
instead of 1 lead me to think it was good enough. Let me show you a more 
complete (non) working example of what my problem is:

I need to use several operators over a "vector", so I make the following:

kill(rules)$
dotdistrib:true$
dotscrules:true$
basis:{a,ad}$

basisp(x):=elementp(x,basis)$
ketp(x):=is(equal(op(x),ket))$

matchdeclare (i,integerp)$
matchdeclare([Z1,Z2,Z3],basisp)$
matchdeclare(K1,ketp )$

simp:false$
tellsimp(Z1[i] . K1, ket(evolve(Z1,i,K1)))$
simp:true$

phi:ket(n)$
r:a[1].ad[2]$
a[1].ad[2] . phi;
r.phi;

So, is basically the same, but now I'm using two operators. The output 
of this is:
(%o33) |evolve(a,1,|evolve(ad,2,|n>)>)>
(%o34) a[1] . |evolve(ad,2,|n>)>

(I have defined the output of ket(n) as |n>)
So If I write the complete expression it will work, but if I use an 
auxilary variable it
will apply the rule correctly once, but not the second time. This happes 
for any
number of operators. How can I make it apply the rules for the whole 
expression?

Thanks!

On 4/27/2011 12:00 AM, Robert Dodier wrote:
> Well, the problem is that i is not known to be an integer.
> You could try this:
>    matchdeclare (i, lambda ([e], integerp (e) or featurep (e, integer)));
> and then after the rule,
>    declare (i, integer);
> or you relax the matchdeclare for i to accept any symbol:
>    matchdeclare (i, symbolp);
> and then it will match i without any declaration for i.
>
> HTH
>
> Robert Dodier
>
> On 4/26/11, beren olvar<beren.olvar at gmail.com>  wrote:
>> Hi,
>>
>> I'm using tellsimp to write some simple rules to work with some operators
>> (a, ad) acting on some vectors(ket,bra).
>> So far I have something like this:
>>
>> basis:{a,ad}$
>> basisp(x):=elementp(x,basis)$
>> ketp(x):=is(equal(op(x),ket))$
>>
>> matchdeclare(K1,ketp )$
>> matchdeclare(Z1,basisp)$
>> matchdeclare (i,integerp)$
>>
>> simp:false$
>> tellsimp(Z1[i].K1, evolve(Z1,i,K1))$ /*operator acting over a state (ket)*/
>> simp:true$
>>
>> where evolve is a function I have defined before.
>> The problem is that if I use the basis elements "a" or "ad" explicitly it
>> works,for example:
>> a[1].ket(0,0,0,0);
>> gives
>> (%o1) evolve(a,1,ket(0,0,0,0))
>>
>> but if I do something like
>> r:a[i]$
>> r.ket(0,0,0,0);
>>
>> it will just write
>> (%o2) a[i] . ket(0,0,0,0)
>>
>> and "evolve" will not be called as it should. Is there a way I can force the
>> last expansion before the simplification is attempted so my rules are used?
>> Do you know of any other way I should try doing this?
>>
>> Thank you very much
>> Regards
>> Fernando
>>