Archived Website: This website is a static snapshot for archival purposes only. It is no longer maintained or updated.

Home Contents Index Summary Previous Next

5.7 Dynamic Modules

So far, we discussed modules that were created by loading a module-file. These modules have been introduced on facilitate the development of large applications. The modules are fully defined at load-time of the application and normally will not change during execution. Having the notion of a set of predicates as a self-contained world can be attractive for other purposes as well. For example, assume an application that can reason about multiple worlds. It is attractive to store the data of a particular world in a module, so we extract information from a world simply by invoking goals in this world.

Dynamic modules can easily be created. Any built-in predicate that tries to locate a predicate in a specific module will create this module as a side-effect if it did not yet exist. Example:


?- assert(world_a:consistent),
   world_a:unknown(_, fail).

These calls create a module called `world_a' and make the call `world_a:consistent' succeed. Undefined predicates will not start the tracer or autoloader for this module (see unknown/2).

Import and export from dynamically created world is arranged via the predicates import/1 and export/1:


?- world_b:export(solve(_,_)).          % exports solve/2 from world_b
?- world_c:import(world_b:solve(_,_)).  % and import it to world_c