HELP ALLEQUALTO                                     John Gibson Jan 1996

The * FOR_FORM

    for var allequalto pattern_list [in list] do ... endfor

allows iteration over all possible lists of elements from a list which
are equal to a given pattern_list (list defaults to the value of the
variable database if the 'in list' clause is omitted).

That is, for every possible item_list that can be constructed from the
elements of list such that item_list = pattern_list, item_list is
assigned to the specified variable var and the body of the loop
executed.

This form is normally used with a pattern_list containing matchvars,
whose corresponding variables will be side-effected by the call to =
(see Pattern Matching With = in HELP * EQUAL). For example:

    vars itemlist, x, y, z;

    vars list = [a 1 b 2 c 3];

    for itemlist allequalto [=?x:isword =?y:isinteger] in list do
        itemlist =>
    endfor;

    ** [a 1]
    ** [a 2]
    ** [a 3]
    ** [b 1]
    ** [b 2]
    ** [b 3]
    ** [c 1]
    ** [c 2]
    ** [c 3]

Another example, using the variable database:

    [
      [1 ison 2] [2 ison 3]
      [A ison B] [B ison C] [D ison E] [E ison F] [G ison H] [A ison I]
    ]
        -> database;

    for itemlist allequalto [[=?x ison =?y:isword][=?y ison =?z]] do
        [^itemlist implies ^x is above ^z] =>
    endfor;

    ** [[[A ison B] [B ison C]] implies A is above C]
    ** [[[D ison E] [E ison F]] implies D is above F]


(Note: If pattern_list contains =** or =?? matchvars, capable of
matching the same list in different ways, then for...allequalto will
only find one way of matching the pattern with that item. E.g.

    for itemlist allequalto [[=??x b =**]] in [[c a b b a g e]] do
        itemlist=> x=>
    endfor;
    ** [[c a b b a g e]]
    ** [c a]

This does not supply the second possible way of of matching the list
[c a b b a g e], namely with x = [c a b].)


for...allequalto is a generalisation of the form for...equalto (see
HELP * equalto), which matches single items rather than multiple items.

(In terms of Pop-11 database procedures, allequalto is to
database_allpresent as equalto is to database_present. See
REF * DATABASE.)



--- C.all/help/allequalto
--- Copyright University of Sussex 1996. All rights reserved.
