Purpose ======= This module defines a C-library to be used with SICStus Prolog that allows you to use foreign code designed for SWI-Prolog with minimal effort in SICStus. Installation ============ The usual ./configure, make, make install will install the library and header files in /usr/local/lib and /usr/local/include. Use ./configure --help for options. License/Copying =============== This library is distributed under the LGPL-2 (Lesser GNU Public License). For details, please visit www.gnu.org. Very briefly you violate this license if you do not provide the source of this library with executables that include it, but it doesn't act as a virus on the licence terms on the rest of your code. Use === Given a C-source holding C-functions that define predicates for SWI-Prolog you can make it suitable for use with SICStus using the following steps: # Replace #include <SWI-Prolog.h> with #include <swi.h> # Remove the install/uninstall functions # Declare the foreign function and write the wrapper SWI-Prolog foreign functions can fail, succeed or be succeed non-deterministically. They do that by returning 0, 1 or something else. They accept a list of arguments of the SICStus form +term. So, if we have a function foo(), implementing foo/2, we have to write: foreign(c_foo, foo(+term, +term, [-integer])). foreign_resource(mylib, [c_foo]). :- load_foreign_resource(mylib). foo(A, B) :- c_foo(A, B, 1). Non-deterministic (PL_FA_NONDETERMINISTIC) cannot be handled this way (see `Restrictions' below). Meta-predicates (PL_FA_TRANSPARENT) should be declared using :- meta_predicate foo/2. If the foreign code using PL_strip_module() this should work as expected. Restrictions ============ # No context module handling (PL_context()) # No non-debugging call-back support (PL_Q_NODEBUG and friends) # Small differences in exception handling # Poor stream emulation This is the hardest bit. We need a record oriented model for SWI-Prolog, where SICStus provides a character oriented model. Actually the emulated IOSTREAM should be an SP_stream, so we can deal with SICStus streams. But then, there is a lot more high-level functionality to SWI-Prolog streams, which we would have to emulate on top of the SICStus streams. For now, we can create a stream and pass it to Prolog, or play with it in C. Don't do both with the same stream! # No non-deterministic foreign predicates. Though not used very frequently, nothing similar exists in SICStus. You need help on the Prolog site. Either by making the foreign routine return a list with all answers and use member/2 to select the non-deterministically or by storing the state somehow and provide a choicepoint in Prolog.