(VAR x xs y z ) (RULES plus(x, y) -> plusIter(x, y, 0) plusIter(x, y, z) -> ifPlus(le(x, z), x, y, z) ifPlus(true, x, y, z) -> y ifPlus(false, x, y, z) -> plusIter(x, s(y), s(z)) le(s(x), 0) -> false le(0, y) -> true le(s(x), s(y)) -> le(x, y) sum(xs) -> sumIter(xs, 0) sumIter(xs, x) -> ifSum(isempty(xs), xs, x, plus(x, head(xs))) ifSum(true, xs, x, y) -> x ifSum(false, xs, x, y) -> sumIter(tail(xs), y) isempty(nil) -> true isempty(cons(x, xs)) -> false head(nil) -> error head(cons(x, xs)) -> x tail(nil) -> nil tail(cons(x, xs)) -> xs a -> b a -> c )