23665

Практикум по извлечению и структурированию знаний в среде CLIPS

Книга

Информатика, кибернетика и программирование

заместитель начальника службы энергонадзора ОАО Транссибнефть Практикум по извлечению и структурированию знаний в среде CLIPS по дисциплине Интеллектуальные информационные системы Авторсост. В качестве средства разработки экспертных систем описана среда CLIPS. Справочная информация по среде CLIPS дана в необходимом количестве для выполнения практических занятий и домашних заданий.

Русский

2013-08-05

1.45 MB

168 чел.

Практикум

 по извлечению и структурированию

знаний в среде CLIPS

по дисциплине «Интеллектуальные

информационные системы»

Омск 2006

Федеральное агентство по образованию

Государственное образовательное учреждение

высшего профессионального образования

«Омский государственный технический университет»

Практикум по извлечению

и структурированию знаний в среде CLIPS 

по дисциплине «Интеллектуальные

информационные системы»

Омск - 2006

УДК

ББК

Рецензенты:

Федоров В.К., д-р техн. наук, проф., каф. физики  Сибирской государственной автомобильно-дорожной академии (СибАДИ);

Воробец А.Б., заместитель начальника службы энергонадзора ОАО «Транссибнефть»   

    Практикум по извлечению и структурированию знаний в среде CLIPS  по дисциплине «Интеллектуальные информационные системы» / Автор-сост. А.С. Татевосян.  Омск: Изд-во ОмГТУ, 2006. 100 с.

Рассмотрены вопросы извлечения и структурирования знаний при разработке экспертных систем, основанных на знаниях. В качестве средства разработки экспертных систем описана среда CLIPS. Справочная информация по среде CLIPS дана в необходимом количестве для выполнения практических занятий и домашних заданий.

Предназначены для студентов очного и заочного обучения с использованием дистанционной технологии по специальности 080801 – «Прикладная информатика в электрооборудовании и электрохозяйстве предприятий, организаций и учреждений».

Печатается по решению редакционно-издательского совета ОмГТУ

 

                                                            

А.С. Татевосян, 2006      

Омский государственный

технический  университет, 2006

ПРЕДИСЛОВИЕ.

Практикум по извлечению и структурированию знаний при разработке экспертных систем в среде CLIPS составлен в соответствии с требованиями государственного образовательного стандарта высшего профессионального образования по дисциплине «Интеллектуальные информационные системы».

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

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

Выбор подходящей проблемы представляет самую критическую часть разработки экспертной системы (ЭС). Подходящие проблемы имеют следующие основные характеристики: не могут быть решены средствами традиционного математического моделирования; содержится неполнота и противоречивость информации; существует много объектов, их свойств, связей, условий и ограничений; не являются для эксперта легкими и слишком сложными.

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

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

  1.  Обзор возможностей  и основные элементы языка CLIPS. Абстракции данных. Факты в CLIPS. Работа с фактами.
  2.  Правила в CLIPS. Основной цикл выполнения правил. Создание правил. Свойства правил. Стратегия разрешения конфликтов. Синтаксис LHS правила. Команды и функции для работы с правилами.
  3.  Глобальные переменные и функции. Разработка ЭС, основанной на правилах. Исходные данные и сущности. Сбор информации. Диагностические правила.
  4.  Объектно-ориентированный язык CLIPS. Родовые функции и их создание. Применимость методов и их приоритет. Скрытые методы. Ошибки выполнения метода. Визуальные инструменты для работы с родовыми функциями.
  5.  Разработка ЭС с использованием объектно-ориентированного языка CLIPS и родовых функций. Постановка задачи. Алгоритм решения задачи. Представление логических элементов и их связь.

 Выполнение работ по темам практических занятий и домашних заданий сводится к следующему:

  •  рассмотрение основных возможностей  языка и среды CLIPS, при этом пользователь применяет множество уже готовых инструментов (встроенный механизм управления базой знаний, механизм логического вывода, менеджеры различных объектов CLIPS) и конструкций (упорядоченные факты, шаблоны, правила, функции, родовые функции, классы, модули, ограничения, встроенный язык COOL);
    •  изучение приведенных в практикуме примеров алгоритмов и программ по разработке ЭС, демонстрирующих основные возможности языка и среды CLIPS;  
    •  разработка ЭС в среде CLIPS по вариантам домашних заданий.

   Итогом выполнения работ по темам практических занятий и домашних заданий являются:

  •  алгоритмы и программы ЭС, демонстрирующие основные возможности языка и среды CLIPS, снабженные комментариями и ответами на контрольные вопросы;  
  •  результаты тестирования ЭС в среде CLIPS (загрузка, запуск программы и пошаговое нахождение решения с наблюдением за изменениями в списке фактов, объектов переменных и в плане решения задачи);
  •  листинги программ в среде CLIPS.

    Работы по темам практических занятий и домашних заданий оформляются в рабочих тетрадях отдельно. Темы и объем в часах практических  и домашних заданий представлены в табл.1.

                                                                                                            Таблица 1             

                                                                                

Содержание курса практи-ческих занятий

Название практического занятия

Отчет по работе

Часы

1 практичес-кое занятие.

Работа в CLIPS.

Решение задачи в CLIPS.

4

2 практичес-кое занятие.

Основные конструкции CLIPS.

3 практичес-кое занятие*.

Разработка диагностической экспертной системы

Создание полноценной диагностической экспертной системы.

2 (8)

4 практичес-кое занятие.

Объектно-ориентирован-ный язык CLIPS.

Создание экспертной системы  построения и оптимизации таблицы  истинности логической схемы.

4 (7)

5 практическое занятие*.

Разработка экспертной системы CIOS

Практическое занятие, помеченное в табл. 1 звездочкой (*), означает наличие в соответствии с учебным планом дисциплины по данной теме домашнего задания.  В скобках в таблице указаны часы на выполнение домашнего задания, а без скобок соответственно часы, предусмотренные рабочей программой на выполнение рабочего задания.

РАБОТА  В СРЕДЕ CLIPS

Среда CLIPS представляет собой современный инструмент, предназначенный для создания экспертных систем (expert system tool). Она состоит:

  •  из интерактивной среды – экспертной оболочки со своим способом представления знаний;
  •  гибкого и мощного языка COOL;
  •  нескольких вспомогательных инструментов.

Среда CLIPS 6.2. последней версии (2002 г.) является свободно распространяемым программным продуктом. Официальный сайт CLIPS имеет адрес: http://www.ghg.net/clips/CLIPS.html.

Экспертная оболочка CLIPS использует продукционную модель представления знаний и содержит три основных элемента: список фактов, базу знаний и блок вывода. В CLIPS используется оригинальный LISP – подобный язык программирования, ориентированный на разработку экспертной системы (ЭС).

Экспертные системы, созданные с помощью CLIPS могут быть запущены тремя основными способами:

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

Основным методом общения с CLIPS, используемым в данном практикуме, является  применение командной строки. После появления в главном окне CLIPS приглашения – CLIPS> –  команды пользователя могут вводиться в среду непосредственно с клавиатуры. Команды могут быть вызовами системных или пользовательских функций, конструкторами различных данных  CLIPS и т.д.    В случае вызова пользователем некоторой функции, она немедленно выполняется. Для вызова функций  CLIPS использует префиксную нотацию – аргументы всегда следуют после имени функции (пример 1). При вызове конструкторов CLIPS создает новый объект соответствующего типа. При вводе в среду имени созданной ранее глобальной переменной CLIPS отобразит ее текущее значение. Ввод в среду некоторой константы приведет к ее немедленному отображению в главном окне CLIPS.

Пример 1

(* 6  8)

(defglobal  ? *x* =  7)

?*x*

red 

Результат выполнения этих команд приведен на рис. 1.

Рис.1. Демонстрация работы в среде CLIPS

Первой командой примера вызывается функция умножения двух чисел 6 и 8. Результат работы этой функции  (число 48) отображается на экране. С помощью конструктора defglobal создается глобальная переменная ?*x*, которая инициализируется значением 7. При вводе в командную строку имени глобальной переменной ?*x* CLIPS отображает ее текущее значение, равное 7. Последней командой была введена константа  red, значение которой тут же выводится на экран. В качестве базового синтаксиса для определения  конструкции языка используется стандартная БНФ-нотация [2].  

ОСНОВНЫЕ ЭЛЕМЕНТЫ ЯЗЫКА CLIPS

Для написания программы CLIPS предоставляет три элемента:

  •  простые типы данных;
  •  функции для манипулирования данными;
  •  конструкции для пополнения базы знаний (факты, правила, классы и т.д.).

Простые типы данных. В CLIPS для представления информации предусмотрены простые типы данных: float, integer, string,  fact-addres, instance-name, instance-addres. Для представления числовой информации используются первые четыре типа данных. Для записи числа используются только цифры (0 – 9), десятичная точка (.), знак (+) или (–) и (е) при экспоненциальном представлении. Любое число, состоящее из цифр, сохраняется как целое (integer), все остальные сохраняются как действительные (float). Последовательность цифр, которая не удовлетворяет числовым типам, обрабатывается как тип данных symbol. Тип данных symbol в CLIPS представляет собой последовательность символов, состоящую из одного или нескольких любых печатных символов кода ASCII. Значение типа symbol заканчивается ограничителем. Символами ограничителями являются любые неотображаемые символы (например, пробел, символ табуляции или перехода на другую строку),  двойные кавычки, открывающаяся или закрывающая круглая скобка, &,│, <  ~  . Точка с запятой (;) также является символом начала комментариев. Символы-ограничители не могут содержаться в значении symbol за исключением символа <, который может быть первым символом значения. Значение типа symbol не может начинаться с символа ? или последовательности символов $?, но может содержать эти символы.  Язык CLIPS чувствителен к регистру. Значение типа string представляет собой строку символов, заключенную в двойные кавычки. Если внутри строки встречаются двойные кавычки, то перед ними необходимо поместить символ  \ . Оперировать с фактами в CLIPS. Типы данных fact-addres, instance-name, instance-addres используются для оперирования фактами (см. далее).

 Функции. Под функцией в CLIPS понимается часть кода, имеющая имя и возвращающая полезный результат или выполняющая полезные действия.  Функции, не возвращающие результат, будем называть в дальнейшем командами. CLIPS оперирует с несколькими типами функций: пользовательские функции, написанные на внешних языках (например на С) и связанные со средой  CLIPS; системные функции, которые были определены изначально внутри среды CLIPS; функции, определенные  с помощью конструктора deffunction; родовые функции. Конструкция deffunction позволяет пользователю определить новые функции непосредственно в среде CLIPS с использованием синтаксиса CLIPS. Родовые функции подобны функциям, созданным с помощью конструктора  deffunction. Однако в отличие от простых, родовые функции являются более мощным средством обработки данных, так как они способны выполнять различные наборы действий в зависимости от числа и типа полученных в данный момент аргументов. Родовые функции определяются с помощью конструкторов defgeneric и defmethod.

В CLIPS предусмотрен ряд стандартных арифметических и математических функций: сложение (+), вычитание (–), умножение (*), деление (/), возведение в степень (**), определение абсолютного значения (Abs), вычисление квадратного корня (Sqrt), взятие по модулю  (Mod), нахождение минимума (Min), нахождение максимума (Max). Вызовы функций в CLIPS имеют префиксную форму: аргументы функции могут стоять только после ее названия. Вызов функции начинается с открывающейся скобки, за которой следует имя функции, затем идут аргументы, каждый из которых отделен одним или несколькими пробелами. Аргументами функции могут быть данные простых типов, переменные или вызовы других функций. В конце вызова ставится закрывающаяся скобка.

Конструкции для пополнения базы знаний. В CLIPS существует несколько описывающих конструкций: defmodule, defrule, deffacts, deftemplate, defglobal, deffunction, defclass, definstances,  defmessage - handler, defgeneric. При записи все они заключаются в скобки. Конструкции отличаются от встроенных функций по выполняемым ими действиям. Функции не меняют состояние базы знаний среды CLIPS (за исключением функций, очищающих среду или загружающих на выполнение некоторый файл). Конструкторы, наоборот, предназначены для добавления в базу знаний новых элементов. Кроме того, в отличие от функций, они не возвращают никаких значений. Все конструкторы, за исключением defglobal  позволяют вставлять комментарии непосредственно в код определения нового элемента базы знаний. Комментарии могут быть поставлены в любое место программы с помощью символа точка с запятой (;). Комментарии, созданные с помощью символа, не сохраняются в среде CLIPS, поэтому их использование разумно только в текстовых файлах.

Абстракции данных. Для представления данных в CLIPS используют три основных абстракции данных:

  •  факты;
  •  объекты;
  •  глобальные переменные.

Факты в CLIPS являются одной из основных форм представления информации. Они являются фундаментальным понятием теории ЭС и предназначены для использования в правилах системы. Каждый факт представляет собой фрагмент данных, помещенных в текущий список фактов системы fact-list (рабочая память). Факт может быть добавлен в текущий список фактов системы (с помощью команды assert), удален из него (команда retract), изменен (modify), или продублирован  (duplicate) пользователем в процессе интерактивной работы в системе или из программы. Количество фактов в списке и объем информации, который может быть сохранен в факте, ограничиваются только размером памяти компьютера. Если при добавлении нового факта к списку обнаруживается, что он полностью совпадает с одним из уже включенных в список фактов, то эта операция игнорируется. Факт может быть задан с помощью значений типа fact-index или fact-address. После создания (или изменения) факт получает уникальный индекс, называемый индексом факта (fact-index). Индексы фактов начинаются с нуля и для каждого нового или измененного факта увеличиваются на единицу. Каждый раз после выполнения команд reset и clear выделение индексов начинается с нуля. Для определения конкретного факта с помощью типа fact-address необходимо получить соответствующее значение от функции, возвращающей значение данного типа (например assert, modify или duplicate), или некоторого правила. Для удобства отображения фактов в CLIPS используют понятие идентификатора факта. Он состоит из символа f и записанного через тире индекса факта. Например, запись f-10 служит для обозначения факта с индексом 10.

Для хранения фактов используется один из двух форматов: упорядоченные факты и неупорядоченные факты, называемые шаблонами. Упорядоченный факт состоит из значения типа  symbol  и следующей за ним последовательности из нуля и более значений symbol. Факт заключается в круглые скобки. Первое поле факта определяет отношение или связь факта. Например, факт (еlectr  cepy  dwa uzla sostoit  is parallel wetwei) показывает, что электрическая цепь с двумя узлами состоит только из  параллельных ветвей. Для того чтобы обратиться к информации, содержащейся в упорядоченном факте, пользователь должен знать не только какие данные содержатся в факте, но и то, в каком поле они хранятся.

Неупорядоченные (шаблонные) факты дают возможность пользователю задавать абстрактную структуру факта путем назначения имени каждому полю. Для создания шаблонов  используется конструктор deftemplate. Конструктор deftemplate задает имя шаблона и определяет последовательность из нуля или более полей неупорядоченного факта (пример 2), называемого слотами. Слот  состоит из имени, заданного значением  symbol, и следующим за ним списка полей.  Слот, как и факт, с обеих сторон ограничивается круглыми скобками.

Пример 2

