
База знаний
База знаний в экспертной системе предназначена для долгосрочных данных (общих фактов), описывающих рассматриваемую предметную область, и правил, описывающих целесообразные преобразования данных этой области.
Разработку простейшей экспертной системы в соответствии с заданием следует начать с определения формата хранения знаний. В данной работе знания будут храниться в виде вопросов и ответов на них. Предполагается следующая логика работы экспертной системы: приложение предлагает пользователю вопросы о симптомах, которые возможны. При ответе на данные вопросы формируются факты, с помощью которых и будет выбрано заболевание.
Разделение фактов по группам удобно представить в виде таблицы (табл. 2).
Табл. 2. Факты, используемые в экспертной системе
Факты |
Состояние |
Общее состояние человека horosho |
normal |
not notmal |
|
Головная боль gol |
yes |
no |
|
Температура temperatura |
yes |
no |
|
Озноб ozn |
yes |
no |
|
Боль в мышцах mish |
yes |
no |
|
Кашель kashel’ |
yes |
no |
|
Боль или комок в горле gor |
yes |
no |
|
Ощущение сухости или першения в горле far |
yes |
no |
|
Наличие мокроты при кашле mok |
yes |
no |
|
Насморк nasm |
yes |
no |
|
Боли в горле при глотании glot |
yes |
no |
|
Увеличение лимфатических узлов lim |
yes |
no |
|
Онемение шеи onem |
yes |
no |
|
Чувствительность к свету или звукам men |
yes |
no |
|
Рвота enc |
yes |
no |
При продукционном виде данных и таком подходе к реализации, удобно хранить их в виде дерева, где каждый узел представляет собой один вопрос, а в дочерних узлах, помеченных различными вариантами ответов, содержит либо конечные ответы, либо новые вопросы, необходимые для уточнения данных (рис. 1).
Рис. 1. Схема базы знаний в виде дерева
В экспертной системе реализуются правила консультации, которые в зависимости от той или иной ситуации будут задавать пользователю необходимые вопросы и получать ответ в строго заданной форме. Дальнейшая консультация будет производиться с учетом предыдущих ответов на вопросы, заданные пользователю. Эти ответы будут формировать описание текущей ситуации с помощью фактов, приведенных выше.
Для реализации подобной архитектуры будет необходимо реализовать функцию, задающую пользователю произвольный вопрос и получающую ответ из заданного набора корректных ответов:
(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)
Функция принимает два аргумента: простую переменную question, которая содержит текст вопроса, и составную переменную allowed-values с набором допустимых ответов. Сразу после своего вызова функция выводит на экран соответствующий вопрос и читает ответ пользователя в переменную answer. Если переменная answer содержит текст, то она будет принудительно приведена к прописному алфавиту. После этого функция проверяет, является ли полученный ответ одним из заданных корректных ответов. Если нет, то процесс повторится до получения корректного ответа, иначе функция вернет ответ, введенный пользователем.
Будет также очень полезно определить функцию, задающую пользователю вопрос и допускающий ответ в виде да/нет, т. к. это один из самых распространенных типов вопросов. С учетом реализации функции ask-question эта функция примет вид, представленный ниже:
(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))
Функция yes-or-no-p вызывает функцию yes-or-no-p с постоянным набором допустимых ответов: yes, no, у и n. В случае если пользователь ввел ответ yes или у, функция возвращает значение true, иначе — false. Поскольку функция yes-or-no-p использует функцию ask-question, то она должна быть определена после нее.
Механизм логического вывода, используя исходные данные из рабочего поля и знания из базы знаний, формирует такую последовательность правил, которая приводит к решению задачи. Продукционная модель знаний с прямым логическим выводом подразумевает присутствие условия ЕСЛИ(Х) – ТО(Y). Причем, под X подразумевается наличие некоторых фактов, соединенных между собой через «И»/«ИЛИ». Последовательно отвечая на вопросы системы, пользователь формирует совокупность фактов X. При достаточном накоплении этих фактов система делает необходимый вывод. При обратном выводе отправной точкой служат цели, после выбора которых производится проход по графу фактов, принадлежащих выбранной цели.
В языке CLIPS для реализации системы логического вывода используются: правила и факты.
Правила (defrule) –основа механизма логического вывода в языке CLIPS, пример которой приведён ниже.
(defrule determine-vi-horosho ""
(not(norm ?))
(not (repair ?) )
=>
(if (yes-or-no-p "Вы чувствуете недомогание (y/n)? ")
then
(assert (norm normal))
else
(assert (repair "У Вас нет причин к беспокойству. Вы здоровы"))))
Правила представляют собой логическую конструкцию «ЕСЛИ-ТО», а знак « => » является разделителем условия и действия.
Факты (facts) – запись в базе данных (в данной работе динамической) в виде списка, который может содержать одно или несколько полей, принимающих символьные либо числовые значения.
При запуске программы интерпретатор CLIPS запускает машину логического вывода, которая выясняет, какие из правил могут быть активированы. Это действие выполняется циклически. Каждый цикл проверки состоит из 3 шагов:
Сопоставление фактов находящихся в БД и всех правил программы.
Выбор правила условия, которого совпадают с фактами в БД и текущим состоянием системы.
Выполнение действий, предписанных правилом.
Так же были реализованы метод вывода итоговой информации и правила, сообщающего пользователю о начале работы. Ниже приведена реализация этих правил.
(defrule system-banner ""
(declare (salience 10))
=>
(printout t crlf crlf)
(printout t ************************************************")
(printout t crlf crlf)
(printout t "* Экспертная система медицинской консультации")
(printout t crlf crlf)
(printout t "Выполнил студент группы 220291 Гусева Светлана Львовна")
(printout t crlf crlf)
(printout t*************************************************")
(printout t crlf crlf))
(defrule print-repair ""
(declare (salience 10))
(repair ?item)
=>
(printout t crlf crlf)
(printout t "Скорее всего у Вас:")
(printout t crlf crlf)
(format t " %s%n%n%n" ?item))