(VAR x y xs f)
(RULES
  app(D, t) -> 1
  app(D, constant) -> 0
  app(D, app(app(+, x), y)) -> app(app(+, app(D, x)), app(D, y))
  app(D, app(app(*, x), y)) -> app(app(+, app(app(*, y), app(D, x))), app(app(*, x), app(D, y)))
  app(D, app(app(-, x), y)) -> app(app(-, app(D, x)), app(D, y))
  app(D, app(minus, x)) -> app(minus, app(D, x))
  app(D, app(app(div, x), y)) -> app(app(-, app(app(div, app(D, x)), y)), app(app(div, app(app(*, x), app(D, y))), app(app(pow, y), 2)))
  app(D, app(ln, x)) -> app(app(div, app(D, x)), x)
  app(D, app(app(pow, x), y)) -> app(app(+, app(app(*, app(app(*, y), app(app(pow, x), app(app(-, y), 1)))), app(D, x))), app(app(*, app(app(*, app(app(pow, x), y)), app(ln, x))), app(D, y)))

  app(app(map,f),nil) -> nil
  app(app(map,f),app(app(cons,x),xs)) -> app(app(cons,app(f,x)),app(app(map,f),xs))

  app(app(filter,f),nil) -> nil
  app(app(filter,f),app(app(cons,x),xs)) -> app(app(app(app(filter2,app(f, x)),f),x),xs)
  app(app(app(app(filter2,true),f),x),xs) -> app(app(cons,x),app(app(filter,f),xs))
  app(app(app(app(filter2,false),f),x),xs) -> app(app(filter,f),xs)

)