Рабочая память
(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'.