流推理/反应式编程在Prolog中的应用?

8

我想知道是否有任何方法可以使用Prolog进行流处理,也就是说,一种响应式编程方式,或者至少让查询在不断更新(有效地成为一个流)的知识库上运行,并持续输出推理结果?

是否有任何在流行的“Prologs”(如SWI-Prolog)中实现的方法?

5个回答

6
您可以使用Logtalk对事件驱动编程的支持来定义监视知识库更新事件并相应地做出反应的监视器。您可以在大多数Prolog系统中使用Logtalk作为后端编译器运行,包括SWI-Prolog。
例如,在用户手册中描述了事件驱动功能: http://logtalk.org/manuals/userman/events.html 当前发行版包含一些使用事件和监视器的示例。考虑到您的问题,一个有趣的示例是bricks示例: https://github.com/LogtalkDotOrg/logtalk3/tree/master/examples/bricks 首先运行此示例,然后查看其代码,应该能让您了解使用系统范围内的事件和监视器可以做什么。

4
XSB具有流处理能力。请参见XSB手册第14页。

1
谢谢!如果您能提供一些如何使用它的示例代码,那就太好了 :) - Samuel Lampa

3
我正在处理一个相关的项目,名为 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).

这段代码依赖于 dirtree,需要安装该软件包。
?- pack_install(dirtree).

通过3个修改,该报告现在具有调用文件编辑的功能:
  • 调用以获取结构中的路径
    dir2list(Path) :-
        dirtree(Path, DirTreeT),
        assign_path(DirTreeT, DirTree),
        ...
  • 请求仅针对文件的专门输出
    dirtree2html(element(file, A, []), _Parents) -->
        html(li(\file2html(A))).
  • 最后,'处理程序' - 这里只需放置一个请求以调用编辑器
    file2html(A) -->
        {memberchk(name=N, A),
         memberchk(path=P, A),
         memberchk(size=S, A)
        },
        html([span([class=name],
                   [a([href='writeln(editing(\'~s\')), edit(\'~s\')'-[N,P]], N)]
        ), ' : ', span([class=size], S)]).
现在文件名是可点击的,如果需要,可以编写消息并进行编辑:图片

2
你应该查看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


1
我不知道为什么到目前为止还没有提到这一点,但在SWI-Prolog中有prolog_listen,它可以监视数据库的动态更新等内容:

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接