Modules have been debated fiercely in the Prolog world. Despite all
counter-arguments we feel they are extremely useful because
- They hide local predicates
This is the reason they have been invented in the first place. Hiding
provides two features. They allow for short predicate names without
worrying about conflicts. Given the flat name-space introduced by
modules, they still require meaningful module names as well as
meaningful names for exported predicates.
- They document the interface
Possibly more important then avoiding name-conflicts is their role in
documenting which part of the file is for public usage and which is
private. When editing a module you may assume you can reorganise
anything but the name and semantics of the exported predicates without
worrying.
- They help the editor
The PceEmacs built-in editor does on-the-fly cross-referencing of the
current module, colouring predicates based on their origin and usage.
Using modules, the editor can quickly find out what is provided by the
imported modules by reading just the first term. This allows it to
indicate real-time which predicates are not used or not defined.
Using modules is generally easy. Only if you write meta-predicates
(predicates reasoning about other predicates) that are exported from a
module good understanding of resolution of terms to predicates inside a
module is required. Here is a typical example from library(readutil)
.
:- module(read_util,
[ read_line_to_codes/2, % +Fd, -Codes
read_line_to_codes/3, % +Fd, -Codes, ?Tail
read_stream_to_codes/2, % +Fd, -Codes
read_stream_to_codes/3, % +Fd, -Codes, ?Tail
read_file_to_codes/3, % +File, -Codes, +Options
read_file_to_terms/3 % +File, -Terms, +Options
]).