Рабочая программа и методические указания для самостоятельной работы студентов Vкурса по специальности 071900. Информационные системы и технологии (исж)

Вид материалаРабочая программа

Содержание


071900. Информационные системы и технологии – (исж)
Составители – к.т.н., доцент Горелик В.Ю.
Цель и задачи дисциплины
Рабочая программа
Подобный материал:
МПС РОССИИ

РОССИЙСКИЙ ГОСУДАРСТВЕННЫЙ ОТКРЫТЫЙ

ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ ПУТЕЙ СООБЩЕНИЯ



Утверждено деканом

факультета

«Управление процессами

перевозок»




Одобрено кафедрой

«Вычислительная техника»



Представление знаний в информационных системах


Рабочая программа и методические указания

для самостоятельной работы студентов V курса по специальности


^ 071900. ИНФОРМАЦИОННЫЕ СИСТЕМЫ И ТЕХНОЛОГИИ – (ИСЖ)


Москва-2007


Рабочая программа составлена на основании примерной учебной программы данной дисциплины, составленной в соответствии с государственными требованиями к минимуму содержания и уровню подготовки студента специальности 071900.


^ Составители – к.т.н., доцент Горелик В.Ю.

к.т.н. Гордиенко Е.П.


Р е ц е н з е н т –


Курс – 5

Всего часов - 8

Лекционные занятия – 8часов

Самостоятельная работа – 45 часов

Контрольная работа – 15 часов

Зачет


Российский государственный открытый технический

университет путей сообщения, 2007


^ ЦЕЛЬ И ЗАДАЧИ ДИСЦИПЛИНЫ


Целью дисциплины “Представление знаний в информационных системах” является изучение теоретических основ представления и обработки знаний в информационных системах, а также получение студентами практических навыков проектирования систем, основанных на знаниях.

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

Для изучения курса необходимы знания предметов, изучавшихся в цикле общеобразовательных и специальных дисциплин: «Информатика», «Технология программирования», «Объектно-ориентированное программирование», «Проектирование информационных систем».


^ РАБОЧАЯ ПРОГРАММА


Введение. Основные понятия инженерии знаний

(лекции – 1 час, самостоятельные занятия – 1 час)

Общие сведения о знаниях. Классификация знаний. Характеристики знаний и отличия знаний от данных. Модели представления знаний и их типы. Декларативные и процедуральные модели представления знаний. [1, 2, 3]


Тема 1. Логическая модель представления знаний

(лекции – 3 часа, самостоятельные занятия – 2 часа)

Основные понятия логики высказываний и логики предикатов. Представление знаний о предметной области в виде предикатных формул. Преобразование предикатных формул и их приведение к нормальной и сколемовской стандартной формам. Клаузальная форма. Исчисление предикатов первого порядка, основные аксиомы и правила логического вывода исчисления предикатов. Аксиоматический подход к организации логического вывода. Метод резолюции и использование резолюционного вывода в исчислении предикатов. Логическое программирование. Достоинства и недостатки логических моделей представления знаний, их использование в информационных системах. [1, 2, 3, 6, 16].


Тема 2. Фреймовая модель представления знаний

(лекции – 2 часа, самостоятельные занятия – 2 часа)

Понятие фрейма, его структура, классификация фреймов. Структура слота, его основные элементы. Типы значений слотов. Виды присоединенных процедур и принципы их функционирования.

Принципы организации фреймовых систем. Виды отношений между фреймами. Наследование атрибутов во фреймовых системах. Основные стратегии логического вывода в фреймовых системах. Достоинства и недостатки фреймовых моделей представления знаний, области их применения. [1, 2, 6, 9, 10]


Тема 3. Сетевые модели представления знаний

(лекции – 2 часа, самостоятельные занятия – 2 часа)

Семантические сети, их классификация и принципы построения. Типы объектов и отношений в семантических сетях. Основные операции над семантическими сетями. Агрегация и обобщение.

Управление выводом в сетевых моделях. Запрос семантической сети. Наследование атрибутов в семантических сетях. Использование семантических сетей в естественно-языковых системах. Достоинства и недостатки сетевых моделей представления знаний. [1, 2, 6, 9, 10]


