Users can write a handler for the specific exception occurring when an
undefined predicate is called by defining clauses for the hook
user:unknown_predicate_handler/3. This can be thought of as
a “global” exception handler for this particular exception, because
catch/3, its effect is not limited to a particular
goal. Furthermore, the exception is handled at the point where the
undefined predicate is called.
The handler can be written to apply to all unknown predicates, or to a class of them. The reference page contains an example of constraining the handler to certain predicates.
call(Module:Goal) is the trapped call to the undefined
predicate, then the hook is called as:
user:unknown_predicate_handler(+Goal, +Module, -NewGoal) hook
If this succeeds, then Prolog replaces the call to the undefined
predicate with the call to Module:NewGoal. Otherwise, the action
taken is governed by the
unknown Prolog flag
(see ref-lps-flg), the allowed values of which are:
Causes calls to undefined predicates to be reported and the debugger to be entered at the earliest opportunity. Not available in runtime systems.
Causes calls to such predicates to raise an exception (the default).
Causes calls to such predicates to display a warning message and then fail.
Causes calls to such predicates to fail.
Finally, this flag can be accessed by the built-in predicate:
unknown(?OldValue, ?NewValue) development
This unifies OldValue with the current value, sets the flag to NewValue, and prints a message about the new value. See mpg-ref-unknown_predicate_handler.