




A different interface is available for predicates which will be called often from Lisp. The macro 
deflogfun
 may be used to generate normal Lisp functions that run with precompiled goals.
(deflogfun break-up (y) (append ?a ?b y) (?a ?b))
(break-up '(foo bar baz))
(NIL (FOO BAR BAZ))
T
(break-up '(foo bar baz) :all :values) 
(NIL (FOO BAR BAZ))
((FOO) (BAR BAZ))
((FOO BAR) (BAZ))
((FOO BAR BAZ) NIL)
(break-up '(foo bar baz) :all :list) 
((NIL (FOO BAR BAZ))
((FOO) (BAR BAZ))
((FOO BAR) (BAZ))
((FOO BAR BAZ) NIL))
T
The generated function works like the Lisp functions any and findall, returning solutions to a prolog expression.
(deflogfun 
name
 
args
 
sample-expr
 
return-expr
)
defines a Lisp function called 
name
, whose lambda list is the list 
args
.  The function will also take a keyword argument 
:all
.  If the function is called with 
:all nil
 (the default), then it returns the first solution, like any.  If the function is called with 
:all t
, then it returns a list of all the solutions, like findall. If the function is called with 
:all :values
, then it returns multiple values, with one value per solution.
The 
sample-expr
 is like the second argument to any, that is, it is the prolog query expression.  The 
return-expr
 is like the first argument to 
clog:any
, that is, it defines how the result will be formed from the results of the query.  If any of the symbols mention in 
args
 appears in 
sample-expr
 or 
return-expr
, then its value is subsituted.  All other symbols in 
sample-expr
 and 
return-expr
 remain unchanged.