[ library(constraint_pools) | Reference Manual | Alphabetic Index ]

create_constraint_pool(+PoolName, +NTypes, ++SpecList)

Create a "constraint pool" module
PoolName
Atom - the name of the pool to create
NTypes
Integer - the number of constraint types
SpecList
List of terms of the form Atom/Integer->Spec

Description

Create a special type of module, called a "constraint pool".

The module will contain:

The possible specifications in SpecList are:

N/A -> store_as(Type)
will generate a definition for the predicate N/A such that every call to N/A will be stored in the pool for the given Type.
N/A -> ImplN/ImplA
will generate a definition for the predicate N/A such that every call to N/A gets augmented with an additional argument (the pool name), and mapped into a call to the implementation predicate ImplN/ImplA. The implementation predicate must be visible from where create_constraint_pool/3 is invoked. The implementation predicate's arity ImplA must be one higher than the the arity A of the newly defined predicate.

Since a pool is a module, the pool name should normally not refer to an existing module. If it does, the existing module gets augmented with the pool predicates and pool stores.

Modules

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

Examples

    % We assume the implementation predicate:
    d(Data, Pool) :- writeln(d(Data, Pool)).

    % Create the pool:
    ?- create_constraint_pool(pool, 1, [c/2->store_as(1),d/1->d/2]).
    Yes (0.00s cpu)

    % Call the just created pool constraint d/1,
    % which leads to d/2 being invoked:
    ?- pool:d(hello).
    d(hello, pool)
    Yes (0.00s cpu)

    % Call the just created pool constraint c/2,
    % which will be stored. Then retrieve the store:
    ?- pool:c(a,b), collect_all_pool_constraints(pool, C).
    C = [c(a, b)]
    Yes (0.00s cpu)
    

See Also

is_constraint_pool / 1, pool_is_empty / 1, post_typed_pool_constraint / 3, collect_typed_pool_constraints / 3, collect_all_pool_constraints / 2, set_pool_item / 2, get_pool_item / 2