想来想去,写了如下程序
% Consumer predicate. If buffer is empty, nothing to take, need to wait for producer predicate.
consumer(BufferBefore, [], _) :-
length(BufferBefore, BuffSize),
BuffSize = 0,
write("Buffer is empty. Waiting for producer"), nl, !, fail.
% If the buffer is not empty, returns first element and removes them from the buffer
consumer(BufferBefore, BufferAfter, Result) :-
car(BufferBefore, Result),
deletefirst(BufferBefore, BufferAfter).
% Producer predicate. If data and buffer is empty, nothing taken from the data to put in buffer.
producer([], [], [], [], _) :- write("End of data!."), !, fail.
% Else if buffer is not empty, add first elem from data (and removes them from here) to last position in buffer.
producer(DataBefore, BufferBefore, DataAfter, BufferAfter, Size) :-
length(BufferBefore, BuffSize), BuffSize < Size, !,
car(DataBefore, Elem),
addlast(Elem, BufferBefore, BufferAfter),
deletefirst(DataBefore, DataAfter).
几个跑步的例子
consumer([1,2,3,4,5], BufferAfter, Result)
返回
BufferAfter = [2,3,4,5], Result = 1.
和
producer([1,2,3,4,5,6],[7,8,9],DataAfter, BufferAfter, %">3 here"%)
返回
DataAfrer = [2,3,4,5,6], BufferAfter = [7,8,9,1].
现在,为了演示任何计算,我们需要编写一个程序,它将运行“消费者”直到缓冲区为空。当缓冲区为空时,“消费者”将运行“生产者”。并停止进程,当数据和缓冲区为空时。
希望对任何人都有用。