Упражнения
1.
В состав документации, которая прилагается к большинству приборов и технических
изделий, как правило, входят и руководства по поиску неисправностей. При отсутствии
эксперта такие руководства можно с успехом использовать в качестве учебного материала
для выполнения упражнений по извлечению знаний.
Например, руководство к пистолету
"Кольт .45" включает шесть страниц советов, большинство из которых представлено
в форме подобных таблиц.
| Где? |
Что? | Проверить |
Примечание | ||
| Боек |
Зажимается | Прямизну |
При
необходимости заменить | ||
| Эжектор |
Неустойчивое
выбрасывание |
Зажимается
ли возвратная пружина |
Установить
длинную направляющую | ||
| Экстрактор |
Неправильно
направляет гильзу |
Угол
установки дна |
При
необходимости выровнять | ||
Для
того чтобы разобраться в такой таблице, требуется обладать некоторыми знаниями
о принципах работы описываемого устройства. В частности, нужно иметь представление
о том, что
Применение
онтологического анализа позволяет систематизировать такое ознакомление. Самый
верный путь к неудаче — приступить к записи диагностических правил до того, как
будет понятен принцип работы устройства.
I)
Выберите ту предметную область, которая вам более всего знакома, и разработайте
для нее примерную онтологию в терминах:
2.
Реализуйте на языке CLIPS простую систему, основанную на правилах, которая будет
выполнять функции консультанта по поиску неисправностей в устройствах из предметной
области, выбранной вами при выполнении предыдущего упражнения. Используйте в качестве
прототипа приведенную ниже программу.
;;
#################################
;;
# Поиск неисправностей в револьвере
;;
# Smith & Wesson
;;
#################################
;;
Класс REVOLVER, определение компонентов (defclass revolver
(is-a INITIAL_OBJECT)
(slot
barrel Jcreate-accessor read-write))
(slot
barrel-pin
(create-accessor read-write))
(slot cyl-stop
(create-accessor read-write))
(slot cyl (create-accessor read-write))
(slot
handspring
(create-accessor
read-write))
)
;; Экземпляр класса REVOLVER.
;; Предназначен для тестирования программы,
(definstance
guns (Ml9 of revolver
(barrel
4499)
(barrel-pin
4499)
(cyl-stop
4499)
(cyl
4499)
(handspring
5022)) )
;; МЕТОД . Получение номера детали револьвера
(def mas sage-handler revolver part-no (?part)
(dynamic-get
?part))
;;
ПОЛЕЗНЫЕ ФУНКЦИИ
;; Приглашение пользователю ввести данные
(deffunction
prompt ()
(printout
t crlf "USER> "))
;; Распечатка списка деталей.
;; Замечание: приведенный список правил касается
;; только неисправностей со стволом (barrel),
(deffunction
parts-list () (printout t crlf
"barrel
cylinder ejector trigger hammer
firing-pin
cylinder-stop
cylinder-hand
yoke
frame
sideplate rear-sight front-sight" crlf))
;; Выбор из списка.
(deffunction
choose-list ()
(printout
t crlf "Please choose from the following list: "
crlf))
;; Правила, которые относятся только к
;; револьверам модели 19.
(deffunction
kind-list ()
(printout
t crlf "M10 M12 M13 M14 M15 M16 M17 M18 M19 "
crlf) )
;; ШАБЛОНЫ РЕШЕНИЯ
ПРОБЛЕМЫ
;; Формулировка проблемы включает узлы (part),
;; симптомы (symptom), возможно, детали (subpart),
;; входящие в состав узлов. С проблемой может
;; быть связано определенное испытание или
;; проверка (check), которые нужно провести,
(deftemplate
problem
(field part (type SYMBOL) (default nil))
(field symptom (type SYMBOL) (default nil))
(field subpart (type SYMBOL) (default nil))
(field
check(type SYMBOL) (default nil)) )
определение
процедуры ремонта включает узел (part), операцию с этим узлом (action), возможно,
детали (subpart), входящие в состав узлов, проверку (check), которую нужно провести,
и поясняющее примечание, предназначенное для пользователя, (deftemplate problem
(field part (type SYMBOL)
(default nil)} (field action (type SYMBOL)
(default nil)) (field subpart (type SYMBOL)
(default nil)) (field check(type SYMBOL)
(default nil)) (field remarkftype STRING)
(default
" "))
)
;;########################
;;
;;
Порождающие правила
;;
Правило START.
;; ЕСЛИ: начинается выполнение программы
;; ТО: определить поврежденный узел и
;;
сформировать шаблон описания проблемы,
(defrule
start
?start-token
<- (initial-fact) =>
(retract
?start-token)
(printout
t crlf
"What part of the gun are you problem with?"
;; С каким узлом у вас проблемы?
(choose-list)
(part-list)
(prompt)
(bind
?part (read))
(assert
(problem (part ?part))) )
;;
Правило FINISH:
;;
ЕСЛИ: Неисправность устранена
;;
TO: Прекратить работу программы.
(defrule
finish
(repair
(check done) (remark ?rem&~" "))
=>
(printout t crlf ?rem
crlf)
(printout t crlf "Glad to be of service! " crlf)
;;
Рад быть вам полезным!
(halt)
)
Правило CHECK-REPAIR:
ЕСЛИ: Имеется решение менее
радикальное, чем
замена
ТО: Информировать пользователя и отметить, что неисправность (проблема) может быть устранена путем ремонта,
(defrule check-repair ?rep <-
(repair
(part ?part) (action ?actions~replace)
(subpart ?sub&~nil&~?part))
(problem
(part ?part) (symptom ?sym))
=>
(printout
t crlf
"If
you " ?action "the " ?sub "that should "
"fix the "
?sym "problem with the," ?part crlf)
;; "Если вы "
?action ?sub "то это' должно "
;; "устранить " ?sym "проблемы с " ?part crlf)
(modify
?rep (check done))
)
Правило
CHECK-REPLACE:
ЕСЛИ:
Решение требует замены узла
ТО:
Информировать пользователя и отметить, что неисправность (проблема) устранена. Для этого добавить в рабочую память пустой вектор и запросить у пользователя наименование модели
;;
изделия,
(defrule
check-replace
(repair (part ?part) (action replace))
(not
(model ?mod&~nil))
?prob <- (problem (part ?part)
(symptom
?sym)) =>
(printout
t crlf
"You have to replace the "
?part "to fix the " ?sym "problem" crlf)
;; "Вам потребуется заменить" ?part
;;
"чтобы устранить " ?sym "проблемы " crlf)
(assert (model nil))
)
;;
Правило REPLACE:
;; ЕСЛИ: Пользователю необходимо заменить узел
;; ТО: Запросить у пользователя наименование
;;
модели изделия,
(defrule
replace
?rep
<- (repair (action replace))
?mod
<- (model nil) =>
(printout
t crlf
"What model of revolver do you have ?" crlf)
;; "Какой модели ваш револьвер?"
(kind-list)
(prompt)
(bind
?answer(read))
(retract
?mod)
(assert
(model ?answer))
(modify
?rep (check part-no))
)
;;
Правило PART-NO:
;; ЕСЛИ: Пользователю необходимо заменить узел
;; ТО: Выяснить номер узла, отослав сообщение
;;
объекту, представляющему данную модель
;;
изделия,
(defrule
part-no
(model
?mod£Tnil)
?rep <- (repair (part ?part)
(action replace) (check part-no)) =>
(bind ?no (send (symbol-to-instance-name ?mod)
part-no ?part))
(printout
t crlf
"The part number of the " ?mod " " ?part "
is " ?no crlf) ;; "Номер узла " ?mod " " ?part ?no
(modify
?rep (check done)) )
;;
Правила BARREL (ствол)
;; Правило BARREL-SYMPTOM
;; ЕСЛИ: Неисправность не имеет признаков
;; ТО: Выяснить признак (симптом),
(defrule barrel-symptom
?prob <- (problem (part barrel)
(symptom
nil) (subpart nil))
=>
(printout
t crlf
"Is there a problem inside barrel? " crlf)
;; "Есть ли повреждения внутри ствола?"
(prompt)
(bind ?answer(read))
(if
(eq ?answer yes)
then
(modify ?prob (subpart bore))
)
)
;;
Правило BARREL-INSIDE
;;
ЕСЛИ: Имеется повреждение канала ствола
;;
ТО: Выяснить у пользователя,
;;
какое (и предложить помощь).
(defrule
barrel-inside
?prob
<- (problem (part barrel) (symptom nil) (subpart bore))
=>
(printout
t crlf
"What is the problem inside the barrel? " crlf)
;; "Характер повреждения канала ствола?"
(choose-list) (printout t crlf "
leading
rust jam" crlf)
;;
" наличие ржавчины"
(prompt)
(bind
?answer (read))
(modify
?prob (symptom ?answer)) )
;; Правило BARREL-RUST
;; ЕСЛИ: Имеется ржавчина в канапе ствола
;; ТО: Проверить наличие раковин.
(defrule barrel-rust
?prob
<- (problem (part barrel) (symptom rust) =>
(printout t crlf
"Are there pits inside the barrel? " crlf)
;; "Нет ли раковин в канале ствола?" (prompt)
(bind ?answer (read))
(if
(eq ?answer yes) then (assert (repair
(action
replace) (part barrel) (subpart bore))
(remark "Please consult your local dealer")))
;; Проконсультируйтесь с местным дилером
else
(assert (repair
(action
clean) (part barrel) (subpart bore))
(remark "Gun should be kept clean and dry"))
;; Оружие нужно содержать в чистоте и
;; предохранять от сырости
)
)
;; Правило BARREL-LEADING
;; ЕСЛИ: Имеется налет свинца в канале ствола
;; ТО: Проверить качество патронов,
(defrule
barrel-leading
?prob
.<- (problem (part barrel) (symptom
leading)
(check nil))
=>
(modify
?prob (check ammo))
(printout
t crlf
"You may be using the wrong ammunition " crlf)
;; "Возможно, вы пользуетесь некачественными
;; патронами" )
;; Правило BARREL-LEADING-CHECK
;; ЕСЛИ: Имеется налет свинца в канале ствола
;; ТО: Проверить качество патронов,
(defrule
barrel-leading-check
Pprob
<- (problem (part barrel) (symptom
leading)
(check ammo))
=>
(assert (repair (part barrel)
(action
clean) (subpart bore)
(remark "Use Lewis Lead Remover"))
;; Воспользуйтесь средством для удаления свинца
;;
фирмы Lewis )
Если посчитаете нужным, скопируйте
из этой программы вспомогательные функции и структуры определения правил, но используйте
знания из другой предметной области, которые были приобретены при выполнении предыдущего
упражнения.
3.
Рассмотрите ситуацию, которая возникает при планировании покупки какой-нибудь
дорогостоящей вещи. Пусть, например, у вас появилась идея приобрести новый автомобиль.
Эту проблему можно будет считать хорошо определенной только после того, как вы
решите, какую сумму можно потратить на эту покупку, для каких поездок будет в
основном использоваться новый автомобиль, какой изготовитель и какая модель для
вас предпочтительны, и т.п. Для подобных упражнений можно использовать не только
пример с автомобилем, но и с другими видами дорогостоящих покупок, — загородный
дом, высококачественная электронная аппаратура и т.д. Далее уточните спецификацию
покупки следующим образом.
I)
Составьте список ключевых концепций и отношений между ними, которые нужно учитывать
при решении проблемы. В случае с автомобилем такой список, очевидно, будет включать
атрибуты фирмы-изготовителя и модели автомобиля, разнообразные эксплуатационные
характеристики (мощность двигателя, расход топлива), связи между этими атрибутами
и параметрами, определяющими ваш "стиль жизни", — частота и продолжительность
поездок, предполагаете ли вы брать в поездку каких-либо экзотических попутчиков
(лошадь или собаку) или необычный груз (например, лодку, домик на колесах) и т.п.
II)
Попробуйте найти способ формального представления перечисленных концепций и отношений
между ними. Например, изготовитель автомобиля и его модель могли бы быть выбраны
из существующего набора классов — седан, спортивное авто, микроавтобус и т.д.
Проанализируйте, не нужно ли при этом использовать многомерную классификацию концепций,
при которой придется использовать множественное наследование.
III) Обратите внимание на важность
учета приоритета разных свойств рассматриваемого объекта и необходимость использования
средств разрешения конфликтов между ними. Если, например, хочется купить автомобиль,
который, с одной стороны, имеет мощный двигатель, а с другой стороны, потребляет
мало бензина, то нужно подумать над тем, как найти компромисс между этими противоречивыми
требованиями.
4.
Составьте на языке CLIPS несложную консультационную программу, которая помогла
бы пользователю в решении проблемы целесообразности покупки, сформулированной
при выполнении предыдущего упражнения. При разработке программы главное внимание
нужно уделить тому, как представить сформулированные ранее концепции и отношения
между ними в виде структур данных. Нужно также продумать и режимы управления,
которые учитывали бы как структуру пространства состояний (например, способ классификации
автомобилей), так и механизм обработки приоритетов свойств и разрешения конфликтов
между ними.
5. До какого уровня детализации, по вашему мнению, можно спроектировать экспертную систему, не зная, как она будет внедряться? Какие опасности, по-вашему, подстерегают разработчика, который слишком рано принимает решение о способе внедрения экспертной системы?
| Maya 3D графика в кино и телевидении Воздействие испытаний ядерного оружия на здоровье населения Объектно-ориентированный язык программирования Java Объектно-ориентированное программирование Delphi Библиотека визуальных компонентов VCL и ее базовые классы Кроссплатформенное программирование для Linux Элементы управления Win32 Элементы управления Windows XP Файлы и устройства ввода/вывода Что такое экспертная система? Объектно-ориентированное программирование Инструментальные средства разработки экспертных систем Программирование на языке CLIPS Критерии и количественные характеристики надежности Расчет характеристик надежности невостанавливаемых резервированных изделий Расчет надежности системы с постоянным резервированием Интегрирование тригонометрических функций ; |