Тема 4. Продукционные модели представления знаний

(лекции – 2 часа, самостоятельные занятия – 2 часа)

Понятие продукции. Структура продукции. Продукционные правила, их типы и основные структуры. Антецедент и консеквент правила. Построение графов продукций, их виды.

Продукционные системы, их структура, основные принципы организации и функционирования. Стратегии разрешения конфликтов в продукционных системах.

Применение продукционных моделей при представлении знаний в интеллектуальных информационных системах. [1, 2, 6, 9, 10]


Тема5. Представление неточных и нечетких знаний

(лекции – 2 часа, самостоятельные занятия – 2 часа)

Понятие неточных знаний. Методы поиска решений в условиях неопределенности. Использование коэффициентов уверенности, байесовского подхода для формализации неточных знаний.

Нечеткие множества и их связь с теорией построения интеллектуальных систем. Виды нечетких знаний. Основные понятия теории нечетких множеств. Лингвистические переменные и их использование для представления нечетких знаний. Обработка нечетких знаний в интеллектуальных системах. [2, 4, 7, 8, 14]


Тема 6. Методы обработки знаний и

технология приобретения знаний

(лекции – 2 часа, самостоятельные занятия – 2 часа)

Основные стратегии обработки знаний. Прямая и обратная цепочки рассуждений, способы их реализации. Методы поиска решений в пространстве состояний. Графовые и гиперграфовые модели. И-ИЛИ графы. Деревья. Поиск в глубину и в ширину. Поиск с возвратом. Поиск на основе стоимости дуг, эвристический поиск.

Методы выявления и структурирования знаний для интеллектуальных систем. Основные функции инженера по знаниям. [1, 5, 9, 11,12]


Тема 7. Инструментальные средства работы со знаниями.

Системы, основанные на знаниях

(лекции – 2 часа, самостоятельные занятия – 2 часа)

Классификация инструментальных средств для работы со знаниями. Языки, использующиеся при представлении и обработке знаний. Общие сведения о языках инженерии знаний. Понятие о функциональном и логическом программировании. Особенности языков Лисп, Пролог и Смолток. Использование объектно-ориентированного подхода к представлению и обработке знаний.

Классы прикладных систем, основанных на знаниях, и задачи, решаемые ими. Экспертные системы: классификация, назначение, особенности, принципы функционирования и построения. Основные подходы к организации баз знаний интеллектуальных систем. [3, 5, 6, 10, 12, 13, 14]


ЛИТЕРАТУРА

а) основная литература:
  1. Частиков А.П. и др. Разработка экспертных систем. Среда CLIPS. – СПб.-БХВ-Петербург, 2003.
  2. Статические и динамические экспертные системы/ Попов Э.В. М: Финансы и статистика, 2001.

б) дополнительная литература

1.Искусственный интеллект: в 3 книгах. Справочник / под ред. Д.А. Поспелова. М.: Радио и связь, 1990.

2.Представление и использование знаний / Уэно Х. М.: Мир, 1989.
  1. Осуга С. Обработка знаний: пер. япон. - М.: Мир, 1989.
  2. Гаврилова Т.А. Извлечение и структурирование знаний для экспертных систем. М.: Радио и связь, 1992.
  3. Малышев Н.Г. Нечеткие модели для экспертных систем в САПР. М.: Энергоатомиздат, 1991.
  4. Нечеткие множества в моделях управления и искусственного интеллекта/ под ред. Поспелова Д.А. М.: Наука, 1986.
  5. Приобретение знаний / Осуга С., М.: Мир, 1990.
  6. Маковский В.А. Базы знаний. М.: Радио и связь, 1993.
  7. Выявление экспертных знаний/ Ларичев О.И. М.: Наука, 1989.
  8. Базы и банки данных и знаний / Г.И. Ревунков. М.: Радио и связь, 1992.
  9. Малпас Дж. Реляционный язык Пролог и его применение. М.: Наука, 1990.
  10. Кофман А. Введение в теорию нечетких множеств. М.: Мир, 1982.



ЗАДАНИЕ для самостоятельной РАБОТЫ

