Hi, I have $\delta$-symbols involving a color index $a$ that runs from 1 to 3 and a Euclidian index $\mu$ from 1 to 4.

```
{\mu,\nu}::Indices(Euklid, position=free).
{\mu,\nu}::Integer(1..4).
{a,b}::Indices(Color, position=independent).
{a,b}::Integer(1..3).
\delta_{#}::KroneckerDelta.
```

But when I try to contract them like in

```
ex := \delta_{a \mu} \delta_{a \mu} ;
eliminate_kronecker(ex);
```

I get 4 but it should be 3. When I reverse the order of the indices I get the correct number:

```
ex2 := \delta_{\mu a} \delta_{\mu a} ;
eliminate_kronecker(ex2);
```

This gives 3.

I suppose cadabra contracts the first two indices first so in the first case we get

$\delta*{a \mu} \delta^{a \mu} = \delta*{\mu}^{\mu} = 4$

and in the second it becomes

$\delta*{\mu a} \delta^{\mu a} = \delta*{a}^{a} = 3$.

Maybe this behavior could be avoided by always first contracting the indices of higher dimension? In the meantime, can somebody think of a workaround?

In the interest of completeness:

```
ex3 := \delta_{\mu a} \delta_{a \mu} ;
eliminate_kronecker(ex3);
```

gives 4 and

```
ex4 := \delta_{a \mu} \delta_{\mu a} ;
eliminate_kronecker(ex4);
```

returns 3.

Thank you

EDIT: Directly after asking I think I found a workaround by adding a substitution to the post_process function that sorts the indices such that the Euclidian one gets contracted first.

```
def post_process(ex):
substitute( ex, $\delta_{a \mu} = \delta_{\mu a}$ )
```