I am interested in defining certain functions, say $mathrm{Traco}$ that imply operators without build-in meaning, say $cdot$ (`Esc . Esc`

).

I want to mimic a trace for it, and the main property is cyclicity, which I expect to use to simplify expressions. Now I face the problem of the last two operators being the same, as is in general, when one wants to impose some invariance.

```
esq(A_CenterDot) := RotateLeft@A (*rotates to the CenterDot-product*)
Traco(A_CenterDot) := Traco(esq(A))
```

Last command I was expecting to yield $ mathrm{Traco}(xcdot ycdot ycdot xcdot ycdot x)=mathrm{Traco}( ycdot ycdot xcdot ycdot xcdot x)$, as the second argument is the result of `esq(x(CenterDot)y(CenterDot)y(CenterDot)x(CenterDot)y(CenterDot)x)`

.

But this of course gives a loop. In general, how does one correct this, and if possible how to deal with situations when “two arrows of the commutative diagram are the same operation”?