Упражнения
1. Почему в качестве пояснения процесса логического вывода пользователю недостаточно представить только результаты трассировки активизируемых правил?
2. Почему формирование пояснений в системах, основанных на порождающих правилах, упрощается, если разделить используемые правила на группы по назначению?
3. Какую помощь в формировании пояснений может оказать использование фреймов? С какой целью фреймы комбинируются с порождающими правилами?
4. Ниже представлена новая версия программы Assault-weapon (оружие нападения), которая была рассмотрена в главе 11. В этой версии программа задает пользователю вопросы об определенном виде оружия, а затем формирует пояснение, почему данный тип оружия относится (или не относится) к классу "оружие нападения" в соответствии с имеющимися в программе правилами. Программа состоит из двух частей: в первой уточняются характеристики модели оружия, а во второй формируется пояснение.
I) Разработайте правила, которые не представлены в приведенном ниже тексте программы. Указания, какие именно правила требуется разработать, выделены в комментариях в тексте программы.
;; Объявления (deftemplate gun
(field name (type SYMBOL))
(field model (type SYMBOL))
(field class (type SYMBOL) (default NIL))
(field action (type SYMBOL) (default NIL))
(field caliber (type FLOAT) (default 0.0))
(field capacity (type INTEGER) (default 0))
(field features (type SYMBOL) (default NIL))
)
(deftemplate assault-weapon
(field make (type SYMBOL))
(field model (type SYMBOL))
)
;; ПРАВИЛА
;; Общий случай
;; Любая полуавтоматическая
;; винтовка (semi-automatic rifle)
;; или охотничье ружье (shotgun) с емкостью
;; магазина более 5 патронов.
(defrule Parti
(gun (make ?M) (model ?N)
(class ?CSrifle|shotgun) (action semi) (capacity ?X&:(> ?X 5))) =>
(assert (assault-weapon (make ?M) (model ?N)))
)
?G <- (gun (action NIL)) =>
(printout t crlf
"Please enter the class of gun" t crlf "
for example shotgun, rifle, pistol " t crlf "CLASS:" t crlf
;; "Введите класс оружия, "
;; "например, охотничье ружье, карабин,
;; "пистолет и т.д. "
;; "КЛАСС:"
(bind ?class (read)) (printout t crlf
"Please enter the action type of the gun" t crlf
"for example bolt, slide, lever, semi,
revolver ... " t crlf "ACTION:" t crlf
;; "Введите тип оружия, "
;; "например, с цилиндрическим затвором, со
;; скользящим затвором, с рычажным затвором,
;; полуавтоматический, револьвер ...
;; "ТИП:"
(bind ?action (read))
(modify ?G (class ?class) (action ?action)) )
;; Разработайте правило capacity, которое будет
;; запрашивать емкость магазина модели оружия.
;; В качестве прототипа используйте приведенное
;; ниже правило caliber, которое запрашивает у
;; пользователя значение калибра модели,
(defrule caliber
?G <- (gun (caliber 0.0)) =>
(printout t crlf
"Please enter the caliber of gun" t crlf "CALIBER:" t crlf
;; "Введите калибр оружия, "
;; "КАЛИБР:"
(modufy ?G (caliber (read))) )
;; Любая полуавтоматическая
;; винтовка (semi-automatic rifle)
;; или охотничье ружье (shotgun) с
;; перечисленными дополнительными признаками.
(defrule Part2
(gun (make ?M) (model ?N)
(class ?CSrifle|shotgun) (action semi)
(features ?F&flash-suppressor|barrel-shroud|night-scope)) =>
(assert (assault-weapon (make ?M) (model ?N))) )
;;Разработайте правило pistol-grip-shotgun,
;;которое будет относить любое охотничье ружье
;;с пистолетной рукояткой к категории
;;"оружие нападения".
;;Разработайте правила, которые будут
;;запрашивать у пользователя сведения о
;;дополнительных конструктивных характеристиках
;;модели ранее определенного класса. Например,
;;пистолет, как правило, не имеет защитного
;;кожуха на стволе, поэтому в наборе правил не
;;имеет смысла запрашивать эту характеристику,
;;если ранее определен класс модели pistol.
;;Особые случаи касаются тех моделей, которые
;;явно перечислены в законодательном акте
;;Модель Cobray Mil относится к категории
"оружие нападения", defrule cobray
(declare (salience 20))
(gun (make cobray) (model Mil)
(class pistol)) =>
(assert (assault-weapon (make cobray)
(model Mil))) )
;; Модель этого типа не относится
;; к категории "оружие нападения", (defrule rimfire
(declare (salience 10))
?except <- (gun (make ?M) (model ?N)
(class rifle) (caliber .22))
?mistake <- (assault-weapon) (model ?N))
=> :
(printout t crlf "The " ?M " " ?N
" is definitely not an assault weapon. " t crlf
;; "Модель " ?М " " ?N
;; "по определению в законе не относится к
;; категории "оружие нападения"."
(retract ?mistake)
(retract ?except) )
;;Разработайте аналогичное правило
;;slide-action, которое будет исключать
;;любое охотничье ружье со скользящим затвором
;;из категории "оружие нападения".
;;Правила вывода результатов.
;;Разработайте правило probably-is, которое
;;будет извещать пользователя о том, что
;;представленная им модель может быть отнесена
;;к категории "оружие нападения", согласно действующему
;;законодательному акту. В качестве прототипа
;;можете воспользоваться приведенным ниже
;;правилом, которое извещает пользователя об
;;обратном результате экспертизы.
(defrule probably-is-not (declare (salience -20))
(gun (make ?M) (model ?N)) (not
(assault-weapon (make ?M) (model ?N))) =>
(printout t crlf "The " ?M " " ?N
" is probably not an assault weapon. " t crlf
;; "Модель " ?M " " ?N
;; ", вероятно, не относится к
;; категории "оружие нападения"."
(halt) )
(1) Общее описание полуавтоматического огнестрельного оружия с большой емкостью магазина.
(2) Перечень дополнительных характеристик.
(3) "Любое охотничье ружье с пистолетной рукояткой".
(4) Перечень фирм-изготовителей и выпускаемых ими моделей, которые безоговорочно относятся к этой категории.
(5) Перечень характеристик, которые позволяют исключить рассматриваемую модель из категории "оружие нападения" даже в том случае, если она удовлетворяет требованиям, перечисленным в предыдущих разделах.
В случае положительного решения (рассматриваемая модель отнесена к категории "оружие нападения") в пояснении должно быть указано, какой из первых четырех разделов послужил основанием для такого заключения. Если же сделано отрицательное заключение, то оно также должно быть мотивировано в пояснении, опираясь на процитированные пять разделов.
Для того чтобы реализовать в программе формирование такого пояснения, придется добавить два новых поля в вектор assault-weapon:
(deftemplate assault-weapon
(field make (type SYMBOL))
(field model (type SYMBOL))
(field just (type SYMBOL) (default NIL))
(field part (type INTEGER) (default 0)) )
(defrule Part)
(gun (make ?M) (model ?N)
(class ?C&rifle|shotgun) (action semi)
(capacity ?X&:(> ?X 5))) =>
(assert (assault-weapon (make ?M) (model ?N)
(just capacity) (part 1))) )
Для завершения разработки программы нужно выполнить следующее.
Модифицировать правило Part2, воспользовавшись в качестве прототипа приведенным выше текстом правила Part1.
Модифицировать правило cobray таким образом, чтобы отразить в нем причину, по которой эта модель отнесена к категории "оружие нападения" (причиной является значение атрибута model).
Аналогично модифицировать и тот вариант правила pistol-grip-shotgun, который вы разработаете, выполняя первую часть этого упражнения.
- Отредактировать правила rimf ire, slide-action и probably-is, включив в них манипуляции с атрибутами just и part.
"The MAKE MODEL is (not) an assault weapon
under Part NUMBER of the definition because of the FEATURE"
Прописными буквами в шаблоне выделены элементы, которые должны быть заменены значениями соответствующих атрибутов.