(deftemplate  prospect)

   (slot name

        (default ?derive)

   (slot assets

              (default rich)

    (slot age

               (default 80)))

Порядок слотов в неупорядоченном факте не важен. Очевидными преиму-ществами шаблонов являются читабельность и независимость слотов от порядка их определения. Следующие символьные выражения зарезервированы и не должны использоваться как первое поле любого факта (упорядоченного или нет): test, and, or, not, declare, logical, object, exists и forall. Заметим, что слоты не могут использоваться в упорядоченных фактах, так же как упорядоченные поля не могут использоваться в шаблонных фактах.

Инициализация фактов. Конструктор  deffacts  позволяет создавать набор фактов, инициализирующий базу знаний  CLIPS, при каждой очистке системы. При выполнении команды reset текущий список фактов CLIPS  очищается, а затем в него добавляются все факты, заданные конструктором deffacts. CLIPS содержит один предопределенный системный конструктор deffacts, который выполняет добавление в систему факта initial-fact. Этот факт записывается в список фактов всегда с идентификатором f-0.

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

Глобальные переменные. Конструктор defglobal предназначен для определения глобальной переменной. Доступ к такой переменной можно получить из любого места среды CLIPS, а значения, которые они содержат, не зависят ни от каких других конструкций языка. В отличие от этого, конструкторы defrule или  deffunction  позволяют  создавать локальные переменные. Эти локальные переменные доступны только внутри соответствующего правила или функции.

Правила. Одним из основных методов представления знаний в CLIPS являются  правила. Их используют для представления эвристик, определяющих ряд действий, которые необходимо выполнить в определенной ситуации. Разработчик ЭС определяет совокупность правил, которые используются совместно для решения проблемы. Правило состоит из двух частей: антицедента  (условия), который является аналогом условия в if-then операторе и записывается слева, и консеквента (заключения), который является аналогом then части этого оператора и записывается справа. Левая часть правила представляет собой ряд  условий, которые должны выполняться, чтобы правило было применимо. В CLIPS принято считать, что условие выполняется, если соответствующий ему факт присутствует в списке фактов. Одним из типов условных элементов может быть образец. Образцы состоят из набора ограничений, которые используются для описания того, какие факты удовлетворяют условию, определяемому образцом. Процесс сопоставления фактов и образцов выполняется блоком вывода CLIPS, который автоматически сопоставляет образцы исходя из текущего состояния списка фактов и определяет, какие из правил являются применимыми. Если все условия правила выполняются, то оно активируется и помещается в список активированных правил. Если левая часть правила пуста, то для его активации необходимо наличие в списке фактов исходного факта (initial-fact). Такие безусловные правила часто используются для того, чтобы инициировать работу программы. Поэтому перед запуском таких программ необходимо произвести сброс состояния среды CLIPS. Правая часть правила представляет собой совокупность действий, которые должны быть выполнены, если правило применимо. Действия, описанные в  правилах, выполняются тогда, когда блок вывода CLIPS получает команду начать выполнение правил. Если существует множество применимых правил, то для того чтобы выбрать правило, действия которого должны быть выполнены, блок вывода использует стратегию разрешения конфликтов. Действия, описанные в выбранном правиле, выполняются (при этом список применимых правил может измениться),  а затем блок вывода выбирает другое правило и т.д. Этот процесс продолжается до тех пор, пока не остается ни одного применимого правила, то есть  пока список активированных правил не окажется пуст. Во многом правила похожи на операторы типа if-then процедурных языков программирования. Однако условие if-then оператора в процедурном языке проверяется только тогда, когда программа передает ему управление. С правилами ситуация иная. Блок вывода постоянно отслеживает все правила, условия которых выполняются, и, таким образом, правило может быть выполнено в любой момент, как только оно становится применимым. Для определения правил          (пример 3) используется конструкция defrule.

        Пример 3

        (defrule rule_name "optional_comment"

          (patten_l)

          ………….

           (patten_N)  

=>

        (action_l)

            …………

        (action_M))

Переменные. Как и в других языках программирования, переменные в CLIPS используются для хранения значений. В отличие от фактов, которые являются статическими, или неизменными, содержание переменной динамично и изменяется по мере того, как изменяется присвоенное ей значение. Идентификатор переменной всегда начинается с вопросительного знака (пример 4), за которым следует ее имя.

Пример 4

?<variable-name>

 Примеры переменных:

?х    ?sensor    ?noun    ?color

Перед использованием переменной ей необходимо присвоить значение. Все переменные, кроме глобальных переменных считаются локальными и могут использоваться только в рамках описания конструкции (пример 5). Чаще всего переменные описываются и получают значения в левой части правила.

 Пример 5

       (defrule make-quack

        (duck-sound ?sound)

  =>

        (assert  (sound-is ?sound))

Получив значение, переменная сохраняет его неизменным при использовании,  как в левой, так и в правой части правила (пример 6), если только это значение не изменяется в правой части при помощи функции bind.

  Пример 6

      (defrule addition

        (numbers ?x ?y)

 =>

      (assert  (answer  (+ ?x ?y) ) )

      (bind ?answer  (+ ?x ?y))

       (printout t "answer is " ?answer crlf))

Кроме значения самого факта, переменной может быть присвоено значение адреса факта (пример 7). Это может оказаться удобным при необходимости манипулировать фактами непосредственно из правила. Для такого присвоения используется комбинация в виде <-.

 Пример 7

      (defrule get-married

      ?duck <-   (bachelor Dopey)

  =>

(retract ?duck))

Дополнительные средства CLIPS. Ограничения на значения полей позволяют ограничить значения, принимаемые образцами в левой части правила. Существует три вида ограничений: ~, | и &.. Ограничение первого типа (пример 8) действует на следующее прямо за ним значение и означает, что поле не может принимать это значение.

Пример 8

         (defrule walk

          (light  ~green)

=>

    (printout t "Don't walk" crlf))

Ограничение второго типа (пример 9) указывает на то, что поле может принимать одно из следующих значений.

Пример 9

     (defrule cautious

     (light yellow | blinking-yellow)

=>

     (printout t "Be cautious" crlf))

 Ограничение третьего типа (пример 10) используется только вместе с ограничениями первых двух типов и указывает на то, что должны удовлетворяться оба соединяемых при его помощи ограничения.

 Пример 10

      (defrule cautious

        (light ? colors ye How I blinking-yellow)

=>

     (printout t "Be cautious because light is "

     ?color     crlf))

Оператор проверки условия test представляет собой мощное средство, при помощи которого можно сравнивать числа, переменные и строки в левой части правила. Он записывается точно так же, как и образцы. Правило может выполниться только тогда, когда наряду с совпадением всех образцов, записанных в левой части правила, справедливо и условие, описываемое в test. Функция test имеет следующий синтаксис: test  (аргумент_сравнения аргумент_1 аргумент_2)), где аргумент _ сравнения – это тот параметр, по которому сравниваются два следующих аргумента. В CLIPS существует ряд предопределенных аргументов сравнения (табл. 2).

                                                                                                                       Таблица 2.                          

Аргументы сравнения и их интерпретация

Аргумент сравнения

Интерпретация выражения сравнения

eq

Равно (сравнивает тип и значение)

neq

Не равно

=

Равно (сравнивает только значение)

<>

Не равно

>=

Больше или равно

>

Больше

<=

Меньше или равно

>

Меньше

Все аргументы, кроме eq и neq, используются только для сравнения чисел. При интерпретации выражения сравнения считается, что аргумент_1 стоит слева от аргумента_сравнения, а аргумент_2 – справа.

Использование функций в правилах. Функции могут использоваться и в левой, и в правой части правила (пример 11).

Пример 11

   (defrule addition

   (numbers ?x ?y)

=>

(assert  (answer  (+ ?х ?у))))

При использовании функции в левой части правила (пример 12) перед ней должен стоять знак =, показывающий CLIPS, что следующее выражение необходимо вычислить, а не использовать буквально.

Пример 12

    (defrule addition (numbers ?x ?y)

    (stock ?ID =(sqrt  (+  (** ?x 2)   (** у 2))))

=>

     (printout t "stock ID = " ?ID crlf))

Использование процедурных знаний. Среда CLIPS поддерживает также процедурную парадигму представления знаний, аналогичную в языках программирования (С, Паскаль). Конструкция deffunction позволяет пользователю определять новые функции. Эти новые функции могут вызываться точно так же, как и встроенные функции CLIPS. Конструкция defmodule позволяет разбивать базу знаний на части.

Стандартная процедура использования интерфейса командной строки выглядит следующим образом:

  •  создать и редактировать базу знаний при помощи любого текстового редактора;
  •  сохранить базу знаний в одном или нескольких текстовых файлах;
  •  выйти из редактора и запустить CLIPS;
  •  загрузить базу знаний в CLIPS.

Рассмотрим создание текстового документа при помощи текстового редактора Notepad (пример 13).

  Пример 13   

     (defrule one

     (light green)

=>

      (printout t "Go  !!!" crlf))

Сохраним текстовый документ в файле под любым именем (например, test.clp).  Запустим CLIPS (на экране появится главное диалоговое окно CLIPS). Теперь для загрузки правила one в базу знаний CLIPS следует воспользоваться  командой (load <имя файла>).

Пример решения задачи с помощью CLIPS. Написать программу для  решения ребуса следующего содержания:

 

                                                       C P E Д A

                                                                       C L I  P S

                                                      I A S N O

В словах СРЕДА, CLIPS и IASNO вместо букв необходимо поставить цифры таким образом, чтобы получилось математически правильное выражение. Причем разным буквам должны соответствовать разные цифры.

Решение задачи в CLIPS. Рассмотрим первые разряды всех трех чисел. Считаем, что первый разряд – это единицы, второй разряд – это десятки, третий – это сотни и так далее. В терминах CLIPS представим комбинации из одной буквы и одной цифры (пример 14) в виде фактов.

Пример 14

 (defrule find-solution

 (combination A ?a)

 (combination S ?s&~?a)

 (combination O ?o&~?a&~?s)

 (test (= (mod (+ ?a ?s) 10) ?o))

=>

(printout t "A Solution is:" t t)

(printout t "  A = " ?a t)

(printout t "  S = " ?s t)

(printout t "  O = " ?o t)

Данное правило выполнимо только в том случае, если в списке фактов существуют факты, удовлетворяющие условиям:

  •  (combination A ?a) – все факты, в которых в первой и во второй позициях          стоят «combination» и «A» соответственно, а в третьей позиции – любое значение, это значение присваивается переменной  ?a.
  •  (combination S ?s&~?a) –  все факты, в которых в первой и во второй позициях стоят «combination» и «S» соответственно, а в третьей позиции – любое значение, только не то, которое было присвоено переменной ?a, это значение присваивается переменной ?s. Знак & означает логическое AND, а знак ~ означает логическое NOT. Выражение ?s&~?a означает, что переменная ?s может принимать значение, не равное значению переменной ?a.
  •  (test (= (mod (+ ?a ?s) 10) ?o))  – это условие проверяет на равенство два выражения (mod (+ ?a ?s) 10) и (?o).

Команда (printout t "A Solution is:" t t) выводит на экран информацию. Информация, которую необходимо вывести на экран, указывается в полях, разделенных пробелами, после команды. Чтобы вывести текст, его необходимо заключить в кавычки, а перед кавычками поставить букву t. Эта буква указывает, что в следующем поле находится текст в кавычках, который необходимо напечатать. Если после буквынет текста в кавычках, то происходит перевод курсора на новую строку. Перевести курсор на новую строку можно параметром crlf. Он указывается без кавычек. Чтобы вывести значение переменной, надо просто указать имя переменной.  Например, (printout t "  S = " ?s t) сначала выводит текст S= , затем значение переменной ?s и  затем переводит курсор на новую строку.

Данное правило позволяет найти все комбинации (буква - цифра), удовлетворяющие условию для первых разрядов трех чисел. По аналогии с этим правилом составим конечное правило (пример 15) для нахождения решения.

Пример 15

 (defrule find-solution

 (combination A ?a)

 (combination S ?s&~?a)

 (combination O ?o&~?a&~?s)

 (test (= (mod (+ ?a ?s) 10) ?o))

 (combination D ?d&~?a&~?s&~?o)

 (combination P ?p&~?a&~?s&~?o&~?d)

 (combination N ?n&~?a&~?s&~?o&~?d&~?p)

 (test (= (mod (+ ?a ?s

                  (* 10 ?d) (* 10 ?p))

               100)

          (+ (* 10 ?n) ?o)))

 (combination E ?e&~?a&~?s&~?o&~?d&~?p&~?n)

 (combination I ?i&~?a&~?s&~?o&~?d&~?p&~?n&~?e)

 (test (= (mod (+ ?a ?s

                  (* 10 ?d) (* 10 ?p)

                  (* 100 ?e) (* 100 ?i))

                1000)

          (+ (* 100 ?s) (* 10 ?n) ?o)))

 (combination L ?l&~?a&~?s&~?o&~?d&~?p&~?n&~?e&~?i)

 (test (= (mod (+ ?a ?s

                  (* 10 ?d) (* 10 ?p)

                  (* 100 ?e) (* 100 ?i)

                  (* 1000 ?p) (* 1000 ?l))

                10000)

          (+ (* 1000 ?a) (* 100 ?s) (* 10 ?n) ?o)))

 (combination C ?c&~?a&~?s&~?o&~?d&~?p&~?n&~?e&~?i&~?l)

 (test (=  (+ ?a ?s

                  (* 10 ?d) (* 10 ?p)

                  (* 100 ?e) (* 100 ?i)

                  (* 1000 ?p) (* 1000 ?l)

                  (* 10000 ?c) (* 10000 ?c))

          (+ (* 10000 ?i) (* 1000 ?a) (* 100 ?s) (* 10 ?n) ?o)))

 =>

 (printout t "A Solution is:" t t)

 (printout t "  C = " ?c t)

 (printout t "  P = " ?p t)

 (printout t "  E = " ?e t)

 (printout t "  D = " ?d t)

 (printout t "  A = " ?a t)

 (printout t "  L = " ?l t)

 (printout t "  I = " ?i t)

 (printout t "  S = " ?s t)

 (printout t "  N = " ?n t)

 (printout t "  O = " ?o t)

 (printout t t)

 (printout t "   " ?c ?p ?e ?d ?a t)

 (printout t " + " ?c ?l ?i ?p ?s t)

 (printout t "   " "------" t)

 (printout t " = " ?i ?a ?s ?n ?o t t))   

Теперь для поиска решения остается занести факты, соответствующие комбинациям из одной буквы и одной цифры (пример 16), в список фактов. Это можно сделать командой assert.

Пример 16

(assert (combination A 0)

(combination A 1)

(combination S 1)

(combination O 9)

……)

Учитывая, что количество фактов равно 100, лучше поступить по-другому (пример 17) путем сопоставления буквам и цифрам следующие факты:

Пример 17

(number 0),   (number 1),  (number 2), ...,   (number 9).

(letter A),  (letter S),  (letter N),   (letter O), (letter L),

(letter C),  (letter I),   (letter P), (letter E),  (letter Д).

Составим правило (пример 18), по которому в список фактов будут заноситься факты, соответствующие комбинациям из одной буквы и одной цифры.

Пример 18

      (defrule generate-combinations

      (number ?x)

      (letter ?y)

 =>

        (assert (combination ?y ?x)))

Согласно данному правилу, если в списке фактов присутствуют факты, имеющие вид (number ?x),  (letter ?y), где вместо переменных стоят вполне конкретные значения, в список фактов добавляется еще один факт (combination ?y ?x), в котором вместо переменных стоят значения из фактов.

Составим правило (пример 19), по которому, во-первых, на экран будет выводиться условие задачи, а во-вторых, в список фактов будут заноситься факты, соответствующие буквам и цифрам. Поскольку это правило должно выполняться всегда, его условная часть будет пустой.

Пример 19

(defrule startup

 =>

 (printout t t "Хеллоу ! The problem is" t t)

 (printout t "   CPEDA" t)

 (printout t " + CLIPS" t)

 (printout t "   ------" t)

 (printout t " = IASNO" t t)

 (assert (number 0)

         (number 1)

         (number 2)

         (number 3)

         (number 4)

         (number 5)

         (number 6)

         (number 7)

         (number 8)

         (number 9)

         (letter C)

         (letter P)

         (letter E)

         (letter D)

         (letter A)

         (letter L)

         (letter I)

         (letter S)

         (letter N)

         (letter O)))

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

Ввод программы. Ввести программу в CLIPS можно непосредственно из диалогового окна, появившегося после запуска. Но в этом случае все написанные правила после закрытия CLIPS будут потеряны. Для сохранения и редактирования текста программы необходимо воспользоваться в CLIPS встроенным редактором. Запустить редактор можно следующим образом: File\ Editor. При запуске ре-дактора автоматически создается новый файл с именем untitled. После того как ввод текста программы закончен, необходимо сохранить этот текст в каком-нибудь файле. Сохранить текст в файле можно, выбрав в меню File редактора команду Save As. По умолчанию файлы сохраняются с расширением .clp. Теперь редактор можно закрыть.

Загрузка, запуск и остановка программы. Чтобы загрузить в базу знаний CLIPS содержимое файла wordgame.clp, нужно воспользоваться пунктом Load Constructs меню File. В появившемся затем диалоговом окне необходимо выбрать этот файл и нажать кнопку Open. Произойдет загрузка содержимого выбранного файла в базу знаний CLIPS. Программа содержит конструкции определения трех правил. Правило startup не содержит условий. Среда CLIPS активизирует правило без условий при наличии в списке фактов факта (initial-fact) с идентификатором f-0. Занести факт f-0 в список фактов можно с помощью команды reset (Execution\ Reset). Команда reset не затрагивает правила, а лишь очищает список активированных правил и включает в список фактов исходный факт (initial-fact) и все факты, описанные в конструкциях (deffacts). После выполнения этой команды окно Facts содержит  факты из списка фактов. Факт f-0 активизирует правило, не содержащее условий, и это правило будет помещено в список активных правил  Agenda.  

Таким образом, программа готова к запуску. Чтобы запустить программу, необходимо выполнить команду run (Execution\ Run). После этой команды CLIPS начнет выполнять все правила, которые находятся в списке активизированных правил. Выполнение программы останавливается либо когда в списке правил больше не останется ни одного активного правила, либо по прерыванию от пользователя комбинацией клавиш (Ctrl+C). Если после выполнения программы необходимо очистить базу знаний CLIPS, а также убрать все факты из списка фактов, то есть привести CLIPS в начальное состояние, то необходимо воспользоваться командой clear (Execution\Clear). Команда clear осуществляет очистку CLIPS от всех правил и фактов. В отличие от команды reset, которая удаляет только все факты из списка фактов.

Просмотр плана решения задачи. Перед выполнением команды run в списке активных правил есть только одно правило с именем startup. Сразу после запуска в результате выполнения данного правила в список фактов заносятся факты. Просмотр отдельного окна с фактами в CLIPS можно осуществить, используя  пункт Facts меню Window или с помощью диалогового окна Watch Options (пункт Watch меню Execution) при установке флажка Facts. Список фактов сразу после запуска приведен на рис. 2. После выполнения всей сотни шагов в списке фактов окажется еще сто фактов. Просмотр активных правил в отдельном окне можно сделать с помощью пункта Agenda меню Window или в диалоговом окне Watch Options (пункт  Watch меню Execution) установкой флажка Rules. Список активных правил после запуска показан на рис. 3. При этом окно списка активных правил будет содержать сто активизированных правил. Таким образом, правило generate-combination было активизировано сто раз фактами из списка фактов. После этого CLIPS начинает по порядку выполнять все правила из списка активных правил, проверяя, не будут ли выполнены условия из третьего и первого правил. Очевидно, что первое правило больше выполняться не будет. Как только в списке фактов появятся факты, которые будут удовлетворять условиям третьего правила, оно незамедлительно будет помещено в список активных правил и выполнено. После выполнения всей сотни шагов в списке фактов окажется еще сто фактов. После этого в списке активных правил не останется ни одного правила, поэтому выполнение программы прекратится.

                                       Рис. 2. Список фактов в CLIPS 

Рис. 3. Список активных правил.

Сохранения протокола работы. Для сохранения протокола работы программы, а также полученного ответа в текстовом файле необходимо сразу после запуска CLIPS выполнить команду File\Turn Dribble On. В появившемся диалоговом окне нужно ввести имя файла, в который будет сохраняться содержимое главного окна CLIPS. После получения ответа, перед очисткой CLIPS выполните команду File\Turn Dribble Off. По этой команде файл, в который записывается содержимое главного диалогового окна CLIPS, будет закрыт.

ПРАКТИЧЕСКОЕ ЗАНЯТИЕ № 1

ОБЗОР ВОЗМОЖНОСТЕЙ  И ОСНОВНЫЕ ЭЛЕМЕНТЫ

ЯЗЫКА CLIPS

Цель занятия.  Абстракции данных. Факты в CLIPS. Работа с фактами.

Рабочее задание

  1.  Ознакомиться с возможностями и основными элементами языка CLIPS (факты, объекты, глобальные переменные, правила), используя демонстрационные примеры с 1 по 13, приведенных ранее в п. «Работа в CLIPS».
  2.  Загрузить в базу знаний CLIPS содержимое файла wordgame.clp, воспользовавшись пунктом Load Constructs меню File. В появившемся диалоговом окне выбрать этот файл и нажать кнопку Open.
  3.  После загрузки содержимого файла в базу знаний занести факт (initial-facts) в список фактов с помощью команды reset. Данный факт активизирует правило, не содержащее условий, и это правило будет помещено в список  активных правил – Agenda.
  4.  Запустить программу, выполнив команду run. После этой команды выполняются все правила, которые находятся в списке активизированных правил.
  5.  Осуществить просмотр плана решения задачи, воспользовавшись пунктом Agenda Window меню Window, а также удобным визуальным инструментом Defrule Manager меню Browse (менеджер плана решения задачи). Для просмотра правил предварительно следует воспользоваться пунктом Breakpoint в инструменте Defrule Manager меню Browse (остановить решение задачи при выполнении правила find-solution).
  6.  Для просмотра списка фактов применить пункт Facts Window меню Window, а также визуальный инструмент Deffacts  Manager меню Browse (менеджер фактов).
  7.  Осуществить просмотр данных, способных активировать правило, используя пункт Matches Defrule Manager меню Browse.
  8.  Рассмотреть алгоритм решения задачи, представленный в пункте 2 рабочего задания, а также синтаксис  описания фактов и правил, представленных в программе.

ПРАКТИЧЕСКОЕ ЗАНЯТИЕ № 2       

  

ПРЕДСТАВЛЕНИЕ ДАННЫХ  В CLIPS

Цель занятия. Абстракции данных. Факты в CLIPS. Работа с фактами.

     Рабочее задание

  1.  Ознакомиться с представлением данных CLIPS, используя три основных абстракции данных: факты, объекты и глобальные переменные.
  2.  Рассмотреть набор возможностей для работы с фактами с помощью соответствующих конструкторов (deftemplate, deffacts) и функций (assert,  retract,  modify, assert-string, fact-existp), а также функций для работы с неупорядоченными фактами, сохранения и загрузки списка фактов.
  3.  Написать программу с помощью CLIPS по разгадыванию ребуса в соответствии с вариантом задания (табл.1), указанным преподавателем Постановка задачи: в слова вместо букв поставить цифры таким образом, чтобы получилось математически правильное выражение. Причем разным буквам должны соответствовать разные цифры.

                                                                              

                                                                              Таблица 1

Варианты задания

Разгадать ребус

  1.  

TEORIY+RABOTA= ZNANIE

  1.  

EXPERT+SYSTEM=TAURST

  1.  

KOLESO+OBMOTK= STATOR

  1.  

REZINA+ELEKTR = DIELEK

  1.  

XOLODA+PROVOD = OBRUAV

  1.  

INFORM+INTELE = SISTEM

  1.  

ALYMIN+STALNY = SPLAVY

  1.  

ELEKTR+PRIVOD = ELPRIV

               

 Вопросы для самоконтроля к практическим занятиям № 1 и № 2

  1.  Приведите примеры представления в CLIPS упорядоченных и неупоря-доченных фактов. В чем заключается их различие?
  2.  Приведите примеры представления правил в CLIPS. Что такое правило?
  3.  Приведите примеры представления функций в CLIPS. Какие бывают функции?
  4.  Дайте понятие экспертной системы и опишите ее структуру: базу знаний, механизм логического вывода и интерфейс пользователя. Как эти части экспертной системы представлены в CLIPS?

ПРАКТИЧЕСКОЕ ЗАНЯТИЕ 3

РАЗРАБОТКА ДИАГНОСТИЧЕСКОЙ ЭКСПЕРТНОЙ СИСТЕМЫ.

Цель занятия. Построение экспертной системы диагностики неисправности мотора автомобиля.

 

Рабочее задание

  1.  Ознакомиться с примером создания экспертной системы, производящей диагностику  неисправности мотора автомобиля по внешним признакам.
  2.  Рассмотреть дерево решений разрабатываемой экспертной системы для наглядного  представления   хода  рассуждений.
  3.  Дать характеристику используемых компонентов экспертной системы, представленных в виде исходных данных, сущностей, фактов, диагностических правил и сбора информации.
  4.  Осуществить запуск программы путем набора приведенного в примере листинга программы в встроенном редакторе CLIPS. Сохранить набранный файл с именем auto.CLP. После запуска CLIPS очистить его командой clear. Загрузить созданный файл с помощью команды load "auto.CLP".
  5.  После удачной загрузки файла убедиться с помощью менеджеров правил и функций соответственно, что все правила присутствуют в списке правил CLIPS, а функции - в списке функций.
  6.  Протестировать экспертную систему, по-разному отвечая на ее вопросы.

Пример создания полноценной несложной экспертной системы, производящей диагностику неисправности мотора автомобиля по внешним признакам и дающей возможность предоставлять пользователю соответствующие рекомендации по устранению неисправности. В реализации данной экспертной системы будем использовать управляющие команды CLIPS, такие как if-then-else и while.

Исходные данные. Разработку любой экспертной системы следует начинать с выделения основных сущностей, имеющих значение при решении конкретной задачи и законов, скорее всего эмпирических, действующих над этими сущностями. В подавляющем большинстве случаев эту информацию получают при помощи эксперта, человека хорошо знающего и давно работающего в этой области. Методы получения информации от эксперта и ее обработка выходят за рамки занятия. Для решения конкретной задачи предположим, что в результате бесед с экспертом в области установления неисправностей и ремонта автомобилей были установлены следующие эмпирические правила.

  1.  Двигатель обычно находится в одном из 3-х состояний: работает нормально; работает  неудовлетворительно; не заводится.
  2.  Если двигатель работает нормально, то это означает, что он нормально вращается, система зажигания и аккумулятор находятся в норме и никакого ремонта не требуется.
  3.  Если двигатель запускается, но работает ненормально, то это означает, по крайней мере,  что аккумулятор в порядке.
  4.  Если двигатель не запускается, то нужно узнать, пытается ли он вращаться. Если двигатель вращается, но при этом не заводится, то это может означать о наличии плохой искры в системе зажигания. Если двигатель даже не пытается заводиться, то это означает, что искры нет в принципе.
  5.  Если двигатель не заводится, но вращается, нужно проверить наличие топлива. Если топлива нет – то, скорей всего, для ремонта машины нужно просто заправиться.
  6.  Если двигатель не заводится, нужно также проверить, заряжен ли аккумулятор, если нет, то его следует зарядить.
  7.  Если двигатель не заводится, и существует вероятность плохой искры в системе зажигания, то необходимо проверить контакты. Контакты могут быть в одном из трех состояний –  чистые, опаленные и грязные, в случае опаленных контактов их необходимо заменить, в случае если контакты грязные, их достаточно просто почистить.
  8.  Если двигатель не заводится, искры нет и аккумулятор заряжен, то нужно  проверить  катушку  зажигания  на  электрическую  проводимость. В случае если ток не проходит через катушку, то ее необходимо заменить. Если катушка зажигания в порядке, значит необходимо заменить распределительные провода.
  9.  Если двигатель запускается, но при этом ведет себя инертно, не сразу реагирует на подачу топлива, то необходимо прочистить топливную систему.
  10.  Если двигатель запускается, но происходят перебои с зажиганием, то это означает наличие плохой искры в системе зажигания. Для устранения данной неисправности необходимо отрегулировать зазоры между контактами.
  11.  Если двигатель запускается и стучит, то необходимо отрегулировать зажигание.
  12.  Если двигатель запускается, но не развивает нормальной мощности, то   это может означать об опаленных или загрязненных контактах.

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

Сущности. Из приведенных правил можно выделить следующие сущности, имеющие значение при решении задачи:

  •  для решения задачи экспертной системе необходимо знать, в каком состоянии находится машина, диагностика которой производится. Эксперт выделил три возможных состояния: нормальная работа двигателя, двигатель работает неудовлетворительно, не заводится (правило 1);
  •  большинство приведенных правил помимо состояния двигателя в целом используют понятие состояния вращения двигателя. Согласно этим правилам двигатель может находиться в одном из двух состояний, которые определяются в зависимости от того, способен он вращаться (работать) или нет;
  •  в некоторых правилах (правила 4, 7, 8, 10) используется понятие состояния системы зажигания. Система зажигания может быть в одном из трех состояний: нормальное состояние, нерегулярная работа и нерабочее состояние;
  •  в правилах 6 и 8 используется понятие - состояние аккумулятора.  Аккумулятор может быть в одном из двух состояний: заряженным и разряженным.

Итак, задача поставлена. Теперь нужно наглядно ее представить. Для описания подобных задач обычно используются диаграммы, которые называются деревьями решений. Деревья решений позволяют проследить ход рассуждений. Диаграммы называются деревьями решений потому, что подобно настоящему дереву, имеют ветви. Ветви деревьев решений заканчиваются логическими выводами. На рис.1 показано дерево решений для данной задачи. Из диаграммы видно, что она состоит из кружков и прямоугольников, которые называются вершинами. Каждой вершине присваивается номер. На вершины можно ссылаться по этим номерам. Линии, соединяющие вершины, называются дугами или ветвями. Кружки, содержащие вопросы, называются вершинами решений. Прямоугольники содержат цели диаграммы и означают логические выводы. Линии показывают направление диаграммы. Многие вершины имеют по нескольку ветвей, связывающих их с другими вершинами. Выбор выходящей из вершины ветви определяется проверкой условия, содержащегося в вершине.

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

Группа фактов, описывающая состояние машины:

Группа фактов, описывающая состояние двигателя:

rotation-dvigatelvrashchaetsja                            двигатель вращается;

rotation-dvigatelne vrashchaetsja                       двигатель не вращается.

Группа фактов, описывающая состояние системы зажигания:

spark-zazhiganie v porjadke                                   зажигание в порядке;

spark-plohaja iskra                                                  искра не регулярна;

spark-net iskri                                                          искры нет.

Группа фактов, описывающая состояние аккумулятора:

charge-akkumuljator zarjagen                             аккумулятор заряжен;

charge-akkumuljator razrjazhen                       аккумулятор разряжен.

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

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

  •     добавить топливо (правило 5);
  •  зарядить аккумулятор (правило 6);
  •  заменить или почистить контакты (правило 7 или правило 12);
  •  заменить катушку зажигания или соединительные  провода (правило 8);
  •  прочистить топливную систему (правило 9);
  •  отрегулировать зазоры между контактами (правило 10);
  •  отрегулировать зажигание (правило 11).

Необходимо помнить также о двух крайних случаях:

  •  ремонт не требуется в принципе;
  •  экспертная система не смогла поставить диагноз.

Для представления всех этих рекомендаций будем использовать факты,  описывающие рекомендации по ремонту автомобиля (пример 1).

Пример 1

Repair "Zarjadite akkumuljator."

Repair "Prochistite sistemu podachi topliva."

Repair "Mashinu neobhodimo zapravit’.

Repair "Otreguliruyte sistemu zazhiganija."

Repair "Zamenite kontakti."

Repair "Zamenite raspredelitel’nie provoda."

Repair "Zamenite katushku zazhiganija."

Repair "Pokazhite vashu mashinu mehaniku"

Все приведенные факты, использующиеся для предоставления пользователю рекомендаций по ремонту, во втором поле содержат текстовое значение с рекомендацией по ремонту. Следует обратить внимание, что одни и те же рекомендации могут выводиться как правилом 7, так и правилом 12. Однако состояние машины при этой поломке отличается. Для того чтобы иметь возможность обрабатывать эту ситуацию с помощью одного правила CLIPS, введем еще два дополнительных факта, описывающих мощность работы двигателя:

Repair "vihodnaja moshchnostdvigatelja nizkaja"         низкая мощность

Repair "vihodnaja moshchnostdvigatelja normalnaja" нормальная мощность

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

Сбор информации. Для работы экспертной системы можно заставить пользователя вручную вводить факты, описывающие проявление возникшей неисправности. Однако такой метод имеет ряд серьезных недостатков: пользователь может забыть о каких-нибудь существенных деталях или, наоборот, указать слишком много информации, что может помешать нормальной работе системы. Кроме того, факты, описывающие проявление неисправности, должны были бы иметь строго определенный формат, и система не смогла бы их обработать в случае ошибки со стороны пользователя. В экспертной системе реализуем правила диагностики, которые в зависимости от той или иной ситуации будут задавать пользователю необходимые вопросы и получать ответ в строго заданной форме. Дальнейшая диагностика будет производиться с учетом предыдущих ответов на вопросы, заданные пользователю. Эти ответы будут формировать описание текущей ситуации с помощью фактов, приведенных ранее. Для построения подобной архитектуры необходимо реализовать функцию, задающую пользователю произвольный вопрос и получающую ответ из заданного набора корректных ответов. В примере 2 приведена одна из возможных реализаций такой функции.

Пример 2. Функция ask-question.

(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 (lowease ?-answer))))

  ?answer)

