control construct

# `(^^)/1`

## Description

    ^^Predicate

Calls an imported or inherited predicate definition. The call fails if the predicate is declared but there is no imported or inherited predicate definition (as per the closed-world assumption). This control construct may be used within objects or categories in the body of a predicate definition.

This control construct preserves the implicit execution context self and sender arguments (plus the meta-call context and coinduction stack when applicable) when calling the inherited (or imported) predicate definition.

The lookups for the predicate declaration and the predicate definition are performed using a depth-first strategy. Depending on the value of the optimize flag, these lookups are performed at compile-time when the predicate is static and sufficient information is available. When the lookups are performed at runtime, a caching mechanism is used to improve performance in subsequent calls. See the User Manual section on performance for details.

When the call is made from within an object, the lookup for the predicate definition starts at the imported categories, if any. If an imported predicate definition is not found, the lookup proceeds to the ancestor objects. Calls from predicates defined in complementing categories lookup inherited definitions as if the calls were made from the complemented object, thus allowing more comprehensive object patching. For other categories, the predicate definition lookup is restricted to the extended categories.

The called predicate should be declared public or protected. It may also be declared private if within the scope of the entity where the method making the call is defined.

This control construct is a generalization of the Smalltalk super keyword to take into account Logtalk support for prototypes and categories besides classes.

## Modes and number of proofs

    ^^+callable - zero_or_more

## Errors

`Predicate` is a variable:
`instantiation_error`
`Predicate` is neither a variable nor a callable term:
`type_error(callable, Predicate)`
`Predicate`, with predicate indicator `Name/Arity`, is declared private:
`permission_error(access, private_predicate, Name/Arity)`
`Predicate`, with predicate indicator `Name/Arity`, is not declared:
`existence_error(predicate_declaration, Name/Arity)`

## Examples

    % specialize the inherited definition
    % of the init/0 predicate:
    init :-
        assertz(counter(0)),
        ^^init.

See also

(::)/2, (::)/1, []/1