(STRATEGY
    INNERMOST)

(VAR
    x y)
(DATATYPES
    A = µX.< 0, true, s(X), false, divByZeroError >)
(SIGNATURES
    ge :: [A x A] -> A
    minus :: [A x A] -> A
    div :: [A x A] -> A
    ify :: [A x A x A] -> A
    if :: [A x A x A] -> A)
(RULES
    ge(x,0()) -> true()
    ge(0(),s(x)) -> false()
    ge(s(x),s(y)) -> ge(x,y)
    minus(x,0()) -> x
    minus(s(x),s(y)) -> minus(x,y)
    div(x,y) -> ify(ge(y,s(0()))
                   ,x
                   ,y)
    ify(false(),x,y) ->
      divByZeroError()
    ify(true(),x,y) -> if(ge(x,y)
                         ,x
                         ,y)
    if(false(),x,y) -> 0()
    if(true(),x,y) -> s(div(minus(x
                                 ,y)
                           ,y)))