By default foreign predicates are deterministic. Using the
PL_FA_NONDETERMINISTIC attribute (see PL_register_foreign()) 
it is possible to register a predicate as a non-deterministic predicate. 
Writing non-deterministic foreign predicates is slightly more 
complicated as the foreign function needs context information for 
generating the next solution. Note that the same foreign function should 
be prepared to be simultaneously active in more than one goal. Suppose 
the natural_number_below_n/2 is a non-deterministic foreign predicate, 
backtracking over all natural numbers lower than the first argument. Now 
consider the following predicate:
quotient_below_n(Q, N) :-
        natural_number_below_n(N, N1),
        natural_number_below_n(N, N2),
        Q =:= N1 / N2, !.
In this predicate the function natural_number_below_n/2 simultaneously generates solutions for both its invocations.
Non-deterministic foreign functions should be prepared to handle three different calls from Prolog:
PL_FIRST_CALL)PL_REDO)PL_PRUNED)(term_t)0.
Both the context information and the type of call is provided by an 
argument of type control_t appended to the argument list 
for deterministic foreign functions. The macro PL_foreign_control() 
extracts the type of call from the control argument. The foreign 
function can pass a context handle using the PL_retry*() 
macros and extract the handle from the extra argument using the
PL_foreign_context*() macro.
return 
_PL_retry(n). 
See also PL_succeed().return _PL_retry_address(n). 
See also
PL_succeed().PL_PRUNED case and should be aware that the other 
arguments are not valid in this case.PL_FIRST_CALL the context value is 0L. Otherwise it is the 
value returned by the last PL_retry() 
associated with this goal (both if the call type is PL_REDO 
or PL_PRUNED).Fetch the Prolog predicate that is executing this function. Note that if the predicate is imported, the returned predicate refers to the final definition rather than the imported predicate; i.e., the module reported by PL_predicate_info() is the module in which the predicate is defined rather than the module where it was called. See also PL_predicate_info().
Note: If a non-deterministic foreign function returns using PL_succeed() 
or PL_fail(), Prolog assumes the foreign function has cleaned its 
environment. No call with control argument PL_PRUNED 
will follow.
The code of figure 5 shows a skeleton for a non-deterministic foreign predicate definition.
typedef struct                  /* define a context structure */
{ ...
} context;
foreign_t
my_function(term_t a0, term_t a1, control_t handle)
{ struct context * ctxt;
  switch( PL_foreign_control(handle) )
  { case PL_FIRST_CALL:
        if ( !(ctxt = malloc(sizeof *ctxt)) )
          return PL_resource_error("memory");
        <initialize ctxt>
        break;
    case PL_REDO:
        ctxt = PL_foreign_context_address(handle);
        break;
    case PL_PRUNED:
        ctxt = PL_foreign_context_address(handle);
        ...
        free(ctxt);
        return TRUE;
  }
  <find first/next solution from ctxt>
  ...
  // We fail */
  if ( <no_solution> )
  { free(ctx);
    return FALSE;
  }
  // We succeed without a choice point */
  if ( <last_solution> )
  { free(ctx);
    return TRUE;
  }
  // We succeed with a choice point */
  PL_retry_address(ctxt);
}