Modules

25.1 Defining a module

% file: geometry.pl
:- module(geometry, [area/2, perimeter/2]).    % name and export list

area(circle(R), A) :- A is pi * R ** 2.
area(rect(W, H), A) :- A is W * H.

perimeter(circle(R), P) :- P is 2 * pi * R.
perimeter(rect(W, H), P) :- P is 2 * (W + H).

helper(X) :- X > 0.                            % private

25.2 Using modules

:- use_module(geometry).                       % load & import exports
:- use_module(library(lists)).                 % library module
:- use_module(library(lists), [append/3]).     % import specific predicates
:- use_module(library(lists), except([delete/3])).
:- ensure_loaded(file).                        % non-module files

?- geometry:helper(5).                         % call a private predicate explicitly
?- area(circle(1), A).

25.3 Module system details

Module:Goal qualifies a call.

reexport/1,2 re-exports another module's predicates.

:- module(m, [op(700, xfx, ===), pred/1]) exports operators too.

meta_predicate declarations make higher-order predicates module-aware.

multifile predicates can be extended from several files (:- multifile hook/1.).

discontiguous allows clauses of a predicate to be spread out in a file.

SWI autoloads many library predicates on first use.

25.4 Directives summary

:- module(Name, Exports).
:- use_module(File).
:- dynamic p/1.
:- discontiguous p/1.
:- multifile p/1.
:- initialization(Goal).            % run after load (main for scripts)
:- set_prolog_flag(Flag, Value).
:- op(P, T, Name).
:- table p/2.
:- meta_predicate p(0).
:- include(File).                   % textual inclusion
:- encoding(utf8).