Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

лаб8 clips пример создания ЭС

.doc
Скачиваний:
219
Добавлен:
09.04.2015
Размер:
153.6 Кб
Скачать

СМ папку

Приложение

Рассмотрим пример создания небольшой экспертной системы.

Сначала необходимо определить базу знаний нашей ЭС. Пусть это будет например выбор ноутбука.

Для начала необходимо определиться с габаритами ноутбука. Это может быть малогабаритный нетбук или ноутбук имеющий стандартные размеры. Если был выбран вариант "нетбук", то далее необходимо уточнить, на базе какого ЦП работает данный нетбук. После этого можно делать вывод о модели нетбука.

Если же был выбран вариант ноутбука, имеющего стандартные габариты, то вариантами выбора являются офисный ноутбук, подходящий для работы в офисе, обучения, и игровой ноутбук, обладающий более мощными комплектующими. При выборе игрового ноутбука далее необходимо определиться с наличием мощной видеокарты, после чего возможен уже вывод модели ноутбука.

Если был выбран вариант с офисным ноутбуком, то критерием выбора является будет ли он иметь оригинальный стильный дизайн или нет. Если будет, то на следующем шаге необходимо будет выбрать, отделан ли ноутбук кожаными вставками. После этого можно уже определиться с моделью.

Если же нужен ноутбук не "стильный" то далее следует выбрать, будет ли экран иметь диагональ 17 дюймов. После этого также возможен вывод модели.

Конечной целью нашей ЭС, является выбор модели ноутбука. В базу знаний внесем вопросы, по которым нам необходимо определиться и которые приведут нас к конкретной модели. Так же в базе знаний будем хранить вопросы, которые будут выводиться пользователю. В CLIPS базу знаний опишем как массив фактов.

(deftemplate rule

(multislot if)

(multislot then))

(deffacts knowledge-base

(goal is model.notebook)

(legalanswers are yes no)

(rule (if small is yes) (then note.size is small))

(rule (if small is no) (then note.size is normal))

(question small is "Vam nuzhen o4en malenkiy notebook?")

(rule (if note.size is small and atom is yes) (then model.notebook is "ASUS EeePC 901"))

(rule (if note.size is small and atom is no) (then model.notebook is "ASUS EeePC 900 with CeleronM"))

(question atom is "Vam nuzhen notebook na processore ATOM?")

(rule (if note.size is normal and gaming is yes) (then type.notebook is game))

(rule (if note.size is normal and gaming is no) (then type.notebook is other))

(question gaming is "Vam nuzhen igrovoy notebook?")

(rule (if type.notebook is game and geforce is yes) (then model.notebook is "ASUS G2Sv"))

(rule (if type.notebook is game and geforce is no) (then model.notebook is "ASUS M50Sv"))

(question geforce is "Vam nuzhna topovaya videokarta GeForce 9650M GT?")

(rule (if type.notebook is other and style.book is yes) (then common.stylish is stylish))

(rule (if type.notebook is other and style.book is no) (then common.stylish is common))

(question style.book is "Vam nuzhen stilniy notebook?")

(rule (if common.stylish is stylish and leather is yes) (then model.notebook is "ASUS S6F LEATHER COLLECTION"))

(rule (if common.stylish is stylish and leather is no) (then model.notebook is "ASUS LAMBORGHINI VX3"))

(question leather is "Vam nuzhen notebook obshitiy naturalnoy kozhey?")

(rule (if common.stylish is common and big.screen is yes) (then model.notebook is "ASUS A7U"))

(rule (if common.stylish is common and big.screen is no) (then model.notebook is "ASUS F5N"))

(question big.screen is "Vam nuzhen notebook s bolshim ekranom. 17inch?")

(answer is "Ya dumayu 4to vam bolshe vsego podhodit notebook " model.notebook))

Далее необходимо сконструировать правила, которые будут работать с нашей базой знаний.

Правило определяющее последовательность в которой наш эксперт будет задавать вопросы определим следующим правилом.

(defrule propagate-goal ""

(goal is ?goal)

(rule (if ?variable $?) (then ?goal ? ?value))

=>

(assert (goal is ?variable)))

Таким образом, при первой активации этого правила будет добавлен факт (goal is common.stylish), правило вносит факты с конца, то есть те вопросы, с которыми необходимо определиться в последнюю очередь вносятся первыми. И так после всех активаций правила propagate-goal мы получаем факты добавленные в следующей последовательности

(goal is common.stylish)

(goal is type.notebook)

(goal is note.size)

(goal is small)

