/* 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 block([head, tail], head : first(var), tail : rest(var), buildq([expr, head, tail], sum(contr(expr, tail), head, 1, 4))) elseif listp(var) and length(var) = 1 then block([head], head : first(var), buildq([expr, head], 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])$