Функция принимает два аргумента: простую переменную question, которая содержит текст вопроса, и составную переменную allowed-values с набором допустимых ответов. Сразу после своего вызова функция выводит на экран соответствующий вопрос и читает ответ пользователя в переменную answer. Если переменная answer содержит текст, то она будет принудительно приведена к прописному алфавиту. После этого функция проверяет, является ли полученный ответ одним из заданных корректных ответов. Если нет, то процесс повторится до получения корректного ответа, иначе функция вернет ответ пользователю.



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

С учетом реализации функции ask-question она примет вид, представленный в примере 3.

Пример 3. Функция yes-or-no-p.

(deffunction yes-or-no-p (?question)

           (bind ?response (ask-question ?question yes no у n))

            (if (or (eq ?response yes) (eq ?response y))

               then

                 TRUE

          else

                FALSE))

Функция yes-or-no-p вызывает функцию ask-question с постоянным набором допустимых ответов: yes, no, у и n . В случае если пользователь ввел ответ yes или у, функция возвращает значение true, иначе - false.

Следует обратить внимание, что функция yes-or-no-p использует функцию ask-question, поэтому она должна быть определена после нее.

Диагностические правила. Для упрощения реализации экспертной системы введем следующее ограничение: за один запуск система может предоставить пользователю только одну рекомендацию по исправлению неисправности.        В случае если в машине несколько неисправностей, то систему нужно будет последовательно вызывать несколько раз, удаляя обнаруженную на каждом новом шаге неисправность. Одним из образцов всех диагностических правил, гарантирующий, что диагноз еще не поставлен, является (not (repair ?)).

Первым реализуем правило 1, определяющее общее состояние двигателя, как показано в примере  4.

Пример 4. Правило defrule opisanie-obshchego-sostojanija-dvigatelja.

(defrule opisanie-obshchego-sostojanija-dvigatelja ""

   (not (working-dvigatel’ rabotaet ?))

   (not (repair ?))

   =>

  (if (yes-or-no-p "Dvigatel’ zavoditsja (yes/no)? ")

       then

       (if (yes-or-no-p "Dvigatel’ normal’no rabotaet (yes/no)? ")

           then

               (assert (working-dvigatel’ rabotaet normal’no)

               (assert (spark-zazhiganie v porjadke))

           else

               (assert (working-dvigatel’ rabotaet neudovletvoritel’no)))

       else

         (assert (working-dvigatel’  ne zavoditsja))))

Условный элемент (not   (working-dvigatelrabotaet ?)) гарантирует, что общее состояние двигателя еще не определено. Если это так, то пользователю задаются соответствующие вопросы и в систему добавляется факт, описывающий текущее общее состояние двигателя.

Теперь реализуем правило, определяющее, пытается ли двигатель вращаться, в случае если он не заводится (пример 5).

Пример 5.Правило opisanie-vrashchenija-dvigatelja:

(defrule opisanie-vrashchenija-dvigatelja""

  (working-dvigatel’ ne zavoditsja)

   (not (rotation- dvigatel’ rabotaet ?))

   (not (repair ?))   

  =>

    (if (yes-or-no-p "Vrashchaetsja li dvigatel’ (yes/no)? ")

       then

      (assert (rotation-dvigatel’ vrashchaetsja))

      (assert (spark-plohaja iskra))

      else

      (assert (rotation-dvigatel’ ne vrashchaetsja))       

      (assert (spark-net iskri))))

Это правило выполняется, в случае если общее состояние двигателя определено и известно, что он не заводится. Кроме того, условный элемент (not (rotation-dvigatelrabotaet ?)) гарантирует, что это правило еще не вызывалось. В зависимости от того или иного ответа пользователя правило добавляет соответствующий набор фактов (правило 4). Далее реализуем правила 5 и 6, как видно из примера 6.

Пример 6. Правила opisanie-toplivnoi-sistemi и opisanie-sostojanija-akkumu-ljatora:

(defrule opisanie-toplivnoi-sistemi""

  (working-dvigatel’  ne zavoditsja)

  (rotation-dvigatel’ vrashchaetsja)

  (not (repair ?))

  =>

  (if (not (yes-or-no-p "Imeetsja li toplivo v bake(yes/no)? "))

       then

       (assert (repair "Mashinu neobhodimo zapravit’."))))

(defrule opisanie-sostojanija-akkumuljatora""

   (rotation-dvigatel’ ne vrashchaetsja)

  (not (charge-akkumuljator ?))

  (not (repair ?))

  =>

  (if (yes-or-no-p " Akkumuljator zarjazhen (yes/no)?")

       then

       (assert (charge-akkumuljator zarjazhen))

       else

       (assert (repair "Zarjadite akkumuljator."))

      (assert (charge-akkumuljator razrjazhen))))  

Правило opisanie-sostojanija-akkumuljatora, помимо определения возможной неисправности, также применяется для добавления в систему факта, описывающего текущее состояние аккумулятора, который может быть использован другими правилами. При реализации правила 7 необходимо учесть, что рекомендации, предоставляемые этим правилом, подходят для двух в корне отличающихся ситуаций. Во-первых, в случае если двигатель не заводится и существует вероятность плохой искры в системе зажигания (правило 7). Во-вторых, в случае если двигатель запускается, но не развивает нормальной мощности (правило 12). Поэтому выполним реализацию этих правил так, как представлено в примере 7.

Пример 7. Правила opisanie-moshchnosti и opisanie-sostojanija-kontaktov.

(defrule opisanie-moshchnosti""

  (working-dvigatel’ rabotaet neudovletvoritel’no)

  (not (vihodnaja moshchnost’ dvigatelja nizkaja | normal’naja))

 (not (repair ?))

  =>

  (if (yes-or-no-p " Vihodnaja moshchnost’ dvigatelja nizkaja (yes/no)? ")

      then

      (assert (vihodnaja moshchnost’ dvigatelja nizkaja))

      else

      (assert (vihodnaja moshchnost’ dvigatelja normal’naja))))

(defrule opisanie-sostojanija-kontaktov""

  (or (and (working-dvigatel’ ne zavoditsja)      

           (spark-plohaja iskra))

      (vihodnaja moshchnost’ dvigatelja nizkaja))

  (not (repair ?))

  =>

  (bind ?response

(ask-question "Kakoe sostojanie kontaktov (chistie/opalennie/zagrjaznennie)? "

                   chistie opalennie zagrjaznennie))

  (if (eq ?response opalennie)

       then

      (assert (repair "Zamenite kontakti."))

       else (if (eq ?response zagrjaznennie)

               then (assert (repair "Pochistite kontakti.")))))

Правило opisanie-moshchnosti определяет, имеет ли место низкая мощность двигателя или нет. Правило opisanie-sostojanija-kontaktov адекватно реагирует на условия, заданные в правилах 7 и 12. Следует обратить внимание на использование условных элементов or и and, которые обеспечивают одинаковое поведение правила в двух абсолютно разных ситуациях. Кроме того, правило opisanie-sostojanija-kontaktov отличается от ранее приведенных правил тем, что непосредственно использует функцию ask-question, вместо yes-or-no-p, так как в данный момент пользователю задается вопрос, подразумевающий три варианта ответа.

Реализация диагностических правил (8 -11) показана в примере 8.

Пример 8. Оставшиеся диагностические правила.

(defrule opisanie-reakcii-dvigatelja ""

   (working-dvigatelrabotaet neudovletvoritelno)

   (not (repair ?))

  =>

    (if (yes-or-no-p "Mashina vedet sebja inertno(yes/no)? ")

       then (assert (repair "Prochistite sistemu podachi topliva."))))

(defrule opisanie-zazhiganija""

  (working-dvigatel’ rabotaet neudovletvoritel’no)

  (not (repair ?))

  =>

   (if (yes-or-no-p "Est’ pereboi s zazhiganiem (yes/no)? ")

      then

      (assert (repair " Otregyliruyte zazori mezhdu kontaktami."))       

      (assert (spark-plohaja iskra))))

      else

      (assert (spark-zazhiganie v porjadke)))

(defrule opisanie-zvuka-raboti-dvigatelja""

  (working-dvigatel’ rabotaet neudovletvoritel’no)

  (not (repair ?))

   =>

    (if (yes-or-no-p "Stuchit li dvigatel’(yes/no)? ")

       then

       (assert (repair "Otreguliruyte polozhenie zazhiganija."))))