В качестве индивидуальной самостоятельной работы студентам предлагается изучить процесс создания несложной экспертной системы, проводящей диагностику неисправности мотора автомобиля по внешним признакам, в среде CLIPS. Среда CLIPS – это удобный инструмент, предназначенный для создания экспертных систем. CLIPS состоит из интерактивной среды – экспертной оболочки со свои способом представления знаний, гибкого и мощного языка и нескольких вспомогательных инструментов. CLIPS является свободно распространяемым программным продуктом. Адрес официального сайта CLIPS – et/clips/ CLIPS.php.

В результа­те бесед с экспертом в области установления неисправностей и ремонта ав­томобилей были установлены следующие эмпирические правила:
  1. Двигатель обычно находится в одном из 3-х состояний: он может работать нормально, работать неудовлетворительно или не заводиться.
  2. Если двигатель работает нормально, то это означает, что он нормально
    вращается, система зажигания и аккумулятор находятся в норме и ни­
    какого ремонта не требуется.
  3. Если двигатель запускается, но работает ненормально, то это говорит,
    по крайней мере, о том, что аккумулятор в порядке.
  4. Если двигатель не запускается, то нужно узнать, пытается ли он вра­щаться. Если двигатель вращается, но при этом не заводится, то это может говорить о наличии плохой искры в системе зажигания. Если
    двигатель даже не пытается заводиться, то это говорит о том, что искры
    нет в принципе.
  5. Если двигатель не заводится, но вращается, нужно проверить наличие
    топлива. Если топлива нет то, скорей всего, для ремонта машины
    нужно просто заправиться.
  6. Если двигатель не заводится, нужно также проверить, заряжен ли аккумулятор, если нет, то его следует зарядить.
  7. Если двигатель не заводится, и существует вероятность плохой искры
    в системе зажигания, то необходимо проверить контакты. Контакты могут быть в одном из трех состояний — чистые, опаленные и грязные,
    в случае опаленных контактов их необходимо заменить, в случае если
    контакты грязные, их достаточно просто почистить.
  8. Если двигатель не заводится, искры нет и аккумулятор заряжен, то нужно проверить катушку зажигания на электрическую проводимость.
    В случае если ток не проходит через катушку, то ее необходимо заменить. Если катушка зажигания в порядке, значит необходимо заменить
    распределительные провода.
  9. Если двигатель запускается, но при этом ведет себя инертно, не сразу
    реагирует на подачу топлива, то необходимо прочистить топливную систему.
  10. Если двигатель запускается, но происходят перебои с зажиганием, то
    это говорит о наличии плохой искры в системе зажигания, для устране­ния данной неисправности необходимо отрегулировать зазоры между
    контактами.
  11. Если двигатель запускается и стучит, то необходимо отрегулировать зажигание.
  12. Если двигатель запускается, но не развивает нормальной мощности, то это может говорить об опаленных или загрязненных контактах (см. пра­вило 7).
  13. Возможны ситуации, когда состояние двигателя нельзя описать приведенными выше факторами и машине может потребоваться более де­тальный анализ состояния.

Выделим сущности, имеющие значение при решении задачи:

1. В каком состоянии находится машина, диагностика которой производится. Эксперт выделил три возможных состояния: нормальная работа двигателя, двигатель работает неудовлетворительно, не заводится (см. правило 1).

2. Состояние вращения двигателя: способен он вращаться (работать) или нет.

3. Состояние системы зажигания: нормальное состояние, не регулярная работа и нерабочее состояние.

4. Состояние акку­мулятора: заряжен­ный и разряженный.

Факты CLIPS, описывающие состояние автомобиля и его узлов:


; Группа фактов, описывающая состояние машины
working-state engine normal ;нормальная работа

working-state engine unsatisfactory ;неудовлетворительная работа
working-state engine does-not-start ;не заводится
; Группа фактов, описывающая состояние двигателя
rotation-state engine rotates ;двигатель вращается

rotation-state engine does-not-rotate ;двигатель не вращается

; Группа фактов, описывающая состояние системы зажигания
spark-state engine normal ;зажигание в порядке

