If you want to call Prolog multiple times in a loop for side effect, for example over the elements of a list, then some care is required in order not to cause a memory leak by creating more and more SP_term_refs. The recommended coding scheme is to use a backtracking loop (see Terminating a Backtracking Loop). For example, suppose that you want the C equivalent of the following code:
process_list(L) :- member(X, L), once(process(X)), fail. process_list(_). process(X) :- ...
That can be encoded as follows, where
refL is the SP_term_ref
... SP_qid goal; SP_pred_ref member2 = SP_predicate("member", 2, "user"); SP_pred_ref process1 = SP_predicate("process", 1, "user"); SP_term_ref refX = SP_new_term_ref(); SP_put_variable(refX); goal = SP_open_query(member2, refX, refL); while (SP_next_solution(goal)==SP_SUCCESS) SP_query_cut_fail(process1, refX); SP_close_query(goal); ...
This programming style is particularly relevant in a stand-alone executable, where the top level iterates over some transactions to be processed.