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

Аннотации для убеждений

1. Аннотация [source(x)]

Утверждает, что источником аннотированного убеждения является «x». Используется наиболее часто. Кроме того, данной аннотацией автоматически снабжаются все убеждения. Аргумент «х» может принимать следующие значения:

- «percept» – если источник убеждения собственное восприятие среды посредством датчиков;

- «self» – если агент формирует данное убеждение в результате логического вывода;

- «имя агента» – если источник убеждения другой агент.

Аннотация «source» полезна для организации интерфейса между агентами. Каждому начальному убеждению можно приписать такую аннотацию и это будет означать, что убеждение может меняться только при получении сообщений от агентов, указанных в аннотации. Если этого не сделать, то убеждение будет меняться при получении соответствующих сообщений от любых источников. Приведем пример.

likes(john,music) [source(john)]

Агент Джон сказал, что любит музыку. Если мы изначально знаем, что Джон любит музыку, и предварительно внесли это убеждение в базу, то только сам Джон сможет его изменить.

Проверку аннотаций довольно часто приходится включать в условие активации планов, например, так:

+likes(john,music) [source(A)]:A== john <- !presentAGuitar(A).

Что означает, если мы получили убеждение, что Джон любит музыку, и сказал нам об этом сам Джон, то подарить ему гитару. Если у этого убеждения будет другой источник, то план не сработает.

2. Аннотация [degOfCert(x)].

Задает степень уверенности в истинности аннотируемого убеждения. По-умолчанию данная аннотация автоматически не влияет на работу механизма логического вывода. Однако, во-первых, она открывает путь к модернизации этого механизма средствами Java, во-вторых, ее все-таки можно использовать, если организовать ее обработку в планах вручную.

Аннотации для планов

1. Аннотация [atomic]

Данная аннотация запрещает агенту отвлекаться от обработки плана на другие события.

2. Аннотация [all_unifs]

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

a(10).

a(20).

!g.

@p[all_unifs] +!g : a(X) <- print(X).

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

3. Аннотация [breakpoint]

При вызове плана с этой аннотацией программа должна приостановить свою работу и перейти в режим отладки.

4.4.8 Работа со списками

Работа со списками в AgentSpeak происходит также как и в Прологе. Списки представляются в памяти как бинарные деревья (см. рис. 6)

рис. 6

В списке выделяются так называемые голова и хвост. Голова списка – это его первый элемент (допустим E1), который посредством специального оператора объединения (обозначенного кружочком) соединяется с его хвостом, представляющим собой остальные элементы списка, увязанные операторами объединения. Теперь рассмотрим хвост (начиная с элемента E2). Он тоже является списком, значит, в нем тоже есть своя голова (E2) и свой хвост (начиная с E3 ). И так далее. В конце списка последний его элемент En объединяется с пустым элементом, формально завершающим список.

Такая организация списка позволяет рекурсивно его обрабатывать, постепенно отделяя головы от хвостов.

В AgentSpeak списки как константы обозначаются в квадратных скобках, а их элементы следуют через запятую, например.

list([a, b, c, d]). – убеждение list содержит в качестве терма список.

Списки могут содержать разнородные и повторяющиеся элементы, в том числе могут быть вложенными, например.

list([a, a, 12, “string”, f(a), g(X), [a, b, c]]).

Для отделения головы списка от его хвоста применяется специальный оператор «|» - вертикальная черта. Например, следующая программа рекурсивно выведет на экран все элементы списка, задаваемого в качестве аргумента в начальной цели.

!start([a, b, c, d]).

+!start([H|T]):H\==[] <-.print(H);

!start(T).

+!start(L)<-true.

Обратите внимание, что первый план рекурсивно выполняется до тех пор, пока голова списка не равна пустому списку. Как только перебор доходит до пустого элемента срабатывает второй план и программа завершает свою работу.

Многие внутренние функции требуют в качестве аргументов списки или возвращают список результатов (см. прил. №1).

В последние версии Jason (начиная с 1.1.2) в экспериментальном порядке введена поддержка условного и циклических операторов в теле плана. С их помощью тоже можно организовать обработку списков (см. прил.1, функция «.member»). Однако, по мнению авторов пособия, реализация данных операторов пока не выглядит до конца отлаженной, поэтому в пособии эти возможности не рассматриваются. Более подробную информацию можно почерпнуть из файла «release-notes.txt».