This chapter describes the features of SWI-Prolog for delivering applications that can run without the development version of the system installed.
A SWI-Prolog built application consists of at least two parts: the emulator and the compiled application. The latter is in the same format as a SWI-Prolog boot-file and SWI-Prolog pre-compiled (QLF) file. This format is fast loadable and abstracted just far enough to be machine independent. This implies an application delivered in binary format can run on any computer for which an emulator is available without modification.
Table: Key = Value pairs for qsave_program/2
The /bin/sh script contains the following data:
#!/bin/sh #SAVE-VERSION=<num> #PROLOG-VERSION=<num> exec ${SWIPL-/path-to-emulator} -x $0 "$@"
Before writing the data to file, qsave_program/2 will run autoload/0 to all required autoloading the system can discover. See autoload/0.
Provided the application does not require any of the Prolog libraries to be loaded at runtime, the only file from the SWI-Prolog development environment required is the emulator itself. The emulator may be built in two flavours. The default is the development emulator. The runtime emulator is similar, but lacks the tracer. The stand-alone program chpl may be used to change the default path to the emulator.
This predicate is used by qsave_program/[1,2] to ensure the saved state will not depend on one of the libraries. A utoload/0 will find all direct references to predicates. It does not find predicates referenced via meta-predicates. The predicate log/2 is defined in the library(quintus) to provide a quintus compatible means to compute the natural logarithm of a number. The following program will behave correctly if its state is executed in an environment where the library(quintus) is not available:
logtable(From, To) :- From > To, !. logtable(From, To) :- log(From, Value), format('~d~t~8|~2f~n', [From, Value]), F is From + 1, logtable(F, To).
However, the following implementation refers to log/2 through the meta-predicate maplist/2. Autoload will not be able to find the reference. This problem may be fixed either by loading the module libtary(quintus) explicitely or use require/1 to tell the system that the predicate log/2 is required by this module.
logtable(From, To) :- findall(X, between(From, To, X), Xlist), maplist(log, Xlist, SineList), write_table(Xlist, SineList). write_table([], []). write_table([I|IT], [V|VT]) :- format('~d~t~8|~2f~n', [I, V]), write_table(IT, VT).