## meld

Combine terms when allowed by symmetries.

In a sum of terms, combine terms using mono-term and multi-term symmetries such that
the expression does not use an overcomplete basis. The `meld`

algorithm does *not*rewrite the expression to a canonical form, but it instead combines terms such that no terms remain which are a linear combination of the other terms. It can hence be used to prove equivalency of expressions under both mono-term and multi-term symmetries.

A typical use cases where

`meld`

is preferable over e.g. `canonicalise`

is when
the expression contains tensors with multi-term symmetries:R_{a b c d}::RiemannTensor;
ex:=R_{a b c d}R_{a b c d} + R_{a b c d}R_{a c b d};
meld(ex);

\(\displaystyle{}\text{Attached property TableauSymmetry to }R_{a b c d}.\)

\(\displaystyle{}R_{a b c d} R_{a b c d}+R_{a b c d} R_{a c b d}\)

R_{a b c d} R_{a b c d} + R_{a b c d} R_{a c b d}

\(\displaystyle{}\frac{3}{2}R_{a b c d} R_{a b c d}\)

3/2 R_{a b c d} R_{a b c d}

What has happened here is that the algorithm figured out that the first term is
expressible in terms of the second, and has combined the two. If you write the
terms in the opposite order,

`meld`

still combines them, but now in the form
of the other term:ex:=R_{a b c d}R_{a c b d}+ R_{a b c d}R_{a b c d};
meld(ex);

\(\displaystyle{}R_{a b c d} R_{a c b d}+R_{a b c d} R_{a b c d}\)

R_{a b c d} R_{a c b d} + R_{a b c d} R_{a b c d}

\(\displaystyle{}3R_{a b c d} R_{a c b d}\)

3R_{a b c d} R_{a c b d}

So

`meld`

does not canonicalise, but rather writes the expression such that there
remain no linear dependencies between terms.This algorithm can of course be used for simpler situations, e.g. one which uses
mono-term symmetries only:

A_{m n}::AntiSymmetric;
ex:=A_{m n} - A_{n m};
meld(ex);

\(\displaystyle{}\text{Attached property AntiSymmetric to }A_{m n}.\)

\(\displaystyle{}A_{m n}-A_{n m}\)

A_{m n}-A_{n m}

\(\displaystyle{}2A_{m n}\)

2A_{m n}

The

`meld`

algorithm can also be used as a quick way to collect terms which only differ by dummy index
relabelling (even when there are no symmetries present), e.g.ex:=Q_{m n} R^{m n} + R^{p q} Q_{p q};

\(\displaystyle{}Q_{m n} R^{m n}+R^{p q} Q_{p q}\)

Q_{m n} R^{m n} + R^{p q} Q_{p q}

meld(ex);

\(\displaystyle{}2Q_{m n} R^{m n}\)

2Q_{m n} R^{m n}

The algorithm also handles cyclic symmetries of traces:

{\mu,\nu}::Indices(vector).
u^{\mu}::ImplicitIndex.
u^{\mu}::SelfNonCommuting.
tr{#}::Trace.
ex := tr{u^{\mu} u^{\mu} u^{\nu} u^{\nu}} -
tr{u^{\mu} u^{\nu} u^{\nu} u^{\mu}};
meld(ex);

\(\displaystyle{}tr\left(u^{\mu} u^{\mu} u^{\nu} u^{\nu}\right)-tr\left(u^{\mu} u^{\nu} u^{\nu} u^{\mu}\right)\)

tr(u^{\mu} u^{\mu} u^{\nu} u^{\nu})-tr(u^{\mu} u^{\nu} u^{\nu} u^{\mu})

\(\displaystyle{}0\)

0