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