Turbo Prolog 2.0中的循环缓冲区。

| 我需要在TurboProlog 2.0中编写类似循环缓冲区的内容来计算平均值。我不知道我需要写哪些谓词,也不知道如何将它们链接在一起。     
已邀请:
        我不确定您的应用程序需要实现“循环缓冲区”的哪些功能。通常,“缓冲区”将是可重用的存储,通常与处理异步通信的I / O进程相关联(因此,需要一个允许一个进程领先于另一个进程的缓冲区)。 “圆形缓冲区”表示一种通过指针(指向有效/未处理的数据的开始和结束)来管理可用存储的方式,这些指针通过(线性)连续区域进行环绕。相对于将FIFO队列保持在具有固定位置的有效数据开始位置而言,这具有优势,因为不需要“洗牌”未处理的项目。 在不直接支持重写内存位置的标准Prolog的一般情况下,这种优势没有意义。即使在Turbo Prolog中,也必须准确询问您要完成什么,以便可以熟练地使用可用的扩展/非标准功能。 这里有一些想法: 与标准Prolog的正确列表相比,Turbo Prolog支持的列表在某些方面更具限制性,在其他方面也可能更为详尽。限制之一是,在Turbo Prolog中,列表的所有项目必须属于同一\“ domain \”,这是标准Prolog的弱类型字符所不具有的概念。域也可以在Turbo Prolog中指定为“参考”域,这是一种间接级别,允许部分绑定的复合术语在子目标之间传递。在不赘述的情况下,“循环缓冲区”的一种含义可能是一个“列表”(由参考域形成),其自身又重新环绕(循环参考)。可以在许多其他序言中创建这样的术语,区别在于它不是适当的列表。尽管这样的术语可能是循环的,但它不会过多地缓冲(一旦创建),因为列表中的项目无法重写。 Turbo Prolog支持事实的动态断言和撤回,并具有像asserta / 1和assertz / 1这样的元谓词,它们允许将新事实串行放置在同一谓词的现有事实的开头或结尾(如果需要,还可以在指定命名空间中) \“ module \”或使用Turbo Prolog术语的事实库)。如果对FIFO队列中的项目进行简单管理是您的目标,那么这很可能是您想要的方法(至少对于初始实现而言),并且将项目封装为事实。 Turbo Prolog还支持带有某些附加功能的“外部”事实库,从某种意义上说是外部的(存储在内存中或磁盘上),可以允许持久性和扩展的空间,超出为内部事实库分配的空间。鉴于通常与循环缓冲区关联的固定大小适中(因为它们旨在重用,并且溢出通常通过阻塞输入过程来解决,直到输出过程有机会赶上来),因此外部事实库似乎无法提供尽管可能具有持久性的“缓冲区”功能对于长时间运行的进程可能很重要。 希望这些建议能使您对这里真正需要完成的工作有所澄清。     
        经过深思熟虑,编写了以下程序
% 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].
现在,为了演示任何计算,我们需要编写一个程序,该程序将运行“ consumer”直到缓冲区为空。当缓冲区为空时,“消费者”将运行“生产者”。并停止该过程,此时数据和缓冲区将为空。 希望对任何人都会有用。     

要回复问题请先登录注册