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. % private25.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).