(defrule opisahie-katushki-zazhiganija ""

  (working-dvigatel’  ne zavoditsja)      

  (rotation-dvigatel' ne vrashchaetsja)

  (charge-akkumuljator zarjagen)

   (not (repair ?))

   =>

   (if (yes-or-no-p "Propuskaet li tok katushka zazhiganija(yes/no)?  ")

       then

      (assert (repair "Zamenite raspredelitel’nie provoda. "))

       else

       (assert (repair "Zamenite katushku zazhiganija."))))

Внимательно взглянув на список правил, можно увидеть, что некоторые правила (2, 3 и 13) остались до сих пор не реализованными. В качестве реализации правила 13 будем использовать правило no-repairs из примера 9.

Пример 9. Правило no-repairs.

(defrule no-repairs

    (declare   (salience -10) )

(not   (repair ?))

=>

(assert   (repair "Pokazhite vashu mashinu mehaniku.")))

Следует обратить внимание на использование приоритета при определении этого правила. Все правила, приведенные ранее, определялись с приоритетом, по умолчанию равным нулю. Использование для правила no-repairs приоритета, равного - 10, гарантирует, что правило не будет выполнено, пока в плане решения задачи находится, по крайней мере, одно из диагностических правил.

Если все активированные диагностические правила отработали и ни одно из правил не смогло подобрать подходящую рекомендацию по устранению неисправности, то CLIPS запустит правило no-repairs, которое просто порекомендует пользователю обратиться к более опытному механику.

Реализация правил 2 и 3 приведена в примере 10.

Пример 10. Правила normalnoe-sostojanie-dvigatelja

и neudovletvoritelaja-rabota-dvigatelja:

(defrule normal’noe-sostojanie-dvigatelja""

  (declare (salience 10))

  (working-dvigatel’ rabotaet normal’no)

    =>

    (assert (repair "Remont ne nugen."))

  (assert (spark-zazhiganie v norme))

  (assert (charge-akkumuljator zarjazhen ))

   (assert (rotation-dvigatel’ vrashchaetsja)))

(defrule neudovletvoritel’aja-rabota-dvigatelja""

  (declare (salience 10))

   (working-dvigatel’ rabotaet neudovletvoritel’no)

  =>

   (assert (charge-akkumuljator zarjazhen))

   (assert (rotation-dvigatelvrashchaetsja)))

В этих правилах используется более высокий приоритет, что гарантирует их выполнение до выполнения любого диагностического правила (естественно, только в случае удовлетворения условий, заданных в левой части правил). Это избавит экспертную систему от лишних проверок, а пользователю от лишних вопросов.

Экспертная система фактически готова к работе, но ей не хватает метода вывода итоговой информации и правила, сообщающего пользователю о начале работы. Реализация этих правил приведена в примере 11.

Пример 11. Правила system-banner и print-repair

(defrule system-banner ""

    (declare (salience 10) )

=>

(printout t crlf crlf)

(printout t "********************************************" crlf)

(printout t "* The Engine Diagnosis Expert System *" crlf)

(printout t "********************************************" crlf)

(printout t crlf crlf))

)

