текст статьи

-----------------------------------------------
-- Пример программы на Акторном Прологе.     --
-- (c) 2003, Алексей А. Морозов, ИРЭ РАН.    --
-- Построение теоретико-модельной семантики. --
-----------------------------------------------
-- Исходный текст программы.                 --
-----------------------------------------------
project: (('Example'))
-----------------------------------------------
class 'Example':
--
-- Создаётся три процесса. Они обмениваются
-- информацией с помощью прямых и потоковых
-- сообщений.
--
-- Процесс p1 служит источником информации
-- для процесса p2, который следит за
-- состоянием p1 с помощью резидента.
-- Кроме того, процесс p1 принимает прямые
-- сообщения от процесса p3.
--
p1      = (('C1'));
--
-- Процесс p2 собирает информацию из процесса
-- p1 и посылает потоковые сообщения процессу
-- p3 через общую переменную data.
--
p2      = (('C2',
                target=p1,
                protecting:output=data));
--
-- Процесс p3 получает информацию из процесса
-- p2 через общую переменную data и посылает
-- её в процесс p1 с помощью прямого сообщения.
-- Таким образом, в системе процессов
-- существует обратная связь.
--
p3      = (('C3',
                receiver=p1,
                suspending:input=data));
--
data;
--
con     = ('Console');
--
[
--
-- Программа печатает значения слота data.
-- Будем считать, что это и есть результаты
-- исполнения программы.
--
goal:-
        con ? writeln(data).
]
-----------------------------------------------
class 'C1':
--
internal_data;
--
[
--
-- Актор goal доказывается повторно при каждом
-- изменении слота internal_data, которое может
-- произойти, например, при получении процессом
-- сообщения message1. Тем самым, актор goal
-- выполняет функции хранителя текущего
-- значения слота. Это значение в дальнейшем
-- может быть извлечено из процесса с помощью
-- функции function1.
--
goal:-
        accept(internal_data).
--
accept(_).
--
-- Это сообщение может изменить значение слота
-- internal_data.
--
message1(A):-
        internal_data== A.
--
-- Функцию function1 вызывет резидент в
-- процессе C3. Она недетерминированная и
-- возвращает три значения.
--
function1()= 100.
function1()= 300.
function1()= internal_data :-
        [internal_data].
        -- Это предложение возвращает
        -- производное значение слота
        -- internal_data.
]
-----------------------------------------------
class 'C2':
--
target;
output;
--
-- Резидент, собирающий информацию о
-- процессе target.
--
data    = target ?? function1();
--
[
--
-- Значение слота data посылается
-- через слот output.
--
goal:-
        output == data.
]
-----------------------------------------------
class 'C3':
--
input;
receiver;
--
[
--
-- Значение слота input посылается в мир
-- receiver.
--
goal:-
        receiver <- message1(input).
]
-----------------------------------------------

текст статьи