На правах рекламы:
ISSN 0236-235X (P)
ISSN 2311-2735 (E)

Авторитетность издания

ВАК - К1
RSCI, ядро РИНЦ

Добавить в закладки

Следующий номер на сайте

4
Ожидается:
09 Декабря 2024

Система продукционного программирования баз данных dbPILOT

Статья опубликована в выпуске журнала № 2 за 1992 год.
Аннотация:
Abstract:
Автор: Щенников С.Ю. () -
Ключевое слово:
Ключевое слово:
Количество просмотров: 11803
Версия для печати

Размер шрифта:       Шрифт:

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

1.       Ограниченный объем накопителей типа "вин честер". Чтобы поддерживать оперативную работу системы приходится при поступлении новой порции информации удалять с винчестера старую. Эта при чина технического характера. Она будет постепенно устраняться с появлением накопителей большего объема.

2.       Информационные системы в большинстве своем реализованы на базе таких СУБД, как dBASB, Paradox, FoxBase, Clipper и др. Эти СУБД поставля ют достаточно мощные и гибкие средства по вводу информации с входных документов, ее сортировке, формированию выходных документов. Они имеют встроенные языки программирования, которые можно использовать для написания нестандартных процедур обработки информации в БД. Но мощность этих языков недостаточна для того, чтобы перейти от программирования правил формирования выход ных документов к эффективному программированию правил обработки информации ("вчерашней" и "се годняшней") экспертом (например брокером, имею щим перед собой информацию по предложениям и покупкам за несколько месяцев, которому нужно провести ее анализ).

Задача программной реализации правил обработки информации (из баз данных) экспертом аналогична классической задаче программирования (представления) знаний эксперта в системах искусственного интеллекта (СИИ), когда знания представляются в виде продукций. Для записи продукционных правил разработано множество языков программирования, называемых продукционными (PROLOG, OPS, KEE, ART и др.), и накоплен достаточно большой опыт по их использованию. Они ориентированы на работу с данными собственного формата, отличного от записей реляционных баз данных, хотя многие из них умеют импортировать и экспортировать записи при обмене с БД. Эта способность позволяет использовать продукционные языки для программирования экспертных правил обработки информации из баз данных, но "расходы" на операции импорта/экспорта могут свести эффективность прикладной информационной системы к нулю. Поэтому необходим продукционный язык, ориентированный на работу непосредственно с записями БД.

В данной статье описывается продукционный язык программирования dbPILOT, предназначенный для записи продукций, которые в качестве данных используют представления БД. Язык реализован на базе продукционного языка PILOT, который был разработан в ВЦ АН СССР. dbPILOT наследовал от базового языка многие его положительные свойства: модульность, управляемый режим формирования и усечения конфликтного множества, режимы сопоставления образцов, режимы выполнения продукций из конфликтного множества, возможность записи вложенных образцов (через спецификаторы с использованием связанных переменных), дековые переменные и многое другое.

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

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

 [<описате2и_секции> J [ < правила_выбора > ] I < правила_разрешения> f < продукции >

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

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

< правила_се лекции > н— SELECTION <продукции>

Раздел правил разрешения, как и раздел правил селекции, содержит продукции.

< правнла селекции > ::= RESOLUTION <продукции>

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

Продукция является основной логической единицей программы на dbPILOT и имеет уникальное имя. Она должна содержать левую и правую части.

< продукция >::- RULE < имя продукции > < левая_часть >

< правая_часть >

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

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

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

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

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

< обраэец_эаписи > ::— [ <режим сопоставления>] ( <префикс образца> < шаблон номера записи > [ < спецификатор > j: [ < шаблоны_полей > ] )

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

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

В режиме сопоставления также можно указать, что образец должен быть сопоставлен хотя бы одной записи. Бели такое указание было сделано, но ни одну запись не удалось сопоставить с образцом, то управление передается обработчику ошибок вместе с информацией о том, где и по какой причине не произошло сопоставления. Обработчик может быть запрограммирован пользователем на dbPILOT или Си.

Составными частями образца записи являются шаблоны номера записи, имен полей, шаблоны значений полей и спецификаторы. Шаблон задает способ сопоставления элемента образца и соответствующей ему компоненты записи (номер записи, имя поля, значение поля). Способов сопоставления два: 1) элемент сопоставим с' любым компонентом и 2) элемент сопоставим с компонентом, совпадающим с ним по написанию.

<шаблон_поля> ::= < шаблон имени_поля >

= < шаблон_значения_поля > [ < спецификатор > ] < шаблон >     :: = *

< Попеременная =• |

< вычис ляемое_выражение >

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

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

<спецификатор> ::= { <образцы_строк> ) |

{ < вычисляемое выражение > )

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

Перейдем к рассмотрению правой части продукции. Она содержит список операций, которые выполняются в порядке следования в случае применения продукции.

<правая_часть> ::= ACTION <операции>

Все операции разделены на три группы: операция присвоения, манипулятор и внешние операции.

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

Манипулятор — это семейство операций по изменению записей баз данных, заносимых в один конструктив. Выделено 3 операции: добавить запись в базу данных, изменить записи в базе данных, удалить записи из базы данных. Если в манипуляторе указано имя файла индекса, то это приводит к автоматической перестройке индекса.

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

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

Для операции изменения записей, образец определяет, какие из них должны быть изменены. Изменены же будут только те, которые сопоставились с образцом манипулятора. Сколько записей нужно изменить задается режимом сопоставления. Изменение записи заключается в смене значений ее полей. ПоБа-зать значение какого поля надо изменить можно, поставив перед шаблоном имени поля обратную черту, шаблон значения поля будет содержать новое значение поля. Шаблоны имен полей (вместе с шаблонами значений), перед которыми стоит обратная черта, в сопоставлении образца манипулятора не участвуют.

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

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

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

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

На этом мы завершим описание конструкций языка.

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

Допустим, имеются две базы данных; Firm - база данных совместных предприятий, малых предприятий, акционерных обществ, частных фирм и т.д., содержащая наименование организаций, ее месторасположение и код; Firmlnfo - база данных, хранящая информацию о фирме (в том числе тип фирмы, годовой оборот, число сотрудников, ранг фирмы, код фирмы учредителя, если это дочерняя фирма). Нужно, исходя из информации в названных базах, выявить в Москве крупные совместные предприятия, выставить им соответствующий ранг, при этом такой же ранг присвоить их дочерним фирмам независимо от месторасположения. Будем считать фирму крупной, если соотношение ее годового оборота и численности сотрудников больше 100000.

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

Продукция Rl_First имеет левую часть, содержащую два вложенных образца (через спецификатор). Расшифровывается она так: "попытаться найти следующую (" - режим сопоставления) запись в базе Firm.dbf в соответствии с порядком, заданном в индексе FirmName.ndx (база индексирована по названиям фирм). Эта запись в поле ГОРОД должна иметь значение "Москва", при этом значение ее поля КОД свяжется с переменной FirmCode. Далее спецификатор, если в базе Firmlnfo.dbf no индексу FirmlCod.ndx под ключем, равным значению связанной переменной FirmCode (база индексирована по кодам фирм), есть запись со значением поля ТИПФИРМЫ, равным "СП" (значения полей ГОДОВОЙ_ОБОРОТ и ЧИСЛО_СОТРУДНИКОВ связываются с переменными YearMoney и NPeaple соответственно), и - спецификатор - частное от этих связанных переменных больше 100000, то с переменной FirmName связывается значение поля НАЗВАНИЕ рассматриваемой в данный момент записи из базы Firm.dbf.". В этом случае считается, что

