Ann: SWI-Prolog 8.5.11

Dear SWI-Prolog user,

SWI-Prolog 8.5.11 is ready for download. Highlights:

  • Several Windows issues. Notably a partial solution on supporting
    long file names, handle the new Windows 10 and 11 UTF-8 system
    code page (65001) and configuration issues. Much better test
    coverage by @mgondan1.

  • Several fixes to source code position logic (affects notably the
    graphical debugger).

  • Partial resolution for poor rounding on float functions, notably
    on MacOS, but to a lesser extend also on other systems by

  • Start of cleanup and improve library(archive) by @peter.ludemann

  • Some work to fix access resources from a saved state as a file
    using res:/filepath. Should eventually allow for a single-
    file distribution of the full Prolog development system (on some

  • Big speedup of show_coverage/1,2, making this tool really useable.
    Note that the call below creates annotated files in the directory cov. The
    annotations are useful for creating a comprehensive test suite. I
    think it can also be useful for debugging.

    ?- show_coverage(Goal, [dir(cov)]).
  • Added jammy (Ubuntu 22.04) to targets for generating PPAs

    Enjoy — Jan

SWI-Prolog Changelog since version 8.5.10

  • PORT: Issue#83: “label can only be part of a statement” compiler error.

  • ADDED: Prolog flag vmi_builtin that controls whether or not built-in
    predicates that are defined in the VM are handled in the VM or called
    as normal predicates. The latter was previously associated with debug
    mode, but has also other purposes, such as in coverage analysis or
    when using trace/1.

  • ADDED: Low level primitives to collect information about coverage.
    This is used by show_coverage/1,2 to achieve only a modest slowdown.

  • MODIFIED: delete_file/1 to delete a read-only file on Windows for
    compatibility with other platforms.

  • MODIFIED: Windows: use GetACP() to detect that the system runs in
    UTF-8 mode and set the default encoding accordingly.

  • FIXED: Several issues to consistently deal with buffer sizes in

  • MODIFIED: Floating point rounding now assumes the C correctly
    implements floating points functions for the “to nearest” rounding.
    It than adds or subtracts one ulp to guarantee that the true value
    is between the downward and upward rounded values.

  • FIXED: Possible race condition importing into a module. Can lead to
    termination on a system error.

  • PORT: Consistently use PATH_MAX and raise it to 32k on Windows.


  • FIXED: Source layout handling for SSU (=>) whose guard is a

  • FIXED: Source layout handling for unifications against nested head

  • FIXED: Make source layout handling aware that debug/3 and assertion/1
    may be removed by the optimizer.

  • DOC: Many enhancements to the foreign language API docs, notably
    wrt. atoms and blobs.

  • ADDED: Sopen_iri_or_file() API to allow foreign code to access the

  • ADDED: Support repositioning streams on program resources by setting
    the buffer size to the size of the resource. This allows the IDE
    tools to run on resource files.

  • FIXED: central resource db handling by opening ``res://` may have
    streams closed early during to atom-GC.

  • ENHANCED: require/1 to simply import if the target module is already
    loaded. Reduces startup time.

  • ENHANCED: open_resource/2,3: allow opening multiple resources

  • FIXED: open/3 and friends on ‘res://’ paths.

  • FIXED: fd_degree/2 and fd_set/2 for constant integer arguments.

  • DOC: added cross-references from absolute_file_name/3 to

  • ADDED: library(sandbox): allow declaring prolog flags as safe.

  • TEST: updated check_installation for PCRE2

  • PORT: skip dll in Rtools (only static libs)

  • ADDED: open/4 option newline(Mode).

Package archive

  • CLEANUP: Removed references to libarchive versions before 3.0.0a -
    Version 3.0.0a was released 2008/05/26 - The “seek” functionality
    was added 2011/11//18 - The “filter count” functionality was added
    2010/02/19 Changed the archive blob from PL_BLOB_NOCOPY to instead
    be allocated by PL_unify_blob(), which simplifies cleanup on some
    failure situations. Set blob fields to NULL after they have been
    freed. Removed unused free_archive()

  • TEST: Remove assumptions about the build environment and other details
    such that the tests also run in different environments such as the
    installed environment.

  • TEST: Added tests for code snippets in documentation and
    check_installation Fixed typos in documentation Added tests that
    cause memory leaks and exercise error conditions / failure

Package cpp

  • TEST: Added foreign language interface regression tests

Package http

  • ENHANCED: Reduce overhead of session GC

Package pengines

  • ENHANCED: Pengines waiting for a new event now wait the first second
    without idling. After than they call thread_idle/2 to minimise
    their footprint. This avoids garbage collections for short waits
    while going into a deeper sleep mode for a long wait.

Package plunit

  • ENHANCED: show_coverage/2: use new built-in coverage collecting
    primitives to achieve only a modest slow down.

  • ENHANCED: show_coverage/1,2: call-site annotation (sub goals),
    several new options to control the output.

Package sgml

  • CLEANUP: Use PATH_MAX consistently

  • TEST: Make tests independent from newline conventions.

  • TEST: Make independent from newline conventions.

Package ssl

  • BUILD: Ensure HOME is set to a writable path for generating the SSL
    test certificates.

  • PORT: Avoid deprecated SecKeychainOpen().

Package xpce

  • CLEANUP: Consistently use PATH_MAX


  • ADDED: file->open: allow using resource iris

  • ENHANCED: file->size to use information from the stream when the
    file is open.

  • ADDED: Allow opening res:// resources.

  • ADDED: PceEmacs to recognise Emacs -*- Var: Value; ... -*-
    syntax. For now only processes tab-width: Width;

  • FIXED: PceEmasc Consult selection command resulted in an error
    message wrt. format/3 and url/1 terms.


Thanks @jan. Looking forward to try show_coverage/2.