如何解决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,Size) :-
length(BufferBefore,BuffSize < Size,car(DataBefore,Elem),addlast(Elem,BufferAfter),deletefirst(DataBefore,DataAfter).
跑步的几个例子
consumer([1,2,3,4,5],Result)
退货
BufferAfter = [2,Result = 1.
和
producer([1,5,6],[7,8,9],%\">3 here\"%)
退货
DataAfrer = [2,BufferAfter = [7,9,1].
现在,为了演示任何计算,我们需要编写一个程序,该程序将运行“ consumer”直到缓冲区为空。当缓冲区为空时,“消费者”将运行“生产者”。并停止该过程,此时数据和缓冲区将为空。
希望对任何人都会有用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。