6.2 Procedure Types
Procedures can be static and dynamic
and this feature can be queried with the stability flag
of get_flag/3.
Static procedures are compiled as one unit, they are thus executed
more efficiently, and they can be modified only by replacing
them by another procedure.
By contrast, dynamic procedures are compiled clause-wise,
they are executed slightly less efficiently, but their source
form can also be retrieved, and they can be modified
by adding or removing single clauses or clause sequences.
By default all procedures are static, dynamic procedures
must be declared by the dynamic/1 declaration,
except that undefined procedures for which assert/1,2
is called are silently declared as dynamic by the event handler,
and so no declaration is needed.
When compiling static procedures, the compiler remembers
their position in the file, which can be then queried
by get_flag/3.
The library scattered actually uses this feature
to retrieve predicates whose clauses are not consecutive.