a field-theory motivated approach to computer algebra

## canonicalise

Bring a tensorial expression to canonical form by re-ordering indices.
Canonicalise a product of tensors, using the mono-term index symmetries of the individual tensors and the exchange symmetries of identical tensors. Tensor exchange takes into account commutativity properties of identical tensors. Note that this algorithm does not take into account multi-term symmetries such as the Ricci identity of the Riemann tensor; those canonicalisation procedures require the use of young_project_tensor or young_project_product. Similarly, dimension-dependent identities are not taken into account, use decompose_product for those. In order to specify symmetries of tensors you need to use symmetry properties such as Symmetric, AntiSymmetric or TableauSymmetry. The following example illustrates this.
A_{m n}::AntiSymmetric. B_{p q}::Symmetric. ex:=A_{m n} B_{m n}; canonicalise(_);
$$\displaystyle{}A_{m n} B_{m n}$$
$$\displaystyle{}0$$
If the various terms in an expression use different index names, you may need an additional call to rename_dummies before the terms get collected together:
{m,n,p,q,r,s}::Indices. A_{m n}::AntiSymmetric. C_{p q r}::AntiSymmetric. ex:=A_{m n} C_{m n q} + A_{s r} C_{s q r}; canonicalise(_);
$$\displaystyle{}A_{m n} C_{m n q}+A_{s r} C_{s q r}$$
$$\displaystyle{}A_{m n} C_{q m n}-A_{r s} C_{q r s}$$
rename_dummies(_);
$$\displaystyle{}0$$
If you have symmetric or anti-symmetric tensors with many indices, it sometimes pays off to sort them to the end of the expression (this may speed up the canonicalisation process considerably).