我想知道您是否知道使用 prolog 进行流处理的任何方法,即某种反应式编程,或者至少让查询在不断更新(实际上是流)的知识库上运行,并不断输出推理的输出?
在流行的“prologs”中实现了什么,例如 SWI-prolog?
我想知道您是否知道使用 prolog 进行流处理的任何方法,即某种反应式编程,或者至少让查询在不断更新(实际上是流)的知识库上运行,并不断输出推理的输出?
在流行的“prologs”中实现了什么,例如 SWI-prolog?
您可以使用 Logtalk 对事件驱动编程的支持来定义监视知识库更新事件并做出相应反应的监视器。您可以使用大多数 Prolog 系统作为支持的编译器运行 Logtalk,包括 SWI-Prolog。
事件驱动的特性在用户手册中有描述:http: //logtalk.org/manuals/userman/events.html
当前发行版包含一些使用事件和监视器的示例。考虑到您的问题,一个有趣的bricks
例子是:
https ://github.com/LogtalkDotOrg/logtalk3/tree/master/examples/bricks
首先运行这个示例,然后查看它的代码,应该可以让您很好地了解可以使用系统范围的事件和监视器做什么。
XSB 具有流处理能力。见第 14 页
我正在做一些相关的事情,在项目pqConsole中已经有基本功能:向用户报告结构化数据,包含在 Prolog 当前状态下回调的可操作区域(链接),因此可以公开操作并做出适当的反应(希望)。
它与 pqConsole::win_write_html 密切相关,展示了 SWI-Prolog 的最新 Qt 功能。
这是一个仅生成简单格式报告的片段示例,我现在将尝试添加反应部分,因此您可以评估您是否发现这个基本系统具有表现力。欢迎提示...
/* File: win_html_write_test.pl
Author: Carlo,,,
Created: Aug 27 2013
Purpose: example usage win_html_write/1
*/
:- module(win_html_write_test,
[dir2list/1
]).
:- [library(http/html_write)].
:- [library(dirtree)].
dir2list(Path) :-
dirtree(Path, DirTree),
% sortree(compare_by_attr(name), DirTree, Sorted), !,
DirTree = Sorted,
phrase(html([\css,
\logo,
hr([]),
ul(\dirtree2html(Sorted, [])),
br([])]), Tokens),
with_output_to(atom(X), print_html(Tokens)),
win_html_write(X),
dump_page_to_debug(X).
css --> html(style(type='text/css',
['.size{color:blue;}'
])).
logo --> html(img([src=':/swipl.png'],[])).
dirtree2html(element(dir, A, S), Parents) -->
html(li([\elem2html(A),
ul(\elements2html(S, [A|Parents]))])).
dirtree2html(element(file, A, []), _Parents) -->
html(li(\elem2html(A))).
elem2html(A) -->
{memberchk(name=N, A),
memberchk(size=S, A)
},
html([span([class=name], N), ' : ', span([class=size], S)]).
elements2html([E|Es], Parents) -->
dirtree2html(E, Parents),
elements2html(Es, Parents).
elements2html([], _Parents) --> [].
dump_page_to_debug(X) :-
open('page_to_debug.html', write, S),
format(S, '<html>~n~s~n</html>~n', [X]),
close(S).
这个片段取决于ditree,应该安装
?- pack_install(dirtree).
编辑现在,经过 3 次修改,报告能够调用文件的编辑:
dir2list(路径):- 脏树(路径,DirTreeT), 分配路径(DirTreeT,DirTree), ...
污垢树2html(元素(文件,A,[]),_Parents)--> html(li(\ file2html (A)))。
file2html(A) --> {memberchk(name=N, A), 成员chk(路径= P,A), memberchk(大小=S, A) }, html([span([class=name], [a([href='writeln(编辑(\'~s\')), 编辑(\'~s\')'-[N,P]], N)] ), ' : ', 跨度([class=size], S)])。
现在文件名是可点击的,写一条消息并根据要求进行编辑:一张图片
您应该查看RTEC:运行时事件演算:
https://github.com/aartikis/RTEC
RTEC 是一种针对流推理优化的开源事件演算方言。它是用 Prolog 编写的,并且已经在 YAP 6.2 下进行了测试。
特色亮点:
基于间隔。
滑动窗口推理。
非惯性流的区间操作构造。
分层知识库的缓存。
支持乱序数据流。
索引以有效处理无关数据。
SWI-Prolog 网站上也提到了它:
https://www.swi-prolog.org/pack/file_details/prologmud_I7/prolog/ec_planner/RTEC/README.md
这大概依赖于:
https://www.swi-prolog.org/pldoc/doc/_SWI_/library/dialect/yap.pl
我不知道为什么到目前为止还没有提出这个问题,但是在 SWI-Prolog 中有prolog_listen
,除其他外,它可以监视数据库的动态更新: