Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Выполнение программы




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

В данном разделе приведен полный листинг программы с подробными комментариями. Он в полной мере дает целостную картину того, как работает созданная экспертная система и из каких частей она состоит.

Пример. Экспертная система диагностики двигателя

;

; Приведенная ниже экспертная система способна

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

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

;

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

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

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

; Функция 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(у) или

; no(n).В случае положительного ответа функция возвращает значение

; TRUE, иначе – FALSE

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

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

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

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

;Правило determine-engine-state определяет текущее состояние двигателя;машины по ответам, получаемым от пользователя. Двигатель может;находиться в одном из трех состояний: работать нормально

;(working-state engine normal), работать неудовлетворительно

;(working-state engine unsatisfactory) и не заводиться

;(working-state engine;does-not-start) (см. правило 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))))

;-------------------------------------------------------------------

; Правило determine-rotation-state определяет состояние вращения

; двигателя по ответу, получаемому от пользователя.

; Двигатель может вращаться (rotation-state engine rotates) или

; не вращаться (spark-state engine does-not-spark) (см. правило 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))))

;-------------------------------------------------------------------

; Правило determine-gas-level по ответу пользователя определяет

; наличие топлива в баке. В случае если топлива нет, пользователю

; выдается рекомендация по ремонту — машину необходимо заправить;(repair "Add gas.") (см. правило 5). При появлении соответствующей

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

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

;-------------------------------------------------------------------

; Правило determine-battery-state по ответу пользователя определяет,

; заряжен ли аккумулятор. В случае если это не так, пользователю

; выдается рекомендация по ремонту — Зарядите аккумулятор (repair

; "Charge the battery.") (см. правило 6).

; Кроме того, правило добавляет факт, описывающий состояние

; аккумулятора. Выполнение диагностических правил прекращается. (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))))

;-------------------------------------------------------------------

; Правило determine-low-output определяет, развивает ли двигатель

; нормальную выходную мощность или нет и добавляет в систему факт,

; описывающий эту характеристику (см. правило 12).

(defrule determine-low-output ""

(working-state engine unsatisfactory)

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

(not (symptom engine low-output I 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))))

;-------------------------------------------------------------------

; Правило determine-point-surface-state определяет по ответу

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

;-------------------------------------------------------------------

; Правило determine-conductivity-test по ответу пользователя

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

; следует заменить.

; Если пропускает, то причина неисправности — распределительные

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

; аккумулятор заряжен и искры нет (см. правило 8)

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

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

;-------------------------------------------------------------------

; Правило determine-sluggishness спрашивает пользователя, не ведет ли; себя машина инертно (не сразу реагирует на подачу топлива).

; Если такой факт обнаружен, то необходимо прочистить

; топливную систему (см. правило 9) и выполнение диагностических

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

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

;-------------------------------------------------------------------

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

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

; (см. правило 10).

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

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

;-------------------------------------------------------------------

; Правило determine-knocking узнает — не стучит ли двигатель.

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

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

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

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

; Правила, определяющие ТС подсистем автомобиля по ТС двигателя

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

; Правило normal-engine-state-conclusions реализует правило 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)); двигатель вращается

)

;-------------------------------------------------------------------

; Правило unsatisfactory-engine-state-conclusions реализует правило 3

(defrule unsatisfactory-engine-state-conclusions ""

(declare (salience 10))

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

(working-state engine unsatisfactory)

=>

; то

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

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

)

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

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

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

; Правило no-repairs запускается в случае, если ни одно

; из диагностических правил не способно определить неисправность.

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

; предлагает пройти более тщательную проверку (см. правило 13).

