{a,b,c,d,e}::Indices;
\delta{#}::KroneckerDelta;
ex:=\delta^{a}_{b}^{c}_{d};
expand_delta(_);


{a,b,c,d,e,m,n,p,q,r,s,t}::Indices;
A_{a b c}::AntiSymmetric;
\delta{#}::KroneckerDelta;
ex:=\delta^{a}_{b}^{c}_{d} A_{a c e};
expand_delta(_);

# Lovelock 2nd order (Gauss-Bonnet)
{a,b,c,d,e,m,n,p,q,r,s,t}::Indices;
\delta{#}::KroneckerDelta;
R_{m n p q}::RiemannTensor;
ex:=\delta_{a m b n c p d q} R_{a b m n} R_{c d p q};
expand_delta(_);
distribute(_);
eliminate_kronecker(_);
meld(_);
substitute(_, $R_{m n m n}=R, R_{m c p c} = R_{m p}, R_{c m c p} = R_{m p}$);

# Lovelock 3rd order
{a#, m#}::Indices;
\delta{#}::KroneckerDelta;
R_{m1 m2 m3 m4}::RiemannTensor;
ex:=\delta_{a1 m1 a2 m2 a3 m3 a4 m4 a5 m5 a6 m6} R_{a1 a2 m1 m2} R_{a3 a4 m3 m4} R_{a5 a6 m5 m6};
expand_delta(_);
distribute(_);
eliminate_kronecker(_);
substitute(_, $R_{m1 m2 m1 m2}=R, R_{m1 a1 m1 a2} = R_{a1 a2}, R_{a1 m1 m1 a2} = -R_{a1 a2}, R_{m1 a1 a2 m1} = -R_{a1 a2}, R_{a1 m1 a2 m1} = R_{a1 a2}$, repeat=True);
sort_product(_)
meld(_);
print(len(ex))

# Lovelock 4th order    
{a#, m#}::Indices;
\delta{#}::KroneckerDelta;
R_{m1 m2 m3 m4}::RiemannTensor;
ex:=\delta_{a1 m1 a2 m2 a3 m3 a4 m4 a5 m5 a6 m6 a7 m7 a8 m8} R_{a1 a2 m1 m2} R_{a3 a4 m3 m4} R_{a5 a6 m5 m6} R_{a7 a8 m7 m8};
expand_delta(_);
distribute(_);
eliminate_kronecker(_);
print(len(ex))
# 2520 terms
substitute(_, $R_{m1 m2 m1 m2}=R, R_{m1 a1 m1 a2} = R_{a1 a2}, R_{a1 m1 m1 a2} = -R_{a1 a2}, R_{m1 a1 a2 m1} = -R_{a1 a2}, R_{a1 m1 a2 m1} = R_{a1 a2}$, repeat=True);
sort_product(_)
print(len(ex))
# 1489 terms
canonicalise(_);
rename_dummies(_);
print(len(ex))
# 25 terms
meld(_);
print(len(ex))  
# 20 terms

# Lovelock 5th order    
{a#, m#}::Indices;
\delta{#}::KroneckerDelta;
R_{m1 m2 m3 m4}::RiemannTensor;
ex:=\delta_{a1 m1 a2 m2 a3 m3 a4 m4 a5 m5 a6 m6 a7 m7 a8 m8 a9 m9 a10 m10} R_{a1 a2 m1 m2} R_{a3 a4 m3 m4} R_{a5 a6 m5 m6} R_{a7 a8 m7 m8} R_{a9 a10 m9 m10};
expand_delta(_)
distribute(_) # need l_applied_no_new_dummies; slow now
eliminate_kronecker(_) # ditto; slow now
# 113400 terms
print(len(ex))
canonicalise(_);  # takes a long time
# 15814 terms
print(len(ex))
rename_dummies(_);
# 452 terms
print(len(ex))
meld(_);
#  terms
print(len(ex))  
substitute(_, $R_{m1 m2 m1 m2}=R, R_{m1 a1 m1 a2} = R_{a1 a2}, R_{a1 m1 m1 a2} = -R_{a1 a2}, R_{m1 a1 a2 m1} = -R_{a1 a2}, R_{a1 m1 a2 m1} = R_{a1 a2}$, repeat=True);


{m,n,p,q,r,s,t,u,x,y,s,v,z,w,a,b,c,d,e,f,i,j,k,l#}::Indices(vector).
{m,n,p,q,r,s,t,u,x,y,s,v,z,w,a,b,c,d,e,f,i,j,k,l#}::Integer(0..D-1).
g_{i j}::Metric.
g^{i j}::InverseMetric.
g_{i j}::Symmetric.
S_{i j}::Symmetric.
W_{m n p q}::WeylTensor.
\delta{#}::KroneckerDelta;
R_{m n p q}::RiemannTensor;

ex5:=\delta^{i}_{a}^{j}_{b}^{k}_{c}^{l}_{d}^{m}_{e}^{n}_{r}^{t}_{p}^{x}_{q}^{y}_{z}^{s}_{w}
R^{a b}_{i j}R^{c d}_{k l}R^{e r}_{m n}R^{p q}_{t x}R^{z w}_{y s};
expand_delta(_);
