Чтобы проиллюстрировать эти идеи, рассмотрим небольшой пример (основанный на примере вакуумной чистки) Идея состоит в том, что мы имеем небольшого роботизированного агента, который чистит в доме. Робот оснащен сенсором, который определяет есть ли там какая-либо грязь и вакуумный очиститель, который может быть использован для засасывания грязи. В дополнение робот все время имеет четкую ориентацию (одно из север, юг, запад, восток) В дополнения к способности всасывать грязь агент может перемещаться вперед на один шаг или поворачиваться на 90 градусов. Агент перемещается по комнате, которая разделена на манер сетки на несколько квадратов одинакового размера (соответствующего единице перемещения агента). Предположим также, что агент кроме чистки больше ничего не делает, никогда не покидает комнату и более того предположит с целью упрощения, что комната имеет сетку 3х3 и агент стартует на квадрате сетки (0,0) в направлении на север.
Рисунок 1.4 Вакуумный мир.
Подводя итог сказанному: наш агент может получить восприятие грязи (означающее что где-то там есть грязь) или null (значащее что нет никакой специальной информации). Он может выполнять любое одно из доступных действий: вперед, всосать, повернуться. Цель в том, чтобы пересекая комнату постоянно искать грязь и удалять ее. См. Рисунок 1.4 для иллюстрации этого вакуумного мира.
Сначала заметим что мы используем три простых доменных предиката в этом примере:
In(x,y) агента находится на (x,y)
Dirt(x,y) есть грязь на (x,y)
Facing(d) направление агента d
Теперь определим функцию next. Эта функция должна обращать внимание на информацию очувствления, полученную из окружающей среды (или грязь или null), и вырабатывать новую базу данных, которая включает эту информацию. Но так же она должна удалять старую или неуместную информацию, и также она должна стараться определить новое положение и направление агента. Поэтому мы определим функцию next по частям. Сперва напишем old(D), чтобы отметить набор «старой» информации в базы данных, который мы хоти при обновлении функцией next удалить:
old(D)={P(t1,…,tn) | PÌ {In, Dirt, Facing} and P(t1,…,tn) Ì D}
Потом нам необходима функция new, которая выдаст набор новых предикатов, которые надо добавить к базе данных. Эта функция имеет следующий вид:
new: DxPàD
Определение функции не сложно, но оно скорее длинное и поэтому мы его опустим в этом примере. (Она должна генерировать предикаты: In(…) описывающий новую позицию агента, Facing(…) описывающий ориентацию агента и Dirt(…) если грязь была обнаружения на новой позиции) Имея функции old и new, функцию next можно записать:
next(D,p)=( D\old(D))Ènew(D,p)
Теперь мы можем перейти к новым правилам, которые определяют поведение агента. Дедуктивные правила имею вид:
f(…)ày (…),
где f и y являются предикатами с некоторым произвольным списком констант и переменных. Идея заключается в том, что если f соответствует базе данных агента, тогда y может быть concluded (решена?) для любых переменных в y.
Первое правило относиться к основному действию очистки агента: это привило имеет приоритет над всеми другими повелениями агента (такими как навигация).
In(x,y)ÙDirt(x,y)àDo(suck) (1.1)
Следовательно, если агент находится на позиции (x,y) и он видит грязь, тогда назначенным действием будет всосать грязь. В противном случае основным действием агента будет пересекать пространство. Пользуясь простотой нашего окружения, мы подсоединим основной алгоритм навигации таким образом, что робот всегда будет двигаться от (0,0) к (0,1) к (0,2) и потом к (1,2), (1,1) и так далее. Как только агент доходит до (2,2),он переходит снова к (0,0). Правила относящиеся к перемещения вплоть до (0,2) очень просты
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.