NAME Language::Prolog::Yaswi - Yet another interface to SWI-Prolog SYNOPSIS use Language::Prolog::Yaswi ':query'; use Language::Prolog::Types::overload; use Language::Prolog::Sugar functors => { equal => '=' is => 'is' }, chains => { orn => ';', andn => ',', add => '+' }, vars => [qw (X Y Z)];
swi_set_query( equal(X, Y), orn( equal(X, 27), equal(Y, 'hello'))); while (swi_next) { printf "Query=".swi_query()."\n"; printf " X=%_, Y=%_\n\n", swi_var(X), swi_var(Y); } print join("\n", xsb_findall(andn(equal(X, 2), orn(equal(Y, 1), equal(Y, 3.1416)) is(Z, plus(X,Y,Y))), [X, Y, Z]); ABSTRACT Language::Prolog::Yaswi implements a bidirectional interface to the SWI-Prolog system (<http://www.swi-prolog.org/>). DESCRIPTION This package provides a bidirectional interface to SWI-Prolog. That means that Prolog code can be called from Perl that can call Perl code again and so on: Perl -> Prolog -> Perl -> Prolog -> ... (unfortunately, by now, the cicle has to be started from Perl, although it is very easy to circunvent this limitation with the help of a dummy Perl script that just calls Prolog the first time). The interface is based on the set of classes defined in Language::Prolog::Types. Package Language::Prolog::Sugar can also be used to improve the look and readability of scripts mixing Perl and Prolog code. The interface to call Prolog from Perl is very simple, at least if you are used to Prolog non deterministic. SUBROUTINES Grouped by export tag: ":query" "swi_set_query($query1, $query2, $query3, ...)" Compose a query with all its parameters and sets it. Return the set of free variables found in the query. "swi_set_query_module($query, $module, $ctx_module)" Allows to set a query in a different module than the default. "swi_result()" Return the values binded to the variables in the query. "swi_next()" Iterates over the query solutions. If a new solution is available returns true, if not, closes the query and returns false. It should be called after "swi_set_query(...)" to obtain the first solution. "swi_var($var)" Returns the value binded to $var in the current query/solution combination. "swi_query" Returns the current query with the variables binded to its values in the current solution (or unbinded if swi_next has not been called yet). "swi_cut" Closes the current query even if not all of its solutions have been retrieved. Similar to prolog "!". "swi_find_all($query, @pattern)" iterates over $query and returns and array with @pattern binded to every solution. i.e: swi_find_all(member(X, [1, 3, 7, 21]), X) returns the array "(1, 3, 7, 21)" and swi_find_all(member(X, [1, 3, 7, 21]), [X]) returns the array "([1], [3], [7], [21])". More elaborate constructions can be used: %mothers=swi_find_all(mother(X,Y), X, Y) There is also an example of its usage in the SYNOPSIS. "swi_find_one($query, @pattern" as "swi_find_all" but only for the first solution. "swi_call" runs the query once and return true if a solution was found or false otherwise. ":interactive" "swi_toplevel" mostly for debugging pourposes, runs SWI-Prolog shell. ":assert" "swi_assert($head => @body)" "swi_assertz($head => @body)" add new definitions at the botton of the database "swi_asserta($head => @body)" adds new definitions at the top of the database "swi_facts(@facts)" commodity subroutine to add several facts (facts, doesn't have body) to the database in one call. i.e.: use Language::Prolog::Sugar functors=>[qw(man woman)]; swi_facts( man('teodoro'), man('socrates'), woman('teresa'), woman('mary') ); ":context" $swi_module $swi_ctx_module allows to change the module and the context module for the upcoming queries. use ALWAYS the "local" operator when changing its value!!! i.e.: local $swi_module='mymodule' swi_set_query($query_from_mymodule); $swi_converter allows to change the way data is converter from Perl to Prolog. You should not use it for any other thing that to configure perl classes as opaque, i.e.: $swi_converter->pass_as_opaque(qw(LWP::UserAgent HTTP::Request HTTP::Result)) CALLBACKS Yaswi adds to SWI-Prolog three new predicates to call perl back. All the calls are make in array contest and the Result value is always a list. There is not way to make a call in scalar context yet. "perl5_eval(+Code, -Result)" makes perl evaluate the string "Code" (really a Prolog atom) and returns the results. "perl5_call(+Sub, +Args, -Result)" calls a perl sub. "perl5_method(+Object, +Method, +Args, -Result)" calls the method "Method" from the perl object "Object". To get objects passed to prolog as opaques instead of marshaled to prolog types, its class (or one of its parent classes) has to be previously register as opaque with the $swi_converter object. i.e.: perl5_eval('$swi_converter->pass_as_opaque("HTTP::Request")',_), perl5_eval('use HTTP::Request',_), perl5_method('HTTP::Request', new, [], [Request]), perl5_method(Request, as_string, [], [Text]); Registering class "UNIVERSAL" makes all objects to be passed to prolog as opaques. EXPORT This module doesn't export anything by default. Subroutines should be explicitely imported. SEE ALSO SWI-Prolog documentation <http://www.swi-prolog.org/>, Languages::Prolog::Types, Language::Prolog::Sugar AUTHOR Salvador Fandiņo, <sfandino AT yahoo.com> COPYRIGHT AND LICENSE Copyright 2003 by Salvador Fandiņo This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.