- •Оглавление
- •Предисловие
- •1. Общие сведения о языке и среде разработки CLIPS
- •1.1. Системы продукций и CLIPS
- •1.2. Основы работы в консоли CLIPSJNI
- •1.3. Основы работы в среде CLIPSWin
- •1.4. Механизмы представления знаний в CLIPS
- •1.5. Пример разработки БЗ и работы с ней в среде CLIPS
- •1.6. Пример использования эвристического механизма представления знаний совместно с процедурным
- •2. Основные конструкции языка CLIPS
- •2.1. Примитивные типы данных языка CLIPS
- •2.2. Особенности вызова функций в языке CLIPS
- •2.3. Факты в языке CLIPS
- •2.3.1. Позиционные факты
- •2.3.2. Непозиционные факты
- •2.4. Операции над фактами
- •2.5. Правила в языке CLIPS
- •2.5.1. Объявление и добавление новых правил
- •2.5.2. Один из подходов к разрешению конфликтов
- •2.6. Групповые символы для простых и составных полей
- •2.7. Переменные в CLIPS
- •2.8. Глобальные переменные
- •2.9. Пользовательские функции
- •3. Примеры построения простых интеллектуальных систем
- •3.1. Разработка простейшей экспертной системы
- •3.2. Пример решения задач на планирование
- •3.2.1. Программа ”Робот и ящик”
- •3.2.2. Запуск и трассировка программы ”Робот и ящик”
- •3.3. Пример использования ООП в CLIPS.
- •Приложение 2. Использование образцов в правилах.
- •Приложение 3. Стратегии разрешения конфликтов
- •Приложение 4. Работа с модулями в CLIPS
- •Литература и Интернет-ресурсы
3.2.Пример решения задач на планирование
Вэтом разделе остановимся на использовании CLIPS для разработки программы составления планов действий технической системой в заданной предметной области. Традиционное планирование основано на знаниях, поскольку создание плана требует организации частей знаний и частичных планов в процедуру решения.
Планирование используется в экспертных системах при рассуждении о событиях, происходящих во времени. Планирование находит применение в производстве, управлении, робототехнике. Планы создаются путем поиска
впространстве возможных действий до тех пор, пока не будет найдена последовательность, необходимая для решения задачи. Это пространство представляет состояние мира, которое изменяется при выполнении каждого действия. Поиск заканчивается при достижении целевое состояние. Задача планировщика заключается в том, чтобы определить последовательность действий модуля решения. Например, некоторой системы управления.
3.2.1. Программа ”Робот и ящик”
Данная задача является простейшей тестовой задачей на планирование действий и формулируется следующим образом. Пусть имеются 2 комнаты, а именно комната А и комната В. Предположим, что в комнате А находится робот, а в комнате В расположен ящик. Задача состоит в том, чтобы переместить ящик в комнату А.
Используя CLIPS, решим эту задачу с помощью шаблонных фактов. С этой целью определим шаблон in, который будет характеризовать текущее местоположение объекта, будь то робот или ящик:
(deftemplate in
(slot object (type SYMBOL)) (slot location (type SYMBOL))
)
В этом шаблоне слот object будет определять название предмета или робота, а слот location будет определять название места, где этот предмет или робот располагается в текущий момент.
Чтобы задать роботу конкретную цель действий создадим шаблон goal, который описывает факт о перемещение кого-то откуда-то и куда-то:
(deftemplate goal
(slot object (type SYMBOL)) (slot from (type SYMBOL)) (slot to (type SYMBOL))
)
В этом шаблоне слот object - определяет название объекта, который необходимо переместить, а слоты from и to определяют, откуда и куда.
50
На основе шаблонов in и goal запишем исходное состояние системы, которое будет определяться набором начальных фактов:
(deffacts world |
|
|
(in |
(object robot) (location RoomA)) |
|
(in |
(object box) |
(location RoomB)) |
(goal (action push) (object box) (from RoomB) (to RoomA))
)
Первый факт соответствует тому, что робот находится в комнате А, Второй факт определяет, что ящик находится в комнате В, а третий факт требует перетащить ящик из комнаты В в комнату А.
Заключительным этапом создания данной программы является создание правил, которые реализовывали бы план действий робота по перемещению ящиков. Чтобы робот мог спланировать свои действия надо реализовать три правила, которые осуществляли бы следующие действия робота:
•перемещение робота в комнату, где находится объект;
•перемещение робота с объектом в комнату, указанную в цели;
•останов программы если цель достигнута.
Реализуем первое действие в виде правила, в котором сформированы три предпосылки:
(defrule move
(goal (object ?X) (from ?Y)) (in (object ?X) (location ?Y))
?robot-position <- (in (object robot) (location ~?Y)) =>
(modify ?robot-position (location ?Y))
)
В первой предпосылке, использующей шаблон goal, задаются значения переменных ?Х и ?Y. Во второй определяется наличие объекта ?Х в комнате ?Y. В третьей предпосылке проверяется, что местоположение робота не соответствует ?Y и запоминается ссылка на данный факт в переменной ?robot-position. Если все предпосылки данного правила истинны, то с помощью оператора modify меняется значение слота location на значение переменной ?Y факта ?robot-position, т. е. робот перемещается в комнату, в которой находится объект, который необходимо переместить.
Аналогично реализуется правило перемещения робота с ящиком, в комнату, указанную в цели:
(defrule push |
|
(goal (object ?X) (from ?Y) (to ?Z)) |
|
?object-position <- (in (object ?X) |
(location ?Y)) |
?robot-position <- (in (object robot) (location ?Y)) =>
(modify ?robot-position (location ?Z)) (modify ?object-position (location ?Z))
)
51
В данном случае изменяются два факта, ссылки на которые задаются в переменных ?object-position и ?robot-position, а именно, значение слота location меняется на значение переменной ?Z, соответствующей значению куда необходимо переместить предмет роботом.
Останов выполнения программы в CLIPS осуществляется с помощью команды (halt). Условием останова является наличие факта, что предмет, указанный в цели (слот object) находится в комнате, указанной в слоте to:
(defrule stop
(goal (object ?X) (to ?Y)) (in (object ?X) (location ?Y)) =>
(halt)
)
Базовый вариант программы «робот и ящик» может быть аналогичным тому, что приведен ниже.
; |
----------------------------------------- |
! |
;---- |
Program "the robot and the box ” ----! |
|
;---- |
This is file robot.clp |
----! |
;----------------------------------------- |
|
! |
;;ШАБЛОНЫ
;;Шаблон «цель»
(deftemplate goal
(slot action (type SYMBOL)) (slot object (type SYMBOL)) (slot from (type SYMBOL))
(slot to (type SYMBOL)) )
;;Шаблон «местоположение оъекта»
(deftemplate in
(slot object (type SYMBOL)) (slot location (type SYMBOL)) )
;;ФАКТЫ
;;Робот в комнате А, ящик в комнате В,
;;цель - вытолкнуть ящик в комнату А.
(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)
)
52
;;Если робот отсутствует в том месте, где находится
;;объект, который нужно передвинуть,
;;переместить туда робот,
(defrule move
(goal (object ?X) (from ?Y)) (in (object ?X) (location ?Y))
?robot-position <- (in (object robot) (location ~?Y))
=>
(modify ?robot-position (location ?Y))
)
;;Если робот и объект не в том помещении, которое
;;указано в цели, то переместить туда робота с объектом. (defrule push
(goal (object ?X) (from ?Y) (to ?Z)) ?object-position <- (in (object ?X) (location ?Y)) ?robot-position <- (in (object robot) (location ?Y))
=>
(modify ?robot-position (location ?Z)) (modify ?object-position (location ?Z))
)
3.2.2. Запуск и трассировка программы ”Робот и ящик”
До запуска программы, ее надо создать и сохранить в файле robot.clp, а затем войти в среду CLIPS и выполнить следующие действия:
•Ввести команду (clear), либо Execution –> Clear CLIPS.
•Загрузить программный файл, используя File –> Load или Ctrl+L.
•Очистить Dialog Window, используя его всплывающее меню.
Для того чтобы была возможность наблюдать результат трассировки процесса выполнения программы дополнительно необходимо:
•В окне Watch Options установить трассировку для Facts и Rules.
•Открыть окно рабочей памяти, использую Windows –> Facts.
Шаг 1. Инициализации системы, команда (reset), либо Execution –> Reset.
Рис. 3.2. Результат шага 1 трассировки программы.
Загружено 4 факта, три из которых f-1, f-2, f-3 определяют исходное состояние нашей программы.
53
Шаг 2. Выполняем (run 1), либо Execution –> Step, либо CTRL+T.
Рис. 3.3. Результат шага 2 трассировки программы.
Из рис. 3.3. видно, что активируется правило move, на наборе фактов f- 3, f-2 и f-1. Результатом применения правила является исключение из рабочей памяти f-1 и добавления в нее f-4. Конечное состояние данного шага – ящик в RoomB (f-2), робот там же (f-4) и его цель переправить ящик из RoomB в RoomA (f-3). Результат шага – робот переместился в RoomB.
Шаг 3. Выполняем (run 1), либо Execution –> Step, либо CTRL+T.
Рис. 3.4. Результат шага 3 трассировки программы.
Из рис. 3.4. видно, что активно правило push, на наборе фактов f-3, f-2 и f-4. Результат работы правила – исключение из рабочей памяти f-4 и f-2, и добавления в нее f-5 и f-6. Конечное состояние шага – ящик в RoomA (f-6), робот там же (f-5) и его цель переправить ящик из RoomB в RoomA (f-3). Результат шага – робот c ящиком переместился в RoomА.
Шаг 4. Выполняем (run 1), либо Execution –> Step, либо CTRL+T.
Рис. 3.5. Результат шага 4 трассировки программы.
Из рис. 3.5. следует, что активируется правило stop, на наборе из двух фактов f-3, f-6. Применимость этого правила определяется тем, что робот
54
