Лаб8 clips приклад створення ЕС

Розглянемо приклад створення невеликої експертної системи.

Спершу необхідно визначити базу знань нашої ЕС. Нехай це буде, наприклад, вибір ноутбука.

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

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

Якщо ж потрібен ноутбук не "стильний", то далі слід вибрати, чи екран матиме діагональ 17 дюймів. Після цього також можливе виведення моделі.

Кінцевою метою нашої ЕС є вибір моделі ноутбука. В базу знань внесемо питання, якими нам необхідно визначитися і які приведуть нас до конкретної моделі. Так само в базі знань зберігатимемо питання, які виводитимуться користувачеві. У CLIPS базу знань опишемо як масив фактів.

(goal is model.notebook)

(legalanswers are yes no)

(rule (якщо мало) (then note.size is small))

(rule (якщо мало) (then note.size is normal))

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

(Руля (якщо невеликий розмір і атом є) (цей model.notebook є "ASUS EeePC 901"))

(Руля (якщо невеликий розмір і атом не є) (цей model.notebook є "ASUS EeePC 900 with CeleronM"))

(quest atom is "Vam nuzhen notebook на ATOM процесор?")

(rule (ifnote.size — це нормально, а для ігор — так) (тоді type.notebook — це гра))

(правило (якщо note.size нормальний, а ігровий ні) (то type.notebook інший))

(питання ігрове «Вам нужен ігровий зошит?»)

(правило (якщо type.notebook — гра, а geforce — «так») (тоді model.notebook — «ASUS G2Sv»))

(правило (якщо type.notebook — гра, а geforce — ні) (тоді model.notebook — «ASUS M50Sv»))

(питання geforce - "Вам потрібна топова відеокарта GeForce 9650M GT?")

(правило (якщо type.notebook має значення other і style.book має значення yes) (тоді common.stylish означає stylish))

(правило (якщо type.notebook — інше, а style.book — ні) (тоді common.stylish — загальне))

(питання style.book - «Вам нужен стильний зошит?»)

(правило (якщо common.stylish — це стильно, а leather — так) (тоді model.notebook — це «КОЛЕКЦІЯ ШКІРИ S6F ASUS»))

(правило (якщо common.stylish — це стильно, а шкіра — ні) (тоді model.notebook — «ASUS LAMBORGHINI VX3»))

(питання шкіри "Вам нужен зошит обшитий натуральной кожи?")

(правило (якщо common.stylish — це common, а big.screen — так) (тоді model.notebook — «ASUS A7U»))

(правило (якщо common.stylish — це common, а big.screen — ні) (тоді model.notebook — «ASUS F5N»))

(питання big.screen - "Вам нужен ноутбук з більшим екраном. 17inch?")

notebook

Далі необхідно сконструювати правила, які будуть працювати з нашою базою знань.

Правило, що визначає послідовність, в якій наш експерт буде задавати питання, визначені правилом.

(правило (якщо ?змінна $?) (тоді ?ціль ? ?значення))

(стверджувати (ціль ?змінна)))

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

(goal is common.stylish)

(goal is type.notebook)

(goal is note.size)

Тепер потрібно правило, яке буде вести діалог з користувачем і робити відповідні зміни в базі фактів.

(declare (salience 10))

(format t "%s" ?text)

(printout t ?answers " ")

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

then (assert (variable ?variable ?reply))

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

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

Так як ми визначилися з відповіддю і зробили відповідний висновок, то необхідне правило, яке б видалило протилежне рішення.

(declare (salience 20))

(variable ?variable ?value)

Правило, яке обробить відповідь і знайде в базі знань, відповідний висновок виглядає так

(declare (salience 20))

(variable ?variable ?value)

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

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

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

(Руля (якщо невеликий розмір і атом є) (цей model.notebook є "ASUS EeePC 901"))

(Руля (якщо невеликий розмір і атом не є) (цей model.notebook є "ASUS EeePC 900 with CeleronM")).

Оскільки ми визначилися із габаритами, активується ще одне правило, яке редагує базу знань.

(declare (salience 20))

(variable ?variable ?value)

У нашому випадку буде відредаговано рядки

(Руля (якщо мова йде про звичайний і гамірний є)) (3).

(rule (якщо ти не є) (тим type.notebook is other))

І в результаті вони виглядатимуть так

(rule (іf gaming is yes) (then type.notebook is game))

(rule (іf gaming is no) (then type.notebook is other)).

Це редагування призведе до активації правила propagate-goal і буде визначено нову мету.

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

(rule (якщо type.notebook is other and style.book is yes) (then common.stylish is stylish))

(rule (якщо type.notebook is other and style.book is no)(then common.stylish is common)).

Потім активується правило modify-rule-match що призводить до модифікації висновків

(Руля (якщо type.notebook є гра і geforce is yes) (then model.notebook is "ASUS G2Sv"))

(Руля (якщо type.notebook є гра і geforce є не) (then model.notebook є "ASUS M50Sv"))

З цього виходить

(Руля (якщо є) (then model.notebook is "ASUS G2Sv"))

(Руля (якщо немає) (then model.notebook is "ASUS M50Sv")).

(declare (salience 30))

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

Внаслідок активації цього правила ми отримаємо виведення ЕС

Вихідний текст програми:

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

;;;; Цей система вибирає ноутбук з модельного рівня ASUS.