CLIPS

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

CLIPS, (від англ. C Language Integrated Production System) — програмне середовище для розробки експертних систем. Синтаксис і назва запропоновані Чарльзом Форго (Charles Forgy) в OPS (Official Production System). Перші версії CLIPS розроблялися з 1984 року в Космічному центрі Джонсона (Johnson Space Center), NASA (як альтернатива існуючій тоді системі ART*Inference), поки на початку 1990-х не було призупинено фінансування.

CLIPS є продукційною системою. Основна ідея полягає в представленні знань у вигляді такої форми:

 Правило1:
   ЯКЩО
     (виконуються умови1)
   ТОДІ
     (виконати дії1)
 Правило2:
   ЯКЩО
     (виконуються умови2)
   ТОДІ
     (виконати дії2)
...

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

CLIPS є однією з найбільш широко використовуваних інструментальних середовищ для розробки експертних систем завдяки своїй швидкості, ефективності і безкоштовності. Будучи суспільним надбанням, вона досі оновлюється і підтримується своїм початковим автором, Гері Райлі (Gary Riley).

CLIPS включає повноцінну об'єктно-орієнтовану мову COOL для написання експертних систем. Хоча вона написана на мові С, її інтерфейс набагато ближче до мови програмування LISP. Розширення можна створювати на мові С, крім того, можна CLIPS інтегрувати в програми на мові С.

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

Як і інші експертні системи, CLIPS має справу з правилами та фактами.

Факти

[ред. | ред. код]

Інформація, на підставі якої експертна система робить логічний висновок, називається фактами. В CLIPS є 2 види фактів: впорядковані і шаблонні. Шаблонні факти мають шаблон, що задається конструкцією deftemplate. Впорядковані не мають явної конструкції deftemplate, проте вона мається на увазі. Шаблонний факт нагадує структуру у мові C або запис у мові Pascal, поля називаються слотами і оголошуються конструкцією slot. Наприклад, наступний шаблон оголошує шаблон з ім'ям cars і полями: model, color і number.

 (deftemplate cars
   (slot model)
   (slot color)
   (slot number)
 )

Факти розміщуються в робочій пам'яті. Нові факти поміщаються в робочу пам'ять командою assert. Наприклад, наступна команда

 (assert (cars))

додасть в робочу пам'ять упорядкований факт cars.

Наступна команда помістить шаблонний факт з трьома атрибутами.

  (assert 
    (cars 
      (model "Audi") 
      (color Black) 
      (number "WY 2576")
    )
  )

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

Правила

[ред. | ред. код]

Знання предметної області представляються в CLIPS у вигляді правил, які мають наступну структуру:

 (умова)           {синоніми: антецеденти в логіці, 
                      ліва частина - LHS в термінах CLIPS}
 =>
 (дія)          {синоніми: консеквент в логіці,
                      права частина - RHS в термінах CLIPS}

Ліва частина правила - це умова його спрацьовування, а права частина - це ті дії, які повинні виконатися в разі виконання умов. Знак => спеціальний символ, що розділяє LHS і RHS.

Правила оголошуються за допомогою команди defrule. Приклад правила:

 (defrule search-black-audi
   (cars (model "Audi") (color Black))
   =>
   (printout t "Маємо чорний Audi!" crlf)
  )

Дане правило активується тоді, коли в робочій пам'яті з'явиться факт з атрибутами (model "Audi") і (color Black).

Активація правила не означає його виконання. Активація правила - це додавання правила в робочий список правил або agenda в CLIPS.

Щоб активовані правила виконалися потрібно виконати команду (run).

Змінні

[ред. | ред. код]

Коли факт введений у пам'ять, його поля можуть бути змінені тільки шляхом видалення та введення нового екземпляру факту, навіть команда modify послідовно видаляє та додає новий екземпляр факту.

На противагу фактам, які є статичними, змінні можуть набувати різних значень. Назві змінної завжди має передувати знак “?”. Для того щоб змінну зв'язати з фактом, використовується запис:

?var <- (fact_name (field value))

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

(defglobal [<defmodule-name>] ?*<назва глобальної змінною>* = <вираз>)

Машина логічного виводу

[ред. | ред. код]

Процесом додавання правил в робочий список і їх виконанням керує машина логічного виводу (МЛВ). МЛВ реагує на певні події:

Подія Дія
Додавання фактів в робочу пам'ять # Зіставлення фактів з правилами з бази знань # Зіставлення фактів з правилами з робочого списку правил
Видалення фактів з робочої пам'яті # Зіставлення фактів з правилами з бази знань # Зіставлення фактів з правилами з робочого списку правил
При зіставленні знайдено правила, що відповідають фактам з робочою пам'яті Додавання знайдених правил в робочий список правил
У робочий список правил додано нові правила Робочий список правил сортується відповідно до обраної стратегії вирішення конфліктів
При зіставленні фактів з робочим списком правил виявлено неактуальні правила Неактуальні правила (умови яких не задовольняють фактам) видаляються з робочого списку
Виконується команда (RUN) Виконуються дії (права частина) правила, що є першим в робочому списку правил.
Робочий список правил став порожнім Зупиняється виконання правил з робочого списку

Стратегії вирішення конфліктів

[ред. | ред. код]

Людина не завжди може задати повні умови, які б задовольняли дійсності. Існує легенда, згідно з якою Діоген Синопський на визначення Платона «Людина є тварина на двох ногах, позбавлене пір'я», обскуб курку і приніс до нього в школу, оголосивши: «Ось платонівська людина!» На що Платон до свого визначення змушений був додати «... і з широкими нігтями ». Коли в базі знань з'являються правила, які задовольняють фактам, але виконують протилежні дії, то виникає конфлікт правил. Наприклад, є два правила:

  1. (Якщо людина штовхнула іншу людину - покарати людину за хуліганство)
  2. (Якщо людина штовхнула іншу людину, на яку їхала вантажівка - нагородити людину за порятунок життя)

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

Різні факти можуть зробити правило таким, що може застосовуватися. Застосовне правило потім допускається (assert). Факти і правила створюються за допомогою попереднього оголошення. Приклад оголошення фактів і правил:

(deffacts trouble_shooting
    (car_problem (name ignition_key) (status on))
    (car_problem (name engine) (status wont_start))
    (car_problem (name headlights) (status work))
 )
(defrule rule1
    (car_problem (name ignition_key) (status on))
    (car_problem (name engine) (status wont_start))
     =>
    (assert (car_problem (name starter) (status faulty))
 )

Нащадками CLIPS є мови програмування Jess (частина CLIPS, що працює з правилами, переписана на Java, пізніше розвинулася в іншому напрямку), ECLiPSe, Haley Eclipse, FuzzyCLIPS (з додаванням концепції значущості (relevancy) в мову) та інші.

Існуючі версії CLIPS для Windows (clipswin.exe) не підтримують кирилицю (консольна версія CLIPS clipsdos.exe підтримує тільки кирилицю в форматі UTF-8). Саме відсутність повноцінної підтримки кирилиці і є основною причиною слабкого поширення CLIPS в Україні. У той же час відкритість вихідних кодів CLIPS дозволяє виправити цю ситуацію. Зокрема, при компіляції з вихідних можливо пропатчити їх, додавши підтримку koi8-r або ansi1251.

Остання версія - CLIPS 6.3 Beta, випущена 7 квітня 2008.

Див. також

[ред. | ред. код]

Посилання

[ред. | ред. код]