Упражнения
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)))
)
Разработайте
правило make-and-model, которое будет запрашивать у пользователя необходимую
информацию о модели оружия и формировать вектор gun в рабочей памяти. Используйте
в качестве модели следующие правила, (defrule class-and-action
?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)
)
II) Теперь
обратимся к той части программы, которая должна давать пользователю пояснения,
на чем основывается сделанное заключение. Сначала нам понадобится зафиксировать
в программе пояснения ко всем решениям, неявно представленным в правилах, а
затем процитировать соответствующие статьи из законодательного акта. Представленный
в нем перечень характеристик, на основании которых модель оружия относится к
категории "оружие нападения", состоит из пяти разделов.
(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))) )
В этом правиле
устанавливается, что причиной, по которой данная модель отнесена к категории
"оружие нападения", является емкость ее магазина (capacity), причем
сделано это на основании раздела 1 (part 1) законодательного акта.
Для завершения
разработки программы нужно выполнить следующее.
Модифицировать
правило Part2, воспользовавшись в качестве прототипа приведенным выше текстом
правила Part1.
Модифицировать
правило cobray таким образом, чтобы отразить в нем причину, по которой эта модель
отнесена к категории "оружие нападения" (причиной является значение
атрибута model).
Аналогично
модифицировать и тот вариант правила pistol-grip-shotgun, который вы разработаете,
выполняя первую часть этого упражнения.
При выводе
поясняющих сообщений оператором printout воспользуйтесь шаблоном, в который
требуется подставить значения переменных из атрибутов make, model, part и features.
Шаблон должен выглядеть примерно так:
"The MAKE MODEL is (not) an assault weapon
under
Part NUMBER of the definition because of the FEATURE"
"Изделие
ИЗГОТОВИТЕЛЬ, МОДЕЛЬ (не) является оружием нападения на основании раздела НОМЕР
определения вследствие ХАРАКТЕРИСТИК."
Прописными буквами в шаблоне выделены элементы, которые должны быть заменены значениями соответствующих атрибутов.