Теперь нужно правило которое будет вести диалог с пользователем и делать соответствующие изменения в базе фактов.

(defrule ask-question-legalvalues ""

(declare (salience 10))

(legalanswers ? $?answers)

?f1 <- (goal is ?variable)

?f2 <- (question ?variable ? ?text)

=>

(retract ?f1)

(format t "%s " ?text)

(printout t ?answers " ")

(bind ?reply (read))

(if (member (lowcase ?reply) ?answers)

then (assert (variable ?variable ?reply))

(retract ?f2)

else (assert (goal is ?variable))))

В базе знаний мы определили допустимые ответы на вопросы ЭС, (legalanswers are yes no). Берем первую цель (goal is small), находим соответствующий ей вопрос (question small is "Vam nuzhen o4en malenkiy notebook?") выводим его пользователю. Ответ пользователя считывается командой (read) и заносится в переменную ?reply после чего сверяем ответ пользователя с разрешенными в нашей БЗ и если все в порядке добавляем факт соответствующий ответу пользователя. Отработавшая цель и вопрос удаляются из БЗ.

Так как мы определились с ответом и сделали соответствующий вывод то необходимо правило которое бы удалило противоположное решение.

(defrule remove-rule-no-match ""

(declare (salience 20))

(variable ?variable ?value)

?f <- (rule (if ?variable ? ~?value

=>

(retract ?f))

Правило которое обработает ответ и найдет в базе знаний соответствующий вывод выглядит так

(defrule rule-satisfied ""

(declare (salience 20))

(variable ?variable ?value)

?f <- (rule (if ?variable ? ?value)

(then ?goal ? ?goal-value))

=>

(retract ?f)

(assert (variable ?goal ?goal-value)))

Пользователь на вопрос, будет ли маленьким ноутбук, ответил нет, ЭС делает вывод что ноутбук имеет обычные габариты. Добавляется соответствующий факт (variable note.size is normal).

Далее активируется правило remove-rule-no-match которое удаляет из БЗ все решения связанные с противоположным ответом note.size is small, таким образом, будут удалены

(rule (if note.size is small and atom is yes) (then model.notebook is "ASUS EeePC 901"))

(rule (if note.size is small and atom is no) (then model.notebook is "ASUS EeePC 900 with CeleronM")).

Так как мы определились с габаритами, активируется еще одно правило, которое редактирует базу знаний.

defrule modify-rule-match ""

(declare (salience 20))

(variable ?variable ?value)

?f <- (rule (if ?variable ? ?value and $?rest))

=>

(modify ?f (if ?rest))).

В нашем случае будут отредактированы строки

(rule (if note.size is normal and gaming is yes) (then type.notebook is game))

(rule (if note.size is normal and gaming is no) (then type.notebook is other))

И в результате они будут выглядеть так

(rule (if gaming is yes) (then type.notebook is game))

(rule (if gaming is no) (then type.notebook is other)).

Это редактирование приведет к активации правила propagate-goal и будет определена новая цель.

(goal is gaming)

Процесс повторяется, задается вопрос, пользователь отвечает. Базу фактов добавляется факт по ответу пользователя (variable gaming is yes). Активируются правила remove-rule-no-match, rule-satisfied, в результате в базе фактов (variable type.notebook game) и снова активация remove-rule-no-match, удаляя не подходящие выводы

(rule (if type.notebook is other and style.book is yes) (then common.stylish is stylish))

(rule (if type.notebook is other and style.book is no) (then common.stylish is common)).

Затем активируется правило modify-rule-match что приводит к модификации выводов

(rule (if type.notebook is game and geforce is yes) (then model.notebook is "ASUS G2Sv"))

(rule (if type.notebook is game and geforce is no) (then model.notebook is "ASUS M50Sv"))

Из этого выходит

(rule (if geforce is yes) (then model.notebook is "ASUS G2Sv"))

(rule (if geforce is no) (then model.notebook is "ASUS M50Sv")).

Процесс повторяется, пользователь определяет какую бы он хотел видеокарту, его выбор приводит в действие сразу несколько правил которые выполняются последовательно rule-satisfied, remove-rule-no-match после чего в базе фактов добавляется (variable model.notebook is "ASUS G2Sv"). Это и есть наш конечный результат, что бы обработать его применим правило

(defrule goal-satified ""

(declare (salience 30))

?f <- (goal is ?goal)

(variable ?goal ?value)

(answer ? ?text ?goal)

=>

(retract ?f)

(format t "%s%s%n" ?text ?value))

В результате активации этого правило мы получим вывод ЭС

Ya dumayu 4to vam bolshe vsego podhodit notebook ASUS G2Sv.

Исходный текст программы:

;;;=============================================

;;; Asus Notebook Selector Expert System Inc. v0.5b

;;;

;;;

;;; Eta sistema vybiraet notebook iz modelnogo ryada ASUS.

;;;

;;;

;;;

;;;

;;; CLIPS Version 6.0 Example

;;;

;;;=============================================

;;;***************************

;;;* DEFTEMPLATE DEFINITIONS *

;;;***************************

(deftemplate rule

(multislot if)

(multislot then))

;;;**************************

;;;* INFERENCE ENGINE RULES *

;;;**************************

(defrule propagate-goal ""

(goal is ?goal)

(rule (if ?variable $?)

(then ?goal ? ?value))

=>

(assert (goal is ?variable)))

(defrule goal-satified ""

(declare (salience 30))

?f <- (goal is ?goal)

(variable ?goal ?value)

(answer ? ?text ?goal)

=>

(retract ?f)

(format t "%s%s%n" ?text ?value))

(defrule remove-rule-no-match ""

(declare (salience 20))

(variable ?variable ?value)

?f <- (rule (if ?variable ? ~?value $?))

=>

(retract ?f))

(defrule modify-rule-match ""

(declare (salience 20))

(variable ?variable ?value)

?f <- (rule (if ?variable ? ?value and $?rest))

=>

(modify ?f (if ?rest)))

(defrule rule-satisfied ""

(declare (salience 20))

(variable ?variable ?value)

?f <- (rule (if ?variable ? ?value)

(then ?goal ? ?goal-value))

=>

(retract ?f)

(assert (variable ?goal ?goal-value)))

(defrule ask-question-no-legalvalues ""

(declare (salience 10))

(not (legalanswers $?))

?f1 <- (goal is ?variable)

?f2 <- (question ?variable ? ?text)

=>

(retract ?f1 ?f2)

(format t "%s " ?text)

(assert (variable ?variable (read))))

(defrule ask-question-legalvalues ""

(declare (salience 10))

(legalanswers ? $?answers)

?f1 <- (goal is ?variable)

?f2 <- (question ?variable ? ?text)

=>

(retract ?f1)

(format t "%s " ?text)

(printout t ?answers " ")

(bind ?reply (read))

(if (member (lowcase ?reply) ?answers)

then (assert (variable ?variable ?reply))

(retract ?f2)

else (assert (goal is ?variable))))

;;;***************************

;;;* DEFFACTS KNOWLEDGE BASE *

;;;***************************

(deffacts knowledge-base

(goal is model.notebook)

(legalanswers are yes no)

(rule (if small is yes)

(then note.size is small))

(rule (if small is no)

(then note.size is normal))

(question small is "Vam nuzhen o4en malenkiy notebook?")

(rule (if note.size is small and

atom is yes)

(then model.notebook is "ASUS EeePC 901"))

(rule (if note.size is small and

atom is no)

(then model.notebook is "ASUS EeePC 900 with CeleronM"))

(question atom is "Vam nuzhen notebook na processore ATOM?")

(rule (if note.size is normal and

gaming is yes)

(then type.notebook is game))

(rule (if note.size is normal and

gaming is no)

(then type.notebook is other))

(question gaming is "Vam nuzhen igrovoy notebook?")

(rule (if type.notebook is game and

geforce is yes)

(then model.notebook is "ASUS G2Sv"))

(rule (if type.notebook is game and

geforce is no)

(then model.notebook is "ASUS M50Sv"))

(question geforce is "Vam nuzhna topovaya videokarta GeForce 9650M GT?")

(rule (if type.notebook is other and

style.book is yes)

(then common.stylish is stylish))

(rule (if type.notebook is other and

style.book is no)

(then common.stylish is common))

(question style.book is "Vam nuzhen stilniy notebook?")

(rule (if common.stylish is stylish and

leather is yes)

(then model.notebook is "ASUS S6F LEATHER COLLECTION"))

(rule (if common.stylish is stylish and

leather is no)

(then model.notebook is "ASUS LAMBORGHINI VX3"))

(question leather is "Vam nuzhen notebook obshitiy naturalnoy kozhey?")

(rule (if common.stylish is common and

big.screen is yes)

(then model.notebook is "ASUS A7U"))

(rule (if common.stylish is common and

big.screen is no)

(then model.notebook is "ASUS F5N"))

(question big.screen is "Vam nuzhen notebook s bolshim ekranom. 17inch?")

(answer is "Ya dumayu 4to vam bolshe vsego podhodit notebook " model.notebook))

10

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]