spark-state engine irregular-spark ;искра не регулярна
spark-state engine does-not-spark ;искры нет
; Группа фактов, описывающая состояние системы питания
charge-state battery charged ;аккумулятор заряжен

charge-state battery dead ;аккумулятор разряжен


Факты, входящие в одну группу взаимоисключающие, т.е. наличие в системе сразу двух фактов из одной группы лишено смысла.

Экспертная система должна предоставлять пользователю рекомендации, позволяющие устранить найденную неисправность. Факты, описывающие рекомендации по ремонту автомобиля:


repair "Add gas." ; добавить топливо

repair "Charge the battery." ; зарядить аккумулятор

repair "Replace the points." ; заменить контакты

repair "Clean the points." ; почистить контакты

repair "Replace the ignition coil." ; заме­нить катушку зажигания

repair "Repair the distributor lead wire." ; заме­нить распределительные провода

repair "Clean the fuel line." ; про­чистить топливную систему

repair "Point gap adjustment." ; отрегулировать зазоры между кон­тактами

repair "Timing adjustment." ; отрегулировать зажигание

repair "No repair needed." ; ремонт не требуется в принципе

repair "Take your car to a mechanic." ; экспертная система

;не смогла поставить диагноз.


Одни и те же рекомендации могут выводиться как правилом 7, так и правилом 12. Однако состояние машины при этой поломке отличается. Введем два дополнительных факта:


symptom engine low-output ; низкая мощность

symptom engine not-low-output ; нормальная мощность


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

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


(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 у n))

(if (or (eq ?response yes) (eq ?response y))

then

TRUE


else

FALSE)

)


Функция yes-or-no-p вызывает функцию ask-question с постоянным набором допустимых ответов: yes, no, у и n. В случае если пользователь ввел от­вет yes или у, функция возвращает значение true, иначе — false. Поскольку функция yes-or-no-p использует функцию ask-question, то она должна быть определена после нее.

Введем ограничение: за один запуск система может предоставить пользователю только одну рекомендацию по исправлению неисправности. В случае, если в машине несколько неисправностей, систему нужно последовательно вызывать несколько раз, удаляя обнаруженную на каждом шаге неисправность. Одним из образцов всех диагностических правил будет (not (repair ?)), гарантирующий, что диагноз еще не поставлен.

Реализуем правило, определяющее общее состояние двигателя:


(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 ?)) гарантирует, что общее состояние двигателя еще не определено. Если это так, то пользователю задаются соответствующие вопросы и в систему добавляется факт, описывающий текущее общее состояние двигателя.

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

Для запуска программы необходимо набрать приведенный листинг. Лучше использовать встроенный редактор CLIPS. Сохраните набранный файл, например, с именем auto.CLP.

Затем:
  1. Запустите CLIPS или, если он уже был запущен, очистите его командой (clear).
  2. Загрузите созданный файл с помощью команды (load “auto.CLP”). Если файл набран без ошибок, то будет выведен ряд сообщений, оканчивающийся словом «TRUE». Если загрузка экспертной системы не завершается словом «TRUE», то значит в синтаксисе определений функций или правил была допущена ошибка.
  3. С помощью менеджера правил и менеджера функций убедитесь, что все правила и функции присутствуют в списке правил CLIPS.
  4. Выполните команду reset и команду run. После этого появиться сообщение «The Engine Diagnosis Expert System», которое означает, что система начала работать и первый вопрос экспертной системы.
  5. Протестируйте экспертную систему.
  6. После завершения работы экспертной системы просмотрите факты, оставшиеся в списке фактов системы CLIPS. Для этого надо воспользоваться командой Fact Window из меню Window.
  7. Для повторного запуска экспертной системы необходимо еще раз выполнить команды reset и run.


