После долгих раздумий была написана следующая программа
% 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].
Теперь, чтобы продемонстрировать какой-либо расчет, нам нужно написать программу, которая будет запускать «потребитель», пока буфер не будет пустым. И «потребитель» будет запускать «производитель», когда буфер пуст. И остановите процесс, когда данные и буфер станут пустыми.
Надежда будет полезна всем.