(defrule no-repairs ""

(declare (salience -10))

(not (repair?))

=>

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

;-------------------------------------------------------------------

; Правило print-repair выводит на экран диагностическое сообщение

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

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

;-------------------------------------------------------------------

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

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

(defrule system-banner " каждом новом запуске."

(declare (salience 10))

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

(printout t crlf crlf)

(printout t "****************************************" crlf)

(printout t "* The Engine Diagnosis Expert System *" crlf)

(printout t "****************************************" crlf)

(printout t crlf crlf))

 

Напомним, что среда CLIPS воспринимает только английский алфавит. Комментарии на русском языке даны для наглядности, однако при вводе программы в таком виде, CLIPS выдаст сообщение об ошибке.

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

После этого запустите CLIPS или, если он уже был у вас запущен, очистите его командой (clear). Загрузите созданный вами файл с помощью команды (load "auto.CLP"). При успешной загрузке файла конструкторов и отсутствии ошибок экран примет вид, показанный на рис. 11.1. Обратите внимание, что функция load вернула значение true. Если это не так, значит, в синтаксисе определений функций или правил была допущена ошибка. При загрузке файла с помощью функции load* информация, отражающая процесс загрузки, на экран не выводится.

После удачной загрузки файла убедитесь, что все правила присутствуют в списке правил CLIPS, а функции − в списке функций. Проще всего это проконтролировать с помощью менеджеров правил и функций соответственно (на рис. 11.2 и рис. 11.3).

 

Рис. 11.1. Загрузка экспертной системы

Рис. 11.2. Правила экспертной системы

Рис. 11.3. Функции экспертной системы

Для запуска разработанной ЭС достаточно выполнить команду reset, которая добавит факт initial-fact, необходимый для правила system-banner, и команду run. После этого на экран выводится сообщение "The Engine Diagnosis Expert System", которое означает, что система начала работать. Затем ЭС формирует серию вопросов, ответы на которые помогут ей оценить текущее ТС двигателя и подобрать соответствующую рекомендацию по ремонту.

Пример опроса пользователя системой показан на рис. 11.4, а результат ее работы − на рис. 11.5.

Если после завершения работы экспертной системы в списке фактов остаются факты, описывающие ТС двигателя, то их легко просмотреть с помощью команды Fact Window из меню Window.

Для повторного запуска экспертной системы необходимо еще раз выполнить команды reset и run.

Рис. 11.4. Диалог с экспертной системой

Рис. 11.5. Результаты работы экспертной системы

 

Для того, чтобы лучше понять механизм работы созданной ЭС и логический механизм вывода CLIPS, необходимо протестировать экспертную систему, по-разному отвечая на ее вопросы, а перед запуском системы − сделать видимым окно фактов (Fact Window) и окно плана решения задачи (Agenda Window).

Рассмотренный пример доступен в Интернете по адресу: www.ghg.net/clips/download/executables/examples/auto.clp.

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

Контрольные вопросы

1. Определите основные структурные элементы программирования в ИО CLIPS.

2. Опишите особенности интерфейса ИО CLIPS.

3. Каковы особенности реализации логического вывода в ИО CLIPS?

4. К какому типу ИО относится CLIPS?

5. Опишите общую схему функционирования ЭС, разработанных с помощью ИО CLIPS.

6. Какие составляющие входят в структуру базы знаний CLIPS?

7. Какие стратегии принятия решений реализованы в ИО CLIPS?

8. Как проявляется свойство активности знаний?

 


12. Создание проекта онтологии с помощью ИС Protégé

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

· надежного семантического базиса в определении содержания;

· общей логической теории описания и классификации информации;

· дружественный интерфейс между пользователем и программой.

Protégé – это интегрированная инструментальная среда программирования разработки систем, основанных на знаниях, с использованием аппарата онтологий.

Protégé существенно облегчает работу с классами и экземплярами. Например, отдельный экземпляр может быть использован на уровне описания класса, а класс можно хранить, как экземпляр. Аналогичным образом, слоты, которые в других оболочках используются только внутри классов, в Protégé могут рассматриваться в качестве самостоятельных классов.

Рассмотрим более подробно процесс создания проекта онтологии с помощью предложенной инструментальной среды и ее дальнейшего экспорта в ЭО CLIPS.




Поделиться с друзьями:


Дата добавления: 2014-12-29; Просмотров: 889; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.127 сек.