ASPN ActiveState Programmer Network
ActiveState
/ Home / Perl / PHP / Python / Tcl / XSLT /
/ Safari / My ASPN /
Cookbooks | Documentation | Mailing Lists | Modules | News Feeds | Products | User Groups


Recent Messages
List Archives
About the List
List Leaders
Subscription Options

View Subscriptions
Help

View by Topic
ActiveState
.NET Framework
Open Source
Perl
PHP
Python
Tcl
Web Services
XML & XSLT

View by Category
Database
General
SOAP
System Administration
Tools
User Interfaces
Web Programming
XML Programming


MyASPN >> Mail Archive >> perl-AI
perl-AI
Re: ANNOUNCE: Language::Prolog::Yaswi, Yet Another interface to SWI-Prolog
by Lee Goddard other posts by this author
Jan 22 2003 7:38PM messages near this date
ANNOUNCE: Language::Prolog::Yaswi, Yet Another interface to SWI-Prolog | Re: ANNOUNCE: Language::Prolog::Yaswi, Yet Another interface to SWI-Prolog
-----BEGIN PGP SIGNED MESSAGE-----
Hash: MD5


Hi Salvador,

Looks very interesting, but if it is an interface to
a specific prolog, shouldn't it all be in a namespace
reflecting that?

Like Language::Prolog::SWI, rather than just Language::Prolog?

lee

On Wednesday, January 22, 2003 at 4:09:06 PM, you wrote:

SF>  NAME
SF>      Language::Prolog::Yaswi - Yet another interface to
SF>  SWI-Prolog

SF>  SYNOPSIS
SF>        use Language::Prolog::Yaswi ':query';
SF>        use Language::Prolog::Types::overload;
SF>        use Language::Prolog::Sugar functors => { equal =>
SF>  '='
SF>                                                  is    =>
SF>  'is' },
SF>                                    chains => { orn => ';',
SF>                                                andn => ',',
SF>                                                add => '+' },
SF>                                    vars => [qw (X Y Z)];

SF>        swi_set_query( equal(X, Y),
SF>                       orn( equal(X, 27),
SF>                            equal(Y, 'hello')));

SF>        while (swi_next) {
SF>            printf "Query=".swi_query()."\n";
SF>            printf "  X=%_, Y=%_\n\n", swi_var(X),
SF>  swi_var(Y);
SF>        }

