Институт радиотехники и электроники им В.А. Котельникова РАН
О ПРОБЛЕМЕ ВВЕДЕНИЯ СРЕДСТВ РАСПРЕДЕЛЁННОГО МНОГОАГЕНТНОГО ПРОГРАММИРОВАНИЯ В ЛОГИЧЕСКИЙ ЯЗЫК СО СТРОГОЙ ТИПИЗАЦИЕЙ
А.А. Морозов
О.С. Сушкова
А.Ф. Полупанов
Средства распределённого объектно-ориентированного логического программирования, описанные в этой статье, созданы для экспериментов с многоагентным интеллектуальным видеонаблюдением. Идея многоагентной обработки видеоинформации пришла из области искусственного интеллекта [4,5,6,7,8] и состоит в том, что система сбора и анализа видеоданных разбивается на множество независимых программ (агентов), обладающих автономностью (агент работает без прямого вмешательства со стороны пользователя и других агентов), социальными связями (агент взаимодействует с другими агентами посредством некоторых заранее предусмотренных механизмов), реактивностью (агент реагирует на внешние события) и проактивностью (агент планирует свои действия для достижения некоторых целей).
С теоретической точки зрения, использование многоагентного подхода к разработке систем интеллектуального видеонаблюдения способно обеспечить высокую гибкость, надёжность и расширяемость таких систем [9,10]. Например, если различные этапы низкоуровневой и высокоуровневой обработки видеоизображений выполняются отдельными агентами, новый вид анализа или распознавание нового вида аномального поведения людей могут быть добавлены в систему интеллектуального видеонаблюдения без изменения уже существующих агентов и даже без остановки системы. Для этого в систему просто добавляется новый агент, умеющий использовать результаты работы других агентов и способный передать им результаты своей работы.
В настоящее время декларативный подход к созданию многоагентных систем признан одним из наиболее перспективных направлений в этой области, разработано и реализовано большое количество декларативных языков и платформ многоагентного программирования [6]. Вместе с тем, агенты, работающие в составе системы интеллектуального видеонаблюдения, должны выполнять специфические операции с большими массивами бинарных данных, выходящие за рамки привычных операций обработки и обмена символьной информацией, характерных для декларативных языков программирования. Поэтому является актуальной задача разработки декларативных платформ многоагентного программирования, ориентированных на распределённую обработку видеоинформации в реальном времени и децентрализованное интеллектуальное видеонаблюдение. Отличительными особенностями нашего подхода к решению задачи является использование параллельного объектно-ориентированного логического языка Акторный Пролог и трансляция логического языка в Джаву.
Использование средств объектно-ориентированного логического программирования для описания и анализа семантики динамических изображений ранее было предложено и исследовано в работах [11,12,13,14,15,16]. Было показано, в частности, что использование объектно-ориентированного логического языка и транслятора логического языка в Джаву обеспечивают возможность проводить логический вывод на логическом описании видеосцены в реальном времени и выявлять сложные сценарии аномального поведения людей. Разработанный ранее подход может быть легко адаптирован к программированию распределённых систем интеллектуального видеонаблюдения, поскольку использованный в работах [11,12,13,14,15,16] логический язык Акторный Пролог является одновременно объектно-ориентированным языком. Для этого не требуется даже расширение синтаксиса языка, достаточно просто обеспечить возможность удалённого вызова методов экземпляров классов Акторного Пролога из других логических программ (агентов).
В разделе 1 рассмотрена проблема введения средств многоагентного программирования в логический язык со строгой типизацией. Расширение системы типов языка Акторный Пролог и алгоритм проверки типов рассмотрены в разделе 2. В разделе 3 рассмотрен пример взаимодействия логических агентов с помощью удалённого вызова предикатов.
1. Проблема строгой типизации в многоагентных системах
Термин «удалённый вызов подпрограммы» обычно ассоциируется со стандартными механизмами взаимодействия распределённых объектов OMG CORBA, Java RMI, MS DCOM, используемыми в объектно-ориентированном программировании (ООП). Такой смысл термина имеет самое непосредственное отношение к обсуждаемой проблеме, потому что, в конечном итоге, взаимодействие агентов в Акторном Прологе реализуется с помощью механизма Java RMI. Вместе с тем, в контексте агентного логического программирования, этот термин имеет более широкое значение и связан с вопросами проектирования и реализации логического языка.
Одной из фундаментальных проблем в области объектно-ориентированного программирования является организация взаимодействия независимых программ (агентов), поддерживающих строгую типизацию данных [17]. Дело в том, что для статической проверки типов данных, передаваемых между распределёнными объектами (агентами), необходимо организовать обмен информацией об используемых этими программами типах данных (например, в форме интерфейсов классов) уже на этапе компиляции программ. Такой обмен информацией между агентами является крайне нежелательным потому, что означает появление связей между агентами ещё до начала их реального взаимодействия, а также усложнение жизненного цикла агентов. Строгая типизация является важным элементом логического языка Акторный Пролог, необходимым для получения быстрого и надёжного исполняемого кода [12,18], поэтому для введения в язык средств распределённого программирования, в первую очередь, необходимо разработать (выбрать) какой-то вариант решения проблемы строгой типизации в многоагентных системах.
Для обеспечения корректного взаимодействия распределённых объектов (агентов) в Акторном Прологе предложен подход на основе комбинированной системы типов, идея которого заключается в том, что принцип статической проверки типов в логическом языке смягчается, а именно, проверка корректности использования объекта, полученного из другой программы (агента), откладывается до тех пор, пока он не понадобится для удалённого вызова предикатов. Во всех остальных случаях осуществляется статическая проверка типов. Ниже будут подробно рассмотрены расширение системы типов языка Акторный Пролог, а также правила проверки типов данных при взаимодействии агентов.
Сочетание в языке программирования объектно-ориентированного подхода со строгой типизацией данных является другой, хотя и тесно связанной с указанной выше, проблемой [19]. Известно, что строгая типизация очень полезна для описания интерфейсов классов в объектно-ориентированном программировании, но при этом «тип данных» и «класс» являются независимыми понятиями, и то, насколько гармонично сочетаются эти элементы в языке программирования, самым серьёзным образом влияет на удобство использования и эффективность реализации языка.
В Акторном Прологе используются оба понятия, «типы данных» (они же «домены») и «классы». Более того, понятия «элемент данных» и «экземпляр класса» были в языке разделены изначально [1,2]. Акторный Пролог поддерживает строгую типизацию различных видов простых и составных данных, таких как числа, символы, списки и пр. Одновременно с этим в языке поддерживаются классы и наследование на основе так называемого клаузального подхода к реализации логического ООП [20]. Экземпляры классов (они же «миры») могут обрабатываться в программе как обыкновенные термы, они могут передаваться в качестве аргументов в предикаты и входить в состав сложных структур данных. При этом для экземпляров классов используются специальные правила унификации, и, вообще говоря, именно для этой разновидности термов предназначены специальные механизмы обмена данными между логическими программами, обсуждаемые в этой статье. программа язык акторный пролог
В Акторном Прологе разные экземпляры классов всегда рассматриваются как разные сущности, то есть, унификация двух экземпляров классов является успешной, если и только если они являются одним и тем же экземпляром одного и того же класса. Интерфейс класса содержит полную информацию о методах класса, включая имена, арность, типы аргументов и направление передачи аргументов (в Акторном Прологе поддерживается явная декларация направления передачи аргументов предиката - входной или выходной). Информация о детерминированности предикатов также содержится в интерфейсе. В языке используются три ключевых слова, обозначающие различные виды детерминированности предикатов: nondeterm, determ и imperative. Ключевое слово nondeterm информирует компилятор о том, что на поведение предиката не наложено никаких ограничений, то есть, он может вернуть один или несколько ответов (в случае отката программы), а также может сам вызвать откат программы (если его исполнение завершится неудачей). Ключевое слово determ сообщает компилятору о том, что исполнение предиката может завершиться успехом (он может вернуть только один ответ) или неудачей. Ключевое слово imperative накладывает на поведение предиката наиболее сильные ограничения: исполнение предиката должно обязательно завершиться успехом; фактически, это означает, что предикат должен выполняться как обычная подпрограмма в императивном языке программирования. Все указанные ограничения проверяются компилятором в ходе трансляции логической программы.
Использование механизма классов в Акторном Прологе усложняется тем, что язык поддерживает параллельные процессы, а также два разных вида вызовов методов класса: простой и асинхронный. Параллельные процессы являются специальной разновидностью экземпляров классов, они обозначаются с помощью двойных круглых скобок в конструкторах миров [3]. Простые вызовы методов - это обычные вызовы предикатов стандартного Пролога; предикат может быть вызван в заданном мире с помощью разделителя «?». Асинхронные вызовы предикатов обозначаются с помощью разделителей «<-» и «<<». Только этот вид вызовов методов применим к параллельным процессам, потому что, согласно семантике языка, любой простой вызов метода в параллельном процессе немедленно заканчивается неудачей. В языке введено ключевое слово internal, с помощью которого можно сообщить компилятору, что некоторый слот экземпляра класса всегда содержит только простой мир (не процесс); это помогает компилятору анализировать детерминированность предикатов и оптимизировать программу. В данной статье основное внимание будет сосредоточено именно на асинхронных вызовах методов, потому что экземпляр класса, созданный и полученный из другой логической программы, является примером процесса, исполняемого параллельно относительно миров принимающей логической программы.
В общем случае, в распределённом Акторном Прологе используется статическая проверка типов, как в обычном Акторном Прологе. Динамическая проверка типов осуществляется лишь в том случае, если метод должен быть вызван в экземпляре класса, который был создан в другой логической программе (агенте) и каким-либо образом передан оттуда в рассматриваемую программу. Динамическая проверка корректности использования метода класса и типов его аргументов включает следующие операции:
1. Проверяется наличие метода с заданным именем и количеством аргументов в интерфейсе класса.
2. В случае необходимости, проверяется, может ли соответствующий предикат быть вызван в форме функции, возвращающей значение.
3. Если вызывается предикат с переменным количеством аргументов, проверяется, задекларирована ли такая возможность в интерфейсе класса.
4. Проверяется наличие заданного образца вызова, то есть, направления передачи аргументов предиката.
5. Осуществляется так называемое структурное сопоставление типов всех аргументов предиката.
Структурное сопоставление (проверка структурного соответствия) типов данных означает, что сравниваются не имена типов данных, а их структура. Далее процедура структурного сопоставления типов будет рассмотрена подробно для различных типов данных, реализованных в Акторном Прологе.
2. Система типов распределённого Акторного Пролога
Система типов Акторного Пролога поддерживает базовый набор простых и составных типов данных (доменов), на основе которых программист может определять свои собственные типы.
В языке реализованы следующие базовые простые типы данных: целые числа (INTEGER), вещественные числа (REAL), символы (SYMBOL) и текст (STRING). Отличие между целыми и вещественными числами заключается в том, что вещественные числа содержат точку. Отличие между символами и текстом заключается в том, что для внутреннего представления символьных данных в ходе выполнения программы используются номера строк в специальной таблице символов. На уровне синтаксиса языка, символьные данные обозначаются с помощью апострофов ('), а текстовые - с помощью кавычек ("). Ниже приведён пример использования встроенных простых типов данных для определения новых типов:
|
DOMAINS: |
|||
|
Год |
= |
INTEGER. |
|
|
Высота |
= |
REAL. |
|
|
Название |
= |
SYMBOL. |
|
|
Сообщение |
= |
STRING. |
Алгоритм проверки структурного соответствия требует точного совпадения базовых простых типов, в частности, целые и вещественные числа рассматриваются как разные типы данных.
В Акторном Прологе поддерживаются так называемые диапазоны и перечисления. Тип данных «диапазон» может быть определён с помощью целых или вещественных чисел, например:
|
Час |
= |
[0 .. 24]. |
|
|
Угол |
= |
[0.0 .. 360.0]. |
Алгоритм структурного сопоставления требует точного соответствия границ диапазонов и числовых типов (целые, вещественные). При этом, однако, сравнение границ вещественных диапазонов осуществляется приблизительно, с точностью, заданной в опциях компилятора.
Тип данных «перечисление» может быть задан в виде набора литералов (констант) простых типов, а также специальных литералов # («неизвестная величина»), [ ] (пустой список), { } (пустое недоопределённое множество), например:
|
Час |
= |
0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12. |
|
|
ДеньНедели |
= |
'понедельник'; 'вторник'; 'среда'; 'четверг'; 'пятница'; 'суббота'; 'воскресенье'. |