Упражнения
1. Проанализируйте
классификацию задач, решаемых экспертными системами, которую предложил Хейес-Рот.
I) Как вы
считаете, существуют ли задачи, которые не представлены в этой классификации?
II) В какую
категорию систем этой классификации входит, по вашему мнению, система, которая
консультирует пользователей относительно их юридических прав и выдает рекомендации
о действиях в ходе судебного процесса.
2. Проанализируйте
схему задач экспертных систем, предложенную Кленси (рис. 11.1 и 11.2).
I) Где в этой
схеме, по-вашему, место для компьютерной системы обработки данных?
II) Можете
ли вы предложить способ расширения или уточнения такого анализа? Например, можете
ли вы предложить способ дальнейшей дифференциации задачи "Управление"?
3. Являются
ли перечисленные ниже задачи по своему характеру задачами классификации, задачами
конструирования или задачами, обладающими признаками обоих этих типов?
I) Принятие
решения о том, какой курс дисциплин следует прослушать в колледже.
II) Принятие
решения о том, как провести отпуск.
III) Изменение
ранее составленного плана проведения отпуска вследствие непредвиденных обстоятельств.
IV) Подготовка
налоговой декларации.
4. Ниже представлен
список правил на языке CLIPS, который соответствует приведенному во врезке 11.1
определению термина "оружие нападения" (assault-weapon). Некоторые
правила в этом наборе вам следует попытаться сформулировать самостоятельно.
;;
Объявления (deftemplate gun
(field
name (type SYMBOL))
(field
class (type SYMBOL))
(field action (type SYMBOL))
(field caliber (type FLOAT))
(field capacity (type INTEGER))
(field
feature (type SYMBOL))
)
(deftemplate
assault-weapon
(field
name (type SYMBOL)) )
;;
Факты
;;
Данный набор исходных правил квалифицируют
;;
только модели Heckler & Kock 91 и Benelli
;;
как "оружие нападения".
(deffacts
guns
(gun (name Browning22)
(class rifle) (action semi)
(caliber
.22) (capacity 11))
(gun (name CobrayMll)
(class pistol)
(action semi)
(caliber
9.0) (capacity 30))
(gun (name HK91) (class rifle)
(action
semi) (caliber .308) (capacity 20))
(gun (name GlocklT) (class pistol)
(action
semi) (caliber 9.0) (capacity 17))
(gun (name Mossberg) (class shotgun)
(action slide) (caliber .410)
(capacity 5) (feature pistol-grip))
(gun (name BenelliSuper90)
(class shotgun) (action semi)
(caliber 12.0) (capacity 5)
(feature
barrel-shroud)) )
;;
ПРАВИЛА
;;
Общий случай
;;
Любая полуавтоматическая
;;
винтовка (semi-automatic rifle)
;;
или охотничье ружье (shotgun) с емкостью
;;
магазина более 5 патронов.
(defrule
Parti
(gun (name ?N) (class ?Csrifle|shotgun)
(action
semi) (capacity ?X&:(> ?X 5))) =>
(assert
(assault-weapon (name ?N)))
)
;;
Любая полуавтоматическая
;;
винтовка (semi-automatic rifle)
;;
или охотничье ружье (shotgun) с
;;
перечисленными дополнительными признаками.
(defrule
Part2
(gun
(name ?N) (class ?C&rifle|shotgun)
(action
semi)
(feature
?Fsflash-suppressor|barrel-shroud|night-scope)) =>
(assert
(assault-weapon (name ?N)))
)
;; Любое охотничье ружье (shotgun) с пистолетной
;;
рукояткой.
;; Сюда вставьте разработанное вами
;;
самостоятельно правило pistol-grip.
;;
Особые случаи
;; Модель Cobray Mil относится к категории
;;
"оружие нападения".
;; Сюда вставьте разработанное вами
;;
самостоятельно правило cobray.
;;
Исключения
;; Модели, указанные пользователем, не относятся
;;
к категории "оружие нападения", (defrule rimfire
?except
<- (gun (name ?N) (class rifle)
(caliber
.22)
?mistake
<- (assault-weapon) (name ?N)) =>
(retract
?mistake) (retract ?except) )
;;
К категории "оружие нападения" не относятся
;;
охотничьи ружья со скользящим затвором
;;(slide-action
shotgun).
;;
Сюда вставьте разработанное вами
;;
самостоятельно правило slide.
Правило cobray
учитывает особый случай с моделью Cobray Mil. Включение в набор правила pistol-grip
приведет к тому, что к категории "оружие нападения" будет отнесена
и модель Mossberg, но затем уточняющее правило slide исключит эту модель.
5. Ниже приведен
фрагмент программы Wine Advisor (Советчик для любителей вин) на языке CLIPS
(программа разработана Рандом Вальцманом для системы Teknowledge OPS5). В программу
вводится название блюда, а она предлагает список вин, рекомендуемых к этому
блюду. Программа работает по принципу эвристической классификации, поскольку
построена на предположении о наличии прямого соответствия между основными характеристиками
блюда (например, из мяса или рыбы, типа приправ и т.п.) и классом рекомендуемых
вин (в характеристики класса входит цвет, крепость, сахаристость и т.п.).
I) Ваша задача
состоит в том, чтобы проанализировать представленный набор правил и принять
решение о том, как организовать базу знаний о блюдах и винах, как поступать
с неопределенностью, как переходить от одной стадии процесса логического вывода
к другой. Комментарии в тексте программы помогут вам понять ее суть и укажут
способ расширения ее возможностей. В случае необходимости пользуйтесь описанием
языка CLIPS, приведенном в Приложении.
;;
Шаблоны
(def
template wine
(field
property (type SYMBOL))
(field
is (type SYMBOL))
(field
cert (type FLOAT))
)
(def
template meal
(field property (type SYMBOL))
(field
is (type SYMBOL))
)
(deftemplate
decision
(field
re (type SYMBOL)) (field is (type SYMBOL))
)
;;
Факты
(deffacts
the-facts
(task
dish) )
;;
Порождающие правила в формате
;;
(defrule <наименование_правила> <прав часть>
;;
=>
;;
<лев_часть> ).
;;
ПРАВИЛА, КАСАЮЩИЕСЯ БЛЮД.
Эти правила
соответствуют этапу абстрагирования данных.
Правило dish-type вызывается первым, поскольку оно устанавливает модель среды в соответствии с имеющимися фактами при перезапуске исполнительной системы CLIPS,
(defrule
dish-type (initial-fact) (task dish) =>
(printout
t crlf
"Is the main dish of the meal MEAT, FISH or POULTRY?"
;;
Блюдо приготовлено из МЯСА, РЫБЫ или ПТИЦЫ?
t
crlf) (assert (meal (property dish-type)
(is
read)))) )
;; Правило meat собирает дополнительные сведения
;; о блюде, если известно, что оно приготовлено
;;
из мяса, (defrule meat (task dish)
(meal
(property dish-type) (is meat)) =>
(printout
t crlf
"What kind of meat? For example STEAK, VEAL, LAMB."
;;
Из какого мяса? Например, ГОВЯДИНА, ТЕЛЯТИНА, БАРАНИНА.
t
crlf) (assert (meal (property meat-type)
(is
read)))) )
Аналогичное
правило fish для блюда из рыбы напишите самостоятельно. Это правило должно уточнять
тип морского продукта, из которого приготовлено блюдо: свежая рыба, моллюски
и т.п.
Разработайте
и правило poultry для блюд из птицы.
;; ПРАВИЛА, КОТОРЫЕ ИМЕЮТ ДЕЛО С
;;
ХАРАКТЕРИСТИКАМИ ВИН.
Эти правила
соответствуют этапу эвристического сопоставления.
Правило steak
является примером сопоставления вида мясного блюда с классом вин.
(defrule
steak
?task <- (task dish) (meal
(property
meat-type) (is steak)) =>
(assert
(wine (property color) (is red)
(cert
1.0))) (assert (wine (property body) (is full)
(cert
1.0))) (assert (wine (property flavor) (is dry)
(cert
0.7))) (assert (wine (property flavor) (is sweet)
(cert
0.2))) (retract ?task)
(assert
(task attributes)) )
;;Такие
же правила можно написать и для других
;;видов
мясных блюд: из телятины (veal),
;;баранины
(lamb) и т.д.
;;Задача
dish удалена, поскольку известно,
;;какого
типа блюдо.
;;Затем
устанавливается задача принятия решения
;;о
характеристиках вина.
;;Для блюд из мяса, рыбы и птицы нужно
;;определить правила по умолчанию
;;(default rules), которые будут относиться к
;;любому типу соответствующего исходного
;;продукта (например, подходят и для блюда из
;;аллигатора, если последний отнесен
;;к
мясным продуктам).
;;ПРАВИЛА
РАБОТЫ С КОЭФФИЦИЕНТАМИ УВЕРЕННОСТИ
;;Если в модели среды существуют две структуры с
;;одними и теми же значениями для одних и тех же
;;атрибутов, но отличаются коэффициентами
;;уверенности, то правило
;;attribute-update создает из них третью
;;структуру с новым значением и удаляет две
;;исходные.
;;Новое значение коэффициента уверенности CF
;;вычисляется по формуле:
;;cf
= cfl + с£2(1 - cfl)
(defrule attribute-update (task attributes)
?winel
<- (property ?attribute) (is ?value)
(cert
?certl)) ?wine2 <- (property ?attribute) (is ?value)
(cert
?cert2)) (<> ?crtl ?cert2) =>
(bind
?newcert (+ ?certl ( ?cert2
(-
1 ?certl)))) (assert (wine (property ?attribute)
(is
?value) (cert ?newcert))) (retract ?winel) (retract ?wine2) )
;;Разработайте правило preference, к которому
;;следует обращаться только в том случае, если в
;;рабочей
памяти существует больше одного
;;возможного значения для некоторого атрибута.
;;Это правило должно запросить у пользователя,
;;какое значение атрибута из существующих для
;;него предпочтительнее, соответственно
;;изменить коэффициент уверенности в выбранном
;;сочетании атрибут-значение, а другое значение
;;удалить
из памяти.
;Разработайте правило choose-value, которое
;;будет активизироваться в том случае, если в
;;рабочей памяти существуют две структуры,
;;характеризуемые разными значениями одного и
;;того же атрибута. Правило должно
;;выбирать структуру, у которой коэффициент
;;уверенности
больше, а другую удалять.
;Разработайте правило unique, которое будет
;;активизироваться в том случае, если существует
;;только одна структура с определенным значением
;;атрибута. Это правило объявляет, что атрибут
;;окончательно
определен.
;Разработайте правило unity, которое будет
;;активизироваться в том случае, если существует
;;структура, обладающая коэффициентом
;;уверенности, равным 1.
;;Это правило объявляет, что атрибут
;;окончательно
определен.
;;Если все атрибуты вина определены, вывести отчет,
(defrule all-attributes-done ?task .
<- (task attributes) ?col
<- (color done) ?bod
<- (body done) ?fla
<- (flavor done) (wine (property color)
(is ?color)) (wine (property body)
(is ?body)) (wine (property flavor)
(is
?flavor)) =>
(printout
t crlf
"Try a " ?flavor " " ?color " wine with a " ?body " body"
;; "Попробуйте " ?f lavor " " ?color " вино с
;;
" ?body " консистенцией."
t
crlf)
(retract ?col) (retract ?bod) (retract ?fla)
(retract
?task) (assert (task brand)) )
;;ПРАВИЛА,
ИМЕЮЩИЕ ОТНОШЕНИЕ К ВИНУ.
;;Выбор
вина по заданному описанию значений ;атрибутов.
;;Правила этой группы соответствуют этапу
;;"конкретизация решения".
;;Прежде чем предложить пользователю выбрать
;;желаемый продукт, нужно сформировать список
;;кандидатов.
;;Разработайте правило go-choose, которое
;;выбирает вино с наивысшим рейтингом, если не
;;активизируются никакие другие правила,
;;дополняющие
список вин.
;;Правило soave является примером правила
;;дополнения списка новым названием вина
;;(в данном случае "soave").
;;Разработайте
другие аналогичные правила.
(defrule
soave (task brand)
(wine (property color) (is white))
(wine
(property flavor) (is dry)
(cert
?certl)) (wine (property body) (is fine)
(cert
?cert2)) =>
(assert
(wine (property brand) (is soave)
(cert
(min ?certl ?cert2))))
)
;; ПРАВИЛА, ОРГАНИЗУЮЩИЕ ВЫБОР ПОЛЬЗОВАТЕЛЕМ ИЗ
;;
СПИСКА.
Пользователь
отвечает на выводимый запрос вводом "yes" или "по".
Разработайте
правило selection, которое выбирает вино с наивысшим рейтингом и предлагает
его пользователю.
Разработайте
правило rejection, которое активизируется после ввода пользователем отрицательного
ответа на текущее предложение.
Правило acceptance
завершает текущий сеанс работы с программой, (defrule acceptance
(task
choice)
(decision
(re ?candidate) (is yes))
=>
(printout
t
crlf
"Sir/Madam has impeccable taste "
;;
"Сэр/Мадам! У вас исключительно тонкий вкус! "
t
crlf) (halt) )
II) Как можно изменить стратегию поиска, например не формировать сначала весь список, а предлагать пользователю вина сразу же после формирования очередного кандидата, причем создавать их в порядке "качества" вина?