|
|
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,#>=#,**,*,+,+,',',...]