По окончании работы с системой CLIPS и выполнения задания необходимо ответить на следующие вопросы:
  1. Составьте блок-схему (алгоритм) работы экспертной системы.
  2. Протестируйте экспертную систему по каждой из веток полученного алгоритма. Подсчитайте количество фактов, пройденных системой. Для этого сделайте видимым окно фактов (Fact Window).
  3. Определите самый длинный для системы путь по выявлению неисправности. При какой неисправности получен этот путь?
  4. Определите самый короткий для системы путь по выявлению неисправности (исключая вариант «ремонта не требуется»). При какой неисправности получен этот путь?
  5. В каких правилах использовался приоритет (salience), отличный от нуля? Зачем в найденных правилах нужен приоритет? Что он гарантирует?
  6. Почему функция yes-or-no-p определена после функции ask-question? Есть ли еще в системе такие обязательные случаи?
  7. Что гарантирует диагностическое правило (not (repair ?))? Какое правило гарантирует, что общее состояние двигателя еще не определено?
  8. Какие правила применяются для добавления в систему новых фактов? Какие факты они добавляют?



ПРИЛОЖЕНИЕ

Листинг программы

;;;======================================================

;;; Пример экспертной системы на языке CLIPS

;;;

;;; Эта экспертная система способна диагностировать некоторые

;;; неисправности автомобиля и предоставлять пользователю

;;; рекомендации по устранению неисправностей

;;;

;;; Среда разработки

;;; CLIPS Version 6.0 Example

;;;======================================================


;;**************************

;;* Вспомогательные функции *

;;**************************

; Функция ask-question задает пользователю вопрос, полученный в переменной ; ?question, и получает от пользователя ответ, принадлежащий списку

; допустимых ответов, в $?allowed-values

(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)


; Функция yes-or-no-p задает пользователю вопрос, полученный в переменной

; ?question, и получает от пользователя ответ yes(y) или no(n). В случае

; положительного ответа функция возвращает TRUE, иначе – FALSE

(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))


;;;***************************************************************

;;;* Правила диагностики подсистем автомобиля по состоянию двигателя *

;;;***************************************************************

; Реализация правила 2

(defrule normal-engine-state-conclusions ""

(declare (salience 10))

; Если двигатель работает неудовлетворительно

(working-state engine normal)

=>

; то

(assert (repair "No repair needed.")) ; ремонт не нужен

(assert (spark-state engine normal)) ; зажигание в норме

(assert (charge-state battery charged)) ; аккумулятор заряжен

(assert (rotation-state engine rotates))) ; двигатель вращается


; Реализация правила 3

(defrule unsatisfactory-engine-state-conclusions ""

(declare (salience 10))

; Если двигатель работает нормально

(working-state engine unsatisfactory)

=>

; то

(assert (charge-state battery charged)) ; аккумулятор заряжен

(assert (rotation-state engine rotates))) ; двигатель вращается


;;;*************************

;;;* Диагностические правила *

;;;*************************

; Правило определяет текущее состояние двигателя по ответам, получаемым от

; пользователя (см. правило 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))))


; Правило определяет состояние вращения двигателя по ответу, полученному от

; пользователя (см. правило 4).

(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))))


; Правило спрашивает у пользователя не ведет ли себя машина инертно.

; Если такой факт обнаружен, то необходимо прочистить топливную систему и ; на этом выполнение диагностических правил прекращается.

(defrule determine-sluggishness ""

(working-state engine unsatisfactory)

(not (repair ?))

=>

(if (yes-or-no-p "Is the engine sluggish (yes/no)? ")

then (assert (repair "Clean the fuel line."))))


; Правило узнает – нет ли перебоев с зажиганием.

; Если это так, то необходимо отрегулировать зазоры между контактами

; Выполнение диагностических правил прекращается.

(defrule determine-misfiring ""

(working-state engine unsatisfactory)

(not (repair ?))

=>

(if (yes-or-no-p "Does the engine misfire (yes/no)? ")

then

; Отрегулируйте зазоры между контактами

(assert (repair "Point gap adjustment."))

; Плохая искра

(assert (spark-state engine irregular-spark))))


; Правило узнает – не стучит ли двигатель.

; Если это так, то необходимо отрегулировать зажигание.

; Выполнение диагностических правил прекращается.

(defrule determine-knocking ""

(working-state engine unsatisfactory)

(not (repair ?))

=>

(if (yes-or-no-p "Does the engine knock (yes/no)? ")

then

; Отрегулируйте положение зажигания

(assert (repair "Timing adjustment."))))


; Правило определяет развивает ли двигатель нормальную выходную мощность

