описываемыми здесь моделями. В первом случае речь идет о связях на атрибутах реляционных схем
СПИСОК ЛИТЕРАТУРЫ
1. Минц Г.Е. Резолютивные исчисления для неклассических логик. // 9-ый Советский Кибернетический симпозиум. - 1981. - Т. 2. - № 4. - С. 34-36.
2. Новосельцев В.Б. Использование методов ИИ в системах автоматизации атмосферно-оптических исследований. // Журнал оптики атмосферы и океана. Спец. выпуск. - 1998.- № 2. - С. 56-63.
3. Alty J.L. Expert systems. - Washington: NCC Publications, 1987. - 190 p.
4. Поспелов Д.А. Логико-лингвистические модели в системах управления. - М.: Энергоиздат, 1981. - 231 с.
5. Кахро М.И., Калья А.П., Тыугу Э.Х. Инструментальная система программирования ЕС ЭВМ (ПРИЗ). - М.: Финансы и статистика, 1981. - 216 с.
в базах данных, а во втором - рассматриваются линейные вычислительные модели.
6. Новосельцев В.Б. Синтез рекурсивных программ в системе СПОРА // Институт теоретической астрономии АН СССР. Алгоритмы небесной механики. - 1985. - № 43. - С. 21-45.
7. Минц Г.Е., Тыугу Э.Х. Полнота правил структурного синтеза // Доклады АН СССР. - 1982. - Т. 2. - № 6. - С. 41-60.
8. Дал У., Дейкстра Э., Хоар К. Структурное программирование. - М.: Мир, 1975. - 327 с.
9. Ульман Дж. Основы систем баз данных. - М.: Финансы и статистика, 1983. - 432 с.
10. Диковский А.Я. Детерминированные вычислительные модели // Техническая кибернетика. - 1984. - Т. 5. - № 5. - С. 84-105.
УДК 004.89
ОБРАБОТКА РЕКУРСИВНЫХ ДАННЫХ КОНЕЧНЫМИ АВТОМАТАМИ
В.Б. Новосельцев, В.В. Соколова
Институт «Кибернетический центр» ТПУ E-mail: [email protected]
Предлагается альтернативный стандартному формализму подход к обработке рекурсивных данных. Основной идеей является первичность функциональности, а не данных. Функциональность реализуется механизмами, основанными на теории конечных автоматов. Полученные результаты позволяют использовать новые методы для создания естественного описания предметной области, содержащей рекурсивные структуры, что, в свою очередь, повышает эффективность манипулирования такими данными.
Классическая парадигма работы с организованными данными определяется реляционной моделью Кодда [1]. При всей своей строгости и лаконичности эта модель обладает одним серьезным недостатком - она является существенно эксплицитной, т. е. не допускает «динамики» в процессе использования. Существует много рекурсивных моделей, в которых образующим элементом является определенная внутренняя структура, сама являющаяся объектом модели, например, модели геномов, сложные химические образования или экономические модели. В таких случаях, реляционный подход позволяет определять рекурсию на данных путем введения, например, явного понятия предка, однако, этот паллиативный вариант не более чем моделирует частичный порядок внесистемными конструкциями [2]. Определенное продвижение в организации рекурсивных данных может предоставить функциональный подход на основе А-форма-лизма Черча [3], реализованного, в частности, в семействе функциональных языков программирования класса ЛИСП, естественно включающих рекурсию, как базовую конструкцию управления.
В рамках предлагаемого подхода основная роль отводится функциональной стороне. Считается, что любые данные появляются в результате интер-
претации первичной составляющей модели, либо применения некоторого автомата к другим данным. Таким образом, необходимо переопределить понятие запроса. Атомарный запрос есть первичное значение, допустимое в заданной интерпретации. Непервичный (автоматный) запрос определяется некоторым конечным автоматом и реализуется применением этого автомата к входным данным.
Входной поток для фиксированного запроса (автомата) представляет собой список, сформированный другими атомарными либо автоматными запросами. Термины запрос и автомат считаются синонимами, если не оговорено противного.
Различаются явное описание запроса и его реализация. Согласно классическому определению, конечный автомат - это система с ограниченным набором состояний и определенной дисциплиной переходов [4], поэтому любая система, обладающая ограниченным набором возможностей, каждая из которых может быть отмечена отдельным состоянием, может быть представлена в виде конечного автомата (КА).
Для строгого введения последующих понятий зафиксируем сигнатуру:
Е = (А, Е, Т). (1)
Здесь А - множество символов атрибутов, Е -множество символов состояний, Т - множество символов доменов (возможных типов). Считается, что в Т зафиксировано непустое подмножество D<Tсимволов первичных доменов (D^0), содержащих базовые значения атрибутов (например, integer, date, text и т. д.). Считается, что при любой интерпретации первичному домену сопоставляется перечислимое множество элементов.
С учетом заданной сигнатуры (1) непервичный автомат Q определяется следующим образом:
Q ^ (A, R, Д,о, F), (2)
где Qe T\D и Q не является именем первичного домена; A - алфавит над декартовым произведением Ax T, то есть это все комбинации допустимых пар из декартова произведения типов и имен атрибутов; ReE - конечное множество состояний автомата; Д - функция перехода, определенная на множестве AxR; oeR - начальное состояние; F<R -непустое множество конечных состояний.
В каждый фиксированный момент времени (такт) конечный автомат находится только в одном из возможных состояний, при этом число состояний, в которых может находиться конечный автомат - конечно. Автомат последовательно считывает элементы из входной строки. Каждый считанный символ либо переводит автомат в новое состояние, либо оставляет его в прежнем, одновременно КА генерирует элемент в выходную строку.
Функция перехода, ассоциированная с автоматом Q (2), является частичной функцией Д:AxR—AxR. Областью определения данной функции является декартово произведение атрибутов и состояний, допустимых для конечного автомата Q, а множеством значений - преобразованные конечным автоматом пары <элемент_алфавита, состояние>. При необходимости подчеркнуть связь Д с автоматом Q используется запись Д^
Считается, что функция перехода, как правило, дискретна, т. е. может быть задана множеством пар: Д ^ {(а,8),(а',8')}. (3)
На рис. 1 данным парам (3) соответствуют x -текущий анализируемый атрибут, y - атрибут, который автомат записал в выходной поток после обработки, и переход между состояниями 8—8'.
Входная лента
Выходная лента
Рис. 1. Структурная схема конечного автомата
Входом и выходом любого автомата являются регулярные списки, которые могут быть вложенны-
ми. Двухуровневые списки, при соблюдении некоторых условий, сопоставляются плоским таблицам реляционного подхода - ниже рассматриваются именно такие списки. Списки большей вложенности также не запрещены, так, трехуровневые структуры могут использоваться при моделировании темпоральных или интенсиональных баз данных.
Введем понятие атрибута, которое понадобится для более строгого определения входного и выходного потоков автомата и других необходимых структур. Будем различать имя атрибута и его значение (интерпретацию), а также первичные (примитивные) и непервичные атрибуты. Прежде всего, определим рекурсивно понятие допустимого имени.
Пусть aeA, а - допустимое имя, тогда а и а.а -также допустимые имена, во втором случае а и а называются префиксом и суффиксом, соответственно. Допустимое имя а становится именем атрибута, только если оно связывается с некоторым доменом TeT. Факт связывания отмечается записью Т(а) или а. T(точечная пара, согласно нотации языка ЛИСП) - первая форма подчеркивает функциональность связывания, а вторая - его ссылоч-ность. Если Te D, и а - примитивный атрибут, то а. Tзаменяется на аTлибо на а, когда ссылка на домен не существенна или очевидна из контекста. Связь именованного объекта с интерпретацией I изображается стандартной записью {имя)\1. Интерпретация задается традиционно: примитивному атрибуту сопоставляется константа из первичного домена а^е T|j, тогда автоматной функции ДQ соответствует отображение Д Q\::A\jX R\:—>A\:x R\:.
Любой непервичный домен Т, где Te T\D является структурой над именованными компонентами: а.Т ^ а.(а1.Т1,...,ап,Тп), (4)
где а - параметр-модификатор имен элементов списка согласно точечной нотации, а, aeA - попарно-различные, TeT\D, TeT. В определении домена допускается рекурсия (в том числе, и неявная).
Интерпретация а. T^ определяет пустой или сколь угодно длинный (но конечный) регулярный список вида а.((а1.!и\1,...,а„.!л\1)...(а1.!1к\1,...,а„.!„к\1)), где для всех значений индексов /=1,...,и, j=1,...,k, a;eA, t^eTi, TteT. Регулярность списка определяется тем, что различные tj и tm принадлежат одному и тому же домену T (4). Префикс может быть продолжен в скобочные фрагменты на любую глубину, так что a.((al.tи...)...)=def(a.(al.tи...)...)=def((a.al.tп...)...). Такие структуры можно считать таблицами, подразумевая, что подсписки соответствуют строкам (кортежам) таблиц реляционного подхода. Ясно, что tj, в свою очередь, могут являться списками, возможно, пустыми.
Рассмотрим реализационные аспекты, использующие функциональный аппарат системы программирования ЛИСП [5]. Зададим описание автомата А-термом в стиле функциональных языков вида:
Q = (Ах.Д[ x]). (5)
Как было выше указано (2), QeT\D, где Q -имя автомата не может быть именем из первичного домена, а [a], определяемое формулой (3), традиционно обозначает вхождение (элементов) списка в форму Д.
В наиболее общем случае структура формы Д определяется следующей конструкцией согласно нотации языка ЛИСП:
(DO (<init_form>) (<stop_condition> <actions>) <actions>). (6)
Интерпретацией автомата Q (5), как отмечалось выше, является применение его к списку S интерпретированных атрибутов - это обозначается традиционной для функционального подхода записью (Q4) или (QS), если интерпретация очевидна из контекста). Результатом интерпретации автомата является также список (возможно, пустой), который, в свою очередь, может использоваться в качестве домена при спецификации нового атрибута. Поскольку атрибуты S могут являться применениями автоматов, возникает вопрос о трактовке операции суперпозиции автоматов, который решается через вложенный функциональный вызов.
Рассмотрим ряд дополнительных соглашений относительно рекурсивных структур данных. Пусть регулярный список L некоторым образом порождается доменом T0=(a1.T1,...,an.Tn), состоящим из первичных атрибутов. Условимся рассматривать только такие списки, у которых первый атрибут связан с первичным доменом, то есть T1 eD (синтаксическое ограничение). Соответственно, первый атрибут (aj.Tj) будем называть первичным ключом и считать его уникальным именем любого подсписка списка L верхнего уровня, так что в L=a.((a1.t11|I,...,an.tn1|I)...(a1.t1J„...,an.tnJI)) значения всех a1.t1i|I - попарно-различны, т. е. уникальны (семантическое ограничение).
Множество K1^{a1.t1i |1} (7)
будем называть ключевым множеством списка L. Считается, что на элементах K определено отношение полного порядка ("<k"), как правило, индуцируемое соответствующим отношением на T1, а также операция инкрементирования. Важно подчеркнуть, что в набор параметров автомата х (5) определения автомата в качестве обязательного параметра входит системный ключ а1. Отметим, что отношения порядка могут быть определены на домене любого атрибута (группы атрибутов), - это позволяет организовывать необходимые индексированные цепочки, что аналогично понятию ключа в реляционном подходе.
Подчеркнем еще раз, что любой домен является порождением автомата, при этом первичные домены трактуются, как реализации is-a отношений (автоматов) вида (is-a integer х), доставляющих истину, если предъявленный объект распознается корректно.
Переопределим понятие таблицы данных в предложенных соглашениях. Для этого зададим понятие
схемы таблицы для объекта данных r - это поименованный список тэгов вида: T(r)=r.(...,T(a),...). При рассмотрении набора таблиц допускается появление неявной или опосредованной рекурсии, причем требование присутствия в описании каждой схемы хотя бы одного первичного атрибута гарантирует конечность реализации любой таблицы. Для «свертки данных» используется автомат-конструктор: (CONSTR( T(a1,...,an)))=def( T(a1,...,an)). Во внешней переменной запоминается прохождение всех рекурсивных ответвлений при обработке данных, что сокращает время обработки.
При реализации существенным образом используется теория функциональных моделей, в частности, из нее заимствованы обозначения [6]. Определим обратную операцию - развертку данных на непервичном атрибуте. Пусть T(r)=r.(..., Tj(aii),...) - описание домена (4) и домен TfeD. Развёрткой домена Г на атрибуте ap будем называть список, получающийся в результате подстановки в описание исходного домена на место имени T(a) раскрытого соответствующим автоматом, подсписка-домена T(a) Все добавленные в развернутый домен T в результате такого действия атрибуты модифицируются префиксом r.ap, что индуцирует и модификацию автомата, доставляющего реализацию домена Tp(aP). Процесс построения развёртки на атрибуте может повторяться многократно - пока имеются атрибуты, связанные с неэлементарными схемами.
Зададим операцию полной развертки. Под полной развёрткой домена Tпонимается завершенный процесс применения соответствующего автомата к интерпретации домена. Полная развёртка реализует систему строго вложенных стеков, которая для рекурсивных доменов, вообще говоря, может оказаться неограниченной. Для сохранения конструктивности построений как раз и вводятся понятия первичного ключа (7) и введенное понятие замыкания атрибутов относительно автоматного домена (запроса).
Пусть T - автоматный (возможно, рекурсивный) домен и пусть A - некоторый набор атрибутов домена. Замыканием A+ для A относительно T будем называть объединение всех таких атрибутов X, что автоматное отображение Q:A^X может быть получено из информации о домене T. Здесь Q -(автоматный) терм в сигнатуре Е, построенный по специальным правилам, A и X - непустые наборы атрибутов. Замыкание A+ используется для обеспечения семантической необходимости выхода из рекурсии в практических случаях.
В предлагаемом подходе (6) результат обработки произвольного списка вычисляется «по частям», т. е. вместо вычисления полного списка a.(a1.t1,a2.t2,...,an.tn) можно найти первый элемент a.(a1.t1) и выполнить вычисления остальных элементов с помощью автоматов, реализующих конкретные операции. При этом получается принципиальная экономия памяти ценой незначительно-
го перерасхода времени на вспомогательное построение. Автоматная операция - это просто ссылка на уже существующую (ранее определенную) программу, связанную с контекстом ее исполнения (вставка, удаление или выборка), т. е. с состоянием ассоциативного списка в момент его построения.
Для повышения эффективности работы автоматов, введем специальные операции || - приостановка вычислений и @ - возобновление ранее отложенных вычислений. Техника приостановки и возобновления функций может быть названа вызовом по необходимости.
Например, для построения ряда целых от M до N с последующим их суммированием, выполним следующее:
(defun рядцел (M N) (cond ((> M N) nil) (T(cons M(|| (ряд цел (1+ M) N)))))) (defun sum (X) (cond ((= X 0) 0) (T(+ (car X)( @ (sum (cdrX))))) )), где car - первый элемент из активного значения списка, cdr - активное значение списка без первого элемента, cons - формирование узла по двум верхним значениям списков, cond - условие завершения вычислений, nil - терминальный элемент списка, sum - автомат, выполняющий операцию суммирования чисел.
С целью исключения повторного вычисления совпадающих списков, в его внутреннее представление вводится логическая переменная (flag), имеющая значение True (истина), для уже выполненных шагов прохождения рекурсии, и False (ложь) - для невыполненных.
Данный автомат-операция позволяет обрабатывать неограниченные рекурсивно-вычислимые
множества. Например, можно работать с рядом целых чисел, больших чем N:
(defun цел (M) (cons M ( || (цел (1+ M) )))). Из организованного таким образом списка, можно выбирать нужное количество элементов; например первые K элементов можно получить применением функции: (defun первые (KInt) (cond ((= Int Nil) Nil)((= K 0) Nil) (T (cons (car Int)( первые ( @ (cdr Int))) )) )).
Эффект таких приостанавливаемых и возобновляемых вычислений получается путем следующей реализации операций || и @:
lie = > (lambda () e), @e = > (e ),
что при интерпретации приводит к связыванию функционального аргумента с ассоциативным списком для операции || и к вызову функции выполнения EVAL для операции @.
Таким образом, предложенная методология может использоваться в качестве теоретического аппарата для построения систем управления базами данных, поддерживающих естественное представление и механизмы манипулирования рекурсивными структурами, а применение автоматного подхода позволяет повысить эффективность обработки таких данных, поскольку ни одна существующая система менеджмента данных не имеет внутреннего аппарата для работы с рекурсивными структурами.
Работа выполнена на основе индивидуального гранта ТПУ молодым ученым на проведение научных исследований (2006г.).
СПИСОК ЛИТЕРАТУРЫ
1. Ульман Дж. Основы систем баз данных. - М.: Финансы и статистика, 1983. - 334 с.
2. Новосельцев В.Б., Соколова В.В. Расширение алгебры Кодда операциями с рекурсивными объектами // Вестник ТГУ. Серия «Математика. Кибернетика. Информатика». - 2004. - № 284. - С. 18-21.
3. Черч А. Введение в математическую логику. - М.: Изд-во иностранной литературы, 1960. - 488 с.
4. Карпов Ю.Г. Теория алгоритмов и автоматов. - СПб.: Геликон Плюс, 2000. - 256 с.
5. Хювенен Э., Сеппянен Й. Мир Лиспа. В 2-х т. Т. 1: Введение в язык Лисп и функциональное программирование. - М.: Мир, 1990. - 447 с.
6. Новосельцев В.Б. Теория структурных функциональных моделей // Сибирский математический журнал. - 2006. - Т. 47. -№ 5. - С. 1014-1030.