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

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

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

5 ответов

Решение

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

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

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

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

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

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

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

Он строго связан с 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).

Этот фрагмент зависит от грязи, который должен быть установлен с

?- pack_install(dirtree).

edit С 3 модификациями теперь отчет имеет возможность вызывать редактирование файлов:

  • вызов, чтобы получить пути в структуре
    dir2list(путь):-
        грязи (путь, DirTreeT),
        assign_path(DirTreeT, DirTree),
        ...
  • запросить специализированный вывод только для файлов
    dirtree2html(элемент (файл, A, []), _Parents) ->
        html (li (\file2html(A))).
  • наконец, "обработчик" - здесь просто разместите запрос для вызова редактора
    file2html(A) ->
        {memberchk(имя =N, A),
         memberchk(путь =P, A),
         memberchk(размер =S, A)
        },
        HTML ([оболочка ([класс = имя],
                   [a([href='writeln(edit (\'~s\')), edit(\'~s\')'-[N,P]], N)]), ': ', span([class=size], S)]).

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

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

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

https://github.com/aartikis/RTEC

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

Другие вопросы по тегам