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
          ]).