5.2.2.
Рабочая память
Основная функция
рабочей памяти — хранить данные в формате векторов объект-атрибут-значение.
Эти данные используются интерпретатором, который в случае присутствия (или
отсутствия) определенного элемента данных в рабочей памяти активизирует те правила,
предпосылки в которых удовлетворяются наличными данными. Как это делается, рассмотрим
на примере.
Пусть в рабочей
памяти содержатся векторы
(patient (name Jones) (age 40)
(organism
organism-1))
(organism (name organism-1)
(morphology
rod) (aerobicity .aerobic)).
В очередном
цикле интерпретатор просмотрит имеющийся список правил и отыщет в нем то, которое
содержит условия, удовлетворяющиеся этими векторами.
Если предпосылка
в правиле не содержит переменных, она удовлетворяется при точном совпадении
выражений в правиле и в рабочей памяти. Если же предпосылка в правиле содержит
переменные, т.е. является образцом, то она удовлетворяется, если в рабочей памяти
содержится вектор, включающий такую пару атрибут-значение, которая остается
постоянной при удовлетворении всех остальных условий в том же правиле.
В самом простом
случае соответствие проверяется присвоением постоянных значений переменным,
которые делают предпосылку совпадающей с вектором в рабочей памяти. Так, вектор
состояния в рабочей памяти
(patient (name Jones) (age 40)
(organism organism-1))
удовлетворяет
предпосылку в правиле
(patient
(name ?pat) (organism ?org))
подстановкой
Jones вместо ?pat и Organism-1 вместо ?org.
Обратите внимание
на то, что мы опускаем при анализе соответствия пары, которые отсутствуют в
предпосылке правила. Поскольку другая предпосылка в этом же правиле также удовлетворяется
при указанной подстановке, то новый вектор
(organism (name organism-1)
(identify
enterobacteriaceae) (confidence 0.8))
добавляется
интерпретатором в рабочую память.
Поскольку
для заключения правила значение ?pat безразлично, поле имени пациента можно
в условии вообще игнорировать.
Теперь рассмотрим
набор правил, представленный в листинге 5.3, вместе с множеством векторов в
рабочей памяти. Этот пример основан на планировщике STRIPS, о котором шла речь
в главе 3. Программа состоит из выражений трех типов:
Строки, которые начинаются символами ";;", являются комментариями.
Листинг
5.3. Набор правил для проблемы в системе STRIPS
;;
Шаблоны
;;
Цель (goal) представляет собой вектор, состоящий из
;;
четырех компонентов:
;;
действие, которое нужно выполнить,
;;
объект, над которым должно быть выполнено действие;
;;
исходное положение;
;;
положение, в которое нужно перейти.
(deftemplate
goal
(field action (type SYMBOL))
(field object (type SYMBOL))
(field from (type SYMBOL))
(field
to (type SYMBOL))
)
;;
Вектор 'in' указывает, где находится объект, (deftemplate in
(field
object (type SYMBOL))
(field
location (type SYMBOL)) )
ФАКТЫ
;;Функция
'deffacts' вводит в рабочую память
;;описание
исходного состояния.
;;Функция
вызывается при перезапуске системы.
;;Исходное
состояние объектов следующее.
;;Робот
находится в комнате А,
;;ящик
находится в комнате В,
;;цель - вытолкнуть ящик в комнату А.
(deffacts
world
(in (object robot)
(location RoomA))
(in (object box)
(location RoomB))
(goal (action push)
(object box)
(from
RoomB) (to RoomA))
)
;;
ПРАВИЛА
;;
Это правило утверждает:
;;
Прекратить процесс, когда цель будет достигнута.
(defrule
stop
(goal
(object ?X) (to ?Y))
(in
(object ?X) (location ?Y)) =>
(halt)
)
;; Если робот отсутствует в том месте, где находится
;; объект, который нужно передвинуть,
;; переместить туда робот.
(defrule
move
(goal
(object ?X) (from ?Y))
(in
(object ?X) (location ?Y))
?robot-position
<- (in (object robot)
(location
?Z&~?Y)) =>
(modify
?robot-position (location ?Y))
;;
Если робот и объект не в том помещении,
;;
которое указано в цепи,
;;
переместить туда робот и объект.
(defrule
push
(goal
(object ?X) (from ?Y) (to ?Z))
(in
(object ?X) (location ?Y))
?object-position
<- (in (object ?X) (location ?Y))
?robot-position
<- (in (object robot) (location ?Y))
=>
(modify ?robot-position (location ?Z))
(modify
?object-position (location ?Z))
Это законченная
программа на языке CLIPS, которую можно запустить на выполнение в среде разработки
CLIPS 6.O. В этой программе не нужно было специально предусматривать
какие-либо варианты разрешения конфликтных ситуаций, поскольку стратегия, предложенная
по умолчанию, всегда обеспечит решение задачи (см. раздел 5.3). Введите в систему
текст этой программы и запустите на выполнение:
С помощью
команды watch посмотрите, в каком порядке будут использоваться специфицированные
в программе правила. Во врезке 5.2 представлены трассировка выполнения этой
программы и краткие пояснения.
5.2.
Трассировка программы управления роботом
Представленная
ниже карта трассировки будет сформирована при запуске про-граммы в режиме трассировки.
Команда
reset обеспечит перезагрузку описания исходного состояния в рабочую память,
а команда run запустит программу на выполнение.
В
карте трассировки каждая строка, которая начинается с символов ==>, представляет
добавление вектора в рабочую память, а строка, которая начинается с символов,
<==, — удаление вектора из рабочей памяти. Строки, которые начинаются с 'FIRE',
представляют активизацию какого-либо правила. Остальные строки пока ,что игнорируйте.
(reset)
==>
f-0 (initial-fact)
=> f-1 (in (object robot) (location RoomA))
==>
f-2 (in (object box) (location RoomB))
==> f-3 (goal (action push) {object box)
(from RoomB) (to RoomA)) CLIPS>
(run)
FIRE 1 move: f-3, f-2, f-1
<==
f-1 (in (object robot) (location RoomA))
==>
f-4 (in (object robot) (location RoomB))
FIRE 2 push: f-3, f-2, f-4 <== f_4
(in (object robot) (location RoomB))
==>
f-5 (in (object robot) (location RoomA))
<==
f-2 (in (object box) (location RoomB))
==>
f-6 (in (object box) (location RoomA))
FIRE
3 stop: f-3, f-6
[PRCCODE4]
Execution halted during the actions of defrule stop.
CLIPS>
(reset)
<==
f-0 (initial-fact)
<== f-3 (goal {action push)
(object box) (from RoomB) (to RoomA))
<==
f-5 (in (object robot) (location RoomA))
<==
f-6 (in (object box) (location RoomA))
CLIPS>
Обратите внимание на то, что выполнение программы останавливается правилом 'stop'.