(defrule print-repair ""

    (declare (salience 10))

     (repair ?item)

=>

    (printout t crlf crlf)

    (printout t "Suggested Repair:")

     (printout t crlf crlf)

      (format t " %s%n%n%n" ?item)

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

Вспомогательные функции. Функция ask-question задает пользователю вопрос, полученный в переменной question, и получает от пользователя ответ, принадлежащий списку допустимых ответов, заданному в виде:

$?allowed-values (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)

Функция yes-or-no-p задает пользователю вопрос, полученный в переменной ?question, и получает от пользователя ответ уеs (у) или nо (n). В случае положительного ответа функция возвращает значение TRUE; иначе  –  FALSE.

(deffunction yes-or-no-p (?question)

           (bind ?response (ask-question ?question yes no у n))

           (if (or (eg ?response yes) (eq ?response y))

            then

            TRUE

              else

              FALSE))

Запуск программы. Для запуска программы наберите приведенный в примере листинг в каком-нибудь текстовом редакторе (лучше использовать встроенный редактор CLIPS. Сохраните набранный файл, например, с именем auto.CLP. После этого запустите CLIPS или, если он уже был у вас запущен, очистите его командой (clear). Загрузите созданный вами файл с помощью команды (load "auto.CLP"). Если файл был набран без ошибок, то вы должны увидеть сообщения, представленные на рис. 2.

Рис.2. Демонстрация успешной попытки загрузки файла конструкторов

Обратите внимание, что функция load вернула значение true. Если это не так, значит, в синтаксисе определений функций или правил была допущена ошибка. Для загрузки вы также могли бы воспользоваться функцией load. В этом случае на экран не выводилась бы информация, отражающая процесс загрузки.

После удачной загрузки файла убедитесь, что все правила присутствуют в списке правил CLIPS, а функции – в списке функций. Легче всего это выполнить с помощью менеджеров правил и функций соответственно. Внешний вид этих менеджеров показан на рис. 3 и  4.

Рис. 3. Правила экспертной системы

Для того чтобы запустить экспертную систему, достаточно выполнить команду reset, которая добавит факт initial-fact, необходимый для правила system-banner, и команду run. После этого вы сразу увидите сообщение "The Engine Diagnosis Expert System", которое означает, что система начала работать, и получите серию вопросов, ответы на которые помогут экспертной системе оценить текущее состояние вашей машины и подобрать соответствующую рекомендацию по ремонту. Пример работы системы показан на рис. 5. Обратите внимание, что если после завершения работы экспертной системы в списке фактов CLIPS остаются факты, описывающие состояние автомобиля, их легко просмотреть с помощью команды Fact Window из меню Window. Факты для данного примера изображены на рис. 6. Для повторного запуска экспертной системы необходимо еще раз выполнить команды reset и run.

Рис. 4. Функции Экспертной системы

Рис.5 Диалог с экспертной системой

Протестируйте экспертную систему, по-разному отвечая на ее вопросы. Чтобы лучше понять механизмы  работы системы и логический механизм вывода CLIPS, перед запуском системы сделайте видимым окно фактов (Fact Window) (см. рис. 6) и окно плана решения задачи (Agenda Window) (рис. 7).

Рис. 6. Окно фактов

Рис. 7. Окно плана решения задачи

Полный листинг программы.

;;;======================================================

;;;   Automotive Expert System

;;;

;;;     Eta ekspertnaja sistema diagnostiruet nekotorie prostie problemi s mashinoy.

;;;

;;;     CLIPS Version 6.0 Example

;;;

;;;     To execute, merely load, reset and run.

;;;======================================================

;;****************

;;* DEFFUNCTIONS *

;;****************

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

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

;;;**********************

;;;* ENGINE STATE RULES *

;;;**********************

(defrule normal'noe-sostojanie-dvigatelja""

  (declare (salience 10))

  (working-dvigatel' rabotaet normal'no)

  =>

  (assert (repair "Remont ne nugen."))

  (assert (spark-zazhiganie v porjadke))

  (assert (charge-akkumuljator zarjazhen ))

  (assert (rotation-dvigatel' vrashchaetsja)))

(defrule neudovletvoritel'naja-rabota-dvigatelja ""

  (declare (salience 10))

  (working-dvigatel' rabotaet neudovletvoritel'no)

  =>

  (assert (charge-akkumuljator zarjazhen))

  (assert (rotation-dvigatel' vrashchaetsja)))

;;;***************

;;;* QUERY RULES *

;;;***************

(defrule opisanie-obshcheso-sostojanija-dvigatelja ""

  (not (working-dvigatel' rabotaet ?))

  (not (repair ?))

  =>

  (if (yes-or-no-p "Dvigatel' zavoditsja (yes/no)? ")

      then

      (if (yes-or-no-p "Dvigatel' normal'no rabotaet (yes/no)? ")

          then (assert (working-dvigatel' rabotaet normal'no))

          else (assert (working-dvigatel' rabotaet neudovletvoritel'no)))

      else

      (assert (working-dvigatel' ne zavoditsja))))

(defrule opisanie-vrashchenija-dvigatelja ""

  (working-dvigatel' ne zavoditsja)

  (not (rotation-dvigatel' rabotaet ?))

  (not (repair ?))   

  =>

  (if (yes-or-no-p "Vrashchaetsja li dvigatel' (yes/no)? ")

      then

      (assert (rotation-dvigatel' vrashchaetsja))

      (assert (spark-plohaja iskra))

      else

      (assert (rotation-dvigatel' ne vrashchaetsja))       

      (assert (spark-net iskri))))

(defrule opisanie-reakzii-dvigatelja ""

  (working-dvigatel' rabotaet neudovletvoritel'no)

  (not (repair ?))

  =>

  (if (yes-or-no-p "Mashina vedet sebja inertno(yes/no)? ")

      then (assert (repair "Prochistite sistemu podachi topliva."))))

(defrule opisanie-zazhiganija ""

  (working-dvigatel' rabotaet neudovletvoritel'no)

  (not (repair ?))

  =>

  (if (yes-or-no-p "Est' pereboi s zazhiganiem (yes/no)? ")

      then

      (assert (repair "Otregyliruyte zazori mezhdu kontaktami."))       

      (assert (spark-plohaja iskra))))

(defrule opisanie-zvuka-raboti-dvigatelja ""

  (working-dvigatel' rabotaet neudovletvoritel'no)

  (not (repair ?))

  =>

  (if (yes-or-no-p "Stuchit li dvigatel' (yes/no)? ")

      then

      (assert (repair "Otreguliruyte polozhenie zazhiganija."))))

(defrule opisanie-moshchnosti ""

  (working-dvigatel' rabotaet neudovletvoritel'no)

  (not (vihodnaja moshchnost' dvigatelja nizkaja / normal'naja))

  (not (repair ?))

  =>

  (if (yes-or-no-p "Vihodnaja moshchost' dvigatelja nizkaja (yes/no)? ")

      then

      (assert (vihodnaja moshchnost' dvigatelja nizkaja))

      else

      (assert (vihodnaja moshchnost' dvigatelja normal'naja))))

(defrule opisanie-toplivnoy-sistemi ""

  (working-dvigatel' ne zavoditsja)

  (rotation-dvigatel' vrashchaetsja)

  (not (repair ?))

  =>

  (if (not (yes-or-no-p "Imeetsja li toplivo v bake (yes/no)? "))

      then

      (assert (repair "Mashinu neobhodimo zapravit'."))))

(defrule opisanie-sostojanija-akkumuljatora ""

  (rotation-dvigatel' ne vrashchaetsja)

  (not (charge-akkumuljator ?))

  (not (repair ?))

  =>

  (if (yes-or-no-p "Akkumuljator zarjazhen (yes/no)? ")

      then

      (assert (charge-akkumuljator zarjazhen))

      else

      (assert (repair "Zarjadite akkumuljator."))

      (assert (charge-akkumuljator razrjazhen))))  

(defrule opisanie-sostojanija-kontaktov ""

  (or (and (working-dvigatel' ne zavoditsja)      

           (spark-plahaja iskra))

      (vihodnaja moshchnost' dvigatelja nizkaja))

  (not (repair ?))

  =>

  (bind ?response

    (ask-question "Kakoe sostojanie kontaktov (chistie/opalennie/zagrjaznennie)? "

                   chistie opalennie zagrjaznennie))

  (if (eq ?response opalennie)

      then

     (assert (repair "Zamenite kontakti."))

      else (if (eq ?response zagrjaznennie)

               then (assert (repair "Pochistite kontakti.")))))

(defrule opisanie-katushki-zazhiganija ""

  (working-dvigatel' ne zavoditsja)      

  (rotation-dvigatel' ne vrashchaetsja)

  (charge-akkumuljator zarjazhen)

  (not (repair ?))

  =>

  (if (yes-or-no-p "Propuskaet li tok katushka zazhiganija (yes/no)? ")

      then

      (assert (repair "Zamenite raspredelitel'nie provoda."))

      else

      (assert (repair "Zamenite katushku zazhiganija."))))

(defrule no-repairs ""

 (declare (salience -10))

 (not (repair ?))

 =>

 (assert (repair "Pokazhite vashu mashinu mehaniku.")))

;;;****************************

;;;* STARTUP AND REPAIR RULES *

;;;****************************

(defrule system-banner ""

 (declare (salience 10))

 =>

 (printout t crlf crlf)

 (printout t "The Engine Diagnosis Expert System")

 (printout t crlf crlf))

(defrule print-repair ""

 (declare (salience 10))

 (repair ?item)

 =>

 (printout t crlf crlf)

 (printout t "Suggested Repair:")

 (printout t crlf crlf)

 (format t " %s%n%n%n" ?item))

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

ПРАКТИЧЕСКОЕ ЗАНЯТИЕ 4

УПРАВЛЕНИЕ ВЫВОДОМ В CLIPS.

Цель занятия. Работа механизма вывода на знаниях в CLIPS.

Рабочее задание

  1.  Ознакомиться с основными методами логического вывода в CLIPS.
  2.  Рассмотреть работу электрической схемы автоматизированного  привода поршневого компрессора (рис. 1).
  3.  Составить программу, реализующую логический вывод  в CLIPS на примере работы электрической схемы, приведенной в пункте 2 рабочего задания.

ПРОДУКЦИОННАЯ МОДЕЛЬ ПРЕДСТАВЛЕНИЯ ЗНАНИЙ

В экспертной системе (ЭС) база знаний состоит из набора правил, а программа, управляющая перебором правил, называется машиной вывода. Машина вывода (интерпретатор правил) – это программа, имитирующая логический вывод эксперта, пользующегося данной продукционной базой знаний для интерпретации поступивших в систему данных. Обычно эта программа выполняет две функции:

  •  просмотр существующих данных (фактов) из рабочей памяти (базы данных) и, правил из базы знаний и добавление (по мере возможности) в рабочую память новых фактов;
  •  определение порядка просмотра и применения правил. Этот механизм управляет процессом консультации, сохраняя для пользователя информацию о полученных заключениях, и запрашивает у него информацию, когда для срабатывания очередного правила в рабочей памяти оказывается недостаточно данных.

В подавляющем большинстве систем, основанных на знаниях, механизм вывода представляет собой небольшую по объему программу и включает два компонента – один реализует собственно вывод, другой управляет этим процессом. Действие компонента вывода основано на применении правила, называемого modus ponens: "Если известно, что истинно утверждение А и существует правило вида «ЕСЛИ А, ТО В", тогда утверждение В также истинно».

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

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

Управляющий компонент определяет порядок применения правил и выполняет четыре функции.

  1.  Сопоставление – образец правила сопоставляется с имеющимися фактами.
  2.  Выбор – из нескольких правил, которые могут быть применены, выбирается одно, наиболее подходящее по заданному критерию (разрешение конфликта).
  3.  Срабатывание – если образец правила при сопоставлении совпал с какими-либо фактами из рабочей памяти, то правило срабатывает.
  4.  Действие –  рабочая память подвергается изменению путем добавления в нее заключения сработавшего правила. Если в правой части правила содержится указание на какое-либо действие, то оно выполняется (как, например, в системах обеспечения безопасности информации).

Интерпретатор продукций работает циклически. В каждом цикле он просматривает все правила, чтобы выявить те, посылки которых совпадают с известными на данный момент фактами из рабочей памяти. После выбора правило срабатывает, его заключение заносится в рабочую память, и затем цикл повторяется сначала. В одном цикле может сработать только одно правило. Если  несколько правил успешно сопоставлены с фактами, то интерпретатор производит выбор по определенному критерию того единственного правила, которое срабатывает в данном цикле. Информация из рабочей памяти последовательно сопоставляется с посылками правил для выявления успешного сопоставления. Совокупность отобранных правил составляет так называемое конфликтное множество. Для разрешения конфликта интерпретатор имеет критерий, с помощью которого он выбирает единственное правило, после чего оно срабатывает. Это выражается в занесении фактов, образующих заключение правила, в рабочую память или в изменении критерия выбора конфликтующих правил. Если же в заключение правила входит название какого-нибудь действия, то оно выполняется. Работа машины вывода зависит только от состояния рабочей памяти и от состава базы знаний. На практике обычно учитывается история работы, то есть поведение механизма вывода в предшествующих циклах. Информация о поведении механизма вывода запоминается в памяти состояний. Обычно память состояний содержит протокол системы.

Управление выводом. От выбранного метода поиска, то есть стратегии вывода, будет зависеть порядок применения и срабатывания правил. Процедура выбора сводится к определению направления поиска и способа его осуществления. Процедуры, реализующие поиск, обычно «зашиты» в механизм вывода, поэтому в большинстве систем инженеры знаний не имеют к ним доступа и, следовательно, не могут в них ничего изменять по своему желанию. При разработке стратегии управления выводом важны:

  •  исходная точка в пространстве состояний. От выбора этой точки зависит и метод осуществления поиска –  в прямом или в обратном направлении.
  •  метод и стратегия перебора – в глубину, в ширину, по подзадачам или иначе.

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

Пусть имеется фрагмент базы знаний из двух правил.

Правило 1: Если «отдых - летом» и «человек - активный», то «ехать в горы».

Правило 2: Если «любит солнце», то «отдых летом».

Предположим, в систему поступили факты – «человек активный» и «любит солнце».

Прямой вывод  – исходя из фактических данных получить рекомендацию.

1-й проход.

Шаг 1. Пробуем правило 1, не работает (не хватает данных «отдых - летом»).

Шаг 2. Пробуем правило 2, работает, в базу поступает факт «отдых - летом».

2-й проход.

Шаг 3. Пробуем правило 1, работает, активизируется цель «ехать в горы», которая и выступает как совет, который дает ЭС.

Обратный вывод - подтвердить выбранную цель при помощи имеющихся правил и данных.

1-й проход.

Шаг 1. Цель - «ехать в горы»: пробуем правило 1 - данных «отдых - летом» нет, они становятся новой целью и ищется правило, где она в левой части.

Шаг 2. Цель «отдых - летом»: правило 2 подтверждает цель и активизирует ее.

2-й проход.

Шаг 3. Пробуем правило 1, подтверждается искомая цель.

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

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

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

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

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

ЭЛЕКТРИЧЕСКАЯ СХЕМА  ЭЛЕКТРОПРИВОДА  

ПОРШНЕВОГО КОМПРЕССОРА

На схеме (рис.1) представлены следующие буквенные и условные графические обозначения:

QF – автоматический воздушный выключатель;

КМ – магнитный пускатель;

КК – реле электротепловое;

М – электродвигатель;

SB – выключатель кнопочный;

KV – промежуточное реле;

FU – предохранитель плавкий;

КТ – реле времени;

VD – силовой неуправляемый кремниевый диод;

TV – понижающий трансформатор;

R – резистор сопротивления;

HL – сигнальная лампа;

SP1 – датчик контроля давления воздуха в ресивере;

SP2 – датчик контроля давления масла в системе смазки компрессора;

SP3 – датчик контроля  давления воды в системе охлаждения компрессора;

FP1 – датчик контроля температуры воды на выходе системы охлаждения компрессора;

FP2 – датчик контроля температуры масла в системе смазки компрессора;

YA – клапан электрогидравлический.

Ресивер (воздухосборник) предназначен для накопления сжатого воздуха, который используется в процессе выполнения тех или иных технологических и производственных операций.

Датчик контроля давления воздуха в ресивере SP1 имеет два контакта, положения которых определяют нижний и верхний уровни давления воздуха.

Для подачи масла в систему смазки компрессора применяют низковольтный асинхронный электродвигатель с короткозамкнутым ротором небольшой мощности, приводящий в движение насос центробежного типа. Основной узел компрессора, куда подается смазочный материал – это кривошипно-шатунный механизм. Отсутствие смазочного материала при работе компрессора может привести к выходу его из строя. Поэтому для увеличения надежности за контролем давления масла в системе смазки компрессора установлены два датчика SP2. Следует также отметить, что превышение температуры нагрева компрессора за допустимые пределы также может привести к выходу его из строя. Охлаждающая вода в компрессор подается центробежным насосом, который приводится в движение асинхронным электродвигателем.     

Описание работы схемы. Асинхронный двигатель компрессора запускается с места установки компрессора кнопкой SB3 и из диспетчерской с постановкой в режим автоматической подкачки кнопкой SB1. Кнопки SB4 и SB2 установлены соответственно по месту установки компрессора и в диспетчерской. Разрешение на пуск двигателя компрессора осуществляется с помощью реле KV2, если давление воздуха в ресивере меньше нормы. При этом контакт SP1.1 датчика давления SP1 в цепи реле KV2 замкнут. На катушку реле KV2 подается напряжение, контакт KV2 в цепи катушки управления контактора KM5 замыкается. Контактор KM5 включается, двигатель запускается. Получает питание также катушка UA1 электромагнита электрогидравлического клапана, который подает охлаждающую воду в компрессор. Выдержка времени реле KT несколько превышает время пуска двигателя. После срабатывания реле KT, получает  питание  реле  KV4  и  катушка YA2 электромагнита второго электрогидравлического клапана. Этот клапан закрывает выход воздуха из компрессора в атмосферу, происходит нагнетание воздуха в ресивер (воздухосборник). Если расход воздуха невелик и давление  воздуха в ресивере превосходит норму,  то  замыка-

Рис.1 . Схема автоматического управления электроприводом

                   поршневого компрессора

ется контакт SP1.2 датчика  давления SP1 в цепи катушки реле KV3. Последнее своим размыкающим контактом отключит реле KV2. Цепь катушки контактора KM5 теряет питание, двигатель отключается от сети. Когда потребление воздуха возрастает и давление воздуха в ресивере снизится по сравнению с нормой, датчик контроля давления воздуха SP1 замкнет свой нижний контакт SP1.1 и включит реле KV2. Катушка управления контактора KM5 снова получит питание, и двигатель компрессора запускается.

Схема обеспечивает автоматический контроль следующих параметров работы компрессора: контроль давления и температуры в системе смазки кривошипно-шатунного механизма, контроль давления и температуры в системе охлаждения компрессора. При выходе данных параметров за пределы нормы срабатывает промежуточное реле отключения KV10 и стоповое реле KV2, отключающее схему питания асинхронного двигателя.

Контрольные вопросы по практическим занятиям № 3 и № 4

  1.  С какой целью строят дерево решений? Из чего оно состоит?
  2.  Перечислить факты, описывающие состояние автомобиля и его узлов?
  3.  Какие правила используются при решении данной задачи?
  4.  Если на рис.1  вместо TRUE функция load вернет значение FALSE, то что это будет значить?
  5.  Как можно убедиться, что все правила присутствуют в списке правил CLIPS и все функции – в списке функций?
  6.  С помощью каких клавиш можно посмотреть полный листинг программы?
  7.  Влияют ли на работу программы лишние пробелы при ее написании?
  8.  Только что активированное правило помещается выше или ниже всех правил с таким же приоритетом?


ДОМАШНЕЕ ЗАДАНИЕ № 1

РАЗРАБОТКА ЭКСПЕРТНОЙ СИСТЕМЫ ДИАГНОСТИКИ

НЕИСПРАВНОСТИ СХЕМЫ АВТОМАТИЧЕСКОГО УПРАВЛЕНИЯ

ЭЛЕКТРОПРИВОДОМ ПОРШНЕВОГО КОМПРЕССОРА

И РАБОТЫ  КОМПРЕССОРНОЙ СТАНЦИИ.

Цель задания.  Реализация экспертной системы с использованием управляющих команд CLIPS, таких как if-then-else и while. 

Варианты заданий

  1.  Ознакомиться с технологической схемой работы компрессорной станции на рис.1 и схемой автоматического управления электроприводом поршневого компрессора, приведенной на рис. 1 в  практическом занятии № 4 «Управление выводом в CLIPS».
  2.  Выделить основные сущности и законы, скорее всего эмпирические, действующие над этими сущностями, имеющие значение при решении задачи построения экспертной системы диагностики неисправности схемы автоматического управления электроприводом поршневого компрессора и работы компрессорной станции.
  3.  При разработке экспертной системы воспользоваться техническими характеристиками поршневого компрессора (табл. 1), данными о суточном графике потребления сжатого воздуха (табл. 2), а также  перечнем неисправностей и отказов электрооборудования (табл. 3).  При анализе производственной ситуации принять условие, что все шесть компрессоров имеют одинаковые технические характеристики, причем два из них находятся в резерве.
  4.    Для наглядного представления решения задачи построить дерево решений.
  5.  При представлении в CLIPS всех применяемых данных использовать упорядоченные факт.
  6.  Дать характеристику используемых компонентов экспертной системы, представленных в виде исходных данных, сущностей, фактов, диагностических правил и сбора информации.
  7.  Осуществить запуск программы путем набора программы во встроенном редакторе CLIPS. Сохранить набранный файл с именем filename.clp. После запуска CLIPS очистить его командой clear. Загрузить созданный файл с помощью команды load filename.clp.
  8.  После удачной загрузки файла убедиться с помощью менеджеров правил и функций соответственно, что все правила присутствуют в списке правил CLIPS, а функции – в списке функций.  
  9.  Протестировать экспертную систему, по-разному отвечая на ее вопросы.
  10.  Привести полный листинг программы с подробными комментариями.



                                                                                                                    Таблица 1

Основные технические данные

 стационарного крейцкопфного компрессора

общего назначения типа 103 ВП-2С/8

(с прямоугольным расположением цилиндров)

Величина

Единица

физической величины

Значение

1

2

3

4

1

Производительность при условиях всасывания достигается в процессе приработки компрессора у потребителя через 200 часов.

0,332

2

Давление всасывания

МПа

атмосферное

3

Температура всасывания

атмосферная

4

Давление нагнетания I ступени

МПа

0,196… 0,246

2,0 … 2,5

5

Давление нагнетания (конечное)

МПа

8,0

0,785

   6

Температура нагнетания, не выше

К

433

160

7

Частота вращения вала компрессора

об/ мин

500

8

Ход поршня

мм

210

9

Число ступеней сжатия

-

2

10

Количество цилиндров

шт.

2

11

Диаметр цилиндров

I ступени

II ступени

мм

400

230

12

Диаметр штока

мм

40

13

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

Мощность  не более 110 кВт достигается в процессе приработки компрессора у потребителя  через 500 часов  работы или через 200 часов при комплектации компрессора прямоточными клапанами завода «Венибе».

кВт

110

                                                                                                          Продолжение табл. 1

1

2

3

4

14

Сорт масла:

а) для смазки цилиндров

б) для смазки механизмов движения

компрессорное К-19

индустриальное 50

15

Смазка цилиндров

от многоплунжерного насоса

16

Смазка механизма движения

циркуляционная от шестеренного насоса

17

Расход масла для смазывания цилиндров

мг/ с

г/ ч

15,24

55

18

Охлаждение

водяное

19

Расход воды на охлаждение компрессора, отнесенный к   всасываемого воздуха, не должен превышать при температуре воды на входе  

без учета концевого холодильника

с учетом концевого холодильника

(л)

2,5         

4,165

20

Давление охлаждающей воды на входе,

не более

МПа

0,245

2,5

21

Масса компрессора с прямоточным холодильником (без электрооборудования, концевого холодильника, обратного клапана, воздушного фильтра, опоры цилиндра, фундаментных болтов и плит, запасных деталей, специального инстру-мента и приспособления)

, не более

кг

2700

22

Регулирование производительности подключением дополнительного мертвого пространства

%

100, 65, 0

23

Общая масса компрессора

(в объеме поставки)

кг

5260

24

Электродвигатель

ДСК – 12-24-12У4

25

Габаритные размеры компрессора:

длина

ширина

высота

мм

2345

1620

2230

26

Ресурс до капитального ремонта

час

40000

                                      

                                                                                          

                                                                                                  Продолжение табл. 1                                                                                         

1

2

3

4

27

Автоматическая остановка компрессора при отклонении от нормы  одного из следующих параметров:

  1.  давления масла в системе смазки механизма движения;
    1.  давления нагнетания после I ступени;
    2.  давления нагнетания после II ступени;
    3.  температуры газа после II ступени;
    4.  температуры масла в станине;
    5.  протока охлаждающей воды;

напряжения возбуждения электродвигателя компрессора.

28

Холодильник концевой:

марка

тип

рабочее давление

масса

габаритные размеры

ХРК-9/8

Ребристый

МПа

кг

мм

0,785

8,0

432

2380x540

29

Синхронный электродвигатель:

мощность

напряжение

частота

частота вращения

кВт

В

Гц

об/ мин

125

380

50

500

                           

                                                                                                                    Таблица 2

Данные о суточном графике потребления сжатого воздуха

(в процентах)

Вариант

задания

I cмена

II смена

III смена

с 8.00 до

16.00 часов

с 16.00 до

24.00 часов

с  24.00 до

8.00 часов

1

100

100

50

2

100

100

25

3

100

100

0

4

100

50

50

5

100

50

25

                                                                                                  Продолжение табл. 2

Вариант

задания

I cмена

II смена

III смена

с 8.00 до

16.00 часов

с 16.00 до

24.00 часов

с  24.00 до

8.00 часов

6

100

50

0

7

100

25

50

8

100

25

25

9

50

50

100

10

50

25

100

11

50

100

0

12

50

0

100

13

25

50

100

14

25

100

50

15

25

50

100

16

25

25

100

17

0

50

100

18

0

100

50

19

0

25

100

20

0

100

25

21

40

80

100

22

60

40

100

23

30

100

60

24

60

100

0

25

40

100

60

26

100

60

40

27

100

30

60

28

60

100

40

29

100

40

40

30

100

80

60

УКАЗАНИЯ К ВЫПОЛНЕНИЮ ДОМАШНЕГО ЗАДАНИЯ

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

  1.  Пуск компрессоров осуществляется на холостом ходу с целью их продувки  для удаления конденсата. При пуске сжатый воздух поступает на линию продувки.
  2.  Задержка времени продувки каждого компрессора составляет 15 – 20 с   и превышает время пуска приводного асинхронного двигателя. По окончании продувки электрогидравлический клапан закрывает выход воздуха из компрессора в атмосферу и происходит нагнетание воздуха в ресивер (воздухосборник),  при  этом  загрузка  компрессора  увеличивается.
  3.  При экстренной остановке компрессора асинхронный двигатель отключается без выдержки времени.
  4.  Асинхронный двигатель отключается от сети, если расход воздуха невелик и давление воздуха в ресивере превосходит норму.
  5.  Асинхронный двигатель отключается от сети при аварийных ситуациях, если происходит отклонение от нормы одного из контролируемых параметров (давление, температура) в системе смазки механизма движения, в системе охлаждения компрессора, а также отсутствие протока воды в системе охлаждения компрессора. Остановка компрессора при аварийных значениях давления воздуха по ступеням сжатия, давления масла в системе смазки кривошипно-шатунного механизма, температуры сжатого воздуха после I и II ступеней сжатия компрессора и недостаточном или полном прекращении протока охлаждающей воды сопровождается световым и звуковым сигналами оповещения.   
  6.  Регулирование производительности компрессорной станции осуществляется изменением числа работающих компрессоров. Если снизилось или прекратилось потребление сжатого воздуха, то отключается один из работающих в данный момент времени компрессоров.  Если давление в ресивере продолжает расти и доходит до величины уставки манометра, то отключается следующий компрессор  и. т. д. Увеличение потребления сжатого воздуха вызывает обратные действия датчиков контроля параметров системы регулирования производительности, обеспечивающих увеличение числа работающих компрессоров.
  7.  Если  в процессе работы компрессорной станции происходит аварийный выход из строя одного из компрессоров, то взамен его вводится резервный компрессор.
  8.  Если двигатель компрессора не включается в рабочий режим, то необходимо проверить наличие напряжения в цепи управления.
  9.  Если двигатель компрессора не включается в рабочий режим при  нормальном положении переключателей и наличии в цепи управления питающего напряжения, то проверить работу магнитного пускателя (контактора). Если магнитный пускатель (контактор) не работает, проверить, есть ли напряжение на его катушке управления. Если напряжение на катушке управления пускателя отсутствует, то проверить цепь управления. Если катушка пускателя (контактора)  в порядке, то неисправен пускатель (контактор).  Если пускатель (контактор) исправен, то необходимо заменить катушку управления или заменить коммутационный аппарат.
  10.  Если двигатель  не  включается  в рабочий режим, положение переключателей нормальное, в цепи управления есть напряжение, пускатель (контактор)  работает, то проверить напряжение на выходе пускателя (контактора). Если напряжение на обмотке статора есть, то неисправен двигатель, если нет – то проверить питающий кабель двигателя.


                                                                                                                                                                                     Таблица 3

Перечень неисправностей и отказов работы электрооборудования                       

                                                                                                                                         

Неисправность

Причина

Устранение

Электрические машины

Разрушение фланцев на фланцевых машинах, лап машины в местах их присоединения к корпусу машины, подшипниковых щитов в местах крепления.

Трещины различного происхождения.

Вибрация, приводимой в движение машины.

По возможности заварить сваркой или заменить разрушенные детали.

Балансировка колес машины.

Ослабление крепления подшипника в гнезде щита.

Износ гнезда при проворачивании внешнего кольца подшипника.

Замена щита машины.

Машина не вращается

Заклинен приводимой машиной механизм.

Заклинена машина по причинам:

а) ржавчина в зазоре между статором   и ротором;

б) ржавчина в подшипниках;

в) подшипник вышел из строя;

г) нарушение центровки валов машины и механизма;

д) замерзла вода при конденсации пара при зазорах вращающихся деталей.

Устранить заклинивание механизма.

Разобрать машину и прочистить внутреннюю поверхность статора и внешнюю поверхность ротора.

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

Заменить подшипник.

Ослабить крепление машины и закрепить ее при правильном положении.

Отогреть машину.

                                                                                           

                                                                                                     57                                                              

                                                                                                                                                                 Продолжение табл. 3

Неисправность

Причина

Устранение

Электрические машины

Двигатель не развивает нормальных оборотов и нагревается.

а) перегрузка двигателя;

б) вышел из строя подшипник.

Устранить перегрузку приводимого механизма.

Заменить подшипник.

Перегрев обмотки статора.

Нарушение вентиляции машины.

Проверить наличие и исправность вентилятора, наличие свободного доступа воздуха к вентилятору.

Перегрев части обмотки статора, машина гудит и из нее показывается дым.

Витковое замыкание, короткое замыкание между фазами или замыкание обмотки на корпус.

Машина демонтируется и отправляется на капитальный ремонт.

После пуска машины ощущается напряжение на металлических конструкциях.

а) голые токоведущие части касаются деталей машины;

б) снижение до нуля сопротивления изоляции обмотки машины.

Осмотреть коробку зажимов и лобовые части обмотки, найти и устранить неисправность.

Просушить машину.

Сильная вибрация машины.

а) вибрация колеса турбомашины (вентилятора, дымососа и др.), насаженного на вал машины.

б) плохое крепление машины к раме или к рабочему механизму.

Произвести балансировку колеса турбомашины.

Закрепить машину.

При работе машины слышен шум высокого тона.

а) проворачивание ротора относи-тельно вала или задевание ротора за ослабленный клин в пазу статора;

б) неисправен подшипник.

Заменить ротор или отправить машину на капитальный ремонт.

Заменить подшипник

                                                                                                                                                                    

                                                                                                                                                               Продолжение табл. 3

Неисправность

Причина

Устранение

Электрические машины

Перегрев обмотки возбуждения.

а) Генератор работает при повышенном напряжении;

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

Отрегулировать величину напряжения или частоту вращения первичного двигателя;

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

Отсутствие напряжения при холостом ходе генератора.

Возбудитель не дает напряжения.

Устранить неисправность возбудителя.

Возбудитель дает напряжение, но в цепи возбуждения нет тока.

Обрыв или нарушение контакта в цепи возбуждения.

Проверить целостность цепи возбуждения.

При холостом ходе генератора нет напряжения в одной фазе.

Обрыв в одной фазе обмотки статора при соединении звездой или в двух фазах при соединении треугольником.

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

Машины постоянного тока

Искрение щеток.

а) Щетки  или щеткодержатель установлены неправильно;

б) щетки износились;

в) щетки прижаты к коллектору сильно или слабо;

г) повышенная вибрация щеточного аппарата из-за ударов щеток о пластины коллектора.

Установить согласно инструкции на машину.

заменить щетки;

отрегулировать нажатие щеток согласно инструкции на машину;

увеличить жесткость щеточного аппарата.

                                                                                                                                                               Продолжение табл. 3

Неисправность

Причина

Устранение

Машины постоянного тока

Щетки искрят, генератор плохо возбуждается, двигатель плохо идет в ход, обмотка якоря нагревается.

а) Некоторые пластины коллектора соединены медью заусениц при обточке коллектора;

б) витковое замыкание в одной из якорных катушек.

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

При холостом  ходе машины искрения нет, с ростом нагрузки искрение увеличивается.

а) Неправильное расположение щеток;

б) неисправен щеточный аппарат;

в) главные и дополнительные полюсы чередуются неправильно;

г) неправильная полярность главных и дополнительных полюсов.

Щетки установить согласно инструк-ции на машину;

устранить неисправности щеточного аппарата;

сделать чередование полюсов правильным;

установить правильную полярность полюсов.

Неустойчивое, иногда преобладающее искрение при нагрузке.

Слаб контакт в щеточном аппарате

Проверить контакты щеточного аппарата.

Щетки искрят, почернение коллектор-ных пластин.

а) Слаб контакт в соединениях между обмоткой и коллектором.

б) отдельные пластины коллектора выступили  или запали.

в) если машина нагревается нормально, то причина в большом износе коллектора.

г) при повышенном нагреве якоря причина в перегрузке машины.

Проверить соединения;

обточить коллектор;

заменить коллектор;

устранить перегрузку машины.

                                                                                                                                                                     Продолжение табл. 3

Неисправность

Причина

Устранение

Машины постоянного тока

Легкое круговое искрение, искры между щетками.

Коллектор загрязнен от смазки машины или от мягких щеток.

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

Круговой огонь на коллекторе.

а) Установлены мягкие щетки4

б) короткое замыкание во внешней цепи.

Заменить щетки;

устранить замыкание.

Генератор не возбуждается.

а) У генератора нет остаточного магнетизма.

б) щетки установлены неправильно.

в) замыкание в катушках возбуждения.

г) короткое замыкание или обрыв в обмотке якоря.

Намагнитить машину от постоянного источника тока;

щетки установить по инструкции;

заменить неисправные катушки;

отправить машину на капитальный ремонт.

Напряжение генератора ниже номинального.

а) Частота вращения якоря ниже номинальной;

б) замыкание в параллельной обмотке возбуждения.

Повысить частоту вращения приводного двигателя;

заменить обмотку.

Напряжение генератора сильно падает при нагрузке.

Понижается частота вращения, приводящего во вращение генератор.

Найти и устранить причины уменьшения частоты вращения двигателя.

Генератор дает повышенное  напряже -

ние  при холостом ходе и нагрузке.

а) Частота вращения двигателя выше номинальной;.

б) сопротивление регулятора возбуж-дения недостаточно.

Отрегулировать частоту вращения двигателя;

отрегулировать величину сопротив-ления регулятора возбуждения.

              Продолжение табл. 3

Неисправность

Причина

Устранение

Машины постоянного тока

Двигатель не вращается, в обмотке якоря нет тока.

а) Нет тока в сети, обрыв в пусковом реостате или в питающих проводах;

б) обрыв в обмотке якоря.

