HELP WHICH                                          A. Sloman May 1983

    which(variables, patternlist) -> list of values;

WHICH is used in conjunction with the DATABASE or LIB SUPER. It makes a
list of the values of the variables for each instance of the patternlist
found in the database, using FOREVERY to find all the instances.

When there is only one variable whose values are to be found, then the
corresponding WORD may be given as first argument. If there is more than
one, then the words must be in a list. E.g. the following formats are
acceptable:

    vars x y z;
    which("x", [[parent tom ?x]]) =>
    ** [lucy dick]

    which([x z], [[parent ?x ?y][parent ?y ?z]]) =>
    ** [ [tom harry] [tom mary] [lucy albert] ]

Note that if the first argument to WHICH is a list of words, then the
result is a list of lists. If the first argument is a word, the the
result is a list of values (which may be lists).

-- EXAMPLE USING LIB SUPER --------------------------------------------------

We can give lib super some information about what is on what, and how to
reason about what is above what, thus:

     newdatabase([
                     [ on a b]
                     [ on b c]
                     [ on e f]
                     [ on f g]
                     [ on h g]
             [ifneeded [above ?x ?y] [on ?x ?y]]
             [ifneeded [above ?x ?y] [on ?x ?z] [above ?z ?y]]
         ]);

Now we can use WHICH to answer questions. Note that the second argument
must be a list of lists:

     vars x y;
     which("x", [[on ?x g]])=>
     ** [f h]

     which([x y], [[on ?x ?y]])=>
     ** [[a b] [b c] [e f] [f g] [h g]]

     vars z;
     which([x z], [[above ?x ?y][above ?y ?z]])=>
     ** [[a c] [e g]]


See HELP * DATABASE, *SUPER, *FOREVERY, *FOREACH
