1. Главная страница » Компьютеры

Clips экспертная система примеры

Автор: | 16.12.2019

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

CLIPS является продукционной системой. Реализация вывода использует алгоритм Rete.

Основная идея состоит в представлении знаний в виде такой формы:

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

CLIPS является одной из наиболее широко используемых инструментальных сред для разработки экспертных систем благодаря своей скорости, эффективности и бесплатности. Являясь общественным достоянием, она до сих пор обновляется и поддерживается своим изначальным автором, Гэри Райли (Gary Riley).

CLIPS включает полноценный объектно-ориентированный язык COOL для написания экспертных систем. Хотя она написана на языке Си, её интерфейс намного ближе к языку программирования LISP. Расширения можно создавать на языке Си, кроме того, можно интегрировать CLIPS в программы на языке Си [1] .

CLIPS разработан для применения в качестве языка прямого логического вывода (forward chaining) и в своей оригинальной версии не поддерживает обратного вывода (backward chaining).

Как и другие экспертные системы, CLIPS имеет дело с правилами и фактами.

Содержание

Факты [ править | править код ]

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

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

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

Следующая команда поместит шаблонный факт с тремя атрибутами.

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

Правила [ править | править код ]

Знания предметной области представляются в CLIPS в виде правил, которые имеют следующую структуру:

Левая часть правила — это условие его срабатывания, а правая часть — это те действия, которые должны выполниться в случае выполнения условий. Знак => специальный символ, разделяющий LHS и RHS.

Правила объявляются с помощью команды defrule. Пример правила:

Данное правило активируется тогда, когда в рабочей памяти появится факт с атрибутами (model «Audi») и (color Black).

Активация правила не означает его выполнение. Активация правила — это помещение правила в рабочий список правил или agenda в CLIPS.

Чтобы активированные правила выполнились нужно выполнить команду (run).

Машина логического вывода [ править | править код ]

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

Событие Действие
ПОМЕЩЕНИЕ ФАКТОВ В РАБОЧУЮ ПАМЯТЬ 1) Сопоставление фактов с правилами из базы знаний
2) Сопоставление фактов с правилами из рабочего списка правил
УДАЛЕНИЕ ФАКТОВ ИЗ РАБОЧЕЙ ПАМЯТИ 1) Сопоставление фактов с правилами из базы знаний
2) Сопоставление фактов с правилами из рабочего списка правил
ПРИ СОПОСТАВЛЕНИИ НАЙДЕНЫ ПРАВИЛА СООТВЕТСТВУЮЩИЕ ФАКТАМ ИЗ РАБОЧЕЙ ПАМЯТИ Помещение найденных правил в рабочий список правил
В РАБОЧИЙ СПИСОК ПРАВИЛ ДОБАВЛЕНЫ НОВЫЕ ПРАВИЛА рабочий список правил сортируется согласно выбранной стратегии разрешения конфликтов
ПРИ СОПОСТАВЛЕНИИ ФАКТОВ С РАБОЧИМ СПИСКОМ ПРАВИЛ ОБНАРУЖЕНЫ НЕАКТУАЛЬНЫЕ ПРАВИЛА Неактуальные правила (условия не удовлетворяют фактам) удаляются из рабочего списка
ВЫПОЛНЯЕТСЯ КОМАНДА (RUN) Выполняются действия (правая часть) первого в рабочем списке правила.
РАБОЧИЙ СПИСОК ПРАВИЛ СТАЛ ПУСТ Останавливается выполнение правил из рабочего списка

Стратегии разрешения конфликтов [ править | править код ]

Человек не всегда может задать полные условия, которые бы удовлетворяли действительности. Существует легенда, согласно которой Диоген Синопский на определение Платона «Человек есть животное о двух ногах, лишённое перьев», общипал курицу и принес к нему в школу, объявив: «Вот платоновский человек!» На что Платон к своему определению вынужден был добавить «…и с широкими ногтями». Когда в базе знаний появляются правила, которые удовлетворяют фактам, но выполняют противоположные действия, то возникает конфликт правил. Например, есть два правила:
1. (Если человек толкнул другого человека — наказать человека за хулиганство)
2. (Если человек толкнул другого человека, на которого ехал грузовик — наградить человека за спасение жизни)
Это два правила будут между собой конфликтовать. Первое правило более общее и оно всегда активируется, если активируется второе. Но первым выполниться должно второе правило. В CLIPS есть несколько стратегий для разрешения таких конфликтов. Но даже если нет возможности выбрать подходящую стратегию для всех случаев, то можно указать приоритеты правилам. Правила с большим приоритетом будут выполняться первыми.

Различные факты могут сделать правило применимым. Применимое правило затем допускается (assert). Факты и правила создаются предварительным объявлением, как показано в примере:

Версии CLIPS [ править | править код ]