Проверить наличие напряжения в сети и положение включающих аппаратов, пусковой реостат и провода.

Устранить неисправность или заменить якорь.

Двигатель не идет  вход при нагрузке.

Без нагрузки двигатель развивает большую частоту вращения.

а) Обрыв  или плохой контакт в цепи возбуждения;

б) замыкание в катушке параллельного возбуждения;

в) обрыв или витковое замыкание в обмотке якоря.

Найти и устранить неисправность;

ремонт или замена катушки;

ремонт обмотки или замена якоря.

Частота вращения двигателя превышает номинальную при номинальном напряжении.

а) Щетки сдвинуты с нейтрали против направления вращения двигателя;

б) велико сопротивление регулятора возбуждения.

в) витковое замыкание в параллельной катушке обмотки возбуждения.

Установить щетки согласно инструкции;

отрегулировать величину сопротивления регулятора;

ремонт или замена катушки.

Частота вращения двигателя ниже номинальной при номинальном напряжении.

а) Щетки сдвинуты с нейтрали по направлению вращения двигателя;

б) мало сопротивление регулятора возбуждения.

Установить щетки согласно инструкции4

отрегулировать величину сопротивления регулятора.

                                                                                                                                                                        Продолжение табл. 3

Неисправность

Причина

Устранение

Трансформаторы

Ненормальное гудение трансфор-матора, напряжения на стороне низкого напряжения ниже нормы и не равны.

Нет напряжения в одном проводе со стороны высокого напряжения:

а) перегорела вставка предохранителя;

б) нет цепи в одной из фаз.

Заменить предохранитель;

проверить целостность цепи омметром.

Ненормальное гудение трансфор-матора.

а) Ослабление крепления крышки и других деталей, ослабление опресовки магнитопровода;

б) перегрузка трансформатора или зна-чительная несимметрия нагрузки.

Подтянуть гайки крепления крышки и других деталей, при капитальном ремонте усилить опрессовку магнитопровода;

устранить перегрузку, отключив второстепенные электроприемники, устранить нессиметрию переключением нагрузки равномерно по фазам.

Витковое замыкание обмотки.

а) Старение изоляции или ее меха-ническое  повреждение;

б) перегрузка трансформатора.

Ремонт или замена обмотки.

Пробой на корпус между обмотками разных фаз или напряжений.

Обрыв в обмотках.

а) Перенапряжения;

б) ухудшилось качество масла;

в) старение изоляции.

Ремонт или замена обмоток;

замена масла;

замена обмоток.

Электрические аппараты

Нет напряжения на выходе аппарата.

а) Подвижные контакты не касаются неподвижных из-за мусора, грязи или неисправности;

б) сильное окисление контактов.

Разобрать аппарат, проверить состояние контактов и устранить неисправность;

почистить контакты напильником, надфилем,  растворителем.

                                                                                                                                                                                                 

                                                                                                                                                              Продолжение табл. 3

Неисправность

Причина

Устранение

Электрические аппараты

Аппарат не срабатывает.

Заклинен механизм из-за поломки или мусора.

Проверить и устранить неисправность.

Общие отказы пускателей, автоматов, рубильников

Обгорание одного или более зажимов присоединенных проводов у пуска-телей и автоматов вместе с корпусом.

Слабо закреплен неподвижный контакт и нельзя достичь плотного прилегания к нему подвижного.

Заменить автомат, съемную часть пускателя, у новых аппаратов проверить крепление контактов.

Перегрев и окисление зажимов присоединения.

а) Слабое затягивание зажимов;

б) малое сечение провода.

Разобрать зажимы, зачистить и собрать вновь;

заменить провода.

Общие отказы пускателей и  автоматов

Аппарат отключается при нагрузке.

а) Уставка защиты  аппарата не соответствует току нагрузки;

б) перегрузка пусковым током двига-теля при затяжном пуске.

Отрегулировать защиту аппарата;

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

На выходе аппарата нет одной или более фаз.

Сгорание тепловых элементов защиты.

Заменить тепловые элементы защиты или при их отсутствии весь аппарат.

Отказы магнитных пускателей

Пускатель не включается.

а) Нет напряжения в питающей сети;

б) нет напряжения в цепи управления пускателя (сработала защита или обрыв в цепи управления);

в) нет выхода напряжения от кнопок «Стоп» и «Ход».

Выяснить и устранить причину;

проверить цепь управления.

проверить исправность кнопок.

                                                                                                                                                                  Продолжение табл. 3

Неисправность

Причина

Устранение

Отказы магнитных пускателей

Пускатель не включается при наличии напряжения на вводе.

а) Окисление зажимов или контактов на вводе;

б) слабое нажатие на зажимах или контактах;

в) обрыв в обмотке катушки;

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

д) частые пуски двигателя, когда его пытаются пустить в заклиненном положении.

Зачистить зажимы или контакты;

устранить регулировкой контактов или затягиванием зажимов;

заменить обмотку;

не следует пускать в ход заклиненный двигатель.

Пускатель работает ненормально

Вибрация и искрение пускателя.

Уменьшение напряжения по следующим причинам:

а) мала мощность трансформатора для данного двигателя;

б) большая удаленность подстанции при проводах малого сечения;

в) несимметрия питающего напряже-ия

Замена пускателя на автомат и контроль нагрева двигателя;

замена проводов на провода большего сечения;

измерить напряжения и при наличии несимметрии устранить ее.

                                                                                                                                                                    Продолжение табл. 3

Неисправность

Причина

Устранение

Пускатель работает ненормально

Вибрация и искрение пускателя.

в) Пускатель заклинен;

г) ослабло крепление деталей пуска-теля;

д) неплотность контактов или зажимов в цепи управления.

Разобрать пускатель и устранить неисправность;

закрепить детали пускателя;

проверить состояние контактов и зажимов.

Пускатель включается, но двигатель не работает.

Отпаялись контакты от контактных мостиков.

Заменить контактные мостики.

Пускатель ненормально гудит.

Неплотное прилегание якоря магнито-провода

Устранить неисправность (см. выше вибрация и искрение пускателя.)

Пускатель не отключается.

а) Кнопка «Ход» заклинена;

б) контакты кнопки «Ход» шунти-рованы замыканием тока цепи управления;

в) замыкание в проводах цепи управле-ния при их повреждении;

г) приварились контакты пускателя при длительном токе, большем номинального для данного пускателя;

д) залипание якоря магнитной систе-мы, то есть якорь не отпадает при отключении тока в катушке;

е) слаба пружина, возвращающая якорь в отключенное положение.

Расширить гнездо толкателя кнопки;

заменить кнопочный элемент;

найти и устранить неисправность;

рассоединить и зачистить контакты;

заменить линейное напряжение в цепи управления на фазное с заменой катушки на соответствующее напряже-ние;

заменить пружину.

                                                                                                                                                                                          

                                                                                                                                                                   Продолжение таблицы 3

Неисправность

Причина

Устранение

Отказы автоматических выключателей

Автомат не включается.

Механические причины:

а) препятствие ходу назад включа-ющей рукоятки при подготовке рыча-гов механизма к включению;

б) не входит в зацепление рычаг механизма свободного расцепления;

в) разрегулирован механизм тепловой защиты и отключает автомат как при перегрузке;

г) при включении выключателя при снятой крышке действует блокировка при ее наличии.

Электрические причины:

а) срабатывание от тока короткого замыкания;  

б) перегрузка.

Расширить гнездо в крышке автомата, в котором ходит рукоятка. Отогнуть деталь, мешающую ее ходу;

заменить автомат;

отрегулировать механизм;

не включать автомат при снятой крышке.

Найти причину неисправности в:

а) сети;

б) электроприемнике..

Отключение автомата во время работы.

а) Короткое замыкание или перегрузка;

б) нагрев зажимов проводов и пере-дача тепла на тепловые элементы защиты;

в) несимметрия питающего напряже-ния приводит к увеличению тока, потребляемого двигателями.

Найти причину неисправности сети или в электроприемнике.

Разобрать, зачистить и собрать зажимы.

Устранить несимметрию напряжения.

                                                                                                                                                              Продолжение табл. 3

Неисправность

Причина

Устранение

Отказы кнопочных постов

Кнопка «Ход» не включает.

Слой льда или пыли на контактах.

Чистка и дальнейшая герметизация.

Кнопка «Стоп» не отключает

а) Неподвижные контакты кнопочного элемента замкнуты по пыли.

Чистка от пыли.

Отказы рубильников

Нет напряжения в одной фазе на выходе рубильника.

а) Один из ножей рубильника отстает от других при включении и не входит в контактную стойку;

б) слабое касание ножом контактной стойки, нагрев и обгорание ножа, контактной стойки и зажимов.

Отрегулировать положение ножа;

заменить обгоревшие детали рубиль-ника.

Отказы розеток, выключателей, патронов

Периодические отказы.

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

б) слабо затянуты детали внутри изделия.

Разобрать корпус и присоединить провод;.

затянуть соединения, при нарушении резьбы соединить детали.

Сильный нагрев розеток и вилок.

а) Окисление деталей розеток и вилок при ослаблении их соединений между собой и при слабом контакте в гнездах;

б) перегрузка током больше номиналь-ного.

Заменить детали или изделия;

устранить перегрузку, отключив часть электроприемников.

                                                                                                              Продолжение табл. 3

Неисправность

Причина

Устранение

Установки с лампами накаливания

Освещение не включается.

Выключается автомат по причинам:

а) неисправен автомат;

б) замыкание в сети освещения или в светильнике;

в) лампа не касается контактов в патроне (контакты отогнулись, обломились или обгорели);

неисправна лампа.

Ремонт или замена автомата;

найти и устранить причину замы-кания;

подогнуть контакты или заменить патрон;

заменить лампу.

Срабатывает защита.

а) Лампа замкнула контакты в патроне своим цоколем;

б) касание проводов в месте их присоединения к патрону или в коробке.

Отогнуть контакты;

устранить неисправность.

Загорание провода.

а) Изоляция двухжильного провода не соответствует условиям среды;

б) провод не соответствует нагрузке.

Замена провода на провод, соответ-ствующий условиям среды;

применить провод большего сечения.

Установки с люминесцентными лампами

Лампа не зажигается или работает         с перерывами.

а) Слабы или окислились зажимы в цепях до светильника, у дросселя, колодок лампы, у стартера, контакты ножек лампы и электродов стартера в гнездах;

б) обрыв в дросселе или в конден-саторе балластного сопротивления;

в) неисправен стартер;

г) неисправна лампа.

Проверить зажимы и контакты в проводке до светильника и в светильнике;

проверить с заменой на новые;

заменить стартер;

заменить лампу.

Окончание табл. 3

Неисправность

Причина

Устранение

Установки с люминесцентными лампами

Лампа не зажигается или работает        с перерывами.

Влияние пониженной температуры воздуха.

Заменить лампу.

Изменение цвета свечения лампы.

Изменение состава люминофора при большом сроке службы лампы.

Заменить лампу.

Гудение светильника.

Колебания пластин магнитопровода дросселя.

Заменить дроссель.

Срабатывание защиты при включении.

а) Пробой компенсирующего конден-сатора на входе светильника парал-лельно питающей сети;

б) замыкание в цепях осветительной установки.

Заменить конденсатор;

проверить цепи за автоматом.

Нагрев сгораемых поверхностей, на которых укрепляется светильник.

Нагрев дросселя светильника.

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


ПРАКТИЧЕСКОЕ ЗАНЯТИЕ № 5

ОБЪЕКТНО-ОРИЕНТИРОВАННЫЙ ЯЗЫК CLIPS

   

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

Рабочее задание

  1.  Ознакомиться с объектно-ориентированными возможностями языка CLIPS  на примере разработки экспертной системы CIOS.
  2.  Описать алгоритм решения задачи и способы  реализации правил экспертной системы CIOS.
  3.  Изучить способ представления логических элементов в рабочей памяти экспертной системы CIOS.
  4.  Осуществить ввод в экспертную систему набор элементов, необходимых для создания заданных логических  схем, приведенных на рис. 2, 3, 4.
  5.  Для проверки экспертной системы выполнить ее тестирование путем создания трех файлов: scheme-l.CLP, scheme-2.CLP и scheme-3.CLP.
  6.  Осуществить загрузку экспертной системы и выполнить наблюдение за изменениями в списке фактов, объектов, переменных и в плане решения задачи с помощью видимых окон Facts Window, Instances Window, Globals Window и Agenda Window, воспользовавшись соответствующими пунктами меню Window.

ОБЪЕКТНО-ОРИЕНТИРОВАННЫЕ ВОЗМОЖНОСТИ ЯЗЫКА CLIPS

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

Постановка задачи. Основной задачей экспертной системы CIOS является построение и оптимизация таблиц истинности заданных логических схем. Логической схемой будем называть объединение некоторых примитивных логических элементов. Полный список и описание логических элементов приведен в табл. 1.

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

  1.  Выход каждого логического элемента связан с одним и только одним входом другого элемента.
  2.  

Вход каждого логического элемента связан с одним и только одним выходом другого элемента.

Таблица.1

Примитивные логические элементы

Логический элемент

Описание работы логического элемента

1

SOURCE

Источник – элемент, представляющий собой вход логической схемы. Имеет один выход и не имеет входов. Считается, что первоначальный сигнал появляется в этом элементе и сразу передается следующему логическому элементу.

2

LED

Индикатор – элемент, моделирующий, выход логической схемы. Является противоположностью источ-нику, имеет один вход и не имеет выходов. Считается, что при получении сигнала индикатор просто отображает его.

3

SPLITTER

Разделитель – элемент предназначен для деления сигнала. Имеет один вход и два логических выхода. Полученный сигнал без изменения передается на оба выхода разделителя.

4

NOT

Логическое НЕ – элемент, имеющий один вход и один выход. Меняет полученный сигнал на противоположный.

5

AND

Логическое И – элемент, имеющий два входа и один выход. Возвращает лог. 1, если оба полученных сигнала равны лог. 1. В противном случае возвращает лог. 0.

6

OR

Логическое ИЛИ – элемент, имеющий два входа и один выход. Возвращает лог. 1, если хотя бы один из полученных сигналов равен лог. 1. В противном слу-чае возвращает лог. 0.

7

NAND

Отрицание логического И – элемент имеет два входа и один выход. Возвращает лог. 0, если оба полученных сигнала равны лог. 1. В противном случае возвращает лог. 1.

8

XOR

Исключающее ИЛИ  элемент имеет два входа и один выход. Возвращает лог. 1, если полученные сигналы не равны. В противном случае возвращает лог. 0.

  1.  Исходные сигналы подаются на источники логической схемы, не имеющие входов.
  2.  Исходный сигнал перемещается по логической схеме, за условную единицу времени принимается  такт.
  3.  По завершении такта обработанный сигнал оказывается на логических индикаторах схемы.

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

Например, для простейшей логической схемы, приведенной на рис. 1, таблица истинности представлена в табл. 2.

Рис. 1. Простейшая логическая схема                                                                                                 

                                                                                                          

                                                                                                     Таблица 2

Пример простейшей таблицы истинности

SOURCE -1

SOURCE -2

LED- 1

0

0

0

0

1

0

1

0

0

1

1

1

Количество столбцов таблицы истинности равно числу источников и индикаторов схемы, количество строк соответственно числу , где n – число источников. Таблица истинности может принимать весьма внушительные размеры, уже при шести источниках количество строк в ней равняется 64. Очевидно, что возможны ситуации, когда изменение значения одного из входов не влияет на результат при постоянных значениях сигналов на остальных входах. Тогда таблицу можно оптимизировать путем объединения этих строк таблицы, заменив значение не влияющим на результат входа символом (*). В представленном примере можно объединить первую и вторую строку табл. 2 , так как при любом значении, подаваемом на источник SOURCE-2, в случае, если на источник SOURCE-1 подается лог. 0, результат будет равен лог. 0. Таким образом, оптимизированная таблица примет вид, соответствующий табл. 3.

                                                                                                              

                                                                                                               Таблица 3

Оптимизированная таблица истинности

SOURCE -1

SOURCE -2

LED- 1

0

*

0

1

0

0

1

1

1

В данном примере преимущества оптимизированных таблиц истинности не очень заметны. Однако при составлении таких таблиц для достаточно больших логических схем преимущества очевидны. Эффект, полученный от оптимизации таблицы истинности, сильно зависит от конкретной анализируемой логической схемы. Следует заметить, что оптимизация таблиц истинности неоднозначна, но конечный результат - количество строк в итоговой таблице – всегда одинаков. Таблицу истинности логической схемы (см. рис.1) можно оптимизировать иначе, например табл.  4.

                          

                                                                                                              Таблица 4

Новый вариант оптимизированной таблицы истинности

SOURCE -1

SOURCE -2

LED- 1

*

0

0

0

1

0

1

1

1

Для разработки и тестирования экспертной системы CIOS будем использовать логические схемы, приведенные на рис. 2 – 4. Представленные на рисунках сокращения даны в табл. 5.

                                                                                                             Таблица  5

Сокращения названий логических элементов

Название логического элемента

Используемое сокращение

SOURCE

S

LED

L

SPLITTER

P

NOT

N

AND

A

OR

O

NAND

D

XOR

X

Рис. 2. Логическая схема (scheme-l.CLP)

Рис. 3. Логическая схема (scheme-2.CLP)

Рис. 4. Логическая схема (scheme-3.CLP)

Алгоритм решения задачи. Для решения поставленной задачи построения и оптимизации таблиц истинности логических схем будем использовать следующий алгоритм.

  1.  Инициализация заданной логической схемы и установление необходимых соединений между ее элементами.
  2.  Получение результата работы логической схемы, в случае если на все ее источники подаются значения, равные лог. 0.
  3.  Последовательно перебираются всевозможные комбинации входных сигналов для всех источников логической схемы и вычисляются результаты ее работы. Перебор всевозможных комбинаций входных сигналов осуществляется с помощью циклического (рефлексного) кода Грея. Этот код является особым методом представления двоичных чисел, в котором каждое последующее число отличается от предыдущего только на один символ. Например, коды Грея для чисел от 0 до 7 будут: 0 = 000; 1 = 001; 2 = 011; 3 = 010; 4 = 110; 5 = 111; 6 = 101; 7 = 100. Использование кода Грея позволяет значительно оптимизировать работу экспертной системы по времени исполнения, так как для получения результата обработки каждого следующего варианта входных сигналов необходимо изменить значение только одного источника.
  4.  В процессе получения результатов работы логической схемы для всевозможных комбинаций входных сигналов экспертная система производит поиск двух строк таблицы, которые можно объединить согласно алгоритму оптимизации, приведенному в примере (см. табл. 3).
  5.  После получения результатов работы логической схемы для всех комбинаций входных сигналов и их оптимизации экспертная система выводит на экран найденную таблицу истинности.

Представление логических элементов. Для того чтобы при разработке правил экспертной системы сконцентрироваться на алгоритме оптимизации таблицы истинности воспользуемся объектно-ориентированными возможностями CLIPS. Для представления каждого логического элемента создадим соответствующий класс, объект которого будет самостоятельно выполнять обработку поступившего сигнала и передавать полученный результат на вход элемента, соединенного с выходом. Составленная таким образом логическая схема будет самостоятельно вычислять результаты своей работы при попадании соответствующих сигналов на вход источников. При реализации классов, представляющих собой логические элементы, воспользуемся возможностью множественного наследования. Заметим, что каждый логический элемент является компонентом, обладающим некоторым числом входов (от 0 до 2) и выходов (от 0 до 2). Основываясь на этом замечании, создадим набор классов и обработчиков сообщений.

