Сбор информации

Как упоминалось выше, для работы нашей системы можно заставить поль­зователя вручную вводить факты, описывающие проявление возникшей не­исправности. Однако такой метод имеет ряд серьезных недостатков: пользо­ватель может забыть о каких-нибудь существенных деталях или, наоборот, указать слишком много информации, что может помешать нормальной работе системы. Кроме того, факты, описывающие проявление неисправно­сти, должны были бы иметь строго определенный формат, и система не смогла бы их обработать в случае ошибки со стороны пользователя.

В нашей экспертной системе мы реализуем правила диагностики, которые в зависимости от той или иной ситуации будут задавать пользователю необхо­димые вопросы и получать ответ в строго заданной форме. Дальнейшая ди­агностика будет производиться с учетом предыдущих ответов на вопросы, заданные пользователю. Эти ответы будут формировать описание текущей ситуации с помощью фактов, приведенных выше.

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

Пример 9.4. Функция ask-question

(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 эта функция примет вид, представленный в примере 9.5.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: