/*-------------------------------------------------------------------------
    program: folding a multiset of items
    file:    fold
    date:    December 97
    author:  Pablo Lopez (lopez@lcc.uma.es)
             Dept. of CS
             University of Malaga, SPAIN

    sample goals:
       count(N).
       max(M).
       min(M).
       add(S).
       mean(M).
-------------------------------------------------------------------------*/

module fold.

fold(P,Base,F) *- folding(Base) # fold(P,F).

fold(P,F) # folding(X) # item(Y)
    <= PXYZ =.. [P,X,Y,Z]
    <= PXYZ
    *- fold(P,F) # folding(Z).

fold(_,F) # folding(F).

% folding data

items *- item(1)  # item(2)  # item(3)  # item(4)  # item(5)  # item(6)  #
         item(7)  # item(8)  # item(9)  # item(10) # item(11) # item(12) #
         item(13) # item(14) # item(15) # item(16) # item(17) # item(18) #
         item(19) # item(20) # item(21) # item(22) # item(23) # item(24) #
         item(25) # item(26) # item(27) # item(28) # item(29) # item(30) #
         item(31) # item(32).

% folding functions

count(X,_,Z) <= Z is X+1.

count(N) <= fold(count,0,N) # items.

max(X,Y,X) <= X >= Y.
max(X,Y,Y) <= Y > X.

max(M) <= fold(max,0,M) # items.

min(X,Y,X) <= X =< Y.
min(X,Y,Y) <= Y < X.

min(M) <= fold(min,1000,M) # items.

add(X,Y,Z) <= Z is X+Y.

add(S) <= fold(add,0,S) # items.

mean(M) <= add(S)
        <= count(N)
        <= N \= 0
        <= M is S/N.
