[net.lang.prolog] bagof & setof

OKeefe.R.A.@EDXA@sri-unix.UUCP (10/12/83)

From:  Richard HPS (on ERCC DEC-10) <OKeefe.R.A.@EDXA>

%   File   : SETOF.PL
%   Author : R.A.O'Keefe
%   Updated: 11 October 1983
%   Purpose: Define set_of/3 and bag_of/3

/*  This file defines two predicates which act like setof/3 and
    bagof/3.  I have seen the code for these routines in DEC-10
    and in C-Prolog, but I no longer recall it, and this code was
    independently derived in 1982 by me and me alone.

    Most of the complication comes from trying to cope with free
    variables in the Filter; these definitions actually enumerate
    all the solutions, then group together those with the same
    bindings for the free variables. There must be a better way of
    doing this.  I do not claim any virtue for this code other than
    the virtue of working.  In fact there is a subtle bug: if
    setof/bagof occurs as a data structure in the Generator it will
    be mistaken for a call, and free variables treated wrongly.
    Given the current nature of Prolog, there is no way of telling
    a call from a data structure, and since nested calls are FAR more
    likely than use as a data structure, we just put up with the
    latter being wrong.  The same applies to negation.

    Would anyone incorporating this in their Prolog system please
    credit both me and David Warren;  he thought up the definitions,
    and my implementation may owe more to subconscious memory of his
    than I like to think.  At least this ought to put a stop to
    fraudulent claims to having bagof, by replacing them with
    genuine claims.
*/

    [ setof.pl is available through FTP as {SU-SCORE}PS:<PROLOG>Setof.Pl
      If you do not have ARPAnet access, I have a LIMITED number of 
      hardcopy listings that could be mailed. -ed ]