Иллюстрированный самоучитель по введению в экспертные системы

Рекомендуемая литература. Упражнения.

Упражнение 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), которые будут относиться к
;;любому типу соответствующего исходного
;;продукта (например, подходят и для блюда из
;;аллигатора, если последний отнесен
;;к мясным продуктам).
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.