Иллюстрированный самоучитель по введению в экспертные системы

         

Рабочая память


Основная функция рабочей памяти — хранить данные в формате векторов объект-атрибут-значение. Эти данные используются интерпретатором, который в случае присутствия (или отсутствия) определенного элемента данных в рабочей памяти активизирует те правила, предпосылки в которых удовлетворяются наличными данными. Как это делается, рассмотрим на примере.

Пусть в рабочей памяти содержатся векторы

(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). Введите в систему текст этой программы и запустите на выполнение:

  • введите (reset),

  • затем введите (run).

    С помощью команды 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'.


    Содержание раздела