v0.6.0
Highlights
Correctness
- Parsed finite-domain ranges finally work:
X in 1..5was rejected by the finite-domain store (only the Lisp-shaped infix range form worked); both shapes are now accepted - Quoted
?-prefixed atoms such as'?x'are real atoms instead of being misread as logic variables - ISO-conformant goal dispatch:
instantiation_errorfor variable goals,type_errorfor non-callable or improper goals - Closing the selected
current_input/current_outputstream resets the selection touser_input/user_output member/2/append/3terminate on cyclic lists; cyclicconsult/load_filessource lists raise a resource error;.inside{...}no longer splits a clause early
Resource hardening
- New exported parser resource limits (source size, tokens, depth, lexeme lengths, interned-symbol budget) with a
prolog-parser-resource-errorcondition surfaced as catchable ISOresource_error/1 - Untrusted input no longer permanently interns symbols (syntax errors, missing paths, stream handles, operator specifiers, arithmetic keys); exponentiation is bounded
Performance
- Hash-indexed unification environments; iterative, cycle-safe substitution
- O(1)
assertzand tabled-answer deduplication; SCC-based left-recursion detection - O(n log n)
bagof/setofgrouping; augmenting-pathall_different
Documentation
- Install/run instructions match reality (ASDF workflow; not on Quicklisp), complete exported-symbol API reference, accurate
phrase/unifycontracts, explicit Linux-only flake outputs, concrete security-reporting and code-of-conduct procedures
Full changelog: https://github.com/takeokunn/cl-prolog/blob/main/CHANGELOG.md