[net.lang.prolog] More on findall Vs. bagof

Pereira%SRI-AI@sri-unix.UUCP (10/14/83)

Consider the following code:

        p(S) :- q(a,X), r(X,S).
        u(S) :- r(X,S), q(a,X).

        r(X,S) :- findall(Y,a(X,Y),S).

        q(X,X).

        a(a,1).
        a(b,2).
        a(a,3).

?- p(S). will return S=[2], whereas ?- u(S) will return S=[1,2,3].
This just because the two goals q and r where exchanged !  Is this
the kind of behavior one should expect from a logic programming
system ?  Of course not! The problem is similar to the one of using
\+P when P has unbound variables.

In contrast, if findall is replaced by bagof in the example,
both queries will return S=[2] as they should.

-- Fernando Pereira