Пример экспертной системы

Введение

Здравствуйте.
В своем первом топике хочу постараться рассказать о такой вещи как экспертные системы. Насколько вижу эта тема не достаточно сильно охвачена хабром.
Экспе́ртная систе́ма (ЭС, expert system) — компьютерная программа, способная частично заменить специалиста-эксперта в разрешении проблемной ситуации. (с) Википедия.
В качестве тестовой задачи постараемся создать некий аналог системного администратора. Наверное каждого, кто имеет хотя бы некоторое отношение к ИТ просили помочь с компьютером (не включается).Вы приходили, включали компьютер в розетку и он начинал работать. Это приятно, если просит красивая девушка и не каждый день.А если их много и не все девушки и не все красивые?

Решение

Давайте формализуем процесс диагностики неисправности компьютера.
В первую очередь следует задать вопросы, что бы определить тип возможной неисправности.

А-Загружается ли у вас компьютер?
Q-Нет
A-Включено ли питание.
Q- Да.
А- Обратитесь к системному администратору.

Вот такую нехитрую систему попробуем реализовать.
Реализация

Опишем вопросы на каком либо языке программирования.
По сути можно это сделать и на ASM. Но мы же не программисты.Мы спецы в своей области (с тем же успехом можно реализовать диагностику здоровья, а врач, который кодит на асме редкость). Значит надо выбрать язык «заточенный» под экспертные системы. Где не надо думать, сколько памяти под массив выделить и т.д.
Побродив по просторам интернета останавливаемся на языке CLIPS (можно выбрать было бы и LISP, но остановимся на CLIPS).
CLIPS работаетс правилами и фактами. Различные факты могут сделать правило применимым. Применимое правило затем допускается (assert). Факты и правила создаются предварительным объявлением.

Опишем в правилах языка CLIPS правило:

;; Правило determine-working-state
(defrule determine-working-state ""
(not (working-state ?))
(not (repair ?))
=>
(if (yes-or-no-p «Загружается ли OS? (yes/no)? „)
then
(if (yes-or-no-p “OS работает корректно? (yes/no)? „)
then
(assert (working-state not-stable))
else
(assert (repair “Remont ne trebuetsa»))
(assert (working-state stable))
)
else
(assert (working-state disenabled))
)
)

Здесь задаются вопросы при помощи некой функции yes-ur-no-p, котороая реализована следующим образом:
(deffunction yes-or-no-p (?question)
(bind ?response (ask-question ?question yes no y n))
(if (or (eq ?response yes) (eq ?response y))
then TRUE
else FALSE))

Где мы получаем ответ на вопрос, который формируется следующим образом:

(deffunction ask-question (?question $?allowed-values)
(printout t ?question)
(bind ?answer (read))
(if (lexemep ?answer)
then (bind ?answer (lowcase ?answer)))
(while (not (member ?answer ?allowed-values)) do
(printout t ?question)
(bind ?answer (read))
(if (lexemep ?answer)
then (bind ?answer (lowcase ?answer))))
?answer)

После того как пользователь ответил, срабатывает assert, после чего правило «срабатывает».
Полльзователь на вопрос загружется ОС ответил «Нет». Значит проверяем включено ли питание.

;;правило определяющее включен ли компьютер
(defrule determine-power-state ""
(working-state disenabled)
(not (power-state ?))
(not (repair ?))
=>
(if (yes-or-no-p "Подается ли питание? (yes/no)? ")
then
(assert (repair "Следует проверить исправность "железа" или переставить ОС"))
(assert (power-state be))
else
(assert (repair "Подайте питание"))
(assert (power-state not))
)
)

Пользователь отвечает «Да», и ему предлагается решение неисправности.
Заключение

В данном посте я постарался описать примитивную задачу. В реальных условиях такая система может быть полезна при передаче своего проекта заказчику в качестве хелпа, что бы он не дергал разработчиков по пустяковым вопросам.
Буду рад ответить на ваши вопросы.
Метки:
clips,Экспертные системы

Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.