SF>        print join("\n",
SF>                   xsb_findall(andn(equal(X, 2),
SF>                                    orn(equal(Y, 1),
SF>                                        equal(Y, 3.1416))
SF>                                    is(Z, plus(X,Y,Y))),
SF>                               [X, Y, Z]);

SF>  ABSTRACT
SF>      Language::Prolog::Yaswi implements a bidirectional
SF>  interface to the
SF>      SWI-Prolog system (<http://www.swi-prolog.org/>).

SF>  DESCRIPTION
SF>      This package provides a bidirectional interface to
SF>  SWI-Prolog. That
SF>      means that Prolog code can be called from Perl that can
SF>  call Perl code
SF>      again and so on:

SF>        Perl -> Prolog -> Perl -> Prolog -> ...

SF>      (unfortunately, by now, the cicle has to be started
SF>  from Perl, although
SF>      it is very easy to circunvent this limitation with the
SF>  help of a dummy
SF>      Perl script that just calls Prolog the first time).

SF>      The interface is based on the set of classes defined in
SF>      Language::Prolog::Types. Package
SF>  Language::Prolog::Sugar can also be
SF>      used to improve the look and readability of scripts
SF>  mixing Perl and
SF>      Prolog code.

SF>      The interface to call Prolog from Perl is very simple,
SF>  at least if you
SF>      are used to Prolog non deterministic.

SF>    SUBROUTINES
SF>      Grouped by export tag:

SF>      ":query"

SF>          "swi_set_query($query1, $query2, $query3, ...)"
SF>              Compose a query with all its parameters and
SF>  sets it. Return the
SF>              set of free variables found in the query.

SF>          "swi_set_query_module($query, $module,
SF>  $ctx_module)"
SF>              Allows to set a query in a different module
SF>  than the default.

SF>          "swi_result()"
SF>              Return the values binded to the variables in
SF>  the query.

SF>          "swi_next()"
SF>              Iterates over the query solutions.

SF>              If a new solution is available returns true, if
SF>  not, closes the
SF>              query and returns false.

SF>              It should be called after "swi_set_query(...)"
SF>  to obtain the
SF>              first solution.

SF>          "swi_var($var)"
SF>              Returns the value binded to $var in the current
SF>  query/solution
SF>              combination.

SF>          "swi_query"
SF>              Returns the current query with the variables
SF>  binded to its
SF>              values in the current solution (or unbinded if
SF>  swi_next has not
SF>              been called yet).

SF>          "swi_cut"
SF>              Closes the current query even if not all of its
SF>  solutions have
SF>              been retrieved. Similar to prolog "!".

SF>          "swi_find_all($query, @pattern)"
SF>              iterates over $query and returns and array with
SF>  @pattern binded
SF>              to every solution. i.e:

SF>                swi_find_all(member(X, [1, 3, 7, 21]), X)

SF>              returns the array "(1, 3, 7, 21)" and

SF>                swi_find_all(member(X, [1, 3, 7, 21]), [X])

SF>              returns the array "([1], [3], [7], [21])".

SF>              More elaborate constructions can be used:

SF>                %mothers=swi_find_all(mother(X,Y), X, Y)

SF>              There is also an example of its usage in the
SF>  SYNOPSIS.

SF>          "swi_find_one($query, @pattern"
SF>              as "swi_find_all" but only for the first
SF>  solution.

SF>          "swi_call"
SF>              runs the query once and return true if a
SF>  solution was found or
SF>              false otherwise.

SF>      ":interactive"

SF>          "swi_toplevel"
SF>              mostly for debugging pourposes, runs SWI-Prolog
SF>  shell.

SF>      ":assert"

SF>          "swi_assert($head => @body)"
SF>          "swi_assertz($head => @body)"
SF>              add new definitions at the botton of the
SF>  database

SF>          "swi_asserta($head => @body)"
SF>              adds new definitions at the top of the database

SF>          "swi_facts(@facts)"
SF>              commodity subroutine to add several facts
SF>  (facts, doesn't have
SF>              body) to the database in one call.

SF>              i.e.:

SF>                use Language::Prolog::Sugar functors=>[qw(man
SF>  woman)];

SF>                swi_facts( man('teodoro'),
SF>                           man('socrates'),
SF>                           woman('teresa'),
SF>                           woman('mary') );

SF>      ":context"

SF>          $swi_module
SF>          $swi_ctx_module
SF>              allows to change the module and the context
SF>  module for the
SF>              upcoming queries.

SF>              use ALWAYS the "local" operator when changing
SF>  its value!!!

SF>              i.e.:

SF>                 local $swi_module='mymodule'
SF>                 swi_set_query($query_from_mymodule);

SF>          $swi_converter
SF>              allows to change the way data is converter from
SF>  Perl to Prolog.

SF>              You should not use it for any other thing that
SF>  to configure perl
SF>              classes as opaque, i.e.:


$swi_converter-> >pass_as_opaque(qw(LWP::UserAgent

SF>  HTTP::Request

SF>  HTTP::Result))

SF>    CALLBACKS
SF>      Yaswi adds to SWI-Prolog three new predicates to call
SF>  perl back.

SF>      All the calls are make in array contest and the Result
SF>  value is always a
SF>      list. There is not way to make a call in scalar context
SF>  yet.

SF>      "perl5_eval(+Code, -Result)"
SF>          makes perl evaluate the string "Code" (really a
SF>  Prolog atom) and
SF>          returns the results.

SF>      "perl5_call(+Sub, +Args, -Result)"
SF>          calls a perl sub.

SF>      "perl5_method(+Object, +Method, +Args, -Result)"
SF>          calls the method "Method" from the perl object
SF>  "Object".

SF>          To get objects passed to prolog as opaques instead
SF>  of marshaled to
SF>          prolog types, its class (or one of its parent
SF>  classes) has to be
SF>          previously register as opaque with the
SF>  $swi_converter object. i.e.:


SF>  perl5_eval('$swi_converter->pass_as_opaque("HTTP::Request")',_),
SF>            perl5_eval('use HTTP::Request',_),
SF>            perl5_method('HTTP::Request', new, [],
SF>  [Request]),
SF>            perl5_method(Request, as_string, [], [Text]);

SF>          Registering class "UNIVERSAL" makes all objects to
SF>  be passed to
SF>          prolog as opaques.

SF>    EXPORT
SF>      This module doesn't export anything by default.
SF>  Subroutines should be
SF>      explicitely imported.

SF>  SEE ALSO
SF>      SWI-Prolog documentation <http://www.swi-prolog.org/>,
SF>      Languages::Prolog::Types, Language::Prolog::Sugar

SF>  AUTHOR
SF>      Salvador Fandiño, <sfandino AT yahoo.com>

SF>  COPYRIGHT AND LICENSE
SF>      Copyright 2003 by Salvador Fandiño

SF>      This library is free software; you can redistribute it
SF>  and/or modify it
SF>      under the same terms as Perl itself.

-----BEGIN PGP SIGNATURE-----
Version: 2.6

iQCVAwUAPi7zN6drfekeF/QBAQFVNQQAswsGde50oVocGFzJ8/DqF8Kx7zqUFgJM
i1Me/dISdO3SFbMBYr81OiV089ajqA+ArAxcKDSA+hyU2sMVzmnogBkvDZVO2Vfx
J1xUhVwKeHVonzkS1pABX7FPNMNpHamRt0Xlvd7/ikmpkHQijLE/0405J2iw57N4
QBLvyeZC3hM=
=r4hU
-----END PGP SIGNATURE-----
Thread:
Salvador Fandiņo
Lee Goddard
Richard Jelinek
Lee Goddard

Privacy Policy | Email Opt-out | Feedback | Syndication
© ActiveState Software Inc. All rights reserved