Grokbase Groups Perl ai January 2003
FAQ
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.

Search Discussions

  • Lee Goddard at Jan 23, 2003 at 7:23 am
    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.
  • Richard Jelinek at Jan 23, 2003 at 7:30 am
    There is already one

    Language::Prolog::SWI::base

    an completedly different implementation. I think this could be a
    clash.

    --
    best regards,

    Dipl.-Inf. Richard Jelinek

    - PetaMem s.r.o. - Drahobejlova 1019 - Prague - www.petamem.com -
    -= 2026049 Mind Units =-

    Legal/Rechtliches:

    This e-mail may contain confidential and/or privileged information. If
    you are not the intended recipient (or have received this e-mail in
    error) please notify the sender immediately and destroy this
    e-mail. Any unauthorized copying, disclosure or distribution of the
    material in this e-mail is strictly forbidden.

    Diese E-Mail enthält vertrauliche und/oder rechtlich geschützte
    Informationen. Wenn Sie nicht der richtige Adressat sind oder diese
    E-Mail irrtümlich erhalten haben, informieren Sie bitte sofort den
    Absender und vernichten Sie diese Mail. Das unerlaubte Kopieren sowie
    die unbefugte Weitergabe dieser Mail ist nicht gestattet.
  • Lee Goddard at Jan 23, 2003 at 7:49 am
    Why not use Language::Prolog::YASWI, then?
    That's how you introduced the module to us,
    and it made complete sense -- you used it because
    we'd all understand at once, and we did.

    So why not use it on CPAN?!!!

    Lee

    RJ> There is already one

    RJ> Language::Prolog::SWI::base

    RJ> an completedly different implementation. I think this could be a
    RJ> clash.




    - --
    Cheers
    Lee mailto:home@LeeGoddard.com

Related Discussions

Discussion Navigation
viewthread | post
Discussion Overview
groupai @
categoriesperl
postedJan 22, '03 at 3:09p
activeJan 23, '03 at 7:49a
posts4
users3
websiteperl.org

People

Translate

site design / logo © 2021 Grokbase