ECLiPSe 6.1 Release Notes
Version 6.1 (June 2013)
The major news for this release are the addition of the Gecode interface, CP-Viz interface, LDSB symmetry breaking, more global constraints, full ISO-Prolog compatibility, and availability on 64-bit Windows.
Libraries
New Libraries
- lib(gfd)
- An interface to the Gecode finite domain solver, see below.
- lib(cpviz)
- An interface to the CP-Viz visualization toolkit, see below.
- lib(ldsb)
- A new library for low-overhead symmetry breaking, contributed by Chris Mears, Monash University and a result of his PhD work.
- lib(cycle)
- A hybrid hamiltonian cycle constraint, using finite domain propagation and a linear programming relaxation, contributed by Lukasz Domagala.
- lib(list_collection)
- A library handling collections of lists, contributed by Lukasz Domagala.
- lib(lazy_io)
- Predicates to map I/O streams to character lists.
- lib(csv)
- Library for reading comma-separated files.
- lib(ic_prop_test_util), lib(fd_prop_test_util)
- Libraries for testing constraint propagators.
- lib(format)
- Compatibility library partly implementing format/2,3.
- lib(timeout_simple)
- Variant of lib(timeout).
Library Enhancements
- lib(ic_global) and lib(ic_global_gac)
- Many new constraints, largely contributed by Helmut Simonis.
- lib(eplex)
- Port to Gurobi solver. Handling of Special Ordered Sets as true constraints. Interface to CPLEX indicator constraints. Improvements to COIN/OR interface.
Gecode Interface
An interface to the Gecode finite domain solver. This interface provides a high degree of code compatibility with the finite domain portion of the IC library, and to a lesser extent, with the FD library as well. This means that programs originally written for the IC library should run with GFD with little modifications, beyond renaming any explicit reference to the ic family of modules. All of Gecode's global finite domain constraints are available through the interface.
CP-Viz Interface
CP-Viz is an open-source visualization toolkit for finite domain constraint programming. It provides visualization for search trees, variables and global constraints through a post-mortem analysis of trace logs. CP-Viz is included in this release of ECLiPSe (no separate download needed), and interfaced via lib(cpviz).
Full support for ISO-Prolog
In ECLiPSe, separate modules can be written in different logic programming language dialects. ISO-Prolog is now supported with three levels:
- lib(iso_strict)
- Implements strict ISO-Prolog, compliant with ISO/IEC 13211-1 and its corrigenda 1 and 2.
- lib(iso)
- Implements what we consider a sensible blend of ISO-Prolog and ECLiPSe language: Built-in predicates of both are avaliable, the syntax is ISO-style (with regard to restrictions and quoting), error checking is slightly less strict than required by ISO, some subtle semantic difference are resolved in favour of ECLiPSe style for reasons of performance, and the extensions are more liberal than what is allowed by ISO. For these reasons, this variant cannot claim full ISO compliance.
- lib(iso_light)
- Like lib(iso), but without ISO exception handling.
Compiler
- inline/1
- Predicates can now be inline-expanded by giving a simple :-inline(PredSpec) declaration.
Built-in Predicates
- call/N
- This generalised metacall primitive invokes a goal with extra arguments, without having to construct the goal structure. For instance, call(foo(a),b,c) will invoke foo(a,b,c).
- catch/3 and throw/1
- These replace the now deprecated block/3 and exit_block/1 builtins, compatible with ISO Prolog. The exception term can be a compound term.
- is_array/1, array_list/2, array_flat/3, array_concat/3
- A number of new builtin predicates for more convenient array manipulation.
- close/2
- ISO-compatible variant of close/1 with force-option.
- meta_predicate/1 declaration
- Declaration for indicating meta-arguments. Mainly for the benefit of source processing tools, the compiler currently does not use this declaration.
- stream_select/3
- The select/3 built-in has been renamed stream_select/3, to remove naming conflict with select/3 from the lists library.
- unschedule_suspension/1
- Undoes the scheduling of a suspension, preventing the delayed goal from actually being executed. This is useful for implementing idempotent constraint propagators.
Other Changes
- Stream handles
- I/O streams are now referred to by anonymous handles (instead of small integers as in previous releases). The advantage of this is that a stream will be closed automatically when the stream handle ceases to exist. This happens on failure (unless the handle has been copied to a persistent location), or when all copies of the handle have gone out of scope and are garbage collected. It is of course still possible to create stream aliases (global names); such streams will behave as before the change. For backward compatibility (and some foreign interfaces), it is still possible to obtain a numeric stream identifier, in which case the advantages of using handles are lost.
- Stream properties
- A number of new stream properties are supported (some for ISO-Prolog compatibility): reposition, input, output, end_of_stream, eof_action, encoding. Also delete_file for automatically deleting an open file when the stream is closed or its handle lost.
- New write-options
- New write_term options precedence, fullstop and nl, and corresponding formats for printf.
- Run Priorities
- Predicates now have a wakeup-priority and a run-priority. The wakeup-priority (corresponding to the priority in previous releases) determines the place that a woken goal occupies in the woken goal queue. The run-priority determines the priority-level under which the woken goals executes, and thus how atomic it is, i.e. which higher-priority goals can interrupt it. The default-run-priority is high (2), meaning that execution can only be interrupted by level 1 goals (which are supposed to be reserved for debugging purposes). This should simplify many cases where in the past it was necessary to use call_priority/2 for atomicity.
- Unscheduling
- Woken goals can be un-scheduled, which is useful for idempotent propagators that do not need to wake themselves.
- Suspension list aliases
- Suspension list names can now be declared in the meta_attribute declaration, lists can be given alias names, and multiple lists can be grouped under a single name. This simplifies the writing of solver independent code. Also, the suspend/3,4 predicate now accepts a more flexible syntax for waking conditions.
- High-resolution timer
- If provided by the operating system and hardware, statistics(hr_time,T) makes a high-resolution timer available. This timer's absolute value is meaningless, it is only useful for computing time differences.
- Command line options
- New options -L LANGUAGE and -t TOPLEVELMODULE, and also -f FILE as a more intuitive alias for -b FILE.
- Working directory
- New flag cwd_scope (process/separate), allowing eclipse to separately keep track of its current directory, rather than relying and manipulating the process-wide one. This was prompted by problems in embedded settings, where eclipse and host program interfere when manipulating the process's current directory.
- Complete support for ISO Prolog syntax
- All remaining discrepancies have been addressed, and syntax switches are provided to enable strict ISO syntax.
- Timers
- If supported by the operating system, event timers no longer use SIGALRM handlers. This results in less likelihood of conflicts in embedded settings, in particular Java.
Incompatibilities
- Woken goal are now executed under their run_priority rather than their waking priority. This means they may execute under higher priority than in previous releases, and thus be less interruptible. This will often be desirable, but code that was designed to be interrupted by higher-priority goals will have to have its run_priority adjusted. See also section on Run Priorities above.
- Stream identifiers are no longer small integers, but anonymous handles (can be tested for with is_handle/1 and current_stream/1).
- get_stream_info/3 now returns mode 'append' (rather than 'write') for streams that were opened in 'append' mode. To test whether a stream can be written, use the new 'output' property.
- Older releases (up to 6.0) contained a deprecated call/2 builtin, which is incompatible with the new call/N feature. Old code that still contains such uses as call(Goal,Module) must be changed to call(Goal)@Module.
- The select/3 built-in has been renamed stream_select/3, to remove naming conflict with select/3 from the lists library.
- The semantics of subcall/2 has changed in the following way: Within the subcall, delayed goals from outside the subcall are now invisible. The subcalled goal is executed under priority 12, even when the subcall's context was under a higher priority.
Supported Architectures
This release is available for the following architectures:
- Linux/x86 (Intel, AMD,...) 32-bit (i386_linux)
- Linux/x86-64 (Intel, AMD) 64-bit (x86_64_linux)
- Sparc/Solaris 32-bit (sparc_sunos5)
- Mac OS X/Intel 64-bit (x86_64_macosx)
- Windows 32-bit (i386_nt)
- Windows 64-bit (x86_64_nt)