ВУЗ:
Составители:
Рубрика:
(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 содержит текст, то она будет прину-
дительно приведена к прописному алфавиту. После этого функция проверяет, является ли полученный ответ одним из за-
данных корректных ответов. Если нет, то процесс повторится до получения корректного ответа, иначе функция вернет ответ,
введенный пользователем.
Будет также очень полезно определить функцию, задающую пользователю вопрос и допускающую ответ в виде да/нет,
так как это один из самых распространенных типов вопросов.
(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 вызывает функцию ask-question с постоянным набором допустимых ответов: yes, no, у и n. В слу-
чае, если пользователь ввел ответ yes или y, функция возвращает значение TRUE,
иначе FALSE. Обратите внимание, что
поскольку функция yes-or-no-p использует функцию ask-question, то она должна быть определена после нее.
Для упрощения реализации нашей экспертной системы введем следующее ограничение: за один запуск система может
предоставить пользователю
только одну рекомендацию по исправлению неисправности. В случае, если в машине несколько
неисправностей, то систему нужно будет последовательно вызывать несколько раз, удаляя обнаруженную на каждом новом
шаге неисправность. Таким образом, одним из образцов всех диагностических правил будет (not (repair ?)), гарантирующий,
что диагноз еще не поставлен.
Первым реализуем правило, определяющее общее состояние двигателя (см. правило 1).
(defrule determine-engine-state ""
(not (working-state engine ?))
(not (repair ?))
=>
(if (yes-or-no-p "Does the engine start (yes/no)? ")
then
(if (yes-or-no-p "Does the engine run normally (yes/no)? ")
then (assert (working-state engine normal))
else (assert (working-state engine unsatisfactory)))
else
(assert (working-state engine does-not-start))))
Условный элемент (not (working-state engine ?)) гарантирует, что общее состояние двигателя еще не определено. Если
это так, то пользователю задаются соответствующие вопросы и в систему добавляется факт, описывающий текущее общее
состояние двигателя.
Теперь реализуем правило, определяющее, пытается ли двигатель вращаться в случае, если он не заводится.
(defrule determine-rotation-state ""
(working-state engine does-not-start)
(not (rotation-state engine ?))
(not (repair ?))
=>
(if (yes-or-no-p "Does the engine rotate (yes/no)? ")
then
(assert (rotation-state engine rotates))
(assert (spark-state engine irregular-spark))
else
(assert (rotation-state engine does-not-rotate))
(assert (spark-state engine does-not-spark))))
Страницы
- « первая
- ‹ предыдущая
- …
- 13
- 14
- 15
- 16
- 17
- …
- следующая ›
- последняя »