ПЕРЕЛІК ДИСЦИПЛІН:
  • Адміністративне право
  • Арбітражний процес
  • Архітектура
  • Астрологія
  • Астрономія
  • Банківська справа
  • Безпека життєдіяльності
  • Біографії
  • Біологія
  • Біологія і хімія
  • Ботаніка та сільське гос-во
  • Бухгалтерський облік і аудит
  • Валютні відносини
  • Ветеринарія
  • Військова кафедра
  • Географія
  • Геодезія
  • Геологія
  • Етика
  • Держава і право
  • Цивільне право і процес
  • Діловодство
  • Гроші та кредит
  • Природничі науки
  • Журналістика
  • Екологія
  • Видавнича справа та поліграфія
  • Інвестиції
  • Іноземна мова
  • Інформатика
  • Інформатика, програмування
  • Юрист по наследству
  • Історичні особистості
  • Історія
  • Історія техніки
  • Кибернетика
  • Комунікації і зв'язок
  • Комп'ютерні науки
  • Косметологія
  • Короткий зміст творів
  • Криміналістика
  • Кримінологія
  • Криптология
  • Кулінарія
  • Культура і мистецтво
  • Культурологія
  • Російська література
  • Література і російська мова
  • Логіка
  • Логістика
  • Маркетинг
  • Математика
  • Медицина, здоров'я
  • Медичні науки
  • Міжнародне публічне право
  • Міжнародне приватне право
  • Міжнародні відносини
  • Менеджмент
  • Металургія
  • Москвоведение
  • Мовознавство
  • Музика
  • Муніципальне право
  • Податки, оподаткування
  •  
    Бесплатные рефераты
     

     

     

     

     

     

         
     
    Програмування на мові CLIPS
         

     

    Інформатика, програмування

    Міністерство загальної та професійної освіти

    Російської Федерації

    Кубанський Державний Технологічний Університет

    Курсова робота на тему:

    ПРОГРАМУВАННЯ НА МОВІ CLIPS

    Роботу виконав студент групи 01 -

    КТ-22 факультету

    КТАС Мариненко А.

    А. < p> Краснодар 2001

    СОДЕРАЖНІЕ

    . А.1. Коротка історія CLIPS 3

    . А.2. Правила та функції в CLIPS

    3

    . А.3. Обектно-орієнтовані засоби в CLIPS

    10

    . А.4. Завдання «правдолюбці і брехуни» 15

    . А.5 Стиль програмування мовою CLIPS 66

    А.1. КОРОТКА ІСТОРІЯ CLIPS

    Назва мови CLIPS - абревіатура від C Language Integrated
    Production System. Мова був розроблений у центрі космічних досліджень
    NASA

    (NASA's Johnson Space Center) в середині 1980-х років і багато в чомусхожий з мовами, створеними на базі LIPS, зокрема OPS5 і ART.
    Використання C як мова реалізації пояснюється тим, що компілятор
    LISP не підтримується частиною поширених платформ, а також складністюінтеграції LISP-коду в додатки, які використовують відмінний від LIPS мовупрограмування. Хоча в той час на ринку вже з'явилися програмнізасоби для задач штучного інтелекту, розроблені на мові C,фахівці з NASA вирішили створити такий продукт самостійно.
    Розроблена ними система в цей час доступна у всьому світі, і потрібносказати, що за своїми можливостями вона не поступається багатьом набагато більшедорогих комерційних продуктів.

    Перша версія є, по суті, інтерпретатор породжуютьправил. Процедурне мова та об'єктивно-орієнтоване розширення CLIPS
    Object-Oriented Language (COOL) були включені в цей програмний продукттільки в 1990-х роках. Існуюча в даний час версія можеексплуатуватися на платформах UNIX, DOS, Windows і Macintosh. Вонає добре документованим загальнодоступним програмним продуктом ідоступна по мережі FTR з безлічі університетських сайтів. Вихідний кодпрограмного пакета CLIPS поширюється абсолютно вільно і його можнавстановити на будь-якій платформі, яка підтримує стандартний компілятор мови
    C. Однак я б рекомендував користуватися офіційною версією дляпевної платформи, оскільки такі версії оснащені для користувачаінтерфейсом, що включає меню команд і вбудований редактор.

    Це Додаток організовано наступним чином. У розділі А.2.розглянуті основні функції мови, опис правил та процедурного мови. Урозділі А.3. представлені методи роботи з об'єктами і показано, яквикористовувати їх у поєднанні з правилами та процедурами. У розділі А.4.описано приклад, що демонструє деякі прийоми програмування правил, ау розділі А.5. резюмуються характеристики цього програмного продукту іпропонуються теми для більш поглибленого вивчення.

    А.2. ПРАВИЛА І ФУНКЦІЇ У CLIPS

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

    Основними компонентами мови опису правил є база фактів
    (fact base) і база правил (rule base). На них покладаються наступніфункції:
    - база фактів являє собою початковий стан проблеми;
    - база правил містить оператори, які перетворять стан проблеми, приводячи його до рішення.

    Машина логічного висновку CLIPS зіставляє ці факти і правила із'ясовує, які з правил можна активізувати. Це виконується циклічно,причому кожен цикл складається з трьох кроків:
    1) зіставлення фактів і правил;
    2) вибір правила, що підлягає активізації;
    3) виконання дій, передбачених правилом.

    Такий трехшаговий циклічний процес іноді називають «цикломрозпізнавання - дія »


    А.2.1. Факти

    Відразу після запуску CLIPS-додатки на виконання на екраніз'явиться запрошення, яке повідомляє користувача, що він працює зінтерпретатором.

    CLIPS>

    У режимі інтерпретатора користувач може використовувати безлічкоманд. Факти можна включити в базу фактів прямо з командного рядка здопомогою команди assert, наприклад:

    CLIPS> (assert (today is Sunday))

    CLIPS> (assert (weather is warm))

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

    Для створення переліку фактів, що є в базі, використовується командаfacts:

    CLIPS> (facts) f-1 (today is Sunday) f-2 (weather is warm)

    В останніх версіях CLIPS, зокрема, в тій, яка працює вопераційному середовищі Windows, такі команди як facts, можна викликати задопомогою меню.

    Для видалення фактів з бази використовується команда retract.

    CLIPS> (retract 1)

    CLIPS> (facts) f-0 (today is Sunday)

    Ці ж команди, assert і retract, використовуються в виконуваної частиниправил (укладанні правила) і з їх допомогою виконується програмнезміна бази фактів. Часто доводиться користуватися і іншою командоюінтерпретатора, clear, яка очищає базу фактів (як правило, цякоманда доступна в одному з випадаючих меню).

    CLIPS> (clear)

    CLIPS> (facts)

    У тексті програми факти можна включати до бази не по поодинці, ацілим масивом. Для цього в CLIPS є команда deffacts.

    (deffacts today

    (today is Sunday)

    (weather is warm)

    )

    Вираз deffacts має формат, аналогічний виразів в мові
    LISP. Вираз починається з команди deffacts, потім наводиться ім'я спискуфактів, які програмісти збирається визначити (у нашому прикладі --today), а за ним ідуть елементи списку, причому їх кількість необмежується. Цей масив фактів можна потім видалити з бази командоюundeffacts.

    CLIPS> (undeffacts today)

    Вираз deffacts можна вводити і в командний рядокінтерпретатора, але краще записати його в текстовий файл за допомогою редактора
    CLIPS або будь-якого іншого текстового редактора. Завантажити цей файл уНадалі можна за допомогою команди в меню File або з командного рядка.

    CLIPS> (load "my file")

    Однак після завантаження файлу факти не передаються відразу ж в базуфактів CLIPS. Команда deffacts просто вказує інтерпретатору, щоіснує масив today, який містить багато фактів. Власнезавантаження виконується командою reset.

    CLIPS> (reset)

    Команда reset спочатку очищає базу фактів, а потім включає в неїфакти з усіх раніше завантажених масивів. Вона також додає до базиєдиний системно певний факт: f-0 (initial-fact)

    Це робиться за замовчуванням, оскільки іноді має сенс включити допрограму правило start rule, яке можна порівнювати із цим фактомі дозволить виконати будь-які нестандартні ініціалізувалися операції.
    Однак включати таке правило в програму чи ні - справа програміста.

    Можна простежити, як виконується команда reset, якщо передвиконанням наведених вище команд встановити режим стеження середовищарозробки. Для цього потрібно викликати команду Watch з меню Execution івстановити в ній прапорець Facts.


    А.2.2. Правила

    У мові CLIPS правила мають наступний формат:

    (defrule

    <необов'язковий коментар>

    <необов'язкове оголошення>

    <предпосилка_1>

    ... ... ... ... ... ....

    <предпосилка_m>

    =>

    <действіе_1>

    ... ... ... ... ... ... ..

    <предпосилка_n>

    )

    Наприклад:

    ( defrule chores

    "Things to do on Sunday"

    (salience 10)

    (today is Sunday)

    (weather is warm )

    =>

    (assert (wash car))

    (assert (chop wood)

    ) < p> У цьому прикладі Chores - довільно обране ім'я правила.
    Передумови в умовній частині правила

    (today is Sunday)

    (weather is warm) зіставляються потім інтерпретатором з базою фактів, а дії,перераховані в виконуваної частини правила (вона починається після парисимволів =>), вставлять в базу два факти

    (wash car)

    (chop wood) у випадку, якщо правило буде активізовано. Наведений в текстіправила коментар

    "Things to do on Sunday"

    "Що робити в неділю" допоможе в подальшому згадати, навіщо це правило включено впрограму. Вираз

    (salience 10) вказує на ступінь важливості правила. Нехай наприклад, у програміє інше правило

    (defrule fun

    "Better things to do on Sunday"

    (salience 100)

    (today is Sunday )

    (weather is warm)

    =>

    (assert (drink beer))

    (assert (play guitar))

    )

    Оскільки передумови обох правил однакові, то при виконанніобумовлених умов вони будуть «конкурувати» за увагу інтерпретатора.
    Перевагу буде віддано правилом, у якого параметр salience має більшвисоке значення, в даному випадку - правилом fun. Параметри salience можебути присвоєно цілочисельне будь-яке значення в діапазоні [-10000, 10000].
    Якщо параметр salience у визначенні правила опущений, йому за замовчуваннямприсвоюється значення 0.

    Зазвичай у визначенні правила присутні і змінні. Якщо,наприклад, правило

    (defrule pick-a-chore

    "Allocating chores to days"

    (today is? day)

    (chore is? job)

    =>

    (assert (do? job on? day))

    ) буде порівнювати із фактами < p> (today is Sunday)

    (chore is carwash) то у випадку активізації воно включить в базу новий факт

    (do carwash on Sunday).

    Аналогічно, правило

    (defrule drop-a-chore

    "Allocating chores to days"

    (today is? day)

    ? chore

    (retract? chore)

    ) скасує виконання робіт по будинку (a chore). Зверніть увагу на те,що обидва екземпляри змінної? day повинні отримати одне і те ж значення.
    Змінна? Chore в результаті зіставлення повинна отримати посилання нафакт, який ми збираємося виключити з бази. Таким чином, якщо цеправило буде порівнювати із базою фактів, в якій містяться

    (today is Sunday)

    (do carwash on Sunday) то при активізації правила з бази буде видалено факт

    (do carwash on Sunday)

    З подробицями виконання процесу сосоставленія в інтерпретаторі
    CLIPS ви зможете познайомитися у Посібнику користувача, а тут тількивідзначимо, що факт

    (do carwash on Sunday) буде підтверджено будь-яким з представлених нижче зразків

    (do?? Sunday)

    (do? on? )

    (do? on? when)

    (do $?)

    (do $? Sunday)

    (do? chore $? when)

    Врахуйте, що префікс $? є ознакою сегментної змінної,яка буде пов'язана з сегментом списку. Наприклад, у наведеному вищеприкладі змінна $? when буде пов'язана з

    (on Sunday)

    Якщо за префіксами? і $? не слід ім'я зміною, вонирозглядаються як універсальні символи підстановки, якимвідповідно може бути підтверджено будь-який елемент або сегмент списку.


    А.2.3. Спостереження за процесом інтерпретації

    Тепер на простому прикладі познайомимося з можливостями, якінадає середовище розробки CLIPS в частині налагодження програми, що складаєтьсяз правил і фактів. Введіть у текстовий файл правило, а потім завантажтеце фото в середу CLIPS.

    (defrule start

    (initial-fact)

    =>

    (printout t "hello, world "crlf)

    )

    Виконайте команду reset. Для цього введіть цю команду в командномурядку інтерпретатора

    CLIPS> (reset)

    Або виберіть у меню команду Execution => Reset, або натисніть
    (останні два варіанти можливі у версії, яка працює під Windows).

    Потім запустіть інтерпретатор. Для цього введіть цю команду run вкомандний рядок інтерпретатора

    CLIPS> (run)

    Або виберіть у меню команду Execution => Run, або натисніть
    (останні два варіанти можливі у версії, яка працює під Windows).

    У відповідь програма повинна вивести повідомлення hello, world, знайомевсім програмістам світу. Для повторного запуску програми повторіть командиreset та run.

    Якщо в меню Execution => Watch раніше був встановлений прапорець Rules абоперед запуском програми на виконання ви ввели в командну стоку командуwatch rules, то на екрані з'явитися результат транссіровкі процесувиконання

    CLIPS> (run)

    FIRE 1 start: f-0 hello, world

    У цьому повідомленні в рядку, що починається з FIRE, виведена інформаціяпро активізовану правилі: start - це ім'я правила, а f-0 - ім'я факту,який «задовольнив» умова в цьому правилі. Команда watch дозволяєорганізувати кілька різних режимів трасування, з деталями яких виможете ознайомитися в посібнику користувача. Якщо перед запускомпрограми ви ввели

    CLIPS> (dribble-on "dribble.dp")

    TRUE

    Те виведений протокол трасування буде збережений у файліdribble.clp. Збереження протоколу припиниться після введення команда

    CLIPS> (dribble-off)

    TRUE

    Це дуже зручна опція, особливо на етапі освоєння мови.

    А.2.4. Використання шаблонів

    Для визначення фактів можна використовувати не тільки списковіструктури, а й шаблони, які нагадують прості записи. (Шаблони в
    CLIPS не мають нічого спільного з шаблонами C + +.) Шаблон виглядає приблизнотак:

    (deftemplate student "a student record"

    (slot name (type STRING))

    (slot age (type NUMBER) (default 18) )

    )

    Кожне визначення шаблона складається з довільного імені шаблону,необов'язкового коментаря і деякої кількості визначень слотів.
    Слот включає поле даних, наприклад name, і тип даних, наприклад STRING.
    Можна вказати і значення за замовчуванням, як у наведеному вище прикладі.

    Якщо в програму включено наведене вище визначення шаблону, товираз

    (deffacts students

    (student (name fred))

    (student (name freda) (age 19))

    ) призведе до того, що в базу фактів після виконання команди resetбуде додано

    (student (name fred) (age 18))

    (student (name freda) (age 19))

    А.2.5. Визначення функцій

    У мові CLIPS функції конструюються приблизно так само, як у мові
    LIPS. Суттєва відмінність полягає в тому, що змінні повинні матипрефікс?, як це показано в наведеному нижче визначенні.

    (deffunction hypotenuse (? a? b)

    (sqrt (+ (*? a? a) (*? b? b))

    )

    Формат визначення функції в CLIPS наступний:

    (deffunction (... ..)

    ... ... ... ... ....

    )

    Функція повертає результат останнього виразу в списку.

    Іноді виконання функції має побічні ефекти, як у наведеномунижче прикладі.

    (deffunction init (? day)

    (reset)

    (assert (today is? day))

    )

    В результаті після запуску функції на виконання командою

    CLIPS> (init Sunday)

    Буде виконана команда reset і, отже, очищена база фактів,а потім у неї буде включений новий факт (today is Sunday).

    А.3. Об'єктно-орієнтоване ЗАСОБИ У CLIPS

    Використання об'єктно-орієнтованих засобів в CLIPS дозволяєзначно спростити програмування правил, оскільки для оновленняданих можна застосовувати механізм передачі та обробки повідомлень методамикласів. У цьому розділі ми продемонструємо, як це робиться на прикладі,який моделює правила поводження з напівавтоматичним пістолетом.

    Насамперед визначимо клас pistol, в якому будуть перерахованівластивості, необхідні для моделювання.

    (defclass pistol

    (is-a USER)

    (role concrete)

    (pattern - match reactive)

    (slot safety (type SYMBOL) (create-accessor read-write))

    (slot slide (type SYMBOL) (create-accessor read-write))

    (slot hammer (type SYMBOL) (create-accessor read-write))

    (slot chamber (type INTEGER) (create-accessor read-write)) < p> (slot magazine (type SYMBOL) (create-accessor read-write))

    (slot rounds (type INTEGER) (create-accessor read-write))

    )

    Перші три слота - системні. Вони потрібні об'єктно-орієнтованоїнадбудові CLIPS (COOL-CLIPS object-oriented language). Ці слоти COOLсповіщають про те, що
    . pistol - це призначений для користувача клас;
    . pistol є конкретним класом, тобто можливе створення екземплярів цього класу (альтернативний тип - абстрактний клас, який відіграє ту ж роль, що і віртуальний клас в C ++);< br>. екземпляри класу pistol можуть бути використані в якості об'єктів даних, які можна зіставляти з умовами в правилах і використовувати в діях, визначених правилами.

    Наступні п'ять слотів представляють властивості і члени даних класу:
    . слот safety (запобіжник) може містити символ on або off;
    . слот slide (затвор) може містити значення forward або back, тобто зберігає інформацію про положення затвора;
    . слот hammer (курок) містить інформацію про стан курка, або back down;
    . слот chamber (патронник) містить значення 1 або 0, в залежності від того, чи є патрон у патроннику;
    . слот magazine (обойма) може містити значення in чи out, залежно від того, вставлена чи обойма;
    . слот rounds (патрони) містить поточну кількість патронів в обоймі.

    Для того щоб мати можливість записувати в слот нове значенняабо зчитувати поточне, потрібно дозволити формування відповідних функційдоступу через фацет create-accessor. Тепер сформуємо екземпляр класуpistol за допомогою наступного виразу:

    (definstances pistols

    (PPK of pistol

    (safety on)

    (slide forward)

    (hammer down)

    (chamber 0)

    (magazine out)

    (rounds 6)

    )

    )

    Цей екземпляр, PPK, правильно укладений - обойма вийнята з рукоятки,пістолет встановлений на запобіжник, затвор у передньому положенні, курокопущений, а патронник порожній. В обоймі є 6 патронів.

    Тепер, маючи в програмі визначення класу і сформувавши примірниккласу, розробимо правила і обробники повідомлень, за допомогою якихможна описати окремі операції поводження з пістолетом і стрільби з нього.
    Для цього спочатку розробимо шаблон завдання. Бажано відстежувати дваречі:
    . чи є патрон у патроннику;
    . зроблений чи постріл.

    Для цього можна використовувати наступний шаблон:

    (deftemplate range-test

    (field check (type SYMBOL) (default no))

    (field fired (type SYMBOL) (default no))

    )

    Перше правило буде встановлювати в робочу пам'ять програм завданняrange-test.

    (defrule start

    (initial-fact)

    =>

    (assert (range-test))

    )

    При активізації цього правила в робочу пам'ять буде додано

    (range-test (check no) (fired no))

    Наступнийющіе три правила будуть перевіряти чи правильно спорядженийпістолет.

    (defrule check

    (object (name [PPK]) (safety on) (magazine out)

    ? T

    (send [PPK] clear)

    (modify? T (check yes)

    )

    Правило check полягає в тому, що якщо пістолет стоїть назапобіжнику (safety on), обойма вийнята (magazine out) і пістолет не бувперевірено, то потрібно очистити патронник і перевірити, чи немає в ньому патрона.
    Оброблювач повідомлень clear для класу pistol буде виглядати наступнимтак:

    (defmassage-handler pistol clear ()

    (dynamic-put chamber 0)

    (ppinstance)

    )

    У першому рядку оголошується, що clear є обрабртчікомповідомлення для класу pistol, причому цей обробник не вимагає передачіаргументів. Оператор у другому рядку «очищає» патронник. Присвоєннявиконується незалежно від того, яке поточне значення має слот chamber,
    - 0 або 1. Оператор в третьому рядку вимагає, щоб примірник розпечатавінформацію про поточний стан своїх слотів.

    У наступних двох правилах обробляються ситуації, коли пістолетспоряджений неправильно, - не встановлений на запобіжник, чи в неївставлена обойма. Правило correct1 встановлює пістолет назапобіжник, а правило correct2 витягує з нього обойму.

    (defrule correct1

    (object (name [PPK]) (safety off))

    (range - test (check no))

    =>

    (send [PPK] safety on)

    )

    (defrule correct2

    (object (name [PPK]) (safety on) (magazine in))

    (range-test (check no))

    =>

    (send [PPK] drop)

    )

    Як при розробці попереднього правила, нам знадобляться обробникиповідомлень safety та drop.

    (defmessage-handler pistol safety (? on-off)

    (dynamic-put safety? on-off)

    (if (eq? on-off on) then (dynamic-put hammer down)

    )

    )

    Оброблювач повідомлення safety приймає єдиний аргумент, якийможе мати лише два символічних значення on або off. В іншомувипадку нам довелося б розробити два обробника: один для повідомленняsafety-on, а інший - для повідомлення safety-off. Врахуйте, що в деякихмоделях, наприклад в Walther PPK, при установці пістолета на запобіжникпатронник очищується автоматично.

    Оброблювач повідомлення drop просто витягує обойму з пістолета.

    (defmessage-handler pistol drop ()

    (dynamic-put magazine out)

    )

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

    (defrule mag-in

    (object (name [PPK]) (safety on) (magazine out))

    (range -test (fired no) (check yes))

    =>

    (send [PPK] seat)

    )

    Оброблювач повідомлення seat виконує дії, протилежні тим,які виконує обробник drop.

    (defmessage-handler pistol seat ()

    (dynamic-put magazine in)

    )

    Можна було б, звичайно, включити в програму і наступне правило mag -in:

    (defrule mag-in

    ? gun

    (modify? gun (magazine in)

    ) але це суперечить одному з принципів об'єктно-орієнтованогопрограмування, який свідчить, що об'єкт повинен самостійнообробляти що містяться в ньому. Наступне правило забезпечуєспорядження обойми патронами:

    (defrule load

    (object (name [PPK]) (magazine in) (chamber 0))

    =>

    (send [PPK] rack)

    )

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

    (defmessage-handler pistol rack ()

    (if (> (dynamic-get rounds) 0) then (dynamic -put chamber 1)

    (dynamic-put rounds (- (dynamic-get rounds) 1))

    (dynamic-put slide forward) else (dynamic-put chamber 0)

    (dynamic-put slide back)

    )

    )

    У цьому обробнику забезпечується досилання патрона в патронник у томувипадку, якщо в обоймі є патрони. Наступне правило готуєпістолет до стрільби, знімаючи його з запобіжника. Зверніть увагу на те,що в ньому повторно використовується повідомлення safety, але на цей раз заргументом off.

    (defrule ready

    (object (name [PPK]) (chamber 1))

    =>

    ( send [PPK] safety off)

    )

    Правило fire виконує стрілянину.

    (defrule fire

    (object (name [PPK ]) (safety off);

    ? T

    (if (eq (send [PPK] fire) TRUE) then (modify? T (fired yes )))

    )

    Зверніть увагу, що в цьому правилі використовується обробникповідомлення, яке повертає значення. Аналізуючи його, можна з'ясувати,зроблений чи постріл, тобто виконана чи насправді та операція,яка «закріплена» за цим повідомленням. Якщо у патроннику був патрон іпістолет був знятий з запобіжника, то обробник повідомлення поверне значення
    TRUE (після того, як виведе на екран BANG!). В іншому випадку він поверне
    FALSE (після того, як виведе на екран click).

    (defmessage-handler pistol fire ()

    (if (and

    (eq (dynamic - get chamber) 1)

    (eq (dynamic-get safety) off)

    ) then (printout t crlf "BANG!" t crlf)

    TRUE else (printout t crlf "click" t crlf)

    FALSE

    )

    )

    Нехай вас не бентежить, що в обробнику повідомлення аналізуєтьсяумова, яку вже було проаналізовано правилом, надіславши повідомлення
    (в даному випадку мова йде про умови safety off). Справа в тому, що одне йтеж повідомлення може надсилатися різними правилами і немає жодної гарантії,що в кожному з них буде перевірятися цю умову.

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

    (defrule unready

    (object (name [PPK]) (safety off))

    (range-test (fired yes))

    =>

    (send [PPK] safety on)

    )

    Наступна операція - вийняти обойму. Зверніть увагу, що в ньому мизнову звертаємося до обробникові повідомлення drop.

    (defrule drop

    (object (name [PPK]) (safety on))

    (range-test (fired yes))

    =>

    (send [PPK] drop)

    )

    Останнє правило викидає патрон з патронника, викликаючиобробник повідомлення clear.

    (defrule unload

    (object (name [PPK]) (safety on) (magazine out)) range-test (fired yes))

    =>

    (send [PPK] clear)

    )

    У цьому пріемре було продемонстровано, як в рамках єдиної CLIPSпрограми "уживаються" правила та об'єкти. Правила керують ходомобчислень, але деякі операції об'єкти виконують і самостійно,отримавши "вказівку" (повідомлення) від правил. Об'єкти не являються резидентамиробочої пам'яті, але члени лівій частині правил (умов) можуть бутизіставлені з вмістом їх слотів. Стан об'єктів може змінитися івнаслідок побічних ефектів активізації правил, але я вважаю, що кращенадати об'єктам можливість самостійно виконувати маніпуляції зщо зберігаються в них даними у відповідь на що надходять від правил повідомлення.
    Об'єкти не можуть самостійно активізувати правила, але їх обробникиповідомлення можуть "повертати" певну інформацію про результати, якавикористовується для керування логікою виконання дій у правій частиніправил.


    А.4. ЗАДАЧА "правдолюбці та брехунів"

    Для того, щоб продемонструвати вам можливості мови CLIPS, явибрав головоломку, а не завдання з практики застосування експертних систем. Уголоволомці вирішується одне із завдань, що виникають на острові, населеномумешканцями двох категорій: одні завжди говорять правду (назвемо їхправдолюбцем), а інші завжди брешуть (їх, природно, назвемо брехунами).
    Безліч таких головоломок ви можете зустріти на сторінкахцікавої книги Раймонда Смуляна «What is the Name of this Book?». Нижченаведені різні завдання з цієї серії.

    Р1. Зустрічаються дві людини, А і В, один з яких правдолюб, адругий - брехун. А каже: «Або я брехун, або У правдолюб». Хто з цихдвох правдолюб, а хто брехун?

    Р2. Зустрічаються три людини, А, В і С. А та каже: «Всі ми брехуни»,а В відповідає: «Тільки один з нас правдолюб». Хто з цих трьохправдолюб, а хто брехун?

    Р3. Зустрічаються три людини, А, В і С. Четвертий проходячи мимо,А запитує: «Скільки правдолюбців серед вас?» А відповідає невизначено, а
    В відповідає: «А сказав, що серед нас є один правдолюб». Тут у розмовувступає С і додає: «У бреше!» ким на вашу думку є В і С?

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

    А.4.1. Аналіз проблеми

    Першим етапом будь-якого програмного проекту є аналіз розв'язуваноїпроблеми. Експерт повинен уміти вирішити проблему, а інженер по знаннях повиненрозібратися, як саме було отримано рішення. При вирішенні нашого завдання вамдоведеться виступити в обох іпостасях.

    Запропоновані головоломки можна вирішити, систематично аналізуючи,що станеться, коли персонаж, що говорить репліку, є правдолюбцем, ащо, якщо він - брехун. Позначимо через Т (А) факт, що А говорить правду, іотже, є правдолюбцем, а через F (А) - факт, що А бреше і,отже, є брехуном.

    Розглянемо спочатку головоломку Р1. Припустимо, що А говоритьправду. Тоді з його репліки випливає, що або А брехун, або У правдолюб.
    Формально це можна представити в наступному вигляді:

    Т (А) => F (А) v Т (В)

    Оскільки А не може одночасно бути і брехуном, і правдолюбцем, тозвідси випливає

    Т (А) => Т (В)

    Аналогічно можна записати й інший варіант. Припустимо, що А бреше:

    F (A )=>-( F (A) v Т (В )).

    Спростимо цей вираз:

    F (A) =>-F (A) ^-Т (В) або F (A) => Т (А) ^ F (B).

    Порівнюючи обидва варіанти, неважко прийти до висновку, що толкоостанній правильне, оскільки в першому варіанті ми прийшли до висновку,суперечить умовам (не можуть бути правдолюбцем одночасно А і В).

    Таким чином, розглянута проблема відноситься до типу таких,вирішення яких знаходиться в результаті аналізу висновків, що випливають ізпевних припущень, і пошуку в них протиріч (або відсутностітаких). Ми припускаємо, що певний персонаж говорить правду, апотім дивимося, чи можна в цьому випадку так розподілити «ролі» іншихперсонажів, що не будуть порушені умови, сформульовані в репліках. Нажаргоні, прийнятому в математичне логікою, припущення про правдивість абобрехню безлічі висловлювань називається інтерпретацією, а варіантнесуперечливого присвоєння значень істинності елементам множини --моделлю.

    Однак наші головоломки включають і щось таке, що виходить за рамки типовихпроблем математичної логіки, оскільки репліки в них може вимовляти неодин персонаж (як у головоломці Р2), а на репліку одного персонажа можепослідувати у відповідь репліка іншого (як у головоломці Р3). У вихідноїверсії програми, яку ми розглянемо нижче, це ускладнення відсутня,але в остаточній воно має бути врахована. Ми покажемо, що поступовеускладнення програми досить добре узгоджується з використанням правил.

    На практиці виявляється, що в першій версії програми Кращий часскористатися «виродженим» варіантом проблеми, тобто постаратися вирішитиїї в тривіальний вигляді, який, проте, несе в собі багатоособливості реального випадку. Ось як це виглядає відносно нашихправдолюбців і брехунів.

    Р0. А заявляє: «Я брехун». Хто ж насправді А - брехун абоправдолюб?

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

    Є багато переваг у виборі для прототипу програми варіантуголоволомки Р0.
    . У головоломці присутній тільки один персонаж.
    . Вираз не містить логічних зв'язок, таких як І або АБО, або кванторів, на зразок квантора спільності (все) та інших.
    . Відсутня відповідь репліка.

    У той же час суттєві риси проблеми в цьому варіантіприсутні. Ми як і раніше повинні спробувати відшукати несуперечливуінтерпретацію висловлювання А, тобто повинні реалізувати два завдання,присутні в будь-яких варіантах подібної головоломки:
    . формувати альтернативні інтерпретації висловлювань;
    . аналізувати наявність протиріч.

    Ви побачите, що для виконання цих двох завдань буде потрібновикористовувати механізм, дуже близький до тих, які ми розглядали приописі систем обробки правдоподібності в главах 17 і 19.

    А.4.2. Онтологічний аналіз і представлення знань

    Наступний етап - визначити, з якими видами даних нам доведетьсямати справу при вирішенні цього класу головоломок. Які об'єкти представляютьінтерес у світі правдолюбців і брехунів і якими атрибутами ці об'єктихарактеризуються?

    Мабуть, для вирішення завдань цього класу нам доведеться мати справуз такими об'єктами.
    . Персонажі, вимовляють репліки. Вимовна репліка характеризує самого персонажа, або інших персонажів, або і тих, і інших. Персонаж може бути або правдолюбцем, або брехуном.
    . Твердження, що міститься в репліці. Це твердження може бути або цілком брехливим, або абсолютно правдивим (істинним).

    Трохи поміркувавши, ми прийдемо до висновку, що існують ще й іншіоб'єкти, які необхідно враховувати при вирішенні завдань цього класу.
    . існує середовище (світ), яка характеризується сукупністю наших припущень. Наприклад, існує світ, в якому ми припустили, що А

    - правдолюб, а отже, висловлене ним твердження (або затвердження) істинно. Це припущення тягне за собою різні наслідки, які утворюють контекст даного гіпотетичного світу.
    . Існує ще щось, що ми назвемо причинами, або причинними зв'язками

    (reasons), які пов'язують висловлювання про той чи інший гіпотетичному світі. Якщо А стверджує, що «У - брехун», і ми припускаємо, що А - правдолюб, то це твердження є причиною (підставою), за якою ми можемо стверджувати, що в даному гіпотетичному світі У - брехун, а отже, всі твердження, які містяться в репліках, вимовних В, брехливі. Відстежуючи такі зв'язки між висловлюваннями, можна відновити початковий стан проблеми, якщо в результаті міркувань ми прийдемо до протиріччя.

    Природно, що ці об'єкти можна представляти в програмі по -різному. Онтологічний аналіз практично ніколи не призводить доєдиного способу представлення. Для першої версії CLIPS-програми явибрав наступне подання описаних об'єктів:

    ;; Об'єкт statement (вислів) пов'язаний з певним

    ;; персонажем (поле speaker).

    ;; Висловлювання містить твердження (поле claim).

    ;; Висловлювання має підставу - причину (поле reason),

    ;; за якою йому можна довіряти,

    ;; та тег (tag) - це може бути довільний

    ;; ідентифікатор.

    (deftemplate statement

    (field speaker (type SYMBOL))

    (multifield claim (type SYMBOL))

    (multifield reason (type INTEGER) (default 0))

    (field tag (type INTEGER) (default 1))

    )

    Замість того, щоб фокусувати вніменіе на персонажі, у главу кутая ставлю вимовних їм репліку (вислів), а персонаж відношу доатрибутами висловлювання. Я хочу забезпечити можливість представитипевну головоломку у вигляді примірника шаблону, наведеного нижче.

    (statement (speaker A) (claim FA))

    Цей шаблон можна перевести на «людський» мова наступнимтак:

    «Існує вислів, зроблене персонажем А, в котромустверджується, що А брехун і тег цього висловлювання за умовчанням отримуєзначення 1 ». Зверніть увагу на те, що в полі reason також будевстановлено значення за замовчуванням (це значення дорівнює 0), тобто ми можемоприпустити, що ніяких попередніх висловлювань, які могли бпідтвердити дане, в цьому завданні не було.

    Зверніть увагу, що поля claim і reason мають кваліфікаторовmultifield, оскільки вони можуть містити кілька елементів даних (більшедокладно про це читайте у Посібнику користувача).

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

    ;; Твердження, зміст якого, наприклад,

    ;; полягає в наступному,

    ;; Т А. . . . означає, що А правдолюб;

    ;; F А. . . . означає, що А брехун.

    ;; Затвердження може мати під собою

    ;; підставу (reason) - зазвичай це тег

    ;; висловлювання (об'єкта statement ) або тег

    ;; іншого твердження (об'єкта claim).

    ;; Затвердження також характеризується ознакою scope,

    ;; який може приймати значення «істина» або «брехня».

    (deftemplate claim

    (multifield content (type SYMBOL))

    (multifield reason (type INTEGER) (default 0))

    (field scope (type SYMBOL))

    )

    Наприклад, розкривши зміст наведеного вище висловлювання наприпускаєложении, що А говорить правду, отримаємо наступні твердження (об'єктclaim):

    (claim (content FA) (reason 1) (scope truth )).

    Таким чином, об'єкт claim успадковує вміст від об'єктаstatement. Останній стає обгрунтуванням (reason) дане твердження.
    Поле scope об'єкта claim приймає значення припущення про правдивість абобрехню цього вислову.

    Ще нам буде потрібно подання в програмі того світу (world), вякому ми зараз знаходимося. Об'єкти world породжуються в момент,коли ми формуємо певні припущення. Потрібно мати можливістьрозрізняти різні безлічі припущень та ідентифікувати їх у програмів той момент, коли процес роздумів приводить нас до протиріччя.
    Наприклад, протиріччя між висловлюваннями Т (А) і F (A) відсутня, якщовони правдиві в різних світах, тобто при різних припущеннях. Якщо у вас єсумніви на цей рахунок, поверніться до неї знову до прикладів на самому початку розділу
    А.4.

    Світи будемо представляти у програмі в такий спосіб:

    ;; Об'єкт world представляє контекст,

    ;; сформований певними припущеннями < p>;; про правдивість або брехню персонажів.

    ;; Об'єкт має унікальний ідентифікатор у полі tag,

    ;; а сенс допущення - істинність або брехливість -

    ;; фіксується в поле scope.

    (deftemplate world

    (field tag (type INTEGER) (default 1))

    (field scope (type SYMBOL ) (default truth))

    )

    Зверніть увагу на те, що при вказаних в шаблоні значеннях позамовчуванням ми можемо починати кожен процес обчислень з об'єкта world,що має в полі значення 1, причому цей «світ» можна заселити висловлюваннямиперсонажів, яких ми вважаємо імовірно правдолюбцем. Такимчином можна ініціалізувати базу фактів the-facts для завдання Р0наступним чином:

    ;; Твердження, що А брехун.

    (deffacts the-facts

    (world)

    (statement ( speaker A) (claim FA))

    )

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


    А.4.3. Розробка правил

    У цьому розділі ми розглянемо набір правил, який допомагаєвпоратися з вироджених формулюванням Р0 задачі про брехуна й правдолюба.
    Перші два правила, unwrap-true і unwrap-false, витягають вміствисловлювання на припущенні, що персонаж, якому належитьвислів, є відповідно правдолюбцем або брехуном, і на цьомупідставі формують об'єкт claim.

    ;; Витягання вмісту висловлювання.

    (defrule unwrap-true

    (world (tag? N) (scope truth))

    (statement (speaker? X) (claim $? Y) (tag? N))

    =>

    (assert (claim (content T? X ) (reason? N)

    (scope truth )))

    (assert (claim (content $? Y) (reason? M)

    (scope truth )))

    )

    (defrule unwrap-false

    (world (tag? N) (scope falsity))

    (statement (speaker? X) (claim $? Y) (tag? N))

    =>

    (assert (claim (content F? X) (reason? N)

    (scope falsity )))

    (assert (claim (content NOT $? Y) (reason? N)

    (scope falsity))

    )

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

         
     
         
    Реферат Банк
     
    Рефераты
     
    Бесплатные рефераты
     

     

     

     

     

     

     

     
     
     
      Все права защищены. Reff.net.ua - українські реферати ! DMCA.com Protection Status