(STRATEGY
    INNERMOST)

(VAR
    c l x y z)
(DATATYPES
    A = µX.< 0, true, s(X), false, eq(X, X), nil, cons(X, X) >)
(SIGNATURES
    ge :: [A x A] -> A
    rev :: [A] -> A
    if :: [A x A x A x A x A] -> A
    help :: [A x A x A x A] -> A
    append :: [A x A] -> A
    length :: [A] -> A)
(RULES
    ge(x,0()) -> true()
    ge(0(),s(y)) -> false()
    ge(s(x),s(y)) -> ge(x,y)
    rev(x) -> if(x
                ,eq(0(),length(x))
                ,nil()
                ,0()
                ,length(x))
    if(x,true(),z,c,l) -> z
    if(x,false(),z,c,l) -> help(s(c)
                               ,l
                               ,x
                               ,z)
    help(c,l,cons(x,y),z) ->
      if(append(y,cons(x,nil()))
        ,ge(c,l)
        ,cons(x,z)
        ,c
        ,l)
    append(nil(),y) -> y
    append(cons(x,y),z) -> cons(x
                               ,append(y,z))
    length(nil()) -> 0()
    length(cons(x,y)) ->
      s(length(y)))