Indices in a cycle

Hello

Can I change indeces in a cycle? For example (it does not work).

for i in [1,2,3]:
for j in [1,2,3]:
for k in [1,2,3]:
substitute(canonicalise($e_{i j k} s_{k}$), $e_{1 2 3} = 1$);


Thank you.

This does not work (as you wrote it) because the mathematical symbols i, j, k in the mathematical expression e_{i j k} s_{k} are not the same as the python symbols of the same name over which you do the loops. In Cadabra, symbols appearing in mathematical expressions are not Python objects (unlike, for example, in SymPy). If this sounds weird, think about the object e_{i j k}. That is clearly not a Python object. Cadabra's maths input language is not Python.

Of course you can still do what you want, using the much more powerful evaluate algorithm. You would write

{i,j,k}::Indices(values={1,2,3});
\epsilon_{i j k}::EpsilonTensor();
ex:=\epsilon_{i j k} s_{k};
evaluate(ex);


The evaluate does the index loops for you; the output will show that e.g. the i=1, j=2 component of your expression equals s_3.

If you had wanted to do other component value substitutions too, you can add them as rules to the evaluate function. For instance, if $s=(a,b,c)$, then use (instead of the last line above)

evaluate(ex, $s_{1}=a, s_{2}=b, s_{3}=c$);


Hope this helps.