Потоковые рассуждения/реактивное программирование в прологе?

Мне было интересно, знаете ли вы какой-либо способ использования пролога для потоковой обработки, то есть какое-то реактивное программирование, или, по крайней мере, чтобы запрос выполнялся в базе знаний, которая постоянно обновляется (фактически поток) и постоянно выводится результат рассуждений?

Что-нибудь реализовано в популярных "прологах", таких как SWI-prolog?


person Samuel Lampa    schedule 16.10.2013    source источник


Ответы (4)


Вы можете использовать поддержку Logtalk для программирования, управляемого событиями, для определения мониторов, которые отслеживают события обновления базы знаний и реагируют соответствующим образом. Вы можете запустить Logtalk, используя большинство систем Prolog в качестве поддерживаемого компилятора, включая SWI-Prolog.

Функции, управляемые событиями, описаны, например. в руководстве пользователя: http://logtalk.org/manuals/userman/events.html

Текущий дистрибутив содержит несколько примеров использования событий и мониторов. Интересным, учитывая ваш вопрос, является пример bricks: https://github.com/LogtalkDotOrg/logtalk3/tree/master/examples/bricks

Сначала запустив этот пример, а затем просмотрев его код, вы должны получить хорошее представление о том, что вы можете делать с общесистемными событиями и мониторами.

person Paulo Moura    schedule 16.10.2013

XSB имеет возможности потоковой обработки. См. стр. 14 в

Руководство по XSB

person Matt    schedule 16.10.2013
comment
Спасибо! Было бы здорово, если бы вы могли предоставить пример кода о том, как это использовать? :) - person Samuel Lampa; 16.10.2013

Я работаю над чем-то связанным, в проекте pqConsole уже есть базовая возможность: отчет пользователю структурированные данные, содержащие активные области (ссылки), которые возвращают текущее состояние Prolog, следовательно, возможность отображать действия и реагировать соответствующим образом (надеюсь).

Он тесно связан с pqConsole::win_write_html, демонстрируя последние возможности Qt SWI-Prolog.

Вот пример фрагмента, создающего только простой отформатированный отчет, сейчас я попытаюсь добавить реактивную часть, чтобы вы могли оценить, находите ли вы выразительной эту базовую систему. Подсказки приветствуются...

/*  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)]).

и теперь имена файлов кликабельны, напишите сообщение и отредактируйте по запросу: картинка

после расширения отчета ссылками на редактор

person CapelliC    schedule 16.10.2013

Вы должны проверить RTEC: исчисление событий во время выполнения:

https://github.com/aartikis/RTEC

RTEC — это диалект исчисления событий с открытым исходным кодом, оптимизированный для потокового анализа. Он написан на Прологе и протестирован на 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

person Erik Kaplun    schedule 06.10.2020