Ann: SWI-Prolog 8.1.7

Dear SWI-Prolog user,

The development version 8.1.7 has been uploaded. Most of the work is
on tabling, but there are more noteworthy developments:

  • Keri Harris implemented several enhancements to clause garbage
    collection. This fixes some possible crashes and brings a
    considerable performance improvement for programs with many
    (thousands) of dynamic predicates. Also enhances the performance
    of tight retract/asserta updates.

  • ADDED: library(prolog_wrap) to install and remove wrappers
    around predicates at runtime.

  • Carlo Capelli enhanced MacOS/Linux Qt console handling of ANSI
    sequences to support all the stuff SWI-Prolog currently uses.

  • ADDED: message_queue_set/2 to change the size of existince message

  • TABLING and XSB integration
    This is under continuous development, sponsored by Kyndi and with
    help of Terri Swift, David Warren and Fabrizio Riguzzi.

    • Use library(prolog_wrap) to get rid of renaming the original
      definition. Also allows for declararing a predicate tabled
      after defining it.
    • Fixes to handling non-ground positive delay elements during
    • Some fixes to answer completion. Some part of this code is
      still suspect.
    • About 40% performance improvement on our benchmark set.
    • MODIFIED: renamed unknown/0 into undefined/0. Considering the
      warning on the stability of the interface and the short-lived
      unknown/0 there is no backward compatibility definition.
    • Several predicates have been added to the XSB dialect emulation
      to run the OpenRuleBench benchmark set.
  • Pengines: provide .detach() to tell a pengine the client stops
    listening for now, but might come back. Backed up in SWISH by
    config-available/ to allow detaching long running tasks
    in authenticated environments.

  • Windows: Some issues with Unicode characters > 64k. Jan Burse.

  • Provide PPA for Ubuntu 19.04 Disco Dingo.

On the short term development continues with tabling, notably sort out
remaining problems with the answer completion step for implementing well
founded semantics and improve performance.

Enjoy --- Jan

SWI-Prolog Changelog since version 8.1.6

  • MODIFIED: Tabling unknown/0 has been renamed to undefined/0 after
    discussion with Terri Swift and David Warren.

  • FIXED: We need the answer return template to avoid early completion
    of answer_completion/1 (now /2).

  • XSB: Added path_sysop/2,3 and concat_atom/2.

  • XSB: Added walltime/1.

  • FIXED: Propogation of last false answer if the worklist is not
    explicitly negative.

  • ADDED: declare numbervars/4 as sandbox-safe.

  • ENHANCED: No need for answer completion if there was no
    simplification. David Warren.

  • FIXED: Various issues with non-ground positive delay elements and
    answer completion. Serious cleanup.

  • FIXED: more_general_table/2 for answer completion.

  • FIXED: is_ground_trie_node()

  • ENHANCED: Do not explicitly join the global and local delay lists
    when adding an answer, but instead have update_delay_list() joining
    the two list while creating the conditional answer.

  • FIXED: Updating positive delay elements from non-ground answers
    from incomplete tables. This breaks delay_tests/gfp.P, which seems
    sensitive to our suspect handling of this case.

  • ENHANCED: inline delim/4, improving tabling performance with about 20%.

  • ENHANCED: merge answer and suspension clusters to reduce memory
    and malloc().

  • ENHANCED: Simplify the work in updating the delay list for the next
    completion step.

  • ENHANCED: Merge getting a conditional answer and updating the delay
    list into one foreign predicate ‘$tbl_answer_update_dl’/3.

  • CLEANUP: Simpler and more efficient tnot/1

  • FIXED: Add sandbox declaration to make the new wrapper based tabling
    work again with Pengines.

  • ENHANCED: improve performance of asserta/1 when there are lots of
    erased clauses

  • ADDED: message_queue_set/2 to modify properties of an existing queue.

  • FIXED: heap-use-after-free error (fairly benign; may lead to wrong
    code size statistics).

  • ENHANCED: do not consider dynamic predicates as dirty until clauses
    have been retracted

  • FIXED: Offload unregistration of dirty foreign/thread-local predicates
    to the thread performing clause GC. This ensures that access to
    DirtyDefInfo structures is no longer racy

  • FIXED: Predicates do not need to be activated when setting a frame’s
    generation as the frame generation is guaranteed to be greater than
    the current CGC starting generation

  • FIXED: Use call((Args)) for calling wrappers to avoid the
    arity >8 limitation for call/N under reset/shift. This is anyway a
    step towards inlining the wrapped goal.

  • ENHANCED: Use new wrap_predicate for tabling. This allows for
    transparent reasoning over tabled predicates and making a predicate
    tabled after it has been defined. Currently implies a small slowdown,
    but eventually this will provide a speedup.

  • FIXED: Issue#475: xinteger//1: missing cut and inconsistent handling
    of negative integers over the two modes.

  • ENHANCED: do not consider dynamic predicates as dirty until clauses
    have been retracted

  • ENHANCED: incrementally track dirty clause count to avoid O(N) cost
    when considering clause GC

  • FIXED: wrap predicates with 0-arity.

  • ADDED: library(prolog_wrap), providing wrap_predicate/4 and
    some friends to manage dynamically wrapping and unwrapping Prolog
    predicates using an arbitrary body term. With input from Paulo Moura,
    Eric Toucher and Peter Ludemann on the forum. This is experimental
    The interface and details may change in the coming weeks.

  • FIXED: Issue#474 (Windows) several issues due to sizeof(wint_t) == 2

  • DOC: Typo, layout.

  • CLEANUP: Avoid warning about ununsed IS_REC_DELAY(). Paulo Moura.

Package pengines

  • MODIFIED: Pengines handling of /abort through HTTP. The abort handler
    (still) sends a signal to the Pengine. The Pengine will reply through
    the handler that is waiting for it (create, ask, next, pull_respons)
    with an abort message. This waiting request is no longer aborted
    in JavaScript
    , which didn’t work anyway. The /abort handler itself
    answers a 404 if the Pengine doesn’t exist or a JSON true if the
    signal was sent, without waiting for its reply.

  • ADDED: /pengine/detach method that allows for detaching from a
    connected Pengine, keeping it running in the background. This is
    backed up by changes to SWISH that can be activated to allow long
    running jobs.

Package swipl-win

  • FIXED: ANSI escape sequences translation and help_pager flag.

  • FIXED: autocompletion crash

Package xpce

  • CLANG: Add unneeded initialization to avoid a warning.

  • CLEANUP: Avoid some (benign, I think) errors trapped by Address

Package zlib

  • TEST: Issue#473: zlib tests failing on Windows due to CR/LF encoding.

Great stuff! Is 8.1.7 available via apt-get on Ubuntu 18.04? Can I do a simple purge and install to upgrade to 8.1.7? I’m on on 8.02, which I got via apt-get. I’m (currently) not building from source.

If you have the “development” PPA (see, then just do:

sudo apt-get update; sudo apt-get upgrade

(I also specify --with-new-pkgs with the apt-get upgrade command.)

1 Like

Maybe swivm might help you in keeping pace with the latest stable version of SWI-Prolog. (Disclaimer: I am the author of swivm.)