/*-------------------------------------------------------------------------
    program: producer/consumer problem (bounded multi-buffer)
    file:    pcbmb
    date:    December 97
    author:  Pablo Lopez (lopez@lcc.uma.es)
             Dept. of CS
             University of Malaga, SPAIN
 
    sample goal:
        go([1,2,3],O)
-------------------------------------------------------------------------*/

module pcbmb.

producer(P,[I|Is]) # nil
      <= P1 is P+1
      *- cell(P,I) # producer(P1,Is).

producer(_,[]) *- delete_nil.

consumer(C,Os) # cell(C,I)
      <= O is 2*I
      <= insert(O,Os,OsO)
      <= C1 is C+1
      *- nil # consumer(C1,OsO).

consumer(_,Os) # result(Os).

delete_nil # nil
      *- delete_nil.

delete_nil *- bot.

insert(X,[],[X]).
insert(X,[Y|Ys], [Y|Z]) <= insert(X,Ys,Z).

go(I,O) *- nil #                                 % buffer
           producer(0,I) # consumer(0,[])  #     % processes
           result(O).
