 
 
 
int    Pl_Query_Start        (int functor, int arity, PlTerm *arg,
                              Bool recoverable)
int    Pl_Query_Next_Solution(void)
void   Pl_Query_End          (int op)
PlTerm Pl_Get_Exception      (void)
void   Pl_Exec_Continuation  (int functor, int arity, PlTerm *arg)
#include <string.h>
#include "gprolog.h"
Bool my_call(PlTerm goal)
{
 PlTerm *arg;
 int     functor, arity;
 int     result;
 arg=Rd_Callable_Check(goal, &functor, &arity);
 result=Pl_Query_Start(functor, arity, arg, FALSE);
 Pl_Query_End(PL_KEEP_FOR_PROLOG);
 return (result==PL_SUCCESS);
}
| | ?- my_call(write(hello)). | ||
| hello | ||
| | ?- my_call(for(X,1,3)). | ||
| X = 1 ? | (here the user presses ; to compute another solution) | |
| X = 2 ? | (here the user presses ; to compute another solution) | |
| X = 3 | (here the user is not prompted since there is no more alternative) | |
| | ?- my_call(1). | ||
| {exception: error(type_error(callable,1),my_call/1)} | ||
| | ?- my_call(call(1)). | ||
| no | ||
#include <string.h>
#include "gprolog.h"
Bool my_call(PlTerm goal)
{
 PlTerm *arg;
 int     functor, arity;
 int     result;
 arg=Rd_Callable_Check(goal, &functor, &arity);
 result=Pl_Query_Start(functor, arity, arg, FALSE);
 Pl_Query_End(PL_KEEP_FOR_PROLOG);
 if (result==PL_EXCEPTION)
    {
     PlTerm except=Pl_Get_Exception();
     Pl_Exec_Continuation(Find_Atom("throw"),1,&except);
    }
 return (result==PL_SUCCESS);
}
| | ?- my_call(call(1)). | ||
| {exception: error(type_error(callable,1),my_call/1)} | 
#include <string.h>
#include "gprolog.h"
Bool my_call(PlTerm goal)
{
 PlTerm *args;
 int    functor,arity;
 args=Rd_Callable_Check(goal, &functor, &arity);
 Pl_Exec_Continuation(functor, arity, args);
 return TRUE;
}
#include <string.h>
#include "gprolog.h"
Bool all_op(PlTerm list)
{
 PlTerm op[1024];
 PlTerm args[3];
 int    n=0;
 int    result;
 args[0]=Mk_Variable();
 args[1]=Mk_Variable();
 args[2]=Mk_Variable();
 result=Pl_Query_Start(Find_Atom("current_op"), 3, args, TRUE);
 while(result)
    {
     op[n++]=Mk_Atom(Rd_Atom(args[2])); /* arg #2 is the name of the op */
     result=Pl_Query_Next_Solution();
    }
 Pl_Query_End(PL_RECOVER);
 return Un_Proper_List_Check(n, op, list);
}
| ?- all_op(L). L = [:-,:-,\=,=:=,#>=,#<#,@>=,-->,mod,#>=#,**,*,+,+,',',...] | ?- findall(X,current_op(_,_,X),L). L = [:-,:-,\=,=:=,#>=,#<#,@>=,-->,mod,#>=#,**,*,+,+,',',...]
 
 
