This is the so-called vanilla meta-interpreter (I cribbed from this answer by Jan Burse):
solve(true) :- !.
solve((A,B)) :- !, solve(A), solve(B).
solve(H) :- clause(H,B), solve(B).
You can extend this to await some input by adding a predicate to ask for input before continuing:
confirm :- write('Continue? [y/n] '), flush_output, get_char(y).
Now replace the second clause with this:
solve((A,B)) :- !, solve(A), confirm, solve(B).
Edit: I asked how to add built-ins and got a response that you could just add this clause:
solve(T) :- call(T).