Пример 1.  Классы, используемые  для создания логических элементов

(defclass COMPONENT 

         (is-a USER)

         (slot ID# (create-accessor write))

         )

(defclass NO-OUTPUT

          (is-a USER)

          (slot number-of-outputs (access read-only)

          (default 0)

                      (create-accessor read) )

           )

(defmessage-handler NO-OUTPUT compute-output ( ) )

(defclass ONE-OUTPUT

          (is-a NO-OUTPUT)

          (slot number-of-outputs (access read-only)

                                  (default 1)

                                  (create-accessor read) )  

          (slot output-1 (default UNDEFINED)

                      (create-accessor write) )

          (slot output-1-link (default GROUND)

                      (create-accessor write) )

          (slot output-1-link-pin (default 1)

                      (create-accessor write) )

           )

(defmessage-handler ONE-OUTPUT put-output-1 after (?value)

          (send ?self:output-1-link

                (sym-cat put-input- ?self:output-1-link-pin)

                 ?value)

           )

(defclass TWO-OUTPUT

(is-a ONE-OUTPUT)

(slot number-of-outputs (access read-only)

(default 2)

(create-accessor read) )

(slot output-2 (default UNDEFINED)

(create-accessor write) )

(slot output-2-link (default GROUND)

(create-accessor write) )

(slot output-2-link-pin (default 1)

(create-accessor write) )

)

(defmessage-handler TWO-OUTPUT put-output-2 after (?value)

(send ?self:output-2-link

(sym-cat put-input- ?self:output-2-link-pin)

?value)

)

(defclass NO-INPUT

(is-a USER)

(slot number-of-inputs (access read-only)

(default 0)

(create-accessor read) )

)

(defclass ONE-INPUT

(is-a NO-INPUT)

(slot number-of-inputs (access read-only)

(default 1)

(create-accessor read) )

(slot input-1 (default UNDEFINED)

(visibility public)

(create-accessor read-write) )

(slot input-1-link (default GROUND)

(create-accessor write) )

(slot input-1-link-pin (default 1)

(create-accessor write) )

)

(defmessage-handler ONE-INPUT put-input-1 after (?value)

(send ?self compute-output)

)

(defclass TWO-INPUT

(is-a ONE-INPUT)

(slot number-of-inputs (access read-only)

(default 2)

(create-accessor read) )

(slot input-2 (default UNDEFINED)

(visibility public)

(create-accessor write) )

(slot input-2-link (default GROUND)

(create-accessor write) )

(slot input-2-link-pin (default 1)

(create-accessor write) )

)

(defmessage-handler TWO-INPUT put-input-2 after (?value)

(send ?self compute-output)

)

Класс component является абстрактным потомком класса USER. Этот класс содержит единственный слот ID#  для идентификационного номера компонента и определяет для него акцессор записи. Класс будет являться суперклассом для всех классов логических элементов.

Набор классов no-output, one-output и two-output предназначен для реализации свойств элемента без выхода, с одним выходом и двумя выходами соответственно. Каждый следующий класс наследуется от предыдущего и добавляет к нему реализацию одного логического выхода.

Класс no-output имеет единственный слот number-of-outputs со значением по умолчанию 0 и доступен только для чтения. Этот слот предназначен для хранения числа выходов элемента, унаследованного от этого класса. Кроме того, класс no-output определяет обработчик compute-output, который унаследует и переопределит все логические элементы. Именно благодаря наличию этого обработчика объекты классов логических элементов смогут самостоятельно определять результат обработки полученных сигналов.

Класс one-output переопределяет слот number-of-outputs и назначает ему значение по умолчанию, равное 1. Кроме того, класс определяет набор слотов, предназначенных для описания логического выхода элемента, и связи этого выхода с последующими элементами схемы. Слот output-1 предназначен для хранения значения, образующегося на выходе элемента. По умолчанию слот имеет значение undefined. Слот output-1-link содержит имя объекта, с которым связан данный выход, и по умолчанию имеет значение ground. Слот output-1-link-pin содержит номер конкретного логического входа элемента, с которым связан данный выход, и по умолчанию равен 1. Класс one-output определяет after-обработчик  put-outout-1, который сразу после присвоения значения слоту output- 1 передает это значение на вход элемента, связанного с данным выходом.

Класс two-output тоже переопределяет слот number-of-outputs и присваивает ему значение по умолчанию, равное 2, а также добавляет набор слотов, предназначенных для описания второго логического выхода: output-2, output-2-link и output-2-link-pin и after-обработчик put-outout-2. Следует обратить внимание на тот факт, что слоты output-1, output-1-link и  output - l - link-pin и обработчик put-outout- 1 не переопределяются, а наследуются от класса one-output.

Набор классов no-input, one-input и two-input предназначен для реализации свойств элемента без входа, с одним входом и двумя входами соответственно. Каждый следующий класс наследуется от предыдущего и добавляет к нему реализацию еще одного логического входа. Назначение слотов, описывающих логический вход элементов input-x, input-x-link, Input-x-link-pin, идентично назначению слотов, использующихся в классах one-output и two-output. Кардинальное отличие классов, реализующих логику входов элемента, заключается в том, что вместо обработчика put-outout-x классы реализуют after-обработчик put-inout-x. Этот обработчик вызывает обработчик сообщения compute-output сразу после получения нового значения.

После определения классов component, no-output, one-output, two-output, no-input, one-input и two-input можно приступать к созданию классов, реализующих логику отдельных элементов схемы. Начнем с простейших по своей функциональности элементов  source и led.

Пример 2.  Классы логических элементов source и led

(defclass SOURCE

(is-a NO-INPUT ONE-OUTPUT COMPONENT)

(role concrete)

(slot output-1 (default UNDEFINED)

(create-accessor write))

)

(defclass LED

(is-a ONE-INPUT NO-OUTPUT COMPONENT)

(role concrete)

)

Класс source реализует поведение источника. Этот логический элемент имеет один выход и не имеет входов. Класс led является реализацией логического индикатора. Он имеет один вход и не имеет выходов. В дальнейшем при создании экспертной системы многократно придется решать проблему сбора результата обработки входных сигналов со всех индикаторов логической схемы. Для решения этой задачи предназначена следующая функция (пример 3).

Пример 3. Функция  LED-response.

(deffunction LED-response ()

(bind ?response (create$))

(do-for-all-instances ((?led LED)) TRUE

(bind ?response (create$ ?response

(send ?led get-input-1))))

?response

)

Эта функция собирает составное поле из значений, хранящихся во всех объектах класса led текущей логической схемы, с помощью функции do-for-all-instances.

Приступим к реализации более сложных логических элементов. Их реализация будет напоминать классы source и led, за исключением, того, что остальные логические элементы должны переопределять обработчик compute-output, который будет производить обработку сигнала, полученного на входе элемента (пример 4).

Пример. 4. Класс not-gate

(defclass NOT-GATE

(is-a ONE-INPUT ONE-OUTPUT COMPONENT)

(role concrete)

)

(deffunction not# (?x) (- 1 ?x))

(defmessage-handler NOT-GATE compute-output ()

(if (integerp ?self:input-1) then

 (send ?self put-output-1 (not# ?self:input-1)))

)

Следует обратить внимание, что в реализации обработчика compute-output используется функция not#, которая и выполняет необходимые вычисления. Определение класса not-gate чрезвычайно компактно, однако, благодаря использованию продуманной иерархии классов и множественного наследования, класс обладает всей необходимой функциональностью. Классы остальных логических элементов реализуем аналогично (пример 5).

Пример 5. Классы остальных логических элементов

(defclass AND-GATE

(is-a TWO-INPUT ONE-OUTPUT COMPONENT)

(role concrete)

)

(deffunction and# (?x ?y)

(if (and (!= ?x 0) (!= ?y 0)) then 1 else 0))

(defmessage-handler AND-GATE compute-output ()

(if (and (integerp ?self:input-1)

(integerp ?self:input-2) ) then

(send ?self put-output-1

(and# ?self:input-1 ?self:input-2) ) )

)

(defclass OR-GATE

(is-a TWO-INPUT ONE-OUTPUT COMPONENT)

(role concrete)

)

(deffunction or# (?x ?y)

(if (or (!= ?x 0) (!= ?y 0)) then 1 else 0))

(defmessage-handler OR-GATE compute-output ()

(if (and (integerp ?self:input-1)

(integerp ?self:input-2) ) then

(send ?self put-output-1

(or# ?self:input-1 ?self:input-2) ) )

)

(defclass NAND-GATE

(is-a TWO-INPUT ONE-OUTPUT COMPONENT)

(role concrete)

)

(deffunction nand# (?x ?y)

(if (not (and (!= ?x 0) (!= ?y 0))) then 1 else 0))

(defmessage-handler NAND-GATE compute-output ()

(if (and (integerp ?self:input-1)

(integerp ?self:input-2 )) then

(send ?self put-output-1

(nand# ?self:input-1 ?self:input-2) ) )

)

(defclass XOR-GATE

(is-a TWO-INPUT ONE-OUTPUT COMPONENT)

(role concrete)

)

(deffunction xor# (?x ?y)

(if (or (and (= ?x 1) (= ?y 0))

       (and (= ?x 0) (= ?y 1))) then 1 else 0))

(defmessage-handler XOR-GATE compute-output ()

(if (and (integerp ?self:input-1)

(integerp ?self:input-2)) then

(send ?self put-output-1

(xor# ?self:input-1 ?self:input-2) ) )

)

(defclass SPLITTER

(is-a ONE-INPUT TWO-OUTPUT COMPONENT)

(role concrete)

)

(defmessage-handler SPLITTER compute-output ()

(if (integerp ?self:input-1) then

(send ?self put-output-1 ?self:input-1)

(send ?self put-output-2 ?self:input-1) )

)

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

Связь логических элементов. После создания набора классов, необходимого для представления всех используемых логических элементов, встает вопрос объединения этих элементов в логическую схему. Для ввода в систему набора элементов, необходимых для создания заданной логической схемы, будем использовать отдельный файл с конструктором definstances. Ниже приведен пример такого конструктора для схемы, изображенной на рис. 2.

Пример 6. Набор, объектов логических элементов

(definstances circuit

(S-1 of SOURCE)

(S-2 of SOURCE)

(P-1 of SPLITTER)

(P-2 of SPLITTER)

(N-1 of NOT-GATE)

(O-1 of OR-GATE)

(X-1 of XOR-GATE)

(L-1 of LED)

(L-2 of LED)

)

Для связи этих элементов между собой можно разработать несколько функций, для каждого типа соединений. Однако гораздо лучшим решением в данном случае будет создание родовой функции (пример 7) с методами, учитывающими различие соединяемых объектов, полученных в качестве параметров.

Пример 7. Родовая функция connect

(defgeneric connect)

(defmethod connect ((?out ONE-OUTPUT) (?in ONE-INPUT))

(send ?out put-output-1-link ?in)

(send ?out put-output-1-link-pin 1)

(send ?in put-input-1-link ?out)

(send ?in put-input-1-link-pin 1)

)

(defmethod connect ( (?out ONE-OUTPUT) (?in TWO-INPUT) (?in-pin INTEGER) )

(send ?out put-output-1-link ?in)

(send ?out put-output-1-link-pin ?in-pin)

(send ?in  (sym-cat put-input- ?in-pin -link) ?out)

(send ?in  (sym-cat put-input- ?in-pin -link-pin) 1)

)

(defmethod connect ((?out TWO-OUTPUT) (?out-pin INTEGER) (?in ONE-INPUT))

(send ?out (sym-cat put-output- ?out-pin -link) ?in)

(send ?out (sym-cat put-output- ?out-pin -link-pin) 1)

(send ?in put-input-1-link ?out)

(send ?in put-input-1-link-pin ?out-pin)

)

(defmethod connect ((?out TWO-OUTPUT) (?out-pin INTEGER)

(?in TWO-INPUT) (?in-pin INTEGER))

(send ?out (sym-cat put-output- ?out-pin -link) ?in)

(send ?out (sym-cat put-output- ?out-pin -link-pin) ?in-pin)

(send ?in  (sym-cat put-input- ?in-pin -link) ?out)

(send ?in  (sym-cat put-input- ?in-pin -link-pin) ?out-pin)

)

Приведенные методы родовой функции connect учитывают все возможные типы соединений логических аргументов. Используя эту родовую функцию, можно написать простую процедуру инициализации логической схемы, приведенной на рис. 2.

Пример 8. Инициализация логической схемы

(deffunction connect-circuit()

(connect [S-1] [P-1])

(connect [S-2] [X-1] 2)

(connect [P-1] 1 [N-1])

(connect [P-1] 2 [O-1] 2)

(connect [N-1]  [O-1] 1)

(connect [O-1] [P-2])

(connect [P-2] 1 [L-1])

(connect [P-2] 2 [X-1] 1)

(connect [X-1] [L-2])

)

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

Дополнительные функции и переменные. Для реализации логики экспертной системы CIOS, помимо описанных выше классов, объектов, функций и родовых функций, понадобятся также некоторые дополнительные элементы. Добавим в систему следующие глобальные переменные (пример 9).

Пример 9. Необходимые глобальные переменные

(defglobal ?*gray-code*    =(create$)

          ?*sources*      =(create$)

          ?*max-iterations* = 0)

Переменная max-iterations служит для хранения максимального числа итераций при переборе всевозможных комбинаций входных сигналов системы. В переменной sources хранятся имена всех источников текущей логической схемы. Переменная gray-code предназначена для хранения текущего кода Грея.

В примере 10 приведена вспомогательная функция, определяющая номер элемента в коде Грея, значение которого необходимо изменить для перебора всех возможных вариантов входных сигналов.

Пример 10 Функция change-which-bit

(deffunction change-which-bit (?x)

(bind ?i 1)

(while (and (evenp ?x) (!= ?x 0)) do

(bind ?x (div ?x 2))

(bind ?i (+ ?i 1))

)

?i

)

Кроме того, поскольку фактическое определение функции, производящей связь логических элементов в схему, осуществляется в отдельном файле, необходимо предварительное объявление этой функции (пример 11).

Пример  11. Предварительное объявление функции connect-circuit

(deffunction connect-circuit ())

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

Пример 12. Правило startup

(defrule startup

=>      

(connect-circuit)

(bind ?*sources* (find-all-instances ((?x SOURCE)) TRUE))

(do-for-all-instances ((?x SOURCE)) TRUE

(bind ?*gray-code* (create$ ?*gray-code* 0) ) )  

(bind ?*max-iterations* (round (** 2 (length ?*sources*))))

(assert (current-iteration 0))

)

Правило startup не имеет явных условных элементов, поэтому правило будет активизировано первым фактом initial-fact. Сразу после запуска правила вызывается функция connect-circuit, инициализирующая текущую логическую схему. После этого правило получает имена всех элементов источников в переменную sources. Затем правило startup создает нулевой код Грея для начала процесса перебора всех вариантов входных сигналов, вычисляет максимальное количество итераций и добавляет факт с номером текущей итерации.

Теперь необходимо запустить итерационный процесс перебора комбинаций входных  сигналов. Для этого служит правило compute-response-lst-time (пример 13).

Пример 13  Правило compute-response-lst-time

(defrule compute-response-1st-time

?f <- (current-iteration 0)

=>

(do-for-all-instances ((?source SOURCE)) TRUE

(send ?source put-output-1 0))

(assert (result ?*gray-code* =(str-implode (LED-response))))

(retract ?f)

(assert (current-iteration 1))

)

Это правило предназначено для первого шага перебора всевозможных входных сигналов. Оно передает нулевой сигнал всем источникам логической схемы, что вызывает автоматическое вычисление результата. Далее полученный результат сохраняется в факте вида:

(result текущее – состояние - источников текущее – состояние - индикаторов)

После этого правило удаляет факт (current-iteration 0), который и запускает правило и добавляет факт (current-iteration 1).

Логика работы правила compute-response-other-times  (пример 14) подобна работе правила compute-response-ist-time, за исключением того, что в начале с помощью вызова функции change-which-bit оно определяет, какой из источников схемы должен поменять входящий сигнал, и меняет его.

Пример 14. Правило compute-response-other-times

(defrule compute-response-other-times

?f <- (current-iteration ?n&~0&:(< ?n ?*max-iterations*))

=>

(bind ?pos (change-which-bit ?n))

(bind ?nv (- 1 (nth ?pos ?*gray-code*)))

(bind ?*gray-code* (replace$ ?*gray-code* ?pos ?pos ?nv))

(send (nth ?pos ?*sources*) put-output-1 ?nv)

(assert (result ?*gray-code* =(str-implode (LED-response))))  

(retract ?f)

(assert (current-iteration =(+ ?n 1)))

)

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

Правило merge-responses (пример 15) предназначено для оптимизации вычисляемой таблицы истинности и имеет более высокий приоритет, поэтому выполняется сразу после того, как в системе появятся два факта, удовлетворяющие заданной маске.

Пример 15. Правило marge-responses

(defrule merge-responses

(declare (salience 10))

?fl <- (result $?b ?x $?e ?response)

?f2 <- (result $?b ~?x $?e ?response)

=>

(retract ?fl ?f2)

(assert (result ?b * ?e ?response))

)

Правило print-header  (пример 16) предназначено для вывода на экран заголовка таблицы истинности.

Пример 16. Правило print-header

(defrule print-header

(declare (salience -10) )

=>

(do-for-all-instances ((?x SOURCE)) TRUE

(format t " %3s " (sym-cat ?x) ) )

(printout t " | ")

(do-for-all-instances ((?x LED)) TRUE

(format t " %3s " ( sym-cat ?x) ) )

(format t "%n")

(do-for-all-instances ((?x SOURCE)) TRUE

(printout t "-----"))

(printout t "-+-")

(do-for-all-instances ((?x LED)) TRUE

(printout t "-----"))

(format t "%n")

 (assert (print-results))

)

Затем правило добавляет в систему факт print-results, активизирующий правило print-result. Заголовок содержит список всех источников системы и список индикаторов, разделенных вертикальной чертой. Кроме того, для большего удобства восприятия правило отделяет заголовок таблицы от ее содержания дополнительной строкой. Это правило имеет более низкий приоритет, чем остальные правила экспертной системы, и не имеет явных условных элементов. Поэтому выполняется только после завершения перебора всевозможных комбинаций входных сигналов логической схемы.

Правило print-result (пример 17) выводит на экран оптимизированную таблицу истинности, сортируя при этом ее строки.

Пример 17. Правило print-result

(defrule print-result

(print-results)

?f <- (result $?input ?response)

(not (result $?input-2 ?response-2&:

(< (str-compare ?response-2 ?response) 0) ) )

=>

(retract ?f)

(while (neq ?input (create$)) do

(printout t "  " (nth 1 ?input) "  ")

(bind ?input (rest$ ?input)))

(printout t " | ")

(bind ?response (str-explode ?response))

(while (neq ?response (create$)) do

(printout t "  " (nth 1 ?response) "  ")

(bind ?response (rest$ ?response)))

(printout t crlf)

)

Листинг программы. Разработку экспертной системы CIOS можно считать завершенной. Ниже приводится полный листинг программы CIOS.

(defclass COMPONENT 

         (is-a USER)

         (slot ID# (create-accessor write))

         )

(defclass NO-OUTPUT

          (is-a USER)

          (slot number-of-outputs (access read-only)

          (default 0)

                      (create-accessor read) )

           )

(defmessage-handler NO-OUTPUT compute-output ( ) )

(defclass ONE-OUTPUT

          (is-a NO-OUTPUT)

          (slot number-of-outputs (access read-only)

                                  (default 1)

                                  (create-accessor read) )  

          (slot output-1 (default UNDEFINED)

                      (create-accessor write) )

          (slot output-1-link (default GROUND)

                      (create-accessor write) )

          (slot output-1-link-pin (default 1)

                      (create-accessor write) )

           )

(defmessage-handler ONE-OUTPUT put-output-1 after (?value)

          (send ?self:output-1-link

                (sym-cat put-input- ?self:output-1-link-pin)

                 ?value)

           )

(defclass TWO-OUTPUT

(is-a ONE-OUTPUT)

(slot number-of-outputs (access read-only)

(default 2)

(create-accessor read) )

(slot output-2 (default UNDEFINED)

(create-accessor write) )

(slot output-2-link (default GROUND)

(create-accessor write) )

(slot output-2-link-pin (default 1)

(create-accessor write) )

)

(defmessage-handler TWO-OUTPUT put-output-2 after (?value)

(send ?self:output-2-link

(sym-cat put-input- ?self:output-2-link-pin)

?value)

)

(defclass NO-INPUT

(is-a USER)

(slot number-of-inputs (access read-only)

(default 0)

(create-accessor read) )

)

(defclass ONE-INPUT

(is-a NO-INPUT)

(slot number-of-inputs (access read-only)

(default 1)

(create-accessor read) )

(slot input-1 (default UNDEFINED)

(visibility public)

(create-accessor read-write) )

(slot input-1-link (default GROUND)

(create-accessor write) )

(slot input-1-link-pin (default 1)

(create-accessor write) )

)

(defmessage-handler ONE-INPUT put-input-1 after (?value)

(send ?self compute-output)

)

(defclass TWO-INPUT

(is-a ONE-INPUT)

(slot number-of-inputs (access read-only)

(default 2)

(create-accessor read) )

(slot input-2 (default UNDEFINED)

(visibility public)

(create-accessor write) )

(slot input-2-link (default GROUND)

(create-accessor write) )

(slot input-2-link-pin (default 1)

(create-accessor write) )

)

(defmessage-handler TWO-INPUT put-input-2 after (?value)

(send ?self compute-output)

)

(defclass SOURCE

(is-a NO-INPUT ONE-OUTPUT COMPONENT)

(role concrete)

(slot output-1 (default UNDEFINED)

(create-accessor write))

)

(defclass LED

(is-a ONE-INPUT NO-OUTPUT COMPONENT)

(role concrete)

)

(defclass NOT-GATE

(is-a ONE-INPUT ONE-OUTPUT COMPONENT)

(role concrete)

)

(deffunction not# (?x) (- 1 ?x))

(defmessage-handler NOT-GATE compute-output ()

(if (integerp ?self:input-1) then

 (send ?self put-output-1 (not# ?self:input-1)))

)

(defclass AND-GATE

(is-a TWO-INPUT ONE-OUTPUT COMPONENT)

(role concrete)

)

(deffunction and# (?x ?y)

(if (and (!= ?x 0) (!= ?y 0)) then 1 else 0))

(defmessage-handler AND-GATE compute-output ()

(if (and (integerp ?self:input-1)

(integerp ?self:input-2) ) then

(send ?self put-output-1

(and# ?self:input-1 ?self:input-2) ) )

)

(defclass OR-GATE

(is-a TWO-INPUT ONE-OUTPUT COMPONENT)

(role concrete)

)

(deffunction or# (?x ?y)

(if (or (!= ?x 0) (!= ?y 0)) then 1 else 0))

(defmessage-handler OR-GATE compute-output ()

(if (and (integerp ?self:input-1)

(integerp ?self:input-2) ) then

(send ?self put-output-1

(or# ?self:input-1 ?self:input-2) ) )

)

(defclass NAND-GATE

(is-a TWO-INPUT ONE-OUTPUT COMPONENT)

(role concrete)

)

(deffunction nand# (?x ?y)

(if (not (and (!= ?x 0) (!= ?y 0))) then 1 else 0))

(defmessage-handler NAND-GATE compute-output ()

(if (and (integerp ?self:input-1)

(integerp ?self:input-2 )) then

(send ?self put-output-1

(nand# ?self:input-1 ?self:input-2) ) )

)

(defclass XOR-GATE

(is-a TWO-INPUT ONE-OUTPUT COMPONENT)

(role concrete)

)

(deffunction xor# (?x ?y)

(if (or (and (= ?x 1) (= ?y 0))

       (and (= ?x 0) (= ?y 1))) then 1 else 0))

(defmessage-handler XOR-GATE compute-output ()

(if (and (integerp ?self:input-1)

(integerp ?self:input-2)) then

(send ?self put-output-1

(xor# ?self:input-1 ?self:input-2) ) )

)

(defclass SPLITTER

(is-a ONE-INPUT TWO-OUTPUT COMPONENT)

(role concrete)

)

(defmessage-handler SPLITTER compute-output ()

(if (integerp ?self:input-1) then

(send ?self put-output-1 ?self:input-1)

(send ?self put-output-2 ?self:input-1) )

)

(defgeneric connect)

(defmethod connect ((?out ONE-OUTPUT) (?in ONE-INPUT))

(send ?out put-output-1-link ?in)

(send ?out put-output-1-link-pin 1)

(send ?in put-input-1-link ?out)

(send ?in put-input-1-link-pin 1)

)

(defmethod connect ( (?out ONE-OUTPUT) (?in TWO-INPUT) (?in-pin INTEGER) )

(send ?out put-output-1-link ?in)

(send ?out put-output-1-link-pin ?in-pin)

(send ?in  (sym-cat put-input- ?in-pin -link) ?out)

(send ?in  (sym-cat put-input- ?in-pin -link-pin) 1)

)

(defmethod connect ((?out TWO-OUTPUT) (?out-pin INTEGER) (?in ONE-INPUT))

(send ?out (sym-cat put-output- ?out-pin -link) ?in)

(send ?out (sym-cat put-output- ?out-pin -link-pin) 1)

(send ?in put-input-1-link ?out)

(send ?in put-input-1-link-pin ?out-pin)

)

(defmethod connect ((?out TWO-OUTPUT) (?out-pin INTEGER)

(?in TWO-INPUT) (?in-pin INTEGER))

(send ?out (sym-cat put-output- ?out-pin -link) ?in)

(send ?out (sym-cat put-output- ?out-pin -link-pin) ?in-pin)

(send ?in  (sym-cat put-input- ?in-pin -link) ?out)

(send ?in  (sym-cat put-input- ?in-pin -link-pin) ?out-pin)

)

(defglobal ?*gray-code*    =(create$)

          ?*sources*      =(create$)

          ?*max-iterations* = 0)

(deffunction change-which-bit (?x)

(bind ?i 1)

(while (and (evenp ?x) (!= ?x 0)) do

(bind ?x (div ?x 2))

(bind ?i (+ ?i 1))

)

?i

)

(deffunction LED-response ()

(bind ?response (create$))

(do-for-all-instances ((?led LED)) TRUE

(bind ?response (create$ ?response

(send ?led get-input-1))))

?response

)

(deffunction connect-circuit ())

(defrule startup

=>      

(connect-circuit)

(bind ?*sources* (find-all-instances ((?x SOURCE)) TRUE))

(do-for-all-instances ((?x SOURCE)) TRUE

(bind ?*gray-code* (create$ ?*gray-code* 0) ) )  

(bind ?*max-iterations* (round (** 2 (length ?*sources*))))

(assert (current-iteration 0))

)

(defrule compute-response-1st-time

?f <- (current-iteration 0)

=>

(do-for-all-instances ((?source SOURCE)) TRUE

(send ?source put-output-1 0))

(assert (result ?*gray-code* =(str-implode (LED-response))))

(retract ?f)

(assert (current-iteration 1))

)

(defrule compute-response-other-times

?f <- (current-iteration ?n&~0&:(< ?n ?*max-iterations*))

=>

(bind ?pos (change-which-bit ?n))

(bind ?nv (- 1 (nth ?pos ?*gray-code*)))

(bind ?*gray-code* (replace$ ?*gray-code* ?pos ?pos ?nv))

(send (nth ?pos ?*sources*) put-output-1 ?nv)

(assert (result ?*gray-code* =(str-implode (LED-response))))  

(retract ?f)

(assert (current-iteration =(+ ?n 1)))

)

(defrule merge-responses

(declare (salience 10))

?fl <- (result $?b ?x $?e ?response)

?f2 <- (result $?b ~?x $?e ?response)

=>

(retract ?fl ?f2)

(assert (result ?b * ?e ?response))

)

(defrule print-header

(declare (salience -10) )

=>

(do-for-all-instances ((?x SOURCE)) TRUE

(format t " %3s " (sym-cat ?x) ) )

(printout t " | ")

(do-for-all-instances ((?x LED)) TRUE

(format t " %3s " ( sym-cat ?x) ) )

(format t "%n")

(do-for-all-instances ((?x SOURCE)) TRUE

(printout t "-----"))

(printout t "-+-")

(do-for-all-instances ((?x LED)) TRUE

(printout t "-----"))

(format t "%n")

(assert (print-results))

)

(defrule print-result

(print-results)

?f <- (result $?input ?response)

(not (result $?input-2 ?response-2&:

(< (str-compare ?response-2 ?response) 0) ) )

=>

(retract ?f)

(while (neq ?input (create$)) do

(printout t "  " (nth 1 ?input) "  ")

(bind ?input (rest$ ?input)))

(printout t " | ")

(bind ?response (str-explode ?response))

(while (neq ?response (create$)) do

(printout t "  " (nth 1 ?response) "  ")

(bind ?response (rest$ ?response)))

(printout t crlf)

)

Тестирование системы. Для проверки экспертной системы будем использовать логические схемы, приведенные на рис. 2, 3, 4. Создайте три файла: scheme-l.CLP, scheme -2.CLP и scheme -3.CLP. Далее приведено содержание этих файлов.

СОДЕРЖИМОЕ ФАЙЛА SCHEME-1.CLP

(definstances circuit

(S-1 of SOURCE)

(S-2 of SOURCE)

(P-1 of SPLITTER)

(P-2 of SPLITTER)

(N-1 of NOT-GATE)

(O-1 of OR-GATE)

(X-1 of XOR-GATE)

(L-1 of LED)

(L-2 of LED)

)

(deffunction connect-circuit()

(connect [S-1] [P-1])

(connect [S-2] [X-1] 2)

(connect [P-1] 1 [N-1])

(connect [P-1] 2 [O-1] 2)

(connect [N-1]  [O-1] 1)

(connect [O-1] [P-2])

(connect [P-2] 1 [L-1])

(connect [P-2] 2 [X-1] 1)

(connect [X-1] [L-2])

)

СОДЕРЖИМОЕ ФАЙЛА SCHEME-2.CLP

(definstances circuit

(S-1 of SOURCE)

(S-2 of SOURCE)

(P-1 of SPLITTER)

(P-2 of SPLITTER)

(A-1 of AND-GATE)

(N-1 of NOT-GATE)

(N-2 of NOT-GATE)

(N-3 of NOT-GATE)

(O-1 of OR-GATE)

(X-1 of XOR-GATE)

(L-1 of LED)

)

(deffunction connect-circuit()

(connect [S-1] [P-1])

(connect [S-2] [P-2])

(connect [P-1] 1 [A-1] 1)

(connect [P-1] 2 [N-2])

(connect [P-2] 1 [A-1] 2)

(connect [P-2] 2 [N-3])

(connect [A-1] [N-1])

(connect [N-2] [O-1] 1)

(connect [N-3] [O-1] 2)

(connect [N-1] [X-1] 1)

(connect [O-1] [X-1] 2)

(connect [X-1] [L-1])

)

СОДЕРЖИМОЕ файла scheme-3.CLP

(definstances circuit

(S-1 of SOURCE)

(S-2 of SOURCE)

(S-3 of SOURCE)

(S-4 of SOURCE)

(S-5 of SOURCE)

(S-6 of SOURCE)

(P-1 of SPLITTER)

(P-2 of SPLITTER)

(P-3 of SPLITTER)

(P-4 of SPLITTER)

(N-1 of NOT-GATE)

(N-2 of NOT-GATE)

(N-3 of NOT-GATE)

(O-1 of OR-GATE)

(O-2 of OR-GATE)

(X-1 of XOR-GATE)

(X-2 of XOR-GATE)

(A-1 of AND-GATE)

(D-1 of NAND-GATE)

(D-2 of NAND-GATE)

(L-1 of LED)

(L-2 of LED)

(L-3 of LED)

)

(deffunction connect-circuit()

(connect [S-1] [P-1])

(connect [S-2] [P-2])

(connect [S-3] [P-3])

(connect [S-4] [A-1] 2)

(connect [S-5] [D-1] 2)

(connect [S-6] [O-2] 2)

(connect [P-1] 1 [O-1] 1)

(connect [P-1] 2 [N-1])

(connect [P-2] 1 [N-2])

(connect [P-2] 2 [A-1] 1)

(connect [P-3] 1 [X-1] 2)

(connect [P-3] 2 [D-1] 1)

(connect [N-1]  [X-1] 1)

(connect [N-2]  [O-1] 2)

(connect [O-1] [X-2] 1)

(connect [X-1] [X-2] 2)

(connect [A-1] [D-2] 1)

(connect [D-1] [O-2] 1)

(connect [X-2] [P-4])

(connect [O-2] [D-2] 2)

(connect [P-4] 1 [N-3])

(connect [P-4] 2 [L-2])

(connect [D-2] [L-3])

(connect [N-3] [L-1])

)

Запуск программы. Для запуска программы следует очистить среду CLIPS командой (clear) и выполнить команду (load «CIOS.CLP»). При успешном варианте загрузки экспертной системы функция  load возвращает значение TRUE. Если это не так, то в синтаксисе определений файла  CIOS.CLP была допущена ошибка. После удачной загрузки следует убедиться, что все определения присутствуют в системе. Легче всего это сделать с помощью соответствующих менеджеров. Внешний вид их приведен на рис. 5 – 7.  

Рис. 5. Классы экспертной системы

Для запуска экспертной системы необходимо загрузить файл с определением логической схемы, например командой (load «scheme -1.CLP»). После этого необходимо сделать команды  reset и run для запуска основного цикла выполнения правил.

Рис. 6. Функции экспертной системы

Рис. 7. Правила экспертной системы.

Пример работы системы показан на рис. 8.

Рис. 8. Оптимизированная таблица истинности для scheme-l.CLP 

Для того чтобы лучше понять принципы работы экспертной системы, попробуйте выполнить ее по шагам с помощью команды (run 1), наблюдая за изменениями в списке фактов, объектов, переменных и плане решения задачи. Для этого сделайте видимыми окна Facts Window, Instances Window, Globals Window и Agenda Window, воспользовавшись соответствующими пунктами меню Window. Рассмотренный пример является наглядным подтверждением эффективности  использования объектно-ориентированных возможностей и родовых функций в среде CLIPS.

Контрольные вопросы к практическому занятию № 5

  1.  В чем проявляются объектно-ориентированные возможности языка CLIPS при построении экспертной системы CIOS?
  2.  Перечислите классы в экспертной системе CIOS, в чем их назначение?
  3.  Какие типы обработчиков сообщений есть в экспертной системе CIOS?
  4.  Укажите виды родовых функций. Приведите пример их использования для связывания логических элементов разных типов.
  5.  Укажите основные части экспертной системы CIOS. К полному листингу программы CIOS приведите подробный комментарий, описывающий ее работу.

ДОМАШНЕЕ ЗАДАНИЕ № 2

СОЗДАНИЕ ЭКСПЕРТНОЙ СИСТЕМЫ ПОСТРОЕНИЯ

И ОПТИМИЗАЦИИ ТАБЛИЦЫ  ИСТИННОСТИ

ЛОГИЧЕСКОЙ СХЕМЫ

Цель задания.  Разработка логической схемы для реализации частично определенной логической функции четырех аргументов и оптимизация таблицы истинности логической схемы с помощью  экспертной системы CIOS.   

Варианты заданий.

  1.  Разработать логические схемы для реализации частично определенной логической функции четырех аргументов (табл. 1). Каждая комбинация значений аргументов двоичных переменных ABCD отображается числом N, равным . Значения функции при неуказанных комбинациях значений аргументов необходимо доопределить для получения схемы с минимальным числом элементов. Минимизацию логической функции выполнить с помощью карт Карно на базе следующих типов элементов и схем: 2И, 2ИЛИ, НЕ; 2И-НЕ; 2ИЛИ-НЕ.
  2.  Для ввода в экспертную систему набора элементов, необходимых для создания построенной логической схемы,  использовать отдельный файл с конструктором definstances. Написать простую процедуру инициализации логической схемы с применением родовой функции connect.
  3.  Для проверки экспертной системы выполнить ее тестирование путем создания трех файлов: scheme-A.CLP, scheme-B.CLP и scheme-C.CLP.
  4.  Осуществить загрузку экспертной системы и выполнить наблюдение за изменениями в списке фактов, объектов, переменных и в плане решения задачи с помощью видимых окон Facts Window, Instances Window, Globals Window и Agenda Window, воспользовавшись соответствующими пунктами меню Window.

                                                                                                                    Таблица 1

Варианты таблиц

частично определенной логической функции

1

N

1

2

3

4

6

7

8

9

11

12

F

0

0

1

0

1

1

0

1

1

0

2

N

0

2

3

5

6

7

8

9

13

15

F

0

1

0

0

1

1

0

0

1

0

3

N

1

2

3

4

6

7

9

12

13

14

F

0

1

1

0

1

0

0

1

0

1

                                                                                                   Продолжение табл. 1

4

N

0

2

3

5

6

7

8

10

12

13

F

0

1

1

0

0

1

1

1

0

0

5

N

0

1

3

4

6

9

10

11

14

15

F

0

1

0

0

0

1

0

1

1

1

6

N

0

1

2

5

7

10

11

13

14

15

F

0

0

0

1

0

1

0

1

1

1

7

N

1

3

4

5

6

10

11

12

14

15

F

0

0

1

0

0

1

1

1

1

0

8

N

0

2

4

5

7

8

10

11

14

15

F

1

0

0

0

0

1

1

1

0

1

9

N

0

1

3

4

5

6

9

10

11

14

F

0

1

0

1

1

0

1

0

1

0

10

N

0

1

2

4

5

7

10

11

13

15

F

1

0

0

1

1

0

0

0

1

1

11

N

0

1

3

4

5

6

11

12

14

15

F

1

1

0

1

0

0

0

1

1

0

12

N

0

1

2

4

5

7

8

10

14

15

F

1

1

0

0

1

0

1

1

0

0

13

N

1

2

3

4

6

8

9

11

12

13

F

0

0

1

0

0

0

1

1

1

1

14

N

0

2

3

5

7

8

9

12

13

15

F

0

0

0

0

1

1

0

1

1

1

15

N

1

3

4

6

7

8

9

12

13

14

F

0

0

0

1

0

1

1

1

0

1

16

N

0

2

5

6

7

8

9

10

12

13

F

0

1

0

0

0

1

1

1

0

1

17

N

0

2

3

5

6

7

8

9

10

13