The following predicates can be used to query the module system for 
reflexive programming:
- [nondet]current_module(?Module)
- 
True if Module is a currently defined module. This predicate 
enumerates all modules, whether loaded from a file or created 
dynamically. Note that modules cannot be destroyed in the current 
version of SWI-Prolog.
- module_property(?Module, 
?Property)
- 
True if Property is a property of Module. Defined 
properties are:
- class(-Class)
- 
True when Class is the class of the module. Defined classes 
are
- user
- 
Default for user-defined modules.
- system
- 
Module systemand modules from<home>/boot.
- library
- 
Other modules from the system directories.
- temporary
- 
Module is temporary.
- test
- 
Modules that create tests.
- development
- 
Modules that only support the development environment.
 
- file(?File)
- 
True if Module was loaded from File.
- line_count(-Line)
- 
True if Module was loaded from the N-th line of file.
- exports(-ListOfPredicateIndicators)
- 
True if Module exports the given predicates. Predicate 
indicators are in canonical form (i.e., always using name/arity and 
never the DCG form name//arity). Future versions may also use the DCG 
form and include public operators. See also
predicate_property/2.
- exported_operators(-ListOfOperators)
- 
True if Module exports the given operators. Each exported 
operator is represented as a term op(Pri,Assoc,Name).
- program_size(-Bytes)
- 
Memory (in bytes) used for storing the predicates of this module. This 
figure includes the predicate header and clauses. Future versions might 
give a more precise number, including e.g., the clause index tables.
- program_space(-Bytes)
- 
If present, this number limits the program_size. See
set_module/1.
 
- set_module(:Property)
- 
Modify properties of the module. Currently, the following properties may 
be modified:
- base(+Base)
- 
Set the default import module of the current module to Module. 
Typically, Module is one of userorsystem. 
See
section 6.9.
- class(+Class)
- 
Set the class of the module. See module_property/2.
- program_space(+Bytes)
- 
Maximum amount of memory used to store the predicates defined inside the 
module. Raises a permission error if the current usage is above the 
requested limit. Setting the limit to 0 (zero) removes the limit. An 
attempt to assert clauses that causes the limit to be exceeded causes a
resource_error(program_space)exception. See assertz/1 
and
module_property/2.