(STRATEGY INNERMOST) (VAR x xs y ys z) (DATATYPES A = µX.< s(X), 0, false, true, logError, nil, cons(X, X), error, b, c >) (SIGNATURES le :: [A x A] -> A double :: [A] -> A log :: [A] -> A loop :: [A x A x A] -> A if :: [A x A x A x A] -> A maplog :: [A] -> A mapIter :: [A x A] -> A ifmap :: [A x A x A] -> A isempty :: [A] -> A last :: [A] -> A droplast :: [A] -> A a :: [] -> A) (RULES le(s(x),0()) -> false() le(0(),y) -> true() le(s(x),s(y)) -> le(x,y) double(0()) -> 0() double(s(x)) -> s(s(double(x))) log(0()) -> logError() log(s(x)) -> loop(s(x) ,s(0()) ,0()) loop(x,s(y),z) -> if(le(x,s(y)) ,x ,s(y) ,z) if(true(),x,y,z) -> z if(false(),x,y,z) -> loop(x ,double(y) ,s(z)) maplog(xs) -> mapIter(xs,nil()) mapIter(xs,ys) -> ifmap(isempty(xs),xs,ys) ifmap(true(),xs,ys) -> ys ifmap(false(),xs,ys) -> mapIter(droplast(xs) ,cons(log(last(xs)),ys)) isempty(nil()) -> true() isempty(cons(x,xs)) -> false() last(nil()) -> error() last(cons(x,nil())) -> x last(cons(x,cons(y,xs))) -> last(cons(y,xs)) droplast(nil()) -> nil() droplast(cons(x,nil())) -> nil() droplast(cons(x,cons(y,xs))) -> cons(x,droplast(cons(y,xs))) a() -> b() a() -> c())