Міністерство загальної та професійної освіти p>
Російської Федерації p>
Кубанський Державний Технологічний Університет p>
Курсова робота на тему: p>
ПРОГРАМУВАННЯ НА МОВІ CLIPS p>
Роботу виконав студент групи 01 - p>
КТ-22 факультету p>
КТАС Мариненко А. p>
А. p> < p> Краснодар 2001 p>
СОДЕРАЖНІЕ p>
. А.1. Коротка історія CLIPS 3 p>
. А.2. Правила та функції в CLIPS p>
3 p>
. А.3. Обектно-орієнтовані засоби в CLIPS p>
10 p>
. А.4. Завдання «правдолюбці і брехуни» 15 p>
. А.5 Стиль програмування мовою CLIPS 66 p>
А.1. КОРОТКА ІСТОРІЯ CLIPS p>
Назва мови CLIPS - абревіатура від C Language Integrated
Production System. Мова був розроблений у центрі космічних досліджень
NASA p>
(NASA's Johnson Space Center) в середині 1980-х років і багато в чомусхожий з мовами, створеними на базі LIPS, зокрема OPS5 і ART.
Використання C як мова реалізації пояснюється тим, що компілятор
LISP не підтримується частиною поширених платформ, а також складністюінтеграції LISP-коду в додатки, які використовують відмінний від LIPS мовупрограмування. Хоча в той час на ринку вже з'явилися програмнізасоби для задач штучного інтелекту, розроблені на мові C,фахівці з NASA вирішили створити такий продукт самостійно.
Розроблена ними система в цей час доступна у всьому світі, і потрібносказати, що за своїми можливостями вона не поступається багатьом набагато більшедорогих комерційних продуктів. p>
Перша версія є, по суті, інтерпретатор породжуютьправил. Процедурне мова та об'єктивно-орієнтоване розширення CLIPS
Object-Oriented Language (COOL) були включені в цей програмний продукттільки в 1990-х роках. Існуюча в даний час версія можеексплуатуватися на платформах UNIX, DOS, Windows і Macintosh. Вонає добре документованим загальнодоступним програмним продуктом ідоступна по мережі FTR з безлічі університетських сайтів. Вихідний кодпрограмного пакета CLIPS поширюється абсолютно вільно і його можнавстановити на будь-якій платформі, яка підтримує стандартний компілятор мови
C. Однак я б рекомендував користуватися офіційною версією дляпевної платформи, оскільки такі версії оснащені для користувачаінтерфейсом, що включає меню команд і вбудований редактор. p>
Це Додаток організовано наступним чином. У розділі А.2.розглянуті основні функції мови, опис правил та процедурного мови. Урозділі А.3. представлені методи роботи з об'єктами і показано, яквикористовувати їх у поєднанні з правилами та процедурами. У розділі А.4.описано приклад, що демонструє деякі прийоми програмування правил, ау розділі А.5. резюмуються характеристики цього програмного продукту іпропонуються теми для більш поглибленого вивчення. p>
А.2. ПРАВИЛА І ФУНКЦІЇ У CLIPS p>
CLIPS включає в мову подання породжують правил і моваопису процедур. У цьому розділі ми розглянемо обидва цих модуля,супроводжуючи опис окремих функцій прикладами. p>
Основними компонентами мови опису правил є база фактів
(fact base) і база правил (rule base). На них покладаються наступніфункції:
- база фактів являє собою початковий стан проблеми;
- база правил містить оператори, які перетворять стан проблеми, приводячи його до рішення. p>
Машина логічного висновку CLIPS зіставляє ці факти і правила із'ясовує, які з правил можна активізувати. Це виконується циклічно,причому кожен цикл складається з трьох кроків:
1) зіставлення фактів і правил;
2) вибір правила, що підлягає активізації;
3) виконання дій, передбачених правилом. P>
Такий трехшаговий циклічний процес іноді називають «цикломрозпізнавання - дія » p>
А.2.1. Факти p>
Відразу після запуску CLIPS-додатки на виконання на екраніз'явиться запрошення, яке повідомляє користувача, що він працює зінтерпретатором. p>
CLIPS> p>
У режимі інтерпретатора користувач може використовувати безлічкоманд. Факти можна включити в базу фактів прямо з командного рядка здопомогою команди assert, наприклад: p>
CLIPS> (assert (today is Sunday)) p>
CLIPS> (assert (weather is warm)) p>
Для кращого сприйняття тесту Програми ми в подальшому будемовиділяти текст, що вводиться користувачем, напівжирним щріфтом, а запити івідповіді інтерпретатора - звичайним моноширинних шрифтом. p>
Для створення переліку фактів, що є в базі, використовується командаfacts: p>
CLIPS> (facts) f-1 (today is Sunday) f-2 (weather is warm) p>
В останніх версіях CLIPS, зокрема, в тій, яка працює вопераційному середовищі Windows, такі команди як facts, можна викликати задопомогою меню. p>
Для видалення фактів з бази використовується команда retract. p>
CLIPS> (retract 1) p>
CLIPS> (facts) f-0 (today is Sunday) p>
Ці ж команди, assert і retract, використовуються в виконуваної частиниправил (укладанні правила) і з їх допомогою виконується програмнезміна бази фактів. Часто доводиться користуватися і іншою командоюінтерпретатора, clear, яка очищає базу фактів (як правило, цякоманда доступна в одному з випадаючих меню). p>
CLIPS> (clear) p>
CLIPS> (facts) p>
У тексті програми факти можна включати до бази не по поодинці, ацілим масивом. Для цього в CLIPS є команда deffacts. P>
(deffacts today p>
(today is Sunday) p>
(weather is warm) p>
) p>
Вираз deffacts має формат, аналогічний виразів в мові
LISP. Вираз починається з команди deffacts, потім наводиться ім'я спискуфактів, які програмісти збирається визначити (у нашому прикладі --today), а за ним ідуть елементи списку, причому їх кількість необмежується. Цей масив фактів можна потім видалити з бази командоюundeffacts. p>
CLIPS> (undeffacts today) p>
Вираз deffacts можна вводити і в командний рядокінтерпретатора, але краще записати його в текстовий файл за допомогою редактора
CLIPS або будь-якого іншого текстового редактора. Завантажити цей файл уНадалі можна за допомогою команди в меню File або з командного рядка. p>
CLIPS> (load "my file") p>
Однак після завантаження файлу факти не передаються відразу ж в базуфактів CLIPS. Команда deffacts просто вказує інтерпретатору, щоіснує масив today, який містить багато фактів. Власнезавантаження виконується командою reset. p>
CLIPS> (reset) p>
Команда reset спочатку очищає базу фактів, а потім включає в неїфакти з усіх раніше завантажених масивів. Вона також додає до базиєдиний системно певний факт: f-0 (initial-fact) p>
Це робиться за замовчуванням, оскільки іноді має сенс включити допрограму правило start rule, яке можна порівнювати із цим фактомі дозволить виконати будь-які нестандартні ініціалізувалися операції.
Однак включати таке правило в програму чи ні - справа програміста. P>
Можна простежити, як виконується команда reset, якщо передвиконанням наведених вище команд встановити режим стеження середовищарозробки. Для цього потрібно викликати команду Watch з меню Execution івстановити в ній прапорець Facts. p>
А.2.2. Правила p>
У мові CLIPS правила мають наступний формат: p>
(defrule p>
<необов'язковий коментар> p>
<необов'язкове оголошення> p >
<предпосилка_1> p>
... ... ... ... ... .... p>
<предпосилка_m> p>
=> p>
<действіе_1> p>
... ... ... ... ... ... .. p>
<предпосилка_n> p>
) p>
Наприклад: p>
( defrule chores p>
"Things to do on Sunday" p>
(salience 10) p>
(today is Sunday) p>
(weather is warm ) p>
=> p>
(assert (wash car)) p>
(assert (chop wood) p>
) p> < p> У цьому прикладі Chores - довільно обране ім'я правила.
Передумови в умовній частині правила p>
(today is Sunday) p>
(weather is warm) зіставляються потім інтерпретатором з базою фактів, а дії,перераховані в виконуваної частини правила (вона починається після парисимволів =>), вставлять в базу два факти p>
(wash car) p>
(chop wood) у випадку, якщо правило буде активізовано. Наведений в текстіправила коментар p>
"Things to do on Sunday" p>
"Що робити в неділю" допоможе в подальшому згадати, навіщо це правило включено впрограму. Вираз p>
(salience 10) вказує на ступінь важливості правила. Нехай наприклад, у програміє інше правило p>
(defrule fun p>
"Better things to do on Sunday" p>
(salience 100) p>
(today is Sunday ) p>
(weather is warm) p>
=> p>
(assert (drink beer)) p>
(assert (play guitar)) p>
) p>
Оскільки передумови обох правил однакові, то при виконанніобумовлених умов вони будуть «конкурувати» за увагу інтерпретатора.
Перевагу буде віддано правилом, у якого параметр salience має більшвисоке значення, в даному випадку - правилом fun. Параметри salience можебути присвоєно цілочисельне будь-яке значення в діапазоні [-10000, 10000].
Якщо параметр salience у визначенні правила опущений, йому за замовчуваннямприсвоюється значення 0. p>
Зазвичай у визначенні правила присутні і змінні. Якщо,наприклад, правило p>
(defrule pick-a-chore p>
"Allocating chores to days" p>
(today is? day) p>
(chore is? job) p>
=> p>
(assert (do? job on? day)) p>
) буде порівнювати із фактами p> < p> (today is Sunday) p>
(chore is carwash) то у випадку активізації воно включить в базу новий факт p>
(do carwash on Sunday). p>
Аналогічно, правило p>
(defrule drop-a-chore p>
"Allocating chores to days" p>
(today is? day) p>
? chore p>
(retract? chore) p>
) скасує виконання робіт по будинку (a chore). Зверніть увагу на те,що обидва екземпляри змінної? day повинні отримати одне і те ж значення.
Змінна? Chore в результаті зіставлення повинна отримати посилання нафакт, який ми збираємося виключити з бази. Таким чином, якщо цеправило буде порівнювати із базою фактів, в якій містяться p>
(today is Sunday) p>
(do carwash on Sunday) то при активізації правила з бази буде видалено факт p>
(do carwash on Sunday) p>
З подробицями виконання процесу сосоставленія в інтерпретаторі
CLIPS ви зможете познайомитися у Посібнику користувача, а тут тількивідзначимо, що факт p>
(do carwash on Sunday) буде підтверджено будь-яким з представлених нижче зразків p>
(do?? Sunday) p>
(do? on? ) p>
(do? on? when) p>
(do $?) p>
(do $? Sunday) p>
(do? chore $? when) p>
Врахуйте, що префікс $? є ознакою сегментної змінної,яка буде пов'язана з сегментом списку. Наприклад, у наведеному вищеприкладі змінна $? when буде пов'язана з p>
(on Sunday) p>
Якщо за префіксами? і $? не слід ім'я зміною, вонирозглядаються як універсальні символи підстановки, якимвідповідно може бути підтверджено будь-який елемент або сегмент списку. p>
А.2.3. Спостереження за процесом інтерпретації p>
Тепер на простому прикладі познайомимося з можливостями, якінадає середовище розробки CLIPS в частині налагодження програми, що складаєтьсяз правил і фактів. Введіть у текстовий файл правило, а потім завантажтеце фото в середу CLIPS. p>
(defrule start p>
(initial-fact) p>
=> p>
(printout t "hello, world "crlf) p>
) p>
Виконайте команду reset. Для цього введіть цю команду в командномурядку інтерпретатора p>
CLIPS> (reset) p>
Або виберіть у меню команду Execution => Reset, або натисніть
(останні два варіанти можливі у версії, яка працює під Windows). p>
Потім запустіть інтерпретатор. Для цього введіть цю команду run вкомандний рядок інтерпретатора p>
CLIPS> (run) p>
Або виберіть у меню команду Execution => Run, або натисніть
(останні два варіанти можливі у версії, яка працює під Windows). p>
У відповідь програма повинна вивести повідомлення hello, world, знайомевсім програмістам світу. Для повторного запуску програми повторіть командиreset та run. p>
Якщо в меню Execution => Watch раніше був встановлений прапорець Rules абоперед запуском програми на виконання ви ввели в командну стоку командуwatch rules, то на екрані з'явитися результат транссіровкі процесувиконання p>
CLIPS> (run) p>
FIRE 1 start: f-0 hello, world p>
У цьому повідомленні в рядку, що починається з FIRE, виведена інформаціяпро активізовану правилі: start - це ім'я правила, а f-0 - ім'я факту,який «задовольнив» умова в цьому правилі. Команда watch дозволяєорганізувати кілька різних режимів трасування, з деталями яких виможете ознайомитися в посібнику користувача. Якщо перед запускомпрограми ви ввели p>
CLIPS> (dribble-on "dribble.dp") p>
TRUE p>
Те виведений протокол трасування буде збережений у файліdribble.clp. Збереження протоколу припиниться після введення команда p>
CLIPS> (dribble-off) p>
TRUE p>
Це дуже зручна опція, особливо на етапі освоєння мови. P>
А.2.4. Використання шаблонів p>
Для визначення фактів можна використовувати не тільки списковіструктури, а й шаблони, які нагадують прості записи. (Шаблони в
CLIPS не мають нічого спільного з шаблонами C + +.) Шаблон виглядає приблизнотак: p>
(deftemplate student "a student record" p>
(slot name (type STRING)) p>
(slot age (type NUMBER) (default 18) ) p>
) p>
Кожне визначення шаблона складається з довільного імені шаблону,необов'язкового коментаря і деякої кількості визначень слотів.
Слот включає поле даних, наприклад name, і тип даних, наприклад STRING.
Можна вказати і значення за замовчуванням, як у наведеному вище прикладі. P>
Якщо в програму включено наведене вище визначення шаблону, товираз p>
(deffacts students p>
(student (name fred)) p>
(student (name freda) (age 19)) p>
) призведе до того, що в базу фактів після виконання команди resetбуде додано p>
(student (name fred) (age 18)) p>
(student (name freda) (age 19)) p>
А.2.5. Визначення функцій p>
У мові CLIPS функції конструюються приблизно так само, як у мові
LIPS. Суттєва відмінність полягає в тому, що змінні повинні матипрефікс?, як це показано в наведеному нижче визначенні. p>
(deffunction hypotenuse (? a? b) p>
(sqrt (+ (*? a? a) (*? b? b)) p>
) p>
Формат визначення функції в CLIPS наступний: p>
(deffunction (... ..) p>
... ... ... ... .... p>
) p>
Функція повертає результат останнього виразу в списку. p>
Іноді виконання функції має побічні ефекти, як у наведеномунижче прикладі. p>
(deffunction init (? day) p>
(reset) p>
(assert (today is? day)) p>
) p>
В результаті після запуску функції на виконання командою p>
CLIPS> (init Sunday) p>
Буде виконана команда reset і, отже, очищена база фактів,а потім у неї буде включений новий факт (today is Sunday). p>
А.3. Об'єктно-орієнтоване ЗАСОБИ У CLIPS p>
Використання об'єктно-орієнтованих засобів в CLIPS дозволяєзначно спростити програмування правил, оскільки для оновленняданих можна застосовувати механізм передачі та обробки повідомлень методамикласів. У цьому розділі ми продемонструємо, як це робиться на прикладі,який моделює правила поводження з напівавтоматичним пістолетом. p>
Насамперед визначимо клас pistol, в якому будуть перерахованівластивості, необхідні для моделювання. p>
(defclass pistol p>
(is-a USER) p>
(role concrete) p>
(pattern - match reactive) p>
(slot safety (type SYMBOL) (create-accessor read-write)) p>
(slot slide (type SYMBOL) (create-accessor read-write))
(slot hammer (type SYMBOL) (create-accessor read-write)) p>
(slot chamber (type INTEGER) (create-accessor read-write)) p> < p> (slot magazine (type SYMBOL) (create-accessor read-write)) p>
(slot rounds (type INTEGER) (create-accessor read-write)) p>
)
Перші три слота - системні. Вони потрібні об'єктно-орієнтованоїнадбудові CLIPS (COOL-CLIPS object-oriented language). Ці слоти COOLсповіщають про те, що
. pistol - це призначений для користувача клас;
. pistol є конкретним класом, тобто можливе створення екземплярів цього класу (альтернативний тип - абстрактний клас, який відіграє ту ж роль, що і віртуальний клас в C ++);< br>. екземпляри класу pistol можуть бути використані в якості об'єктів даних, які можна зіставляти з умовами в правилах і використовувати в діях, визначених правилами. p>
Наступні п'ять слотів представляють властивості і члени даних класу:
. слот safety (запобіжник) може містити символ on або off;
. слот slide (затвор) може містити значення forward або back, тобто зберігає інформацію про положення затвора;
. слот hammer (курок) містить інформацію про стан курка, або back down;
. слот chamber (патронник) містить значення 1 або 0, в залежності від того, чи є патрон у патроннику;
. слот magazine (обойма) може містити значення in чи out, залежно від того, вставлена чи обойма;
. слот rounds (патрони) містить поточну кількість патронів в обоймі. p>
Для того щоб мати можливість записувати в слот нове значенняабо зчитувати поточне, потрібно дозволити формування відповідних функційдоступу через фацет create-accessor. Тепер сформуємо екземпляр класуpistol за допомогою наступного виразу: p>
(definstances pistols p>
(PPK of pistol p>
(safety on) p>
(slide forward)
(hammer down) p>
(chamber 0) p>
(magazine out) p>
(rounds 6) p>
) p>
) p>
Цей екземпляр, PPK, правильно укладений - обойма вийнята з рукоятки,пістолет встановлений на запобіжник, затвор у передньому положенні, курокопущений, а патронник порожній. В обоймі є 6 патронів. P>
Тепер, маючи в програмі визначення класу і сформувавши примірниккласу, розробимо правила і обробники повідомлень, за допомогою якихможна описати окремі операції поводження з пістолетом і стрільби з нього.
Для цього спочатку розробимо шаблон завдання. Бажано відстежувати дваречі:
. чи є патрон у патроннику;
. зроблений чи постріл. p>
Для цього можна використовувати наступний шаблон: p>
(deftemplate range-test p>
(field check (type SYMBOL) (default no))
(field fired (type SYMBOL) (default no)) p>
) p>
Перше правило буде встановлювати в робочу пам'ять програм завданняrange-test. p>
(defrule start p>
(initial-fact) p>
=> p>
(assert (range-test)) p>
) p>
При активізації цього правила в робочу пам'ять буде додано p>
(range-test (check no) (fired no)) p>
Наступнийющіе три правила будуть перевіряти чи правильно спорядженийпістолет. p>
(defrule check p>
(object (name [PPK]) (safety on) (magazine out) p>
? T p>
(send [PPK] clear) p>
(modify? T (check yes) p>
) p>
Правило check полягає в тому, що якщо пістолет стоїть назапобіжнику (safety on), обойма вийнята (magazine out) і пістолет не бувперевірено, то потрібно очистити патронник і перевірити, чи немає в ньому патрона.
Оброблювач повідомлень clear для класу pistol буде виглядати наступнимтак: p>
(defmassage-handler pistol clear () p>
(dynamic-put chamber 0) p>
(ppinstance) p>
)
У першому рядку оголошується, що clear є обрабртчікомповідомлення для класу pistol, причому цей обробник не вимагає передачіаргументів. Оператор у другому рядку «очищає» патронник. Присвоєннявиконується незалежно від того, яке поточне значення має слот chamber,
- 0 або 1. Оператор в третьому рядку вимагає, щоб примірник розпечатавінформацію про поточний стан своїх слотів. p>
У наступних двох правилах обробляються ситуації, коли пістолетспоряджений неправильно, - не встановлений на запобіжник, чи в неївставлена обойма. Правило correct1 встановлює пістолет назапобіжник, а правило correct2 витягує з нього обойму. p>
(defrule correct1 p>
(object (name [PPK]) (safety off)) p>
(range - test (check no)) p>
=> p>
(send [PPK] safety on) p>
) p>
(defrule correct2 p>
(object (name [PPK]) (safety on) (magazine in)) p>
(range-test (check no)) p>
=> p >
(send [PPK] drop) p>
) p>
Як при розробці попереднього правила, нам знадобляться обробникиповідомлень safety та drop. p>
(defmessage-handler pistol safety (? on-off) p>
(dynamic-put safety? on-off) p>
(if (eq? on-off on) then (dynamic-put hammer down) p>
) p>
) p>
Оброблювач повідомлення safety приймає єдиний аргумент, якийможе мати лише два символічних значення on або off. В іншомувипадку нам довелося б розробити два обробника: один для повідомленняsafety-on, а інший - для повідомлення safety-off. Врахуйте, що в деякихмоделях, наприклад в Walther PPK, при установці пістолета на запобіжникпатронник очищується автоматично. p>
Оброблювач повідомлення drop просто витягує обойму з пістолета. p>
(defmessage-handler pistol drop () p>
(dynamic-put magazine out)
) p>
Тепер, коли забезпечене правильне вихідне спорядження пістолета,можна приступити до стрільби. Наступне правило забезпечує вставку обоймив пістолет перед стрільбою: p>
(defrule mag-in p>
(object (name [PPK]) (safety on) (magazine out)) p>
(range -test (fired no) (check yes)) p>
=> p>
(send [PPK] seat) p>
) p>
Оброблювач повідомлення seat виконує дії, протилежні тим,які виконує обробник drop. p>
(defmessage-handler pistol seat () p>
(dynamic-put magazine in) p>
) p>
Можна було б, звичайно, включити в програму і наступне правило mag -in: p>
(defrule mag-in p>
? gun p>
(modify? gun (magazine in) p>
) але це суперечить одному з принципів об'єктно-орієнтованогопрограмування, який свідчить, що об'єкт повинен самостійнообробляти що містяться в ньому. Наступне правило забезпечуєспорядження обойми патронами: p>
(defrule load p>
(object (name [PPK]) (magazine in) (chamber 0)) p>
=> p >
(send [PPK] rack) p>
) p>
На прикладі обробника повідомлення rack ви можете переконатися всправедливості нашого зауваження про те, що обробку даних усередині об'єктапотрібно доручати методів цього об'єкту, а не включати прямо в правило. p>
(defmessage-handler pistol rack () p>
(if (> (dynamic-get rounds) 0) then (dynamic -put chamber 1) p>
(dynamic-put rounds (- (dynamic-get rounds) 1)) p>
(dynamic-put slide forward) else (dynamic-put chamber 0) p>
(dynamic-put slide back) p>
) p>
) p>
У цьому обробнику забезпечується досилання патрона в патронник у томувипадку, якщо в обоймі є патрони. Наступне правило готуєпістолет до стрільби, знімаючи його з запобіжника. Зверніть увагу на те,що в ньому повторно використовується повідомлення safety, але на цей раз заргументом off. p>
(defrule ready p>
(object (name [PPK]) (chamber 1)) p>
=> p>
( send [PPK] safety off) p>
) p>
Правило fire виконує стрілянину. p>
(defrule fire p>
(object (name [PPK ]) (safety off); p>
? T p>
(if (eq (send [PPK] fire) TRUE) then (modify? T (fired yes ))) p >
) p>
Зверніть увагу, що в цьому правилі використовується обробникповідомлення, яке повертає значення. Аналізуючи його, можна з'ясувати,зроблений чи постріл, тобто виконана чи насправді та операція,яка «закріплена» за цим повідомленням. Якщо у патроннику був патрон іпістолет був знятий з запобіжника, то обробник повідомлення поверне значення
TRUE (після того, як виведе на екран BANG!). В іншому випадку він поверне
FALSE (після того, як виведе на екран click). P>
(defmessage-handler pistol fire () p>
(if (and p>
(eq (dynamic - get chamber) 1) p>
(eq (dynamic-get safety) off) p>
) then (printout t crlf "BANG!" t crlf) p>
TRUE else (printout t crlf "click" t crlf) p>
FALSE p>
) p>
) p>
Нехай вас не бентежить, що в обробнику повідомлення аналізуєтьсяумова, яку вже було проаналізовано правилом, надіславши повідомлення
(в даному випадку мова йде про умови safety off). Справа в тому, що одне йтеж повідомлення може надсилатися різними правилами і немає жодної гарантії,що в кожному з них буде перевірятися цю умову. p>
Після завершення стрільби пістолет треба знову повернути в положення
«По-похідному». Починається це з того, що пістолет встановлюється назапобіжник, для чого використовується раніше розробленого обробникповідомлення safety. p>
(defrule unready p>
(object (name [PPK]) (safety off)) p>
(range-test (fired yes))
=> p>
(send [PPK] safety on) p>
) p>
Наступна операція - вийняти обойму. Зверніть увагу, що в ньому мизнову звертаємося до обробникові повідомлення drop. p>
(defrule drop p>
(object (name [PPK]) (safety on)) p>
(range-test (fired yes)) p>
=> p>
(send [PPK] drop) p>
) p>
Останнє правило викидає патрон з патронника, викликаючиобробник повідомлення clear. p>
(defrule unload p>
(object (name [PPK]) (safety on) (magazine out)) range-test (fired yes)) p>
=> p>
(send [PPK] clear) p>
) p>
У цьому пріемре було продемонстровано, як в рамках єдиної CLIPSпрограми "уживаються" правила та об'єкти. Правила керують ходомобчислень, але деякі операції об'єкти виконують і самостійно,отримавши "вказівку" (повідомлення) від правил. Об'єкти не являються резидентамиробочої пам'яті, але члени лівій частині правил (умов) можуть бутизіставлені з вмістом їх слотів. Стан об'єктів може змінитися івнаслідок побічних ефектів активізації правил, але я вважаю, що кращенадати об'єктам можливість самостійно виконувати маніпуляції зщо зберігаються в них даними у відповідь на що надходять від правил повідомлення.
Об'єкти не можуть самостійно активізувати правила, але їх обробникиповідомлення можуть "повертати" певну інформацію про результати, якавикористовується для керування логікою виконання дій у правій частиніправил. p>
А.4. ЗАДАЧА "правдолюбці та брехунів" p>
Для того, щоб продемонструвати вам можливості мови CLIPS, явибрав головоломку, а не завдання з практики застосування експертних систем. Уголоволомці вирішується одне із завдань, що виникають на острові, населеномумешканцями двох категорій: одні завжди говорять правду (назвемо їхправдолюбцем), а інші завжди брешуть (їх, природно, назвемо брехунами).
Безліч таких головоломок ви можете зустріти на сторінкахцікавої книги Раймонда Смуляна «What is the Name of this Book?». Нижченаведені різні завдання з цієї серії. p>
Р1. Зустрічаються дві людини, А і В, один з яких правдолюб, адругий - брехун. А каже: «Або я брехун, або У правдолюб». Хто з цихдвох правдолюб, а хто брехун? p>
Р2. Зустрічаються три людини, А, В і С. А та каже: «Всі ми брехуни»,а В відповідає: «Тільки один з нас правдолюб». Хто з цих трьохправдолюб, а хто брехун? p>
Р3. Зустрічаються три людини, А, В і С. Четвертий проходячи мимо,А запитує: «Скільки правдолюбців серед вас?» А відповідає невизначено, а
В відповідає: «А сказав, що серед нас є один правдолюб». Тут у розмовувступає С і додає: «У бреше!» ким на вашу думку є В і С? p>
У програмі, що вирішує проблеми подібного класу, будуть використаніширокі можливості засобів програмування правил в мові CLIPS іпродемонстровані деякі цікаві прийоми, наприклад, вживанняконтекстів і зворотного простежування. Ми також покажемо, як конструюватиі тестувати прототипи, які приблизно відтворюють поведінкуостаточної програми. Як зазначалося в основному матеріалі книги,технологія побудови експертних систем з використанням прототипів - одинз найпоширеніших в даний час. p>
А.4.1. Аналіз проблеми p>
Першим етапом будь-якого програмного проекту є аналіз розв'язуваноїпроблеми. Експерт повинен уміти вирішити проблему, а інженер по знаннях повиненрозібратися, як саме було отримано рішення. При вирішенні нашого завдання вамдоведеться виступити в обох іпостасях. p>
Запропоновані головоломки можна вирішити, систематично аналізуючи,що станеться, коли персонаж, що говорить репліку, є правдолюбцем, ащо, якщо він - брехун. Позначимо через Т (А) факт, що А говорить правду, іотже, є правдолюбцем, а через F (А) - факт, що А бреше і,отже, є брехуном. p>
Розглянемо спочатку головоломку Р1. Припустимо, що А говоритьправду. Тоді з його репліки випливає, що або А брехун, або У правдолюб.
Формально це можна представити в наступному вигляді: p>
Т (А) => F (А) v Т (В) p>
Оскільки А не може одночасно бути і брехуном, і правдолюбцем, тозвідси випливає p>
Т (А) => Т (В) p>
Аналогічно можна записати й інший варіант. Припустимо, що А бреше: p>
F (A )=>-( F (A) v Т (В )). p>
Спростимо цей вираз: p>
F (A) =>-F (A) ^-Т (В) або F (A) => Т (А) ^ F (B). p>
Порівнюючи обидва варіанти, неважко прийти до висновку, що толкоостанній правильне, оскільки в першому варіанті ми прийшли до висновку,суперечить умовам (не можуть бути правдолюбцем одночасно А і В). p>
Таким чином, розглянута проблема відноситься до типу таких,вирішення яких знаходиться в результаті аналізу висновків, що випливають ізпевних припущень, і пошуку в них протиріч (або відсутностітаких). Ми припускаємо, що певний персонаж говорить правду, апотім дивимося, чи можна в цьому випадку так розподілити «ролі» іншихперсонажів, що не будуть порушені умови, сформульовані в репліках. Нажаргоні, прийнятому в математичне логікою, припущення про правдивість абобрехню безлічі висловлювань називається інтерпретацією, а варіантнесуперечливого присвоєння значень істинності елементам множини --моделлю. p>
Однак наші головоломки включають і щось таке, що виходить за рамки типовихпроблем математичної логіки, оскільки репліки в них може вимовляти неодин персонаж (як у головоломці Р2), а на репліку одного персонажа можепослідувати у відповідь репліка іншого (як у головоломці Р3). У вихідноїверсії програми, яку ми розглянемо нижче, це ускладнення відсутня,але в остаточній воно має бути врахована. Ми покажемо, що поступовеускладнення програми досить добре узгоджується з використанням правил. p>
На практиці виявляється, що в першій версії програми Кращий часскористатися «виродженим» варіантом проблеми, тобто постаратися вирішитиїї в тривіальний вигляді, який, проте, несе в собі багатоособливості реального випадку. Ось як це виглядає відносно нашихправдолюбців і брехунів. p>
Р0. А заявляє: «Я брехун». Хто ж насправді А - брехун абоправдолюб? p>
Ми тільки що фактично процитували добре відомий Парадокс
Брехуна. Якщо А брехун, то, значить, він бреше, тобто насправді вінправдолюб. Але тоді ми приходимо до протиріччя. Якщо ж А правдолюб,тобто говорить правду, то насправді він брехун, а це зновупротиріччя. Таким чином, у цій головоломці не існуєнесуперечливого варіанту «розподілу ролей», тобто не існує моделів тому сенсі, який надається їй в математичній логіці. p>
Є багато переваг у виборі для прототипу програми варіантуголоволомки Р0.
. У головоломці присутній тільки один персонаж.
. Вираз не містить логічних зв'язок, таких як І або АБО, або кванторів, на зразок квантора спільності (все) та інших.
. Відсутня відповідь репліка. P>
У той же час суттєві риси проблеми в цьому варіантіприсутні. Ми як і раніше повинні спробувати відшукати несуперечливуінтерпретацію висловлювання А, тобто повинні реалізувати два завдання,присутні в будь-яких варіантах подібної головоломки:
. формувати альтернативні інтерпретації висловлювань;
. аналізувати наявність протиріч. p>
Ви побачите, що для виконання цих двох завдань буде потрібновикористовувати механізм, дуже близький до тих, які ми розглядали приописі систем обробки правдоподібності в главах 17 і 19. p>
А.4.2. Онтологічний аналіз і представлення знань p>
Наступний етап - визначити, з якими видами даних нам доведетьсямати справу при вирішенні цього класу головоломок. Які об'єкти представляютьінтерес у світі правдолюбців і брехунів і якими атрибутами ці об'єктихарактеризуються? p>
Мабуть, для вирішення завдань цього класу нам доведеться мати справуз такими об'єктами.
. Персонажі, вимовляють репліки. Вимовна репліка характеризує самого персонажа, або інших персонажів, або і тих, і інших. Персонаж може бути або правдолюбцем, або брехуном.
. Твердження, що міститься в репліці. Це твердження може бути або цілком брехливим, або абсолютно правдивим (істинним). P>
Трохи поміркувавши, ми прийдемо до висновку, що існують ще й іншіоб'єкти, які необхідно враховувати при вирішенні завдань цього класу.
. існує середовище (світ), яка характеризується сукупністю наших припущень. Наприклад, існує світ, в якому ми припустили, що А p>
- правдолюб, а отже, висловлене ним твердження (або затвердження) істинно. Це припущення тягне за собою різні наслідки, які утворюють контекст даного гіпотетичного світу.
. Існує ще щось, що ми назвемо причинами, або причинними зв'язками p>
(reasons), які пов'язують висловлювання про той чи інший гіпотетичному світі. Якщо А стверджує, що «У - брехун», і ми припускаємо, що А - правдолюб, то це твердження є причиною (підставою), за якою ми можемо стверджувати, що в даному гіпотетичному світі У - брехун, а отже, всі твердження, які містяться в репліках, вимовних В, брехливі. Відстежуючи такі зв'язки між висловлюваннями, можна відновити початковий стан проблеми, якщо в результаті міркувань ми прийдемо до протиріччя. P>
Природно, що ці об'єкти можна представляти в програмі по -різному. Онтологічний аналіз практично ніколи не призводить доєдиного способу представлення. Для першої версії CLIPS-програми явибрав наступне подання описаних об'єктів: p>
;; Об'єкт statement (вислів) пов'язаний з певним p>
;; персонажем (поле speaker). p>
;; Висловлювання містить твердження (поле claim). p>
;; Висловлювання має підставу - причину (поле reason), p>
;; за якою йому можна довіряти, p>
;; та тег (tag) - це може бути довільний p>
;; ідентифікатор. p>
(deftemplate statement p>
(field speaker (type SYMBOL)) p>
(multifield claim (type SYMBOL)) p>
(multifield reason (type INTEGER) (default 0)) p>
(field tag (type INTEGER) (default 1)) p >
) p>
Замість того, щоб фокусувати вніменіе на персонажі, у главу кутая ставлю вимовних їм репліку (вислів), а персонаж відношу доатрибутами висловлювання. Я хочу забезпечити можливість представитипевну головоломку у вигляді примірника шаблону, наведеного нижче. p>
(statement (speaker A) (claim FA)) p>
Цей шаблон можна перевести на «людський» мова наступнимтак: p>
«Існує вислів, зроблене персонажем А, в котромустверджується, що А брехун і тег цього висловлювання за умовчанням отримуєзначення 1 ». Зверніть увагу на те, що в полі reason також будевстановлено значення за замовчуванням (це значення дорівнює 0), тобто ми можемоприпустити, що ніяких попередніх висловлювань, які могли бпідтвердити дане, в цьому завданні не було. p>
Зверніть увагу, що поля claim і reason мають кваліфікаторовmultifield, оскільки вони можуть містити кілька елементів даних (більшедокладно про це читайте у Посібнику користувача). p>
Однак недостатньо тільки уявити в програмі висловиперсонажів - нам знадобитися також виявити суть що містяться в нихтверджень. Далі, прийнявши певне припущення про правдивість абобрехню персонажа, якому належить вислів, можна побудуватигіпотезу про істинність або брехню цього твердження. З кожним такимзатвердженням зв'яжемо унікальний числовий ідентифікатор. p>
;; Твердження, зміст якого, наприклад, p>
;; полягає в наступному, p>
;; Т А. . . . означає, що А правдолюб; p>
;; F А. . . . означає, що А брехун. p>
;; Затвердження може мати під собою p>
;; підставу (reason) - зазвичай це тег p>
;; висловлювання (об'єкта statement ) або тег p>
;; іншого твердження (об'єкта claim). p>
;; Затвердження також характеризується ознакою scope, p>
;; який може приймати значення «істина» або «брехня». p>
(deftemplate claim p>
(multifield content (type SYMBOL)) p>
(multifield reason (type INTEGER) (default 0))
(field scope (type SYMBOL)) p>
) p>
Наприклад, розкривши зміст наведеного вище висловлювання наприпускаєложении, що А говорить правду, отримаємо наступні твердження (об'єктclaim): p>
(claim (content FA) (reason 1) (scope truth )). p>
Таким чином, об'єкт claim успадковує вміст від об'єктаstatement. Останній стає обгрунтуванням (reason) дане твердження.
Поле scope об'єкта claim приймає значення припущення про правдивість абобрехню цього вислову. p>
Ще нам буде потрібно подання в програмі того світу (world), вякому ми зараз знаходимося. Об'єкти world породжуються в момент,коли ми формуємо певні припущення. Потрібно мати можливістьрозрізняти різні безлічі припущень та ідентифікувати їх у програмів той момент, коли процес роздумів приводить нас до протиріччя.
Наприклад, протиріччя між висловлюваннями Т (А) і F (A) відсутня, якщовони правдиві в різних світах, тобто при різних припущеннях. Якщо у вас єсумніви на цей рахунок, поверніться до неї знову до прикладів на самому початку розділу
А.4. P>
Світи будемо представляти у програмі в такий спосіб: p>
;; Об'єкт world представляє контекст, p>
;; сформований певними припущеннями p> < p>;; про правдивість або брехню персонажів. p>
;; Об'єкт має унікальний ідентифікатор у полі tag, p>
;; а сенс допущення - істинність або брехливість - p>
;; фіксується в поле scope. p>
(deftemplate world p>
(field tag (type INTEGER) (default 1)) p>
(field scope (type SYMBOL ) (default truth)) p>
) p>
Зверніть увагу на те, що при вказаних в шаблоні значеннях позамовчуванням ми можемо починати кожен процес обчислень з об'єкта world,що має в полі значення 1, причому цей «світ» можна заселити висловлюваннямиперсонажів, яких ми вважаємо імовірно правдолюбцем. Такимчином можна ініціалізувати базу фактів the-facts для завдання Р0наступним чином: p>
;; Твердження, що А брехун. p>
(deffacts the-facts p>
(world) p>
(statement ( speaker A) (claim FA)) p>
) p>
Якщо цей оператор deffacts буде включений в той же файл, що іоголошення шаблонів (а також правила, про які йтиметься нижче), то післязавантаження цього файлу в середу CLIPS нам знадобиться для запуску програмидати тільки команду reset. p>
А.4.3. Розробка правил p>
У цьому розділі ми розглянемо набір правил, який допомагаєвпоратися з вироджених формулюванням Р0 задачі про брехуна й правдолюба.
Перші два правила, unwrap-true і unwrap-false, витягають вміствисловлювання на припущенні, що персонаж, якому належитьвислів, є відповідно правдолюбцем або брехуном, і на цьомупідставі формують об'єкт claim. p>
;; Витягання вмісту висловлювання. p>
(defrule unwrap-true p>
(world (tag? N) (scope truth))
(statement (speaker? X) (claim $? Y) (tag? N)) p>
=> p>
(assert (claim (content T? X ) (reason? N) p>
(scope truth ))) p>
(assert (claim (content $? Y) (reason? M) p>
(scope truth ))) p>
) p>
(defrule unwrap-false p>
(world (tag? N) (scope falsity)) p>
(statement (speaker? X) (claim $? Y) (tag? N)) p>
=> p>
(assert (claim (content F? X) (reason? N) p>
(scope falsity ))) p>
(assert (claim (content NOT $? Y) (reason? N) p>
(scope falsity)) p>
) p>
У кожному з наведених правил перший оператор в умовній частиніробить припущення відповідно про правдивість або брехню персонажа, адругий оператор в заключній частині правила поширює припущенняна що формуються затвердження - об'єкти claim. p