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