; и добавляет в систему факт, описывающий эту характеристику.

(defrule determine-low-output ""

(working-state engine unsatisfactory)

; Мощность работы двигателя еще не определена

(not (symptom engine low-output | not-low-output))

(not (repair ?))

=>

(if (yes-or-no-p "Is the output of the engine low (yes/no)? ")

then

; Низкая мощность двигателя

(assert (symptom engine low-output))

else

; Нормальная выходная мощность двигателя

(assert (symptom engine not-low-output))))


; Правило по ответу пользователя определяет наличие топлива в баке.

; В случае, если это не так пользователю выдается рекомендация –

; машину надо заправить и выполнение диагностических правил прекращается.

(defrule determine-gas-level ""

(working-state engine does-not-start)

(rotation-state engine rotates)

(not (repair ?))

=>

(if (not (yes-or-no-p "Does the tank have any gas in it (yes/no)? "))

then

; Машину необходимо заправить

(assert (repair "Add gas."))))


; Правило по ответу пользователя определяет заряжен ли аккумулятор.

; В случае, если это не так пользователю выдается рекомендация –

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

; аккумулятора. Выполнение диагностических правил прекращается.

(defrule determine-battery-state ""

(rotation-state engine does-not-rotate)

; Состояние аккумулятора еще не определено

(not (charge-state battery ?))

(not (repair ?))

=>

(if (yes-or-no-p "Is the battery charged (yes/no)? ")

then

; Аккумулятор заряжен

(assert (charge-state battery charged))

else

; Зарядите аккумулятор

(assert (repair "Charge the battery."))

; Аккумулятор разряжен

(assert (charge-state battery dead))))


; Правило по ответу пользователя определяет состояние контактов

; (см. правило 7, 12).

; После выдачи соответствующих рекомендаций выполнение диагностических

; правил прекращается.

(defrule determine-point-surface-state ""

(or (and (working-state engine does-not-start)

(spark-state engine irregular-spark))

(symptom engine low-output))

(not (repair ?))

=>

(bind ?response

(ask-question "What is the surface state of the points (normal/burned/contaminated)? "

normal burned contaminated))

(if (eq ?response burned)

then

; Контакты опалены - замените контакты

(assert (repair "Replace the points."))

else (if (eq ?response contaminated)

then

; Контакты загрязнены – почистите их

(assert (repair "Clean the points.")))))


; Правило по ответу пользователя определяет пропускает ли ток катушка

; зажигания. Если нет, то ее следует заменить. Если пропускает, то причина

; неисправности – распределительные провода. Для нормальной работы

; правила необходимо убедиться, что аккумулятор заряжен и искра нет.

; Выполнение диагностических правил прекращается.

(defrule determine-conductivity-test ""

(working-state engine does-not-start)

(spark-state engine does-not-spark) ; нет искры

(charge-state battery charged) ; аккумулятор заряжен

(not (repair ?))

=>

(if (yes-or-no-p "Is the conductivity test for the ignition coil positive (yes/no)? ")

then

; Замените распределительные провода

(assert (repair "Repair the distributor lead wire."))

else

; Замените катушку зажигания

(assert (repair "Replace the ignition coil."))))


;;;*********************

;;;* Запуск и завершение *

;;;*********************


; Правило запускается в том случае, если ни одно из диагностических правил не ; способно определить неисправность. Правило корректно прерывает

; выполнении экспертной системы и предлагает пройти более тщательную

; проверку.

(defrule no-repairs ""

(declare (salience -10))

(not (repair ?))

=>

(assert (repair "Take your car to a mechanic.")))


; Правило выводит на экран название экспертной системы

; при каждом новом запуске

(defrule system-banner ""

(declare (salience 10))

=> ; каждом новом запуске

(printout t crlf crlf)

(printout t "The Engine Diagnosis Expert System")

(printout t crlf crlf))

; Правило выводит на экран диагностические сообщения по устранению

; найденной неисправности

(defrule print-repair ""

(declare (salience 10))

(repair ?item)

=>

(printout t crlf crlf)

(printout t "Suggested Repair:")

(printout t crlf crlf)

(format t " %s%n%n%n" ?item))