Упражнения
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. До какого уровня детализации, по вашему мнению, можно спроектировать экспертную систему, не зная, как она будет внедряться? Какие опасности, по-вашему, подстерегают разработчика, который слишком рано принимает решение о способе внедрения экспертной системы?