
abolish +SpecList

   Remove the definition of the predicates specified in SpecList.



Arguments
   SpecList            Sequence of expressions of the form Atom/Integer.

Type
   Predicate Database and Compiler

Description
   Removes the definition of the predicates specified in SpecList. These
   predicates must have their definition (clauses) in the caller module.

   Predicates that are defined elsewhere (i.e. imported or reexported
   predicates) cannot be abolished. They can only be abolished from their
   definition module.

   After a predicate has been abolished, any attempt to invoke it will
   give rise to an error 68 (calling an undefined procedure).

   Certain declarations about properties of a predicate will remain in
   effect even after abolishing the predicate. These include declarations
   that affect the predicate's calling convention (modes, demon, parallel,
   tool).  Moreover, the predicate's visibility (local, exported) is not
   affected, i.e. if the predicate was exported, it will remain exported.

   Predicates can be abolished, no matter whether they are static or
   dynamic. For dynamic predicates, the difference between retract_all/1
   and abolish/1 is that retract_all/1 leaves the predicates with no
   clauses (call of the predicate will fail) and the predicate retains
   its dynamic-property.  In contrast, abolish/1 makes the predicates
   undefined (calls will raise and error) and the predicate loses its
   dynamic-property.

   Error 60 (``referring to an undefined procedure'') is raised when no
   predicate of name SpecList is visible.  Error 100 (``accessing a
   procedure defined in another module'') is raised if the visible
   predicate is defined or declared in a different module than the
   caller module.

   abolish/1 satisfies the logical update semantics.  Abolishing a
   predicate will not, in any way, affect previous calls to it (when
   backtracking).



Modes and Determinism
   abolish(++) is det

Modules
   This predicate is sensitive to its module context (tool predicate, see @/2).

Exceptions
     4 --- SpecList is not instantiated
     5 --- SpecList is instantiated, but not to a sequence of expressions of the form Atom/Integer
    60 --- SpecList is undefined in the caller module
   100 --- SpecList is not defined in the caller module

Examples
   
[eclipse 1]: [user].
 p :- writeln(hello).
Yes (0.00s cpu)

[eclipse 2]: p.
hello
Yes (0.00s cpu)

[eclipse 3]: abolish p/0.
Yes (0.00s cpu)

[eclipse 4]: p.
calling an undefined procedure p in module eclipse
Abort

[eclipse 5]: abolish writeln/1.
accessing a procedure defined in another module in abolish writeln / 1
Abort

[eclipse 6]: abolish foo/33.
referring to an undefined procedure in abolish foo / 33 in module eclipse
Abort



Logical semantics :

If the following clauses are in the database :
    p(1) :- abolish(p/1).
    p(2).

The call p(X). will produce all the solutions visible when it started
executing :

    [eclipse]: p(X).
    X = 1     More? (;)
    X = 2
    yes.


See Also
   retract_all / 1