Потомками CLIPS являются следующие языки и среды:

  • Jess — коммерческий последователь CLIPS, доступен бесплатно для академического использования, переписан на Java, позже развился в других направлениях. Поддерживает обратный вывод.
  • HaleyRules Eclipse — язык правил системы HaleyRules компании Haley Systems. Поддерживает обратный вывод. Проект закрыт после поглощения Haley Systems корпорацией Oracle в декабре 2009 в пользу Oracle Policy Automation [2] .
  • FuzzyCLIPS — CLIPS с добавлением концепции значимости ( relevancy ) в язык. Не поддерживает обратного вывода.
  • EHSIS — испанский CLIPS, разработан в группе Erabaki Факультета Информатики Университета Страны Басков. Поддерживает нечеткую логику как FuzzyCLIPS [3] .
  • CLIPS/R2 — новая версия от компании Production Systems Technologies, обратно совместимая со стандартным CLIPS версий 6.x, но с добавлением алгоритма Rete II, поддержкой обратного вывода и прозрачной поддержкой структур языка Си и классов C++.

Существующие версии CLIPS для Windows (clipswin.exe) не поддерживают кириллицу (консольная версия CLIPS clipsdos.exe поддерживает только кириллицу в формате UTF-8). Именно отсутствие полноценной поддержки кириллицы и является основной причиной слабого распространения CLIPS в России. В то же время открытость исходных кодов CLIPS позволяет исправить эту ситуацию. В частности, при компиляции из исходников возможно пропатчить их, добавив поддержку koi8-r или ansi1251 [4] .

Последняя версия — CLIPS 6.3, выпущена 17 марта 2015.

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

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

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

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

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

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

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

(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))

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

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

(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)

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

(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, таким образом, будут удалены

(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")).

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

(declare (salience 20))

(variable ?variable ?value)

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

(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 и будет определена новая цель.

Процесс повторяется, задается вопрос, пользователь отвечает. Базу фактов добавляется факт по ответу пользователя (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"). Это и есть наш конечный результат, что бы обработать его применим правило

(declare (salience 30))

(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.

Введение
Решение

Давайте формализуем процесс диагностики неисправности компьютера.
В первую очередь следует задать вопросы, что бы определить тип возможной неисправности.

А-Загружается ли у вас компьютер?
Q-Нет
A-Включено ли питание.
Q- Да.
А- Обратитесь к системному администратору.

Вот такую нехитрую систему попробуем реализовать.

Реализация

Опишем вопросы на каком либо языке программирования.
По сути можно это сделать и на ASM. Но мы же не программисты.Мы спецы в своей области (с тем же успехом можно реализовать диагностику здоровья, а врач, который кодит на асме редкость). Значит надо выбрать язык «заточенный» под экспертные системы. Где не надо думать, сколько памяти под массив выделить и т.д.
Побродив по просторам интернета останавливаемся на языке CLIPS (можно выбрать было бы и LISP, но остановимся на CLIPS).
CLIPS работаетс правилами и фактами. Различные факты могут сделать правило применимым. Применимое правило затем допускается (assert). Факты и правила создаются предварительным объявлением.

Опишем в правилах языка CLIPS правило:

;; Правило determine-working-state
(defrule determine-working-state ""
(not (working-state ?))
(not (repair ?))
=>
(if (yes-or-no-p «Загружается ли OS? (yes/no)? „)
then
(if (yes-or-no-p “OS работает корректно? (yes/no)? „)
then
(assert (working-state not-stable))
else
(assert (repair “Remont ne trebuetsa»))
(assert (working-state stable))
)
else
(assert (working-state disenabled))
)
)

Здесь задаются вопросы при помощи некой функции yes-ur-no-p, котороая реализована следующим образом:
(deffunction yes-or-no-p (?question)
(bind ?response (ask-question ?question yes no y n))
(if (or (eq ?response yes) (eq ?response y))
then TRUE
else FALSE))
Где мы получаем ответ на вопрос, который формируется следующим образом:

(deffunction ask-question (?question $?allowed-values)
(printout t ?question)
(bind ?answer (read))
(if (lexemep ?answer)
then (bind ?answer (lowcase ?answer)))
(while (not (member ?answer ?allowed-values)) do
(printout t ?question)
(bind ?answer (read))
(if (lexemep ?answer)
then (bind ?answer (lowcase ?answer))))
?answer)

После того как пользователь ответил, срабатывает assert, после чего правило «срабатывает».
Полльзователь на вопрос загружется ОС ответил «Нет». Значит проверяем включено ли питание.

;;правило определяющее включен ли компьютер
(defrule determine-power-state ""
(working-state disenabled)
(not (power-state ?))
(not (repair ?))
=>
(if (yes-or-no-p "Подается ли питание? (yes/no)? ")
then
(assert (repair "Следует проверить исправность "железа" или переставить ОС"))
(assert (power-state be))
else
(assert (repair "Подайте питание"))
(assert (power-state not))
)
)
Пользователь отвечает «Да», и ему предлагается решение неисправности.

Заключение

Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.

Читайте также:  Asus wl500g premium v2 прошивка

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *