/* Contract indices in expression */ /* NOTE: buildq works like splicing a list with quasiquote in lisp; escaped items are defined at start of quote */ contr(expr, var) ::= ( if listp(var) and length(var) > 1 then buildq( [expr, head : first(var), tail : rest(var)], sum(contr(expr, tail), head, 1, 4)) elseif listp(var) and length(var) = 1 then buildq( [expr, head : first(var)], sum(expr, head, 1, 4)) elseif listp(var) then ( expr) else buildq([expr, var], sum(expr, var, 1, 4))); /* Differentiate with respect to nth coordinate */ cdiff(func, coord) := diff(func, ct_coords[coord])$ /* Wave operator */ box_op(func) := ( expand(contr(ug[μ,ν] * cdiff(cdiff(func, ν), μ), [μ,ν]) - contr(ug[μ,ν] * mcs[μ,ν,ρ] * cdiff(func, ρ), [μ,ν,ρ])))$