Рабочая память
Основная функция рабочей памяти – хранить данные в формате векторов объект-атрибут-значение. Эти данные используются интерпретатором, который в случае присутствия (или отсутствия) определенного элемента данных в рабочей памяти активизирует те правила, предпосылки в которых удовлетворяются наличными данными. Как это делается, рассмотрим на примере.
Пусть в рабочей памяти содержатся векторы:
(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' вводит в рабочую память ;;описание исходного состояния. ;;Функция вызывается при перезапуске системы. ;;Исходное состояние объектов следующее. ;;Робот находится в комнате А, ;;ящик находится в комнате В, ;;цель – вытолкнуть ящик в комнату А.