mid_split(X) :-
M is midpoint(X),
({X=<M} ; {M=<X}).
Note that mid_split succeeds if X is a number, but doesn't do anything.
Use clpBNR:small as a pre-test to avoid splitting intervals which are already small enough.
clpBNR:small/1