SWI-Prolog has been designed and implemented to get a Prolog implementation which can be used for experiments with logic programming and the relation to other programming paradigms. The intention was to build a Prolog environment which offers enough power and flexibility to write substantial applications, but is straightforward enough to be modified for experiments with debugging, optimisation or the introduction of non-standard data types. Performance optimisation is limited due to the main objectives: portability (SWI-Prolog is entirely written in C and Prolog) and modifiability.
SWI-Prolog is based on a very restricted form of the WAM (Warren Abstract Machine) described in Bowen & Byrd, 1983 which defines only 7 instructions. Prolog can easily be compiled into this language and the abstract machine code is easily decompiled back into Prolog. As it is also possible to wire a standard 4-port debugger in the WAM interpreter there is no need for a distinction between compiled and interpreted code. Besides simplifying the design of the Prolog system itself this approach has advantages for program development: the compiler is simple and fast, the user does not have to decide in advance whether debugging is required and the system only runs slightly slower when in debug mode. The price we have to pay is some performance degradation (taking out the debugger from the WAM interpreter improves performance by about 20%) and somewhat additional memory usage to help the decompiler and debugger.
SWI-Prolog extends the minimal set of instructions described in Bowen & Byrd, 1983 to improve performance. While extending this set care has been taken to maintain the advantages of decompilation and tracing of compiled code. The extensions include specialised instructions for unification, predicate invocation, some frequently used built-in predicates, arithmetic, and control (;/2, |/2), if-then (->/2) and not (\+/1).
This manual does not describe the full syntax and semantics of Prolog, nor how one should write a program in Prolog. These subjects have been described extensively in the literature. See Bratko, 1986, Sterling & Shapiro, 1986, and Clocksin & Melish, 1987. For more advanced Prolog material see OKeefe, 1990. Syntax and standard operator declarations confirm to the `Edinburgh standard'. Most built in predicates are compatible with those described in Clocksin & Melish, 1987. SWI-Prolog also offers a number of primitive predicates compatible with Quintus Prolog (1) Qui, 1997 and BIM_Prolog (2) BIM, 1989.
ISO compliant predicates are based on ``Prolog: The Standard'', Deransart et al., 1996.