- •Оглавление
- •Предисловие
- •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. ПРИМЕРЫ ПОСТРОЕНИЯ ПРОСТЫХ ИНТЕЛЛЕКТУАЛЬНЫХ СИСТЕМ
3.1. Разработка простейшей экспертной системы
Выше был рассмотрен минимальный набор средств достаточный для построения небольшой экспертной системы. Для примера рассмотрим простую экспертную систему диагностики автомобиля. Допустим, что в результате беседы с экспертом мы получили следующие знания.
В простейшем случае проблемы с автомобилем могут делиться на две категории: «Не заводится» или «Работает нестабильно». Если двигатель не заводится, то он либо совсем не раскручивается, либо раскручивается от аккумулятора, но не заводится. Если двигатель не раскручивается, то проблема может быть в аккумуляторной батарее или в стартере двигателя. Если же двигатель не заводится, то проблема может заключаться в отсутствии топлива или неисправности системы зажигания. Если двигатель работает нестабильно, виной может слабая искра или неисправность свечей, а также неисправность в системе подачи топлива.
Таким образом, из этого словесного описания можно выделить основные факты, которые описывают состояние автомобиля и его узлов:
•Факты, описывающие состояние автомобиля: work doesnot (не заводится), work unstable (работает нестабильно).
•Факты, описывающие состояние двигателя: engine rotates (двигатель вращается), engine does-not-rotate (двигатель не вращается).
•Факты, описывающие состояние системы зажигания: ignition ok (зажигание в порядке), ignition failed (отказ в системе зажигание), Is there strong spark? (Есть сильная искра?).
•Факты, описывающие состояние топливной системы: Is it enough fuel? (Достаточно ли этого топлива?)
Не вдаваясь в технические подробности работы автомобиля и его двигателя, запрограммируем наши знания, используя продукционную модель, которую реализуем на языке CLIPS. Интерфейсная часть этой экспертной системы будет базироваться на наборе функций, которые уже отлажены и хранятся в файле es_fnAsk.clp. Набор правил, описывающих консультацию о работе двигателя представлен ниже и должен быть сохранен в файле es_rules.clp.
46
; |
----------------------------------------- |
|
|
! |
;---- |
Define Rules For Engine |
----! |
||
;---- |
This is file es _ rules.clp |
----! |
||
;---- |
Works |
with |
es_fnAsk.clp |
----! |
;----------------------------------------- |
|
|
|
! |
(defrule EngineState |
|
|
||
|
(not (work ?)) |
|
|
|
|
=> |
|
|
|
|
(bind ?mes " |
<<< |
EXPERT SYSTEM FOR CAR'S ENGINE >>>") |
|
(printout t crlf ?mes crlf crlf) (bind ?mes " 1-engine does not work")
(bind ?mes (str-cat ?mes " 2-engine works unstable")) (bind $?q (str-cat "What is the problem:" ?mes))
(if (eq (ask-allowed $?q 1 2) 1) then (assert(work doesnot)) else (assert(work unstable))
)
)
(defrule KindOfFail (work doesnot) =>
(bind ?m1 " 1 - Engine does not rotate")
(bind ?m2 " 2 - engine rotates, but not start") (bind $?q (str-cat ?m1 ?m2 ) )
(if (eq (ask-allowed $?q 1 2) 1)
then (assert(engine does-not-rotate)) else (assert(engine rotates))
)
)
(defrule CheckBatt
(engine does-not-rotate) =>
(assert(suggest "Check your battery or engine starter"))
)
(defrule UnstableIgnition (work unstable)
(not (ignition ?)) =>
(assert(need to check ignition))
)
(defrule IgnitionCheck (not (ignition ?))
(need to check ignition) =>
(bind ?m1 " Is there strong spark?")
(if (ask-yes-no (str-cat "Check ignition system." ?m1)) then (assert(ignition ok))
else (assert(ignition failed))
)
)
47
(defrule EnoughFuel (engine rotates) =>
(if (ask-yes-no "Is it enough fuel?") then (assert(need to check ignition)) else (assert(suggest "Add Fuel"))
)
)
(defrule SuggestOfIgnition (ignition failed) (engine rotates)
=>
(bind ?m1 "Your engine does not start because of") (bind ?m2 " the faulty of ignition system ")
(assert(suggest (str-cat ?m1 ?m2 )))
)
(defrule SuggestFuel (work unstable) (ignition ok)
=>
(bind ?m1 "Your engine work unstable due to") (bind ?m2 " unstable fuel supply ") (assert(suggest (str-cat ?m1 ?m2 )))
)
(defrule PrintSuggest (suggest ?x)
=>
(printout t ?x crlf)
)
(defrule NoSuggest (declare (salience -10)) (not (suggest ?))
=>
(printout t "Sorry, there is no suggest." crlf))
В данной экспертной системе в зависимости от исходных посылок и фактов предусмотрены следующие варианты экспертных заключений:
•“Your engine does not start because of the faulty of ignition system” (Ваш двигатель не запускается из-за неисправной системы зажигания),
•“Add Fuel” (Добавить топлива),
•“Check your battery or engine starter” (Проверьте батарею или стартер двигателя),
•“Your engine work unstable due to unstable fuel supply” (Работа вашего двигателя нестабильна из-за нестабильной подачи топлива),
•“Sorry, there is no suggest" (К сожалению, нет предложений).
После того, как набор правил сформирован, он сохраняется в файле es_rules.clp. Этот файл вместе с es_fnAsk.clp составит проектируемую нами
48
экспертную систему. Для запуска ее в работу надо очистить память CLIPS, загрузить и запустить на выполнение оба эти файла. Для реализации этих задач сформируем еще один файл – командный файл CLIPS, вида
;---- CLIPS batch file es_start.bat ----! (load* "D:\\CLIPS_WORK\\es_fnAsk.clp") (load* "D:\\CLIPS_WORK\\es_rules.clp") (reset)
(run)
Для запуска в работу разработанной нами простой экспертной системы по диагностики автомобиля достаточно в среде CLIPS выбрать в главном меню опцию File -> Load Batch … и загрузить файл es_start.bat. Если все было сделано правильно, то вид окна Dialog Windows будет аналогичен тому, что приведен на рис. 3.1.
Рис. 3.1. Результат запуска и консультации в разработанной ЭС.
Для запуска нового варианта консультации ЭС при уже загруженной программе достаточно выполнить команды (reset) и (run).
CLIPS> (reset) CLIPS> (run)
<<<EXPERT SYSTEM FOR CAR'S ENGINE >>>
ES: What is the problem: 1 - Engine does not rotate . . .
Упражнение 3.1.
•Провести тестирование экспертной системы во всех возможных режимах консультаций. При необходимости исправить правила.
•Расширь возможности ЭС, добавив новые правила. Например, в части топливной системы (бензонасос, фильтр, карбюратор) или любой другой системы на ваш выбор.
•Изменить внешний интерфейс ЭС, обеспечив вывод сообщений на экран не в одну, а в несколько строк.
49
