built-in method

# `forall/2`

## Description

    forall(Generator, Test)

For all solutions of `Generator`, `Test` is true. This meta-predicate implements a generate-and-test loop using a definition equivalent to `\+ (Generator, \+ Test)`. As a consequence, no variables in the arguments are bound by a call to this predicate. This predicate often provides a better alternative to a failure-driven loop as an unexpected `Test` failure will not be ignored as it will make the `forall/2` call fail.

This built-in meta-predicate is declared as a private method and thus cannot be used as a message to an object.

## Meta-predicate template

    forall(0, 0)

## Modes and number of proofs

    forall(@callable, @callable) - zero_or_one

## Errors

Either `Generator` or `Test` is a variable:
`instantiation_error`
`Generator` is neither a variable nor a callable term:
`type_error(callable, Generator)`
`Test` is neither a variable nor a callable term:
`type_error(callable, Test)`

## Examples

To call both goals in the context of the object or category containing the call:
`forall(Generator, Test)`
To send both goals as messages to self:
`forall(::Generator, ::Test)`
To send both goals as messages to explicit objects:
`forall(Object1::Generator, Object2::Test)`

See also

bagof/3, findall/3, findall/4, setof/3