流程推理/ prolog中的反应式编程?

时间:2013-10-16 15:40:12

标签: stream prolog swi-prolog reactive-programming

我想知道你是否知道使用prolog进行流处理的任何方法,即某种反应式编程,或者至少让查询在不断更新的知识库上运行(实际上是一个流),并不断输出推理的输出?

在流行的“prologs”中实现了什么,例如SWI-prolog?

4 个答案:

答案 0 :(得分:6)

您可以使用Logtalk对事件驱动编程的支持来定义监视知识库更新事件并相应做出反应的监视器。您可以使用大多数Prolog系统作为支持的编译器运行Logtalk,包括SWI-Prolog。

例如描述事件驱动的特征。在用户手册中: http://logtalk.org/manuals/userman/events.html

当前分发包含一些使用事件和监视器的示例。考虑到您的问题,一个有趣的问题是bricks示例: https://github.com/LogtalkDotOrg/logtalk3/tree/master/examples/bricks

首先运行此示例,然后查看其代码,可以让您清楚了解可以对系统范围的事件和监视器执行的操作。

答案 1 :(得分:3)

XSB具有流处理功能。参见

中的第14页

XSB Manual

答案 2 :(得分:2)

我正在处理相关的事情,在项目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))).
  • 最后,'handler' - 这里只是发出一个调用编辑器的请求
    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)]).

现在文件名可以点击,写一条消息并在需要时进行编辑:图片

after extending the report with links to editor

答案 3 :(得分:1)

您应该查看 RTEC:运行时事件演算

https://github.com/aartikis/RTEC

RTEC是针对流推理进行了优化的开源Event Calculus方言。它是用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