-----------------------------------------------
-- Пример программы на Акторном Прологе. --
-- (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).
]
-----------------------------------------------
|