Упражнения
Например, руководство к пистолету "Кольт .45" включает шесть страниц советов, большинство из которых представлено в форме подобных таблиц.
Где? |
Что? |
Проверить |
Примечание |
||
Боек |
Зажимается |
Прямизну |
При необходимости
заменить |
||
Эжектор |
Неустойчивое
выбрасывание |
Зажимается ли
возвратная пружина |
Установить длинную
направляющую |
||
Экстрактор |
Неправильно направляет
гильзу |
Угол установки
дна |
При необходимости
выровнять |
||
- искривленный боек часто
застревает в направляющей канавке, что приводит к осечке; такой боек нужно
заменить;
- возвратная пружина,
которая зажимается внутри канавки, вероятнее всего, погнута; предотвратить
такую поломку поможет замена стандартного короткого направляющего стержня
полноразмерным;
- неправильный угол установки
экстрактора приводит к тому, что он выбрасывает гильзы обратно на стреляющего,
а не вправо; эту неисправность можно устранить подгонкой и шлифовкой дна экстрактора.
I) Выберите ту предметную область, которая вам более всего знакома, и разработайте для нее примерную онтологию в терминах:
- ключевые сущности
и отношения, такие как компоненты и отношения часть-целое;
- предикаты предметной
области, такие как неустойчивые, прямые, связывающие;
- операции в предметной
области, такие как замена, очистка, установка и т.п. II) Продолжите анализ
предметной области и рассмотрите следующие вопросы:
- насколько детальным
должен быть анализ отношений часть-целое;
- какие предикаты предметной
области должны быть использованы для разбиения на части пространства признаков
неисправностей;
- какие логические отношения
существуют между операциями в предметной области, например подобие между заменой
и установкой (одна операция включает другую в качестве составляющей).
;; #################################
;; # Поиск неисправностей в револьвере
;; # 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. До какого уровня детализации, по вашему мнению, можно спроектировать экспертную систему, не зная, как она будет внедряться? Какие опасности, по-вашему, подстерегают разработчика, который слишком рано принимает решение о способе внедрения экспертной системы?
Назад | Содержание |