/* ---------------------------------------------------------------------- */
/*
 *   Version 1.
 */

   Initial release.

/* ---------------------------------------------------------------------- */
/*
 *   Version 2.
 */

   The 'any' keyword is now called 'any', as documented. (This word was
previously reserved by the TADS 3 compiler, so the it was temporarily
replaced with 'any_', but this is no longer necessary.)

   Collections such as lists and vectors can now be used as criteria, in
which case they will be met only by objects that belong to them. The all()
function will take advantage of such criteria by only considering members
of the collection.

   The 'definition' macro has been changed to define a new Criterion sub-
class instead of a function. Such sub-classes are recognized by the criteria
compiler, which will create instances that can be used throughout an entire
search. This will make definitions more efficient when used in all() and
related searches, but note that a terminating semi-colon is now required
when using this macro.

   The criteria compiler is now better at determining how many parameters
are required when a property pointer is used as a criterion. The following
example, which was used in the manual to demonstrate a certain limitation,
now works as one would expect:

   all(FireSource, &isIn, any, [Flammable])

/* ---------------------------------------------------------------------- */
/*
 *   Version 3.
 */

   Added a new function: exists(). This simply looks for an object that
meets the given criteria, returning true if there was one, nil otherwise.

   In addition to nested 'any' phrases, a method call criterion now accepts
nested 'all' phrases. This means that we can check if a method returns true
for all objects matching a set of nested criteria.

