initialization/1 declaration

Synopsis

:- initialization Goal

Declares that Goal is to be run when the file in which the declaration appears is loaded into a running system, or when a stand-alone program or runtime system that contains the file is started up.

Arguments


Goal callable [MOD]
A valid goal.

Description

Defined as built-in prefix operator, so a simplified syntax can be used when using initialization/1 as a directive. See examples.

Callable at any point during compilation of a file. That is, it can be used as a directive, or as part of a goal called at compile-time. The initialization goal will be run as soon as the loading of the file is completed. That is at the end of the load, and notably after all other directives appearing in the file have been run.

qpc and save_program/[1,2] save initialization goals in the QOF file, so that they will run when the qof file is loaded.

Goal is associated with the file loaded, and with a module, if applicable. When a file, or module, is going to be reloaded, all goals earlier installed by that file or in that module, are removed. This is done before the actual load, thus allowing a new initialization Goal to be specified, without creating duplicates.

Exceptions


instantiation_error
The argument Goal is not instantiated

Examples

To understand the examples fully, read the reference page on volatile/1 first.

A common case is when the Prolog process at start up should connect itself to an external database. It should also make the connection when the file with the code for the connection is loaded for the first time.

     :- volatile db_connection/1.
     :- initialization my_init.
     
     my_init :-
       ( clause(db_connection(_), _) ->
         true
       ; set_up_connection(Connection),
         assert(db_connection(Connection))
       ).
     

In the above example, set_up_connection/1 is user defined. We do not declare db_connection/1 as dynamic in the file, since such a declaration would implicitly delete all clauses of the predicate when the file is reloaded.

It might not always be desirable to have the connection set up the first time the file is loaded, but only when a system is started up (for instance during the debugging of a database application.) This can be achieved with the following code (note that we use the property that a dynamic declaration reinitiliazes/resets the declared predicate):

     :- dynamic connect/0.
     :- volatile db_connection/1.
     :- initialization my_init.
     
     my_init :-
       ( connect ->
         set_up_connection(Connection),
         assert(db_connection(Connection))
       ; assert(connect)
       ).
     

See Also

volatile/1, load_files/1, compile/1

See ref-sls