Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие_по_jason_(итог).doc
Скачиваний:
79
Добавлен:
21.03.2016
Размер:
1.79 Mб
Скачать

Справочник по функциям среды jason Внутренние функции

Напоминаем, что вызов любой внутренней функции начинается с точки.

Функции коммуникации

  1. Функция «.broadcast»

Посылает сообщение всем агентам. Первый аргумент – императив, второй – посылаемый литерал.

По-умолчанию команда использует сокращенную версию KQML, что, тем не менее, не исключает подключение новых императивов. Используются следующие императивы:

tell – сообщить получателю литерал;

untell сообщить получателю, что передаваемый литерал уже не истинен;

achieve – просьба к получателю достичь указанной цели;

unachieved просьба прекратить достижение цели;

askOne – реализует запрос информации одним агентом из базы убеждений другого. Запрашиваемое убеждение передается в виде предиката-шаблона, в котором требуется конкретизировать заданные переменные. При этом в качестве ответа ожидается только один вариант конкретизации. Запросивший агент ожидает ответа, приостанавливая свою работу, но время ожидания может быть и ограниченно.

askAll – запрос у получателя информации по заданному предикату-шаблону (ожидаются все возможные ответы);

tellHow – сообщить получателю план;

untellHow – сообщить получателю, что план не верен (обычно ожидается удаление плана из базы знаний получателя);

askHow – запрос всех планов для обработки события.

Следует помнить, что вся передаваемая между агентами информация автоматически всегда сопровождается аннотацией [source(A)], где A – имя агента отправителя, что позволяет получателю проверить источник сообщения.

Примеры использования

a) .broadcast(tell,value(10)). – Всем агентам сообщается предикат value(10).

b) .broadcast(achieve, who_is_last). – Всех агентов просят достичь цели «who_is_last».

2) Функция «.Send»

Посылает сообщение заданному агенту. Может иметь переменное число параметров в зависимости от используемого императива.

Первый параметр – имя агента-адресата сообщения, – может быть представлен индивидной константой, параметрическим предикатом, строкой или списком, в котором перечислены имена адресатов в одной из упомянутых форм.

Второй параметр – используемый императив (см. операцию «.broadcast»).

Третий – обычно содержание сообщения.

Примеры использования

a) .send(store, askOne, mealsInStore(Rest), mealsInStore(Rest)).

Здесь третий параметр это шаблон запрашиваемого убеждения, в котором необходимо конкретизировать переменную «Rest»; четвертый параметр – это место для записи полученного ответа – в данном случае это тот же самый предикат, хотя могла быть и просто локальная переменная плана. При наличии четвертого параметра агент будет ожидать ответа в этом же цикле моделирования. Если четвертый параметр опустить, то это будет означать, что получение незамедлительного ответа не принципиально для отправителя запроса, отправитель продолжит свою работу и будет обрабатывать полученный в будущем ответ стандартным способом перехвата события изменения базы убеждений (см. следующий пример).

Далее предположим, что агент отправитель это «jomi», а агент получатель – «rafael».

b) .send(rafael,askOne,value(beer,X)): «jomi» посылает запрос «value(beer,X)» агенту «rafael». При этом дальнейшее выполнение намерений агента «jomi» не приостанавливается. Когда «rafael» ответит на запрос, то «jomi» получит событие «+value(beer,10)[source(rafael)]».

.send(rafael,askOne,value(beer,X),A,2000): аналогично примеру «а)» с поправкой на «jomi» и «rafael-я» и той разницей, что «jomi» ждет ответа 2 секунды. Если по истечении этого времени ответ не получен, то в переменную «А» помещается «timeout».

с) .send(rafael,tell,value(10)): «jomi» посылает value(10) агенту «rafael». Литерал «value(10)[source(jomi)]» будет добавлен в базу убеждений «rafael-я», а также будет сгенерировано соответствующее событие.

d) .send(rafael,achieve,go(10,30): «jomi» посылает параметризованную цель «go(10,30)» «rafael-ю». Когда «rafael» получит данное сообщение, то в его очередь событий добавится «+!go(10,30)[source(jomi)]».