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

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

(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.0. В этой программе не нужно было специально предусматривать какие-либо варианты разрешения конфликтных ситуаций, поскольку стратегия, предложенная по умолчанию, всегда обеспечит решение задачи (см. раздел 5.3). Введите в систему текст этой программы и запустите на выполнение:

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

С помощью команды watch посмотрите, в каком порядке будут использоваться специфицированные в программе правила. Во врезке 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'.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.