Version 3.3 is a major release, changing many things internally and externally. The highlights are a complete redesign of the high-level I/O system, which is now based on explicit streams rather then current input/output. The old Edinburgh predicates (see1, tell1, etc.) are now defined on top of this layer instead of the other way around. This fixes various internal problems and removes Prolog limits on the number of streams.
Much progress has been made to improve ISO compliance: handling strings as lists of one-character atoms is now supported (next to character codes as integers). Many more exceptions have been added and printing of exceptions and messages is rationalised using Quintus and SICStus Prolog compatible print_message2, message_hook3 and print_message_lines3. All predicates descriped in [Deransart et al., 1996] are now implemented.
As of version 3.3, SWI-Prolog adheres the ISO logical update view for dynamic predicates. See update for details.
SWI-Prolog 3.3 includes garbage collection on atoms, removing the last serious memory leak especially in text-manipulation applications. See atomgc. In addition, both the user-level and foreign interface supports atoms holding 0-bytes.
Finally, an alpha version of a multi-threaded SWI-Prolog for Linux is added. This version is still much slower than the single-threaded version due to frequent access to `thread-local-data' as well as some too detailed mutex locks. The basic thread API is ready for serious use and testing however. See threads.