That's because you leave your list tails open:
separate([X],X,_):-number(X).
separate([X],_,X).
The thing is: you actually do not need to write these statements, you could have omitted them:
separate([],[],[]).
separate([X|Y],[X|Z],S):-number(X),separate(Y,Z,S).
separate([X|Y],Z,[X|S]):-separate(Y,Z,S).
This would have worked but it would return multiple results, and except the first, all the remaining are wrong. You should solve this by adding a guard to the last clause:
separate([],[],[]).
separate([X|Y],[X|Z],S):-number(X),separate(Y,Z,S).
separate([X|Y],Z,[X|S]):-\+ number(X),separate(Y,Z,S).
Where \+ acts like a "not" in the sense that \+ number(X) will succeed if Prolog cannot match number(X).
A final note is that what you see is not really a memory address: it is simply an uninstantiated variable, although that is of course a minor remark.