искомая запись найдена. Иными словами, найдена информация о СП, которое можно отнести к рязряду крупных. Обратим внимание на то, что переменные NRecord - номер записи, FirmCode - код СП, Year-Money - годовой оборот, NPeaple - число сотрудников, FirmName - название СП. Таким образом, левая часть отвечает на вопрос "есть ли в базе данных информация о СП, которое можно назвать крупным?".

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

Вторая операция - манипулятор - изменит значение поля РАНГ_ФИРМЫ на "Крупная" в записи (базы Firmlnfo.dbf) с номером из переменной NRecord, т.е. в записи, сопоставленной с внешним образцом левой части продукции, если значение этого поля не равно "Крупная". Таким образом, эта операция фиксирует изменение ранга СП.

Третья операция - манипулятор - заменит значение поля РАНГ_ФИРМЫ на "Крупная" во всех записях (" — режим сопоставления) базы Firmlnfo, в которых значения полей ТИПФИРМЫ, КОД_ФИРМЫ_ УЧРЕДИТЕЛЯ равны соответственно "Дочерняя" и значению переменной FirmCode (коду СП, которое было идентифицировано как крупное). Таким образом, эта операция фиксирует изменение ранга у всех организаций, являющихся дочерними по отношению к СП, отнесенному к разряду крупных.

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

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

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

Для эффективного программирования на языке dbPILOT разработана среда программирования, близкая по поддерживаемой технологии к средам типа Turbo и Quick. Она включает в себя средства управления файлами, директориями, устройствами, текстовой редактор, встроенный компилятор с dbPILOT, отладчик (с аппаратом точек останова, трассы выполнения, просмотра динамических объектов программы), модуль project-технологии сборки программ, настраиваемый текстовой конструктор программ и блок контекстной помощи по работе со средой. В состав среды также входит документация по языку и программа просмотра ее в виде гипертекста.

Язык dbPILOT в настоящее время обеспечивает программирование баз данных двух наиболее распространенных форматов dBASE и PARADOX. Ожидается, что основным направлением будет расширение возможностей языка для работы с базами данных других форматов. Вполне вероятно, что к моменту публикации этой статьи появится версия языка dbPILOT для баз данных db_VISTA.

Другим направлением будет адаптация программных средств для работы в среде WINDOWS. Важное место займет работа по совершенствованию самого языка dbPILOT. Продолжатся разработки на его основе экспертных систем и информационных систем со сложной логикой обработки данных.


Постоянный адрес статьи:
http://swsys.ru/index.php?id=1452&page=article
Версия для печати
Статья опубликована в выпуске журнала № 2 за 1992 год.

Возможно, Вас заинтересуют следующие статьи схожих тематик: