Текст
                    Ю.В.КАПИТОНОВА
А.А.ЛЕТИЧЕВСКИЙ
МАТЕМАТИЧЕСКАЯ
ТЕОРИЯ
ПРОЕКТИРОВАНИЯ
ВЫЧИСЛИТЕЛЬНЫХ
СИСТЕМ
МОСКВА "НАУКА"
ГЛАВНАЯ РЕДАКЦИЯ
ФИЗИКО-МАТЕМАТИЧЕСКОЙ ЛИТЕРАТУРЫ
1988


ББК 22.18 К20 УДК 519.6 Капитонова Ю.В., Летичевский А.А. Математическая теория проектирования вычислительных систем. - М.: Наука. Гл. ред. физ.-мат. лит., 1988. -2% с. ISBN 5-02-013777-4 Излагаются основы математического аппарата и современных методов проектирования систем преобразования информации: аппаратуры вычислительных машин, программ и программных систем, систем управления и обработки данных, основанных на применении средств вычислительной техники. Первая часть посвящена обзору основных математических моделей вычислительных систем. Вторая часть содержит изложение практических методов проектирования различного типа систем - аппаратуры ЭВМ, последовательных и параллельных программ, компонент общесистемной математики. Для математиков и инженеров - разработчиков аппаратных и программных средств, а также для студентов и аспирантов в области информатики и вычислительной техники. Табл. 5 Ил. 43 Библиогр. 93 назв. Рецензент доктор физико-математических наук В.Е. Котов из з tuzj -вв Главная редакция физико-математической ISBN 5-02-013777-4 литературы, 1988
ОГЛАВЛЕНИЕ Предисловие 5 ЧАСТЬ I. МАТЕМАТИЧЕСКИЕ МОДЕЛИ 9 Глава 1. Дискретные системы 9 § 1. Основные определения 9 § 2. Примеры дискретных систем 13 § 3. Реализация дискретных систем 16 § 4. Алгебра языков 19 § 5. Конечные системы 22 § 6. Многокомпонентные системы 26 § 7. Автоматы 32 § 8. Дискретные преобразователи 38 § 9. Алгебра отношений 42 Комментарии к гл. 1 48 Глава 2. Алгоритмы 48 § 1. Схемы программ 48 § 2. Алгоритмические языки 56 § 3. Схемы программ над памятью 63 § 4. Алгебра алгоритмов 70 § 5. Логика алгоритмов 80 § 6. Параллельные алгоритмы 90 Комментарии к гл. 2 99 Глава 3. Рекурсивные определения 100 § 1. Функциональные уравнения 100 § 2. Анализ схем программ над памятью 107 § 3. Вычисление алгебраических/>функций 109 § 4. Функционалы высших типов 115 § 5. Рекурсивные программы 119 Комментарии к гл. 3 / 125 Глава 4. Структуры данных , 126 § 1. Функциональные структуры данных 126 § 2. Периодически определенные функции 132 § 3. Многоосновные алгебры структур данных 138 § 4. Рекурсивные структуры данных 141 § 5. Теоретико-множественные структуры данных ". 151 Комментарии к гл. 4 158 1* 3
ЧАСТЬ И. ПРОЕКТИРОВАНИЕ 159 Глава 5. Архитектура ЭВМ 159 § 1. Структура неймановской ЭВМ 159 § 2. Логическое проектирование алгоритмических модулей 168 § 3. Развитие Неймановской концепции 177 Комментарии к гл. 5 187 Глава 6. Проектирование последовательных программ 188 § 1. Основные этапы проектирования программ 188 § 2. Вычисление элементарных функций 192 § 3. Вычисление функций над структурами данных 204 § 4. Теоретико-множественное программирование 214 § 5. Недетерминированное программирование 227 § 6. Рекурсивное программирование 234 Комментарии к гл. 6 247 Глава 7. Распределенные многопроцессорные системы 248 § 1. Принцип макроконвейера 248 § 2. Макроконвейерные сети 251 § 3. Проектирование распределенных программ 260 § 4. Синтез макроконвейерных программ вычисления функций над стру к- турами данных 268 § 5. Динамическое распараллеливание последовательных программ 282 Комментарии к гл. 7 291 Список литературы .. 292
Светлой памяти нашего дорогого учителя Виктора Михайловича Глушкова посвящается ПРЕДИСЛОВИЕ В этой книге под вычислительной системой понимается любая техническая система преобразования информации, поведение которой может быть описано алгоритмически. Таким образом, к вычислительным системам относятся программы (вместе с ЭВМ, на которых они выполняются), устройства вычислительных машин, системы программ, программно-технические комплексы, системы управления, содержащие в своем составе специализированные или универсальные ЭВМ. Сложность разработки вычислительных систем, в особенности стоимость создания качественного и надежного программного обеспечения ЭВМ, стимулируют развитие теоретических основ проектирования вычислительных систем, создание теоретически обоснованных методов и средств их разработки, поддержанных автоматизированными инструментальными системами. Основная цель, которую ставили перед собой авторы при написании книги, состояла в том,, чтобы укрепить связи между фундаментальными понятиями общей теории проектирования вычислительных систем и практическими методами проектирования программных и аппаратных средств вычислительной техники. С этой целью книга разделена на две части. В первой части рассматриваются основные математические модели, используемые для описания и представления объектов проектирования, и исследуются их свойства. Эта часть составляет основу теории проектирования. Поскольку книга носит прикладной характер, авторы не развивают теоретические построения глубоко, ограничиваясь лишь теми результатами, которые имеют непосредственное применение в практике проектирования. Вторая часть демонстрирует применение базовых математических понятий и конструкций к проектированию вычислительных систем. Основное внимание в ней уделяется проектированию последовательных и параллельных программ. Стиль изложения здесь не такой строгий, как в первой части. Основные положения методологии проектирования иллюстрируются примерами. Теория программирования и теория проектирования аппаратуры первоначально развивались в значительной степени независимо. Первая базировалась на теории алгоритмов и теории формальных языков, вторая — на алгебре логики, теории автоматов и других разделах дискретной математики. В дальнейшем произошло сближение этих двух направлений, и в настоящее время их взаимное проникновение стало настоятельной необхо- 5
димостыо. Особенно ярко общность моделей программирования и проектирования аппаратуры проявляется в области параллельного программирования, в которое все больше проникают методы проектирования структур ЭВМ. С другой стороны, проектирование БИС и СБИС не может мыслиться без анализа алгоритмов функционирования устройств с использованием алгоритмических языков высокого и сверхвысокого уровня, присущих программированию. Вторая цель книги и состоит в том, чтобы продемонстрировать общность математических моделей и методов проектирования программ и аппаратуры. Поэтому в качестве основного теоретического понятия выступает понятие дискретной динамической системы, которое с равным успехом описывает как процессы вычислений, порождаемые программой, так и процессы функционирования аппаратных компонент вычислительных систем. Еще одна цель, которую преследовали авторы, состоит в изложении теоретических основ методологии проектирования схемного и программного оборудования ЭВМ, которая развивалась на протяжении ряда лет в Институте кибернетики АН УССР под руководством академика В.М. Глуш- кова. В 70-х годах эта методология получила название метода формализованных технических заданий или, употребляя более современный термин — формализованных спецификаций [25]. Исторической предпосылкой создания метода формализованных технических заданий послужила методика синтеза цифровых автоматов, предложенная в начале 60-х годов В.М. Глуш- ковым [15]. В этой методике синтез был четко разделен на этапы блочного, абстрактного, структурного и надежностного синтеза. Каждый из этапов предполагал использование определенного класса математических моделей проектируемого устройства (цифрового автомата по терминологии того времени) и базирующегося на соответствующих моделях языка представления устройств. Этапы абстрактного и структурного синтеза были полностью формализованы и снабжены алгоритмами решения задач анализа, синтеза и оптимизации проектируемого устройства. Дальнейшее развитие методики было связано с решением задач блочного и алгоритмического синтеза автоматов применительно к проектированию вычислительных машин [16,17]. В.М. Глушковым были предложены основные математические модели, на базе которых решаются эти задачи: понятие регистрового автомата и пары микропрограммных алгебр (в дальнейшем они стали называться системами алгоритмических алгебр или алгеброй алгоритмов). В 70-х годах метод формализованных технических заданий был расширен и включил в себя проектирование последовательных, а затем и параллельных программ [21,23] . В методе формализованных технических заданий процесс проектирования вычислительной системы (программы или устройства) представляется в виде последовательности этапов, на каждом из которых проект системы представлен с помощью совокупности математических моделей, описывающих различные ее части. Различают три основных вида моделей - функциональные, динамические и структурные. Функциональные модели определяют функции, которые вычисляет проектируемая система, динамические модели определяют процессы функционирования системы или процессы вычислений, а структурные модели представляют систему в виде параллельной композиции компонент. Обычно процесс проектирования 6
протекает от функциональных к динамическим, а затем к структурным моделям (сверху вниз). Этот естественный переход может нарушаться для сложных систем, которые сначала представляются в структурном виде. Но тогда естественный путь проходят в процессе проектирования компоненты системы. Наиболее общий класс динамических моделей составляют дискретные динамические системы, общая теория которых рассматривается в первой главе. Автоматы и дискретные преобразователи выделяются как важнейшие частные ^случаи. Во второй главе рассматриваются более конкретные классы динамических систем, используемые для представления алгоритмов функционирования вычислительных систем - абстрактные схемы программ (схемы Янова), схемы программ над памятью и алгебра алгоритмов (алгебра Глушкова). Последнюю модель можно относить как к динамическим, так и к функциональным моделям вычислительных систем, поскольку выражения в алгебре алгоритмов можно рассматривать и как выражения, порождающие процессы вычислений, и как операторы, действующие на информационной компоненте дискретного преобразователя. В качестве основной структурной модели параллельных алгоритмов рассматриваются сети из алгоритмических модулей. При построении всех рассматриваемых моделей широко применяется алгебраическая точка зрения, при которой операции некоторой базовой алгебры рассматриваются как исходные алгоритмы, используемые для порождения новых объектов из заданных (порождающих элементов алгебры) или построения функций над этими объектами. Суперпозиции операций алгебры D дают элементарные />функции, а рекурсивные определения, рассматриваемые как функциональные уравнения, порождают алгебраические /^-функции. Общая теория рекурсивных функциональных определений над алгебрами с отношением аппроксимации строится в третьей главе. Теорема о неподвижной точке, которая лежит в основе теории рекурсивных определений, появляется уже в первой. Бе частный вариант используется при рассмотрении уравнений в алгебре языков, а общая формулировка для индуктивных частично упорядоченных множеств появляется в связи с алгеброй отношений. Завершением общей теории рекурсивных определений является теорема о пополнении алгебр с аппроксимацией, которая рассматривается в четвертой главе в. связи с рекурсивными структурами данных. В главе о рекурсивных определениях решается также в общем виде задача синтеза динамических и отчасти структурных моделей, представляющих алгоритмы вычисления алгебраических /^функций. В иерархию моделей вычислительных систем и их компонент, разрабатываемых на различных этапах проектирования, вплетается также иерархия структур данных. Высший уровень этой иерархии образуют теоретико-множественные структуры данных. Они реализуются рекурсивными или функциональными структурами данных, а рекурсивные и функциональные структуры данных общего вида реализуются функциональными структурами данных специального вида — прямоугольными массивами, расположенными на целочисленной решетке. В конечном счете все может сводиться даже к простым одномерным массивам. Теория структур данных рассматривается в четвертой главе. Особенно важную роль играет здесь теория периодически определенных функций — общая основа проектирования операционных устройств ЭВМ (в особенности на 7
СБИС) и параллельного распределенного программирования. Эту главу можно рассматривать как базис общей теории функциональных моделей. Во второй части книги основной материал связан с проектированием последовательных и параллельных программ. Вопросы проектирования аппаратуры сводятся к рассмотрению лишь нескольких примеров в пятой главе, посвященной архитектуре ЭВМ. Эти примеры иллюстрируют общую точку зрения на алгоритмическое и логическое проектирование устройств. Примеры проектирования последовательных программ демонстрируют решение задач синтеза, т.е. перехода от функциональных моделей к динамическим (процедурное представление), а также пошаговое уточнение динамических моделей. Рассматриваются также различные методы программирования - теоретико-множественное, недетерминированное и рекурсивное. На наш взгляд, стиль и методы программирования должны определяться не только и не столько опытом и аппаратом, которым владеют разработчики, сколько природой решаемых задач. В частности, конкретные ситуации могут требовать сочетания различных методов представления моделей на различных этапах проектирования и даже на одном и том же этапе. Седьмая глава содержит результаты, полученные авторами книги и их коллегами за последние годы в связи с разработкой методов и средств проектирования программ для распределенных многопроцессорных ЭВМ. Этот материал может использоваться также при разработке структур ЭВМ и общесистемного математического обеспечения современных и перспективных ЭВМ. Принцип макроконвейерной обработки данных, предложенный В.М. Глушковым в 1978 г., послужил основным источником идей в этих исследованиях. К сожалению, мы не имеем возможности достаточно глубоко рассмотреть все вопросы математической теории проектирования вычислительных систем. В частности, вне сферы нашего внимания остались многие вопросы применения методов математической логики, языковые проблемы, теория сложности вычислений, проектирование трансляторов и многое другое. Некоторые из этих вопросов уже достаточно хорошо освещены в монографиях, другие требуют специального внимания. Рассматриваемые в этой книге методы проектирования наиболее близки к трансформационному подходу в программировании, который развивается, например, Бауэром в западногерманском проекте CIP [81], и оригинальному варианту этого подхода, развиваемому в СО АН СССР под руководством академика АЛ. Ершова [40,44]. Авторы позволили себе отклоняться от традиционного математического стиля, поскольку книга рассчитана на более широкую аудиторию, чем специалисты, владеющие в совершенстве математическим аппаратом. Тем не менее, чтение книги потребует от читателя определенного напряжения. Во многих случаях конкретные положения не выделяются в отдельные утверждения и теоремы, хотя для них проводятся достаточно подробные обоснования, которые можно было бы формализовать в виде строгих доказательств. Читателю предоставляется возможность самостоятельно выделить из текста интересные для него факты, сформулировать соответствующие утверждения и провести доказательства на необходимом уровне строгости. Комментарии к главам не претендуют на полноту и в значительной степени выражают субъективную точку зрения авторов. 8
Часть I МАТЕМАТИЧЕСКИЕ МОДЕЛИ Глава 1 ДИСКРЕТНЫЕ СИСТЕМЫ § 1. Основные определения Пусть Т — множество моментов времени. Это может быть либо множеством неотрицательных вещественных чисел, либо множеством неотрицательных целых чисел. В первом случае говорят о непрерывном времени, во втором — о дискретном времени. В качестве Т можно рассматривать также любое линейно -упорядоченное множество, изоморфное множеству неотрицательных вещественных или целых чисел. В этом случае, как правило, множество Т будет отождествляться с соответствующим числовым множеством. Рассмотрим множество, S которое будем называть пространством состояний. Процессом в S назовем произвольное отображение р: [0:т] -»• -+S. Число г называется длительностью процесса р и обозначается I p I. Если время дискретно, то процесс р можно отождествлять с последовательностью р(0),р(1),... ,р(т) и рассматривать как слово в алфавите S. Заметим, что на мощность пространства состояний никаких ограничений не накладывается, и, говоря о словах, мы допускаем бесконечные и даже несчетные алфавиты. Заметим также, что длительность процесса в дискретном времени на 1 меньше, чем длина соответствующего слова. Пусть | р | = г, р(0) = s, р(т) = s'. В этом случае будем говорить, что р начинается в состоянии s, заканчивается в состоянии s' , и записывать это формулой s -+ s*. Для любых двух процессов р и q таких, что s -> s' и s'-*s", определим их последовательную композицию р*#= г, полагая, что г(*) = (если 0<f <| р\ тоp(t) иначе если \ р\ <t <| р\ +1 ? I то q(t -| р\ ) иначе \p\*\q\ „ неопределено). Очевидно, что \ p*q\ =\ p\ +\ q\ и 5 *s . Определим на множестве всех процессов в S отношение частичного порядка <, полагая p<q <==> существует процесс г такой, что q = p *г. Процесс р называется началом, а г — окончанием процесса q. Операцию последовательной композиции следует отличать от полугруппового умножения (конкатенации) слов, представляющих процессы. Для процессов, протекающих в дискретном времени, последовательная композиция выражается через конкатенацию формулой ps *sq=psq. 9
Пусть р — процесс, протекающий в непрерывном времени. Будем говорить, что рустойчив в момент времени t (0<? <| р| ), если в некоторой достаточно малой окрестности точки t функция р сохраняет постоянное значение. Если р неустойчив в момент t, то t называется моментом переключения. В случае дискретного времени моментом переключения называется любой момент времени, для которого определен рассматриваемый процесс. Процесс называется дискретным, если он содержит лишь конечное число моментов переключения. Пусть F есть множество процессов в пространстве состояний S. Пара Г= (SfF) называется абстрактной динамической системой, если выполняется условие замкнутости множества F: pSF и q<p =*q€F. Если не возникает недоразумений, то систему Г = (S,F) будем обозначать и называть так же, как и ее пространство состояний, а множество F будем называть множеством допустимых процессов системы 5. Условие замкнутости множества F можно перефразировать теперь следующим образом: всякое начало допустимого процесса допустимо. Абстрактная динамическая система дискретна, если каждый ее допустимый процесс дискретен. Понятие процесса можно расширить, рассматривая также бесконечные процессы р: T-+S, определенные на множестве всех моментов времени. Понятие последовательной композиции р*q распространяется естественным образом и на случай, когда р - конечный, a q - бесконечный процесс. Поэтому можно говорить о конечных началах бесконечных процессов. Бесконечный процесс в пространстве состояний системы S будем называть допустимым, если всякое его конечное начало допустимо. Из определения дискретной системы вытекает, что всякое конечное начало допустимого бесконечного процесса дискретной системы допустимо. Если ^Rw, aF - множество решений системы обыкновенных дифференциальных уравнений xt =/,- (jci ,..., хп, t) (/= 1,...,«), то мы имеем дело с классической динамической системой. Для построения числовых решений уравнения в непрерывном времени заменяются конечно- разностными приближениями и рассматриваются в дискретном времени. Таким образом переходят к дискретным системам. Любую дискретную систему S с непрерывным временем можно заменить системой S' с дискретным временем, пользуясь следующей стандартной конструкцией. Пусть w, v,wGS. Рассмотрим процессы p = uvfw, определяемые следующим образом: I p\ =r, p(0) =u, pit) =w, р(т) =v (0<T<t). Процессы указанного типа назовем элементарными. Любой дискретный процесс р в пространстве S можно представить в виде композиции р = Ро * Pi * • • • *pm элементарных процессов, так что I pt \ есть момент переключения процесса pt * pi+1 (/ = 0,1,..., m — 1). Такое представление, очевидно, единственно. В качестве пространства состояний системы S'возьмем множество всех элементарных процессов системы 5, а множество ее допустимых процессов F' составим из процессов р таких, что р = р (0) * ... *р (т)у где т = | р | есть разложение.некоторого допустимого процесса p€F в последовательную композицию элементарных процессов. Между элементами множеств F и F* существует очевидное 10
взаимно однозначное соответствие, и система S'содержит полную информацию о системе S. В дальнейшем, если не оговорено противное, будут рассматриваться только системы с дискретным временем. Рассмотрим основной способ задания множества допустимых процессов - функцию переходов дискретной системы. Через P(S) обозначим множество всех конечных процессов в пространстве S (время дискретно), отождествив его с множеством всех непустых слов в алфавите 5. Если к множеству Р(5) добавить пустое слово е, то получим множество S * =P(5)U{ e }всех слов в алфавите S. Отождествляя элементы пространства S с процессами нулевой длительности и со словами длины 1, получим S С Р (S). Рассмотрим отображение 8 : Р (S ) -* 2 s множества Р (S ) в множество всех подмножеств пространства S, полагая 5 (р) ={ s G S \ ps G F} для всех р€ Р (5). Функцию 5 назовем функцией переходов системы S с множеством допустимых процессов F. Из определения функции переходов имеем: процесс ps ненулевой длительности допустим <=> S€Ь(р) .Состояние s назовем допустимым начальным состоянием системы 5, если s есть допустимый процесс (нулевой длительности). Теорема 1.1. Множество допустимых процессов дискретной системы однозначно определяется ее функцией переходов и множеством допустимых начальных состояний. Действительно, множество допустимых процессов F можно представить оо в виде F = U Ft, где Ft есть множество допустимых процессов длитель- ности л Тогда F0 есть множество допустимых начальных состояний, а pseFt*=*peFt_l9 pseb(p), t>o. Теорема 1.1 показывает, что можно было бы дать другое определение дискретной системы, равносильное первоначальному: дискретная система - это тройка (5, S0, 5), где S - множество (50 С 5 ), а 5 — функция из Р (5) в 2s, удовлетворяющая условию s^S0=>b(s)=(t>. Действительно, если в качестве множества допустимых процессов в пространстве S взять множество таких процессов s0Si ... sT, что sG50,h для любого t такого, что 0<t<T, имеет место sf+1G5(s0 si ...sf), то получим дискретную систему с множеством допустимых начальных состояний S0 и функцией переходов 6. Условия Sf+i £5(s0 Si ... st), s0€S0i определяют закон функционирования системы S. Функцию б можно рассматривать как многозначное отображение из Р(5) в S. Как и всякое многозначное отображение, функция 5 определяет естественным образом бинарное отношение s Е 5 (р) между элементами множеств Р(5) и S. Это отношение называется отношением переходов системы S. Пару (р, s), находящуюся в этом отношении, будем записывать в виде p-*s или просто p->s, если известно, о какой системе s идет речь. Если p-+s9 то говорят, что допустимый процесс р системы S 11
может быть продолжен переходом в состояние s или что после окончания процесса р система может перейти в состояние s. Для систем с непрерывным временем функцию переходов естественно привязывать не к моменту, а к интервалу времени. Пусть Р (5) есть множество всех конечных процессов в пространстве S с непрерывным временем. Рассмотрим функцию 6t: P(S) -*2Р(5\ полагая 51(p) = {qЕ GP(S)\p*q€F, \ q \ =t) . Любая из функций 8t при f >0 вместе с множеством S0 допустимых начальных состояний однозначно определяет множество F всех допустимых процессов системы S. Рассмотрим некоторые виды дискретных систем. 1. Система S с функцией переходов 5 называется детерминированной, если для любого рЕ Р (£*) множество 5 (р) состоит не более чем из одного элемента. Если система S детерминирована, то ее функцию переходов можно отождествить с частичным отображением б С P(S) -*S. Функционирование детерминированной системы и множество ее допустимых процессов определяются уравнением *г+1 = 5(*о sx ... st), s0GS0. 2. Система S с функцией переходов 5 называется автоматной, если 8(ps) =5(5). Функционирование автоматной системы и множество ее допустимых процессов определяются соотношением Функция переходов автоматной системы однозначно определяется своим ограничением 5 : S -+2S на множество S. Функция 5 является многозначным отображением из S в 5. а определяемое ею отношение s'E 5 (s) <=> <=>s'E8(s) есть ограничение отношения переходов на множество S. Процесс s0Si ... st автоматной системы допустим «=>So e So hs0^^ -> -*.. .-+st (s0 -*Si,sx -+s2>. • • >s*-i "* st). Автоматная система может быть также определена как тройка (S,S0>8), где S — множество, S0 С С5,5: S -*• 2s, причем из s $ S0 следует 8(s) = ф . 3. Система называется свободной, если любой процесс является допустимым процессом этой системы. Самостоятельного значения свободные системы не имеют, но могут использоваться в качестве компонент сложных систем. 4. Система называется конечной, если множество ее состояний S конечно. 5. Система называется многокомпонентной, если множество ее состояний S содержится в декартовом произведении множеств S С St X ... .. .XSm. Множества Si,... ,Sm называются компонентами системы 5, если Si X ... XSm есть наименьшее произведение такое, что S С Si X ... ... X Sm. Очевидно, что st Е S; <=> существуют s 1,. .., S/_ г, si+ г,... ... ,5W такие, что ($i,... ,sw) E 5. Если некоторые из компонент многокомпонентной системы в свою очередь являются многокомпонентными, то система называется многоуровневой. оо 6. Если S С U Qm, где каждое из множеств Qm содержится в де- w = l картовом произведении, то система S называется системой с переменной структурой. 12
§ 2. Примеры дискретных систем Всякая реальная система существует в непрерывном времени и изменяет свои состояния непрерывно. Дискретные системы являются моделями реальных систем. Адекватность этих моделей зависит от целей и задач, для решения которых они используются. С другой стороны, дискретные системы могут возникать умозрительно как точные математические объекты, предназначенные для изучения закономерностей, существующих внутри математических теорий. При благоприятном стечении обстоятельств такие системы могут стать источником новых технических идей или применений математики. Одним из таких примеров является машина Тьюринга, придуманная для изучения понятия вычислимости. С нее мы и начнем серию примеров дискретных систем. 1. Как известно, машина Тьюринга состоит из ленты, на которой записано слово в некотором конечном алфавите X, и головки, установленной на один из символов этого слова и находящейся в каждый момент времени в некотором состоянии из конечного множества А. Таким образом, состояние машины Тьюринга представляется тройкой s = (p,a,q), где р и q — слова (быть может, пустые) в алфавите X, а&А. Слово р определяет заполнение ленты слева от ячейки, обозреваемой головкой, включая эту ячейку; слово q — заполнение ленты справа. Множество допустимых процессов порождается программой, которая задается как множество пятерок вида ax-+axfOL, где a, a'GA; x,x'€X; а = —1,0,+1 (соответственно сдвиг влево, остаться на месте, сдвиг вправо). Машина Тьюринга является детерминированной автоматной" системой, функция переходов которой определяется хорошо известными правилами. Например, если в программе есть пятерка дх->д'х'(+1), то (рх, af yq) -* (рх'у, a, q), а (рх, а,е)-+ -» (рх \,а,е), где X - пустой символ. 2. Выполнение программы, записанной в некотором алгоритмическом языке, может быть описано с помощью дискретной динамической системы, переходы которой из состояния в состояние представляют шаги вычислений. Если задать соответствие между программами рассматриваемого языка и системами, порождающими процессы выполнения этих программ, получим динамическую, или операционную, семантику языка. Рассмотрим для примера фрагмент программы, определяющей умножение двух матриц порядка N: 1 для /: = 1 до N выполнить 2 для J: = 1 до Довыполнить 3 С(/,/):=0; 4 для К: = 1 до N выполнить 5 C(ItJ):=A(I,K)*B(KtJ) + C(ItJ) 6 конец цикла по К 7 конец цикла по / 8 конец цикла по / . Состояниями дискретной системы, описывающей процессы выполнения рассматриваемой программы, могут служить пары (т,и), где т = 1,... ... , 9 - состояния управления, соответствующие строкам программного текста, и- (/,/,к,ауЪ,с) - состояние памяти. Здесь i,j,k —целые числа, 13
значения переменных I,J,K; а, Ъ, с — матрицы порядка N, значения переменных А,В9С. Процесс S\S2 •.. допустим, если st+i получается из s, по правилам определения действия операторов, из которых составлена программа. Пусть и= (i,j,k,a,b,c). Тогда переход (т,и) -> (т ,и ) может быть определен с помощью следующей таблицы: т 1 2 3 4 5 6 6 7 7 8 8 Условие N>0 N>0 N>0 k>N k<N i>N j<N i>N i<N m' 2 3 4 5 6 7 5 8 3 9 2 и (\J,kta,b,c) (i,lyk,a,b,c) (i,j,k,a,b,c') (I,/, 1,0, ft, C) \i,f,k,a,b,c") w (i,j,k + l9a,b,c) и (/,/ + l,k,a, b, c) и (f+lj,k,a,b,c) В данной таблице с и с" — матрицы такие, что сиХ) = (если и = /, и =/" то О иначе сми), с'^, = (если и = /, и =/ то aik *bkj +cMU иначе cuv). Если iV<0, то (1, и) -> (9, и), (2, и) -+ (8, и), (4, и) -*(7, и). Описанная система является двухкомпонентной двухуровневой автоматной детерминированной системой. Ее можно представить в виде диаграммы рис. 1.1. В этой диаграмме вершина с номером т представляет множество состояний, у которьгх первая компонента равна т. Указанную диаграмму можно рассматривать как диаграмму переходов некоторой другой дискретной системы. Эта система представляет собой модель управления рассмотренной программы. Она является конечной автоматной, но не детерминированной. 3. Как известно, язык L — это множество слов в алфавите X. Процессы порождения элементов языка L слева направо символ за символом могут быть описаны с помощью дискретной системы 5 = ЛГХ{0, 1}с множеством допустимых процессов, определенных следующим условием. Процесс (xi, olx) ... (хп, ап) допустим, если Xi...xn есть начало некоторого слова из Z,, a ty = 1 <=»х1 ... хп EZ,. Система 5, вообще говоря, не детерминирована и не автоматна. 4. Последовательность формул логического исчисления такова, что каждая из формул является либо аксиомой, либо следствием из предыдущих формул, полученным однократным применением одного из правил вывода, и может рассматриваться как допустимый процесс некоторой дискретной системы. Состояния этой системы — формулы соответствующего языка. Система описывает процессы построения выводов в исчислении. Рис.1.1 14
5. Игра в шахматы может быть описана как дискретная система, состояниями которой являются шахматные позиции, а переходы делаются по правилам игры. Система не является автоматной, поскольку переход зависит не только от позиции, но и от очередности хода, а также от условий допустимости рокировки и взятия на проходе. 6. Головоломки типа Ханойских башен или кубика Рубика представляют собой естественные примеры дискретных систем с конечным числом состояний. Многие задачи искусственного интеллекта формулируются как задачи поиска допустимого процесса, который оканчивается в одном из заданных множеств целевых состояний. 7. Сеть Петри определяется как ориентированный граф с вершинами двух типов. Вершины первого типа называются местами, вершины второго типа - переходами. Дуги могут соединять только вершины различных типов. Состояние сети или разметка мест — это отображение множества мест в множество неотрицательных целых чисел. Значение функции разметок на данном месте интерпретируется как количество фишек, расположенных на этом месте. Сети Петри изображаются графически так, как показано на рис. 1.2. Места изображаются кружочками, переходы - вертикальными линиями. Точки внутри мест - фишки. Места, из которых дуги ведут к некоторому переходу, называются входными местами этого перехода, а места, в которые входят дуги, выходящие из некоторого перехода, называются выходными местами этого перехода. Изменение состояния сети определяется правилами срабатывания переходов. Переход t может осуществиться, если каждое из его входных мест содержит по крайней мере одну фишку. Результатом срабатывания перехода будет новое состояние, которое получается вычитанием по одной фишке из каждого его входного места и добавлением по одной фишке к каждому выходному месту. В состоянии, изображенном на рис. 1.2, могут сработать переходы tx и f3- Изображая разметку шестимерным вектором, координаты которого соответствуют местам, занумерованным, как показано на рисунке, получим допустимую последовательность состояний: (3,2, 0,2,2,0)^(2,1,1,1,2,0)^(2,1,1,1,2,1) 4 (2,1,1,0,2,1) 4 (2,1,1,0,2,2). 8. Аддитивные порождающие системы. Множество состояний есть множество целочисленных векторов размерности п с неотрицательными координатами. Отношение переходов определяется множеством V целочисленных л-мерных векторов. Система может перейти из состояния х в состояние х , если существует z G V такой, что х = х + z. Любая сеть Петри может быть представлена как аддитивная порождающая система. Размерность такой системы равна числу мест. Элементы множества V соответствуют переходам. Вектор z€F, соответствующий некоторому переходу, есть сумма zx + z2- Координаты вектора zx равны — 1 для компонент, соответствующих входным местам; координаты вектора z2 равны 1 для выходных мест; остальные координаты векторов z j и z2 равны 0. Например, переходу t2 сети рис. 1.2 соответствует вектор (0,0,-1,-1, 0,0) + (0,0,1,0,0,0) = (0,0,0,-1,0,0). Аддитивные порождающие системы так же, как и сети Петри, являются автоматными, но не обязательно детерминированными системами. 15
9. Асинхронные логические сети представляются системами булевых уравнений вида Ух =fi(xi ,...,x„9yl9... ,>',„), / = 1,..., т. Каждое уравнение соответствует элементу, вычисляющему булеву функцию //. Переменные хх,..., хп соответствуют входным, ух,... >ут - внутренним переменным сети. Отношение переходов (х,у) -> (х' ,у' ) определяется следующим образом. Значение jc' может быть произвольным. Pi 4Drl Л©а Рз О* *'. *'** I—** НЕ ИЛУ! У'ъ *> И Уз Рис. 1.2 Рис.1.3 Для вычисления у подставляем значения х= (х19...,хп) my=(yi9--- ••->Ут) в уравнения и определяем уравнения, для которых равенство нарушается. Выбираем произвольным образом какие-либо из таких уравнений и изменяем значения координат вектора у, соответствующих этим уравнениям, на противоположные. Полученный вектор и есть возможное значение у' . На рис. 1.3 изображена асинхронная логическая сеть, построенная из элементов И, ИЛИ и НЕ. Она описывается уравнениями: у\ =*г. Уг =*i v^3; Уъ =Ух *Уг- Обозначая состояния этой сети вектором (х1,Хг>У19Уг>Уз)> получим пример допустимого процесса: (0,0,0,0,0) -* (0,1,6,0,0) -► (0,1,1, 0,0) -*(0,1,1,1,0)->(0,1,1,1,1)» (0,0,1,1,1). § 3. Реализация дискретных систем Пусть S и S' - дискретные системы с множествами допустимых процессов F и F1 соответственно. Рассмотрим отображение 7- S -*•£'. Это отображение естественным образом продолжается до отображения 7: P(S) -*P(S'), если считать, что 7(^1 ... sn) = 7(^1) — 7(^i)- Отображение у называется гомоморфизмом системы 5 в S\ если образ допустимого процесса системы S при этом отображении является допустимым процессом системы S'. Если 5 и б' — функции переходов, а 50 и 5о - множества допустимых начальных состояний систем S' и S' соответственно, то у есть гомоморфизм <=» y(S0)C S'o> У(Ь(р)) с Ь'(у(р)) Для любого р G Р(5). Последнее включение может быть записано также в виде импликации:/?—>s => s => у(р) ~т"*7(5)- Система (S1, F') называется подсистемой системы (5, F), 16
если S' С S, F' С F. Образом системы (S, F) при гомоморфизме 7 в систему S1 называется подсистема (y(S), y(F)) системы S'. Взаимно однозначный гомоморфизм называется изоморфизмом. Системы (5, F) и (S\ F') изоморфны, если существует изоморфизм у системы S на S' такой, что 7(F) = F'. Пусть задан гомоморфизм у системы S в S*. Тогда S' называется гомоморфной моделью, a S - гомоморфной реализацией системы S'. Такая терминология объясняется практическими задачами. Если мы хотим изучить некоторые свойства сложной системы 5, то изучение их может быть проведено на упрощенной модели. Проще всего связь между исследуемым объектом и его моделью выражается в терминах гомоморфизма. С другой стороны, когда мы хотим реализовать некоторую абстрактную систему S' заданными средствами, понятие изоморфизма может быть слишком жестким, и мы вынуждены вводить дополнительные состояния для того, чтобы реализация была возможна. И в этом случае простейшая связь между реализацией S и исходной моделью Sf - гомоморфизм. Наблюдая допустимый процесс р функционирования системы 5, которая реализует систему S' при помощи гомоморфизма 7, мы однозначно восстанавливаем процесс функционирования q = у(р) системы S'. Процесс р называется также реализацией процесса q, a q — его моделью. Заметим, что гомоморфизмов из S в S' может существовать много, и мы говорим о реализации лишь в случае, когда такой гомоморфизм зафиксирован. Этот гомоморфизм называется также реализующим. Гомоморфная реализация S системы S' называется полной, если каждый допустимый процесс системы S' имеет реализацию, т.е. 7(70 = F'• Теорема 3.1. Всякая дискретная система S* имеет полную гомоморфную автоматную реализацию S. Действительно, в качестве множества состояний системы S возьмем множество F' допустимых процессов системы S1. Определим функцию переходов -5 системы S условием Ь(р) ={'ps \psGF ^.Отображение 7: F* -*S\ определенное равенством y(ps) = 5> является гомоморфизмом. Действительно, каждый допустимый процесс системы S имеет вид р = = (So) (soSi) ••• (s0Si ...st), где s0Si - st e F'> a7(p) = s0Si - st = q. Процесс p является также реализацией процесса q> и, поскольку q произволен, реализация полна. Метод получения автоматной реализации, примененный для доказательства теоремы 3.1, неэффективен. Действительно, эта реализация имеет бесконечно много состояний, даже если система S' конечна. Вопрос о существовании конечных автоматных реализаций конечных систем будет рассмотрен в следующих параграфах. Более общее понятие реализации дискретных систем можно получить, если отказаться от необходимости задавать отображение у только на состояниях, а определять его сразу на множестве всех допустимых процессов. Пусть F и F' - множества процессов. Отображение у: F -* F назовем монотонным, если из р <q следует у(р) <y(q). Из монотонности следует также, что у(р * г) = у(р) * г'. Монотонное отображение 7- ^i ~*^2 назовем реализующим отображением системы (Si, Fx) в (S2, F2). Если задано ^Ш1етея~{м<>нв¥вда1ей) реализацией, реализующее отображение, то Si назьн a S2 - моделью системы Si. Так же и дЛя npoiiecdos recjm'/? # ^i » т0 процесс 2. Ю.В. Капитонова
Я = 7(р) называется моделью процесса р, а р - реализацией процесса q. Реализация называется полной, если y(Fi) = F2. Так же как и в случае гомоморфной реализации, наблюдая за поведением системы S\, можно однозначно восстановить соответствующее поведение ее модели. При этом восстановление производится последовательно слева направо. Понятие реализации дословно переносится на системы с непрерывным временем. Только вместо множества Р(5) следует рассматривать множество P(S) конечных процессов в непрерывном времени. Реализующее отображение можно задавать и для систем с разными множествами моментов времени. Рассмотрим некоторые типичные способы построения моделей дискретных систем. 1. Пусть S0 С S' С 5, где 50 — множество допустимых начальных состояний системы S. Всякий допустимый процесс р системы S однозначно можно представить в виде р = sxpiS2p2 — $трт,где sl9 ...,sw €S'(m> 0), а слова pl9..., рт не содержат вхождений состояний из S', т.е. рх% ...,pw e G (S\S')*. Положим у(р) = Si ... sm. Рассмотрим систему S', выбрав в качестве ее допустимых процессов множество всех процессов вида у(р), где р - допустимый процесс системы S. Поскольку функция у монотонна, система S является полной монотонной реализацией системы S' с реализующей функцией 7- Систему S' будем называть проекцией системы S на подмножество состояний S' С 5. Модель S' обычно получается следующим образом. В системе S выделяются некоторые основные или существенные состояния, которые интересуют нас по тем или иным соображениям. Допустимые процессы получаются путем опускания промежуточных состояний. Например, рассматривая работу программы с подпрограммами, можно игнорировать состояния, соответствующие внутренним операторам подпрограмм, оставив только состояния, соответствующие обращениям к подпрограммам и выходам из них. Методы проектирования последовательных программ сверху вниз обычно сводятся к построению цепочки реализаций, модели которых являются проекциями на подмножества или гомоморфизмами. Если система S детерминирована или автоматна, то S' также детерминирована или автоматна. Но S' может быть детерминированной или автоматной, даже если S не является таковой. 2. В случае многокомпонентных систем описанная выше конструкция может быть реализована следующим образом. Пусть S = Si X S2 — двух- компонентная система с множеством начальных состояний S0 =SJ°) XS(°) и в ее компонентах выделены подмножества5^ CS\ С S и S^ С S'2 CS2. Построим систему S' = S\ X S'2 следующим образом. Пусть г = (ai9bi) ... ... (am,bm) — допустимый процесс системы S. Представим слова р = ах ...ат nq = bi ...bm в втер = stpi ...skpkyq= s\p\ ... 5*р*, гдер!, ...,р* _ , G e {Sx\s\y, p\ ,..., pfk _ i € (S2\s2) *, st,..., sk e s\, s\,..., s'k e s,2 и либо Pk € (Si\S'i)*, либо pk G (S2\S2)*. Положим y(r) = (slf s\) ... (sk, sjt). Отображение у монотонно и является реализующим отображением системы S на систему S', допустимые процессы которой имеют вид у (г), где г — допустимый процесс системы S. Систему S* назовем асинхронной проекцией S на Si XS'2. 18
3. Конструкция перехода от систем с непрерывным временем к системам с дискретным временем, описанная в § 1, может рассматриваться как построение модели с дискретным временем, поскольку отображение к(Р\*Рг *--*Рк) =7(Pi)7(P2) ••7(Рл)»гдер1,...,рАг - элементарные процессы, npi, ...,Pfcоканчиваются в моменты переключения монотонно.Если взятье' = 53, y(uv*w) = (и, и, w), то имеем более простую модель, в которой потеряны длительности, но сохранен порядок смены состояний. 4. Пусть есть система уравнений, определяющая асинхронную логическую сеть. Состояние (х, у) этой сети назовем устойчивым, если оно удовлетворяет системе уравнений. Пусть (5, F) - подсистема сети, которая получается наложением следующих двух условий на допустимые процессы: - каждый допустимый процесс начинается в устойчивом состоянии; -если (х,у) -*(*',У) и (х,у) не устойчиво,тох* =х. Проекция S на множество S' устойчивых состояний представляет собой модель функционирования сети, в которой игнорируются переходные процессы. § 4. Алгебра языков Множество допустимых процессов дискретной системы представляет собой язык в алфавите состояний. Поэтому для задания множества допустимых процессов можно использовать общие методы задания языков. Эти методы особенно удобны для определения недетерминированных систем с конечным числом состояний. Алгебра языков, определенная в этом параграфе, имеет также и другие применения. Пусть W - некоторый алфавит. Множество W*ecex слов в алфавите W является свободной полугруппой с единицей относительно операции умножения (приписывания) слов. Пустое слово е является единицей этой полугруппы. Определим на множестве 2W всех языков в алфавите W (подмножеств множества W*) следующие операции. 1. Произведение языков PQ={pq\p€P,q SQ). 2. Дизъюнкция Р v Q - теоретико-множественное объединение языков. 3. ИтерацияР* языка/>;/>* = U Р*, гдеР° = {е), Р"+1=Р"Р п = 0 ш* Множество 2 вместе с указанными операциями образует алгебру, которая называется алгеброй всех языков в алфавите W. Вообще алгеброй языков называется произвольное множество языков, замкнутое относительно операций умножения, дизъюнкции и итерации. Из определения операций вытекают следующие простые утверждения, полезные при доказательстве соотношений в алгебре языков. l.p GPQ*=> существу ют рх ЕРир2 £ С такие, чтор = Р\Рг- 2.pePvQ<=>pePwmpeQ. Отождествляя символы алфавита W с одиобуквенными словами, получим включение W С W*. Отождествляя слова с одноэлементными языками, получим также включение W* C2W . Элементарными языками будем называть языки е, w (w E W) и пустой язык </>. Замыкая множество эле- 2* 19
ментарных языков относительно операций алгебры языков, получим алгебру JC(W) регулярных языков. Каждый регулярный язык может быть записан в виде выражения, построенного из символов элементарных языков с помощью операций алгебры языков. Такие выражения называются регулярными. Если L — произвольное множество языков, то, замыкая это множество с помощью операций алгебры языков, получим алгебру K(L) языков, регулярных относительно L. Каждый язык этой алгебры может быть также записан в виде выражения, построенного из обозначений языков из L и операций алгебры языков. Такие выражения называются регулярными относительно L. Рассмотрим основные соотношения алгебры языков: P(QR) = (PQ)R (ассоциативность умножения); Ре = еР = Р', Рчф = фчР = Р\ Рч Q- QmP (коммутативность дизъюнкции); (Р vQ) vR = Р v(Q vR) (ассоциативность дизъюнкции); РуР-Р (идемпотентностьдизъюнкции); P(QvR) = PQ\iPR (леваядистрибутивность); (Р vQ)R = PR vQR (правая дистрибутивность); Р* = е чРР* =е \/Р*Р (развертывание итерации); P*=(evP\/P2 v...vPn-l)(Pny; Р*Р*=Р*; {P*vQY=(PvQy\ Р*Р = РР*. Все указанные соотношения являются тождественными, т.е. они выполняются при любых значениях переменных P>Q и R в любой алгебре языков. Доказательства этих соотношений можно получить путем доказательства двух включений, исходя непосредственно из определения операций. Докажем, например, левую дистрибутивность. Пусть р G P(Q v R). Тогда р =PiP2,Pi еЛрг е Q v/2. Еслир2 е (2>т0 pePQCPQ v PR. Если же р2 £ R, то р G PR CPQ v PR. Таким образом, P(Qv R) CPQvPR. Аналогично доказывается обратное включение. Другие соотношения алгебры языков можно получить как следствия из указанных или непосредственным доказательством, исходя из определения операций. Простое описание всех тождеств алгебры языков не известно, хотя существует алгоритм их распознавания, основанный на результатах теории автоматов. Следующий вопрос — уравнения в алгебре языков. Рассмотрим сначала одно уравнение с одним неизвестным вида X = XPvQ, (4.1) где Р и Q - известные языки, X - неизвестный язык. Такого типа уравнения будем называть каноническими линейными уравнениями. Уравнение (4.1) имеет решение X = QP*. Действительно, применяя соотношения алгебры языков, получим X = QP* = Q(evPP*) =Qv (QP*) P = = XPvQ. Аналогичным образом правое уравнение X = РХ v Q имеет решение X = 20
Множество всех языков упорядочено отношением включения. Покажем, что X = QP* есть наименьшее решение уравнения (4.1). Действительно, пусть Y - какое-нибудь решение. Покажем, что X СУ. Имеем р Е QP* <=> <=>р =р'р",р"=Pi ...рт(р{ €iPfp' GQ). Подставляя многократно правую часть уравнения Y = УТу(?вместо У в себя, получим Y=YP\t Q = (YPvQ)Pv vQ=YP2 vQPvQ=... = YPm + lvQPm v ... v QPm Q. Поскольку ре QPm , то p^Y. Вообще говоря, уравнение (4.1) может иметь много решений, но при условии е $ Р имеет место единственное решение. Действительно, если Y — какое-нибудь решение и длина слова р равна т, то из р Е У и Y = = YPm + ! v QPm v ... v QP v Q следует, что р G QPm v ... v Q, так как все слова в YPm + 1 имеют длину больше, чем т. Но тогда р Е QP* = X. Резюмируя сказанное, получаем следующую теорему. Теорема 4.1. Уравнение X = ХР v Q(X = PX v Q) имеет решение X = = QP* (X = P*Q). Это решение является наименьшим и, если е$Р, единственным. Рассмотрим теперь систему уравнений вида Xt= V XftjvQ,, i=l,...f/i. (4.2) / = l Системы вида (4.2) называются каноническими системами линейных уравнений в алгебре языков или леволинеиными системами. Праволинейные системы имеют вид *,= V РиХ}мйь / = 1,...,л. (4.3) Теорема 4.2. Среди решений систем (4.2) и (4.3) существует наименьшее решение, регулярное относительно коэффициентов Ptj и свободных членов Q,. Если для всех /, / = 1,..., п имеет место е £ Рц f ,то это решение единственно. Доказательство проводится методом решения систем (4.2) и (4.3), основанным на исключении неизвестных. Каждый шаг исключения делается с применением теоремы 4.1. Рассмотрим первое уравнение системы (4.2). Если Х\ не встречается в правой части уравнения, то Х\ можно исключить, подставив правую часть во все остальные уравнения. Если же Х\ входит в правую часть, то, применяя теорему 4.1, получим, что *i=( V XfuvQ^PU /= 2 является наименьшим решением этого уравнения при известных^, —*Хп- Подставив вместо Хх его значение в другие уравнения, снова получим систему с меньшим числом неизвестных. После раскрытия скобок по закону правой дистрибутивности и приведения подобных членов,*т.е. вынесения за скобки неизвестных по закону левой дистрибутивности^ снова получим каноническую систему линейных уравнений. Продолжая подобным образом, в конце концов получим наименьшее решение в виде выражения, регулярного относительно коэффициентов и свободных членов. Заметим, что если коэффициенты исходной системы не содержат пустых слов, то 21
это свойство сохранится и при исключении, а решение, полученное на каждом шаге, будет единственным. Рассмотрим пример. Решим систему уравнений X = XP\tYve, Y = XQ\iYP. Исключая Y из второго уравнения, получим Y=XQP\ Подставляем У в первое уравнение и исключаем X: X = XPvXQP*\te = X(PvQP*)ve = = (P\,QP*y=(PvQY. Последнее равенство можно получить из следующих включений, которые устанавливаются непосредственной проверкой: PvQP* С (P\tQY*>{P\/QP*y С (PvQ)*, PmQCPmQP* ^{PmQY C(PyQP*y. Окончательно получаем X = (PvQ)\ Y = (PvQYQP*. Если e G Q, то X = У, но решение в этом случае не единственно. § 5. Конечные системы В это1*т параграфе будет изучена связь между конечными и конечными автоматными системами. Метод изучения основан на применении алгебры языков и доказательстве основной теоремы, являющейся обобщением теоремы анализа и синтеза в теории конечных автоматов. Конечные автоматные системы можно задавать с помощью графов, или диаграмм переходов. Вершинами такого графа служат состояния системы, а дуга связывает две вершины, если возможен переход от первого состояния ко второму. Для того чтобы множество допустимых процессов было определено, необходимо также задавать множество допустимых начальных состояний. На рис. 1.4 представлена диаграмма переходов системы с четырьмя состояниями. Все ее состояния являются допустимыми начальными состояниями, поскольку из каждого возможен переход в некоторые другие (5(s)^0). Состояние s автоматной системы называется тупиковым, если 6(s) = ф. Только тупиковые состояния могут не быть допустимыми начальными состояниями автоматной системы. Теорема 5.1 (теорема анализа конечных автоматных систем).Множество допустимых процессов конечной автоматной системы регулярно. Пусть (5, F) — конечная автоматная система с множеством допустимых начальных состояний S0 и функцией переходов 5. Рассмотрим множества Fs ={ps GF}h Fs ={ sp GF}U{s}5 где 5G5, pGS*. Указанные множества 22
удовлетворяют уравнениям Fs = a(s) v V Fs>s, seS, (5.1) Fs = sv ViF*! sGS, (5.2) где a(s) = (если s G S0 то 5 иначе 0). Действигельно, pGFsop = sGS0 или p = p's's, p's'G /y, s -*s. В первом случае p G a(s), во втором р €Fs>s. Рис. 1.4 Далее, p G Fs <> p = s или p = ss'p', 5 -*• s\ sp G F* , что доказывает (5.2). Системы (5.1) и (5,2) являются каноническими системами линейных уравнений в алгебре регулярных языков. Поскольку коэффициенты этих систем не содержат пустого слова, в силу теоремы 4.2 каждое из семейств (Fs)s^s и (Fs)s^s образует единственное решение системы (5.1) и (5.2) соответственно. С другой стороны, F = V Fs= V Fs. s^S s<ES0 Доказательство теоремы анализа содержит в себе также алгоритм решения задачи анализа, которая состоит в том, чтобы, зная отношение переходов и множество допустимых состояний, найти регулярное выражение для множества допустимых процессов. Алгоритм состоит из двух этапов. Первый этап — построение системы уравнений, второй этап — получение решения. Решим, например, задачу анализа системы, изображенной на рис. 1.4. В этом случае удобно воспользоваться системой (5.1): F\ =Si v F3sl9 F2 = s2 у Fls2 v F4s2, F3 = s3 v F2s3 v F3s3, F4 = 54. Выражаем F{ и F2 через F3, исключаем F4, получаем уравнение для F3 и решаем его: F3 = s3 v s2s3 v Fxs2s3 v s4s2s3 v F3s3 = = S3 V S2S3 V SiS2S3 V S4S2S3 V F3(S1S2S3 VS3) = = (s3 V S2S3 V SiS2S3 V S4S2S3)(S1S2S3 V S3)*. 23
Используем полученный результат для определения F: F = FX v F2 v F3 v F4 =Si v F3Si vj2v s*s2 v (^! v F3Si)s2 v F3 v s4 = = S! V S2 V S4 V SiS2 V SAS2 V F3(e VSj V 5i52) = = 5i vj4v2v(ev G)53(s3 v SiS2s3)*(e vsjv Si$2), где(? = (е v Si v s4)s2. Пусть (5, F) - автоматная система, S, С S0, S2 С S. Через /,($!, S2) p обозначим язык L (Sl9 S2) -{ p G F|sj -> s2, Si G Si, s2 G S2}. Пусть 7: 5 -> ЛГ - гомоморфизм системы 5 в свободную систему ДГ. Образ y(L(Si, S2)) = R есть некоторый язык в алфавите А\ О языке R будем говорить, что он порождается системой S при множестве начальных состояний Si, заключительных состояний 52 и порождающем гомоморфизме 7- Язык называется конечно-автоматным, если он порождается конечной автоматной системой. Теорема 5.2 (теорема синтеза конечных автоматных систем). Если язык R регулярен, то R\e конечно-автоматен. Для доказательства теоремы 5.2 нужно определить метод построения (синтеза) конечной автоматной системы, порождающей данный язык. Доказательство проведем индукцией по числу операций, использованных в регулярном выражении, представляющем язык R. Базис индукции сводится к рассмотрению случая, когда R является элементарным языком. Шаг индукции требует рассмотрения трех случаев: R = RXR2,R= Rx v Л2, R = R *. Для каждого из трех случаев будет указана конструкция, которая по системам Sx и52, порождающим языки Rx\e и R2\e, строит систему 5, порождающую язык R\e. Системы, порождающие языки х и 0, показаны на рис. 1.5. =0 о—" Рис. 1.5 Конструкции для трех операций алгебры языков показаны на рис. 1.6. Двойными стрелками показаны множества начальных и заключительных состояний. Построение системы S для произведения можно описать следующим образом. Диаграммы переходов систем Sx и S2 с непересекающимися множествами состояний объединяются. В качестве множества начальных состояний системы S выбирается множество начальных состояний системы Si, в качестве заключительных - системы S2. Все заключительные состояния системы Sx соединяются-переходами с начальными состояниями системы S2. Порождающий гомоморфизм системы S на множестве Si действует как на первой системе, на S2 - как на второй. Если е G R2, то к заключительным состояниям добавляются заключительные состояния системы Si, а если eG R х, то к начальным состояниям системы St добавляются начальные состояния системы 52. Построение системы Sx для дизъюнкции видно из рисунка. Для итерации в системе S2 нужно просто соеди- 24
п f*ff\2 R=RfvRz ЧееЯ2 »eerfif =/?* /?=/?; Рис. 1.6 нить переходами заключительные состояния с начальными. Доказательство того, что полученные системы порождают соответствующие языки, предоставляется читателю в качестве легкого упражнения. Теорема 5.3. Язык R регулярен *>R\e конечно-автоматен. Первая часть теоремы совпадает с теоремой 5.2. Пусть R\e — конечно- автоматный язык, а (5, F) - конечная система, которая его порождает, т.е. R\e = y(L(S\, $2))- Для любой пары состояний s, s E S рассмотрим р язык Fss> ={ р Е F\s -*• s). Языки Fss> удовлетворяют соотношениям где j3(s, 5') = (если s -* s' то ss' иначе 0). Поэтому все они регулярны. С другой стороны, L(Sl9S2)= V FmS sGS, s'es2 и для доказательства регулярности R\e осталось показать, что всякий гомоморфизм 7 сохраняет регулярность. Прежде чем доказывать это свойство, распространим действие гомоморфизма у на все слова в данном алфавите, включая пустое слово и полагая у(е) = е. Теперь выражение 7(Я) имеет смысл для произвольного языка, а не только для множества процессов, т.е. непустых слов. Лемма 5.1. Образ регулярного языка при гомоморфизме у: S -* X регулярен. Это вытекает из соотношений 7(^0 = 7(^7(0, 7(/>v0 = 7(P)v7(0, 7(Д*) = (7(Я))*. 25
Действительно, р G y(PQ) о р = y(piP2) = ТФОтФг), Pi еЛ Рг^й ** *pey(P)y(Q) и т.д. Теперь можно сформулировать и доказать основной результат этого параграфа. Теорема 5.4. Конечная система имеет конечную полную автоматную гомоморфную реализацию о множество ее допустимых процессов регулярно. => Пусть S есть полная гомоморфная реализация системы S', а у: S -> S' — реализующий гомоморфизм. Если S — конечная автоматная система, то множество ее допустимых процессов F регулярно и F' = 7 (/0 регулярно в силу леммы 5.1. <= Пусть (S, F) - конечная система с регулярным множеством допустимых процессов F. Построим систему (Sr, F'), порождающую язык F. В силу теоремы 5.3 систему S' можно сделать конечной автоматной. Кроме того, можно предположить, что из любого состояния системы S' достижимо множество заключительных состояний. Действительно, состояния, из которых не достижимо множество заключительных состояний, можно отбросить, не изменив при этом языка, порождаемого системой. Покажем, что порождающий гомоморфизм у: S' -> S определяет полную гомоморфную реализацию. Пусть р — допустимый процесс системы S'. Поскольку множество заключительных состояний достижимо, то р можно продолжить до процесса pq, который кончается в одном из заключительных состояний. Тогда y(pq) = y(p)y(q) допустим и в силу замкнутости множества допустимых процессов 7(р) также допустим. С другой стороны, поскольку S' порождает F, то для каждого р Е F найдется р G F1 такой, что у(р') = р. Теорема доказана. § 6. Многокомпонентные системы Пусть р и р — два процесса одной и той же длительности в пространствах S и S' соответственно (время может быть как непрерывным, так и дискретным). Определим параллельную композицию q = р® р процессов р и р\ полагая q(t) = (p(t\ p{t)) для всех t (О < t < \р | = \р' |). Композиция р ® р есть процесс в пространстве S X £'. Процессы р и р' называются проекциями процесса q на компоненты S и S соответственно. Если F и F' — два множества процессов в пространствах S и S\ то через F ® F' обозначим множество всех процессов вида р ® р' (р е F, p1 GF'). Определение параллельной композиции и проекций распространяется очевидным образом на любое конечное или бесконечное число сомножителей. Систему (5, F) будем называть параллельной композицией систем (Si, Fi), ..., (Sm, Fw), если SCS,X...X Sm, F С F, ® ... ® Fm. Множество S называется также множеством допустимых состояний композиции (оно может не совпадать с Si X ... XSm). Если S = St X ... X Sm, a F = FX® ... ®Fm, то S называется прямым произведением систем Si9 ..., Sm и обозначается S^ ® ... ® Sm. Таким образом, произвольная параллельная композиция систем есть подсистема прямого произведения. Заданную многокомпонентную си'стему (S, F) можно многими способами разлагать в композицию своих компонент. Одним из таких способов является представление S в виде композиции свободных систем. Другой 26
способ состоит в том, что в качестве допустимых процессов системы (St, Ff) выбирается множество всех проекций на i-ю компоненту всех допустимых процессов системы S. Другие разложения лежат между двумя указанными в том смысле, что если S разложена также в композицию систем (Si9 F/), то (St, Ft) С (St, Fj) (состояния рассматриваются как допустимые процессы длительности 0). С другой стороны, (5/, F[) С C(S,,P(S,)). Далее будем снова рассматривать только дискретное время. Пусть S С Si ® ... ® Sm. Определим функции переходов компонент bt(i = 1,..., т) следующим образом. Функция 5f- зависит от i аргументов. Первый аргумент — процесс в пространстве S, остальные /—1 аргументов — состояния компонент Sx, ..,V,, ht{p, sx, ..., s,-i) С Sf, sf G 5,(p, sXi ...,s*_i) о существуют s/+1,..., sm такие, что процесс p(sx,..., sm) допустим. Теорема 6.1. Функция переходов компонент однозначно определяет функцию переходов многокомпонентной системы. Доказательство очевидно. Компонента 5,- называется свободной, если для любых р, S\, ..., ty_i 8/(р, Si, ..., s/_i)= Sj или 0. Компонента называется детерминированной, если 5j(p, si, ..., ty_i) состоит не более чем из одного элемента. Система S называется квазидетерминированной, если каждая ее компонента либо свободна, либо детерминирована. Теорема 6.2. Всякая дискретная система S имеет полную гомоморф- ную квазидетерминированную реализацию. Рассмотрим сначала случай, когда множество S не более, чем счетно. Пусть Sf — полная автоматная реализация системы S, которая существует по теореме 3.1, у: S' -* S — реализующий гомоморфизм, а 5' — функция переходов системы S'. Из доказательства теоремы 3.1 видно, что в качестве S' можно взять систему со счетным числом состояний. Упорядочим S' линейно по типу натурального ряда отношением < Пусть для любых s, s" G S' <р(У, s") ={sE 5'(s")|s' < s). Рассмотрим автЬматную систему S" = (S')2, определив ее функцию переходов 5" равенством 8"(s', s") = (если 5'(s") = 0, то 0, иначе, если v?(s', s") = ф, то S' X {min6'(s")}, иначе S' X { mines', s")}). Положим (S")0 = S' X (S')0. Отображение 7': S" -* S', определенное равенством y'(s', s") = s", есть гомоморфизм, а композиция у" = у1 о у дает искомый реализующий гомоморфизм. Для несчетного множества 5" доказательство дословно повторяется, если S' упорядочить так, чтобы оно стало вполне упорядоченным множеством, что можно сделать с помощью известной теоремы Цорна. При перестановке компонент многокомпонентной системы и соответствующем изменении функции переходов получаются системы, изоморфные исходной, но с другим упорядочением компонент. Следует заметить, что при этом свойство квазидетерминированности может потеряться. Например, если S = St X S2 — автоматная система и d(sir s2) = (s|, f(sJ)), где s[ G Si произвольно, a /: Si -> S2, то система S квазидетерминирована, однако если отображение / не является отображением на все множество S, то после перестановки компонент свойство квазидетерминированности теряется. С другой стороны, если отображение / - взаимно однозначное отображение Si на S2, то при перестановке роли компонент поменяются 27
и система останется квазидетерминированной. Для того чтобы понятие квазидетерминированной системы сделать независимым от упорядочения компонент, расширим это понятие, считая систему квазидетерминированной, если она становится такой после перестановки компонент. Свободные компоненты обычно представляют связь системы с внешним окружением, поэтому они изменяются независимо от того, что происходит внутри системы. При построении композиции некоторых систем те из них, которые моделируют внешнее окружение других, становятся компонентами композиции; и на изменение свободных компонент накладываются ограничения, характеризующие обратные связи. Для автоматных систем функции переходов компонент могут быть определены другим способом. Именно, полагаем б,-: Si X ... X Sm X X Sx X ...X Sy_, -> 2 '. При этом процесс p(sl9 ..., sm)(s[, ..., s'm) допустим о s/ G 6Д51, • ••> sm> su ..., fy_i) (/ = 1, ..., m). Таким образом, Si(si > ...» sm, s[, ..., s|_ i) представляет возможные значения /-й компоненты в текущий момент времени при условии, что в предыдущий момент времени система находилась в состоянии (s2, ..., sm), а в текущий момент времени первые I— 1 компонент перешли в состояния sj,..., s|_! соответственно. Переходя к многоуровневым системам, заметим, что декартово произведение рассматривается как многоместная операция, и расстановка скобок в произведении меняет соответствующее множество. Например, множества (Si X S2 X S3) X SA и Si X (S2 X S3) X 54 считаются разными. Компоненты Si, ...,5'w многоуровневой системы S С Si X ... X Sm называются компонентами верхнего уровня. Предположим, что двигаясь вниз по уровням компонент, в каждой из них можно дойти до самого нижнего уровня. Если 7^, ..., Тп — все компоненты нижнего уровня, то система S изоморфна одноуровневой системе с множеством состояний, содержащимся в множестве 7*1 X ... X Тп. Само множество состояний системы S содержится в множестве, которое получается некоторой расстановкой скобок в произведении Тг X ... X Тп. Соответствующее выражение называется многоуровневой структурой системы S. Каждую компоненту некоторого уровня можно, двигаясь сверху вниз, представить в виде композиции компонент следующего уровня. Если зафиксировать такие представления, то получим многоуровневую композицию, представляющую систем/5. Рассмотрим преобразования многоуровневых систем, не выводящие их из класса изоморфных систем. 1. Поднятие уровня компонент, состоящее в опускании некоторой пары скобок в многоуровневой структуре системы. 2. Понижение уровня компонент, состоящее в том, что в структуру системы добавляется новая пара скобок. 3. Перестановка компонент одного и того же уровня, непосредственно подчиненных, т.е. являющихся компонентами, одной и той же компоненте верхнего уровня. 4. Дублирование (удвоение) компоненты состоит в том, что некоторая компонента повторяется на том же уровне и с той же непосредственной подчиненностью, что и исходная компонента. При этом функция переходов и множество допустимых состояний представляются таким образом, что 28
в допустимых процессах и состояниях новая и старая компоненты всегда равны. Такие компоненты называются также отождествленными. 5. Удаление одной из отождествленных компонент — преобразование, обратное к преобразованию 4. Пусть 7\, ..., Тт9Т' — компоненты одного и того же уровня и одинаковой подчиненности. Компоненту Т будем называть зависящей от компонент Тх, ..., Тт, если во всех допустимых состояниях ее значение однозначно определяется состояниями компонент 7\,..., Тт. 6. Добавление зависимых компонент состоит в следующем. Пусть Sj С Тх X ... X Тт — одна из компонент некоторого уровня. Заменим St на S'i С Тх X ... Тт X Т и переопределим функцию переходов и множество допустимых состояний таким образом, чтобы во всех допустимых процессах и всех допустимых состояниях этой новой системы значение компоненты Т было бы равно некоторой заданной функции от состояний компонент Tl9..., Tm. 7. Удаление зависимых компонент — преобразование, обратное преобразованию 6. Легко заметить, что преобразования 4 и 5 являются частными случаями преобразований 6 и 7 соответственно. Две системы называются структурно изоморфными, если одну можно получить из другой при помощи последовательности указанных преобразований. Переход от системы S к структурно изоморфной системе с помощью только преобразований 1-3 называется реструктурированием системы S. Одним из основных способов определения композиции дискретных систем является введение соотношений между компонентами прямого произведения. Пусть заданы системы (Si9Fi), ..., (Sm9Fm)9 aR(sl9 ..., sm) есть отношение между элементами множеств Si9 ..., Sm, т.е. R С Si X ... X Sm. Композицией дискретных систем S%9 ..., Sm9 определенной отношением R9 или R-композицией, называется подсистема прямого произведения Si ® ... ® sm9 множество допустимых состояний которой совпадает с R9 а множество допустимых процессов F = Р(Л) П (Fx ® ... ® Fm)9 т.е. Pi ® ... ® рт допустим о все процессы рг, ..., рт допустимы, и для всех t таких, что 0 < t < |р|, имеет место R(pi(t)9 ..., pm(t)). Очевидно, что /^-композиция определена также и для систем с непрерывным временем. Простейшим вариантом отношения R является конъюнкция равенств состояний некоторых компонент sti = Sj A ... л si/c = sJk. Равенства, входящие в это отношение, называются уравнениями связей, а соответствующая композиция — композицией, определенной системой связей. Если Si, ..., Sm сами являются многокомпонентными, то в уравнениях связей будем разрешать использование состояний, являющихся компонентами состояний систем Sx,..., Sm. Многокомпонентная система называется полуоткрытой, если среди ее компонент выделены некоторые свободные компоненты, называемые входными. Входные компоненты, или входы, предназначены для получения информации от внешнего мира. Полуоткрытая система называется открытой, если среди ее компонент вьзделены компоненты, называемые выходными. Компоненты, которые не являются входными или выходными, называются внутренними. Всякая полуоткрытая система структурно изоморфна двухкомпонентной системе S С X X А, где X — произведение 29
всех свободных компонент. Открытая система структурно изоморфна трехкомпонентной системе S С X X А X У, где X— произведение входных, А — произведение внутренних, Y — произведение выходных компонент. Для получения такого представления в случае, если система не имеет внутренних компонент или некоторые из входных являются внутренними, следует воспользоваться дублированием компонент. Для открытых систем может быть введен особый вид композиции, определяемой системой связей, - сети. Пусть Si, ..., Sm - открытые системы. Сетью, построенной из Sx,..., Sm, называется композиция систем Sl9 ..., Sm, определенная системой связей R и удовлетворяющая некоторым дополнительным ограничениям. Для того чтобы сформулировать эти ограничения, рассмотрим отношение эквивалентности на множестве компонент систем Sl9 ..., Sm. Две компоненты Т\ и Т2 называются отождествленными, если равенство Sx = s2 их состояний является следствием из уравнений связей. Потребуем теперь выполнения следующих ограничений. 1. В каждом классе отождествленных компонент либо все входные, либо только одна выходная, а остальные входные. 2. Множества состояний отождествленных компонент либо совпадают, либо все содержат множество состояний выходной компоненты. Смысл введенных ограничений становится ясным, если представить сеть графически. Это можно сделать с помощью ориентированного графа с отмеченными дугами. Вершины этого графа делятся на два класса - узлы и компоненты. Первые представляются на рисунке точками, вторые — например, прямоугольниками. Узлы находятся во взаимно однозначном соответствии с классами отождествленных компонент. Дуга соединяет узел с компонентой (компоненту с узлом), если один из входов (выходов) этой компоненты содержится в соответствующем классе, и отмечается символом переменной, принимающей значения в множестве состояний этого входа (выхода). Если сеть имеет классы отождествленных компонент, состоящие только из входных компонент, то, выбрав из каждого такого класса по одному представителю, их можно объявить входными компонентами сети. В качестве выходов можно объявить любые из выходов компонент сети. После соответствующего реструктурирования сеть может быть объявлена открытой или полуоткрытой системой. Повторяя операцию построения новых сетей из уже построенных, получаем многоуровневые сети. Такой подход обычно используется при описании сложных многокомпонентных систем. На рис. 1.7 изображена сеть из трех компонент. Состояние этой сети имеет вид v = (vl3 v2, u3)> где Vi = (xlf x2, st9yi)9 v2 = (*з, x4,s2fy2X Уз = (*s>x6>*7>&ъ>Уг*У4)- %£ компоненты в текущий момент времени должны удовлетворять следующим условиям: s, e8i(Pi,*i,*2)> s2 €S2(p2,x3,xA), sz ^ЫРз,*s,*6,*?), Ух e54(Pi,*,,X2,Si), Уг €5s(p2,x3,x4,s2\ 30
уъ еб6Оз,*5,*б,*7,*з), *3 =^2» *1 = >>3, *6 = *7 =^2- Здесь Pi, р2,Рз - процессы функционирования компонент, предшествующих текущему моменту времени, 5i, ..., 67 — функции переходов компонент. Если компоненты сети являются квазидетерминированными системами с детерминированными внутренними и выходными компонентами, *i г* *t *3 „ 5l s2 \0I '* , •ч Xg JOy s. \Уз_ "*-. Рис. 1.7 то сеть, вообще говоря, может не быть квазидетерминированной. Действительно, в случае квазидетерминированности систем Sl9 S2, S3 утверждения о принадлежности состояний и выходов множествам, определяемым функциями переходов компонент, превращаются в равенства, а система соотношений (6.1) становится системой уравнений. Наличие обратных связей приводит к тому, что решение этой системы может не быть единственным. Рассмотренные композиции дискретных систем соответствуют случаю конечного множества линейно упорядоченных компонент. В общем случае можно рассматривать семейство систем (£/)/е/ и прямое произведение S =? ® S{f которое определяется следующим образом. Элементами мно- /е/ жества S являются функции s: I -* U Sf такие, что для любого /G/ /е/ s(f) G Sf. Множество F = ® Ft допустимых процессов системы S состоит /е/ из всех процессов р в пространстве S таких, что для всякого /Е/ процесс р{, определенный равенством pf(t) = st(i), где st = p(t) (О < t < \р |), принадлежит множеству Ff- допустимых процессов системы Sf. Процесс pt называется i-й проекцией процесса р. Сам процесс р однозначно определяется своими проекциями и обозначается р = ® р/. /е/ При определении функций переходов компонент композиции семейства систем следует учитывать порядок, который должен быть задан на 31
множестве индексов / этого семейства. Указанный порядок может быть частичным, а функции переходов компоненты с большим индексом могут зависеть от текущего состояния компонент только с меньшими индексами. С учетом этого порядка можно определить свободные и детерминированные компоненты, квазидетерминированные, открытые и полуоткрытые системы. Следует заметить, что в случае частичного порядка функции переходов компонент не всегда существуют. Например, если состояния двух компонент всегда равны, то индексы этих компонент должны быть сравнимыми, поскольку состояние любой из них зависит бт состояния другой. § 7. Автоматы Важным частным случаем открытой и полуоткрытой систем является автомат. Полуоткрытая автоматная система X X А называется Х-автоматом, если функция переходов компоненты А 52 (*> а* *') не зависит от jc\ а множество начальных состояний имеет вид XX А0, где А0 С А. Функция д(а9 х) = = 82 (х, а, х'.) называется функцией переходов автомата, а сам автомат обозначается так же, как и его внутренняя компонента А. ЛГ-автомат однозначно определяется множествами X, А, А0 и функцией переходов 5. Поэтому его часто определяют как четверку (X, А, А0, 5). Если А0 = А, то ^-автомат называют неинициальным и отождествляют с тройкой (X, А, 6). Если функция 5 однозначна, то автомат называют детерминированным; если функция 5 однозначна и всюду определена, то автомат называют полностью определенным. Часто ^-автоматом называют неинициальный, детерминированный, полностью определенный автомат, а рассмотренное выше определение - как обобщение с добавлением атрибутов "инициальный", "недетерминированный", "частично определенный". Поскольку всякая полуоткрытая система структурно изоморфна двух- компонентной, следующая теорема фактически устанавливает связь между произвольными полуоткрытыми системами и ^-автоматами. Теорема 7.1. Всякая двухкомпонентная полуоткрытая автоматная система S С X X А является подсистемой полной гомоморфной модели Х-автомата В. При этом если S квазидетерминирована, то В детерминирован. Рассмотрим Х-автомат В = (IU{ х0}) X А> где jc0 ^ X, определив его функцию переходов формулой д((х9а), х ) = (лг\ Ъ2 (х, а, *')), где §2 (х, а, х') — произвольное продолжение функции 62 переходов второй компоненты системы 5 на все множество (XU{ х0}) X А XX, удовлетворяющее условию 52 (х0, а, х) =а. Положим В0 ={*о} X Л. Определим отображение у: X X ((X U { х0}) X А) -* X X Ау полагая у(х, (х',а)) = = (х, 52 (*', а, х)). Это отображение определяет гомоморфизм автомата В в свободную систему с множеством состояний XX А. Образ S ' автомата В при этом гомоморфизме является его полной моделью. Покажем, что S' содержит S в качестве подсистемы. Действительно, пусть q = (xi, ai) ... {xm, am) — допустимый процесс системы S. Тогда tff+i G S2(x/, aif xi+i) (i = 1, ..., m - 1), а процесс /? = (х1э (x0, а0)) X X (*2, (*i,tfi)) ••• (*m> (*m-b <*m-\)) есть допустимый процесс функ- 32
ционирования автомата В. Но у(р) = q, и, следовательно, q допустим в 5. Вторая часть теоремы очевидна. Трехкомпонентная открытая система S С XX А X У называется ЛГ— У-лв- томатом, если компонента XX Л системы 5' С (XX А) X У, полученной из S соответствующим реструктурированием, является Х-автоматом, функция переходов компоненты У зависит только от состояний входной и внутренней компонент в текущий момент времени: 53 (х, а, у, x'td') *= = Х(я', дг'),* а множество допустимых состояний (а, х9 у) определяется условием у = X(а, х). Функция переходов Х-автомата XX А и функция X называются функцией переходов и функцией выходов автомата S соответственно, а сам X— У-автомат обозначается обычно так же, как и его внутренняя компонента А. Поскольку X— У-автомат однозначно определяется множествами X, А, Aq, У (А0 — множество начальных состояний внутренней компоненты) и функциями 5 и X, то его обычно определяют как шестерку (X, А, А0, У, 5, X) или, если А0 = А, как пятерку (X, А, У, 6, X). Так же как и для Х-автоматов, вводятся понятия инициальное™, детерминированности и полной определенности (требование полной определенности относится к функции переходов и к функции выходов). Теорема 7.2. Всякая открытая автоматная система S С XX А X У является подсистемой полной гомоморфной модели X-Y-автомата В. Если S квазидетерминирована, то В детерминирован. Доказательство аналогично доказательству теоремы 7.1. В дальнейшем, если это не оговорено особо, будут рассматриваться только неинициальные, детерминированные, полностью определенные автоматы. При рассмотрении гомоморфизмов автоматов кроме требования сохранения допустимости процессов добавляются следующие условия. Отображение 7: S -+S' Х-У-автомата SCXXAXYb X'-Y -автомат 5" С С X1 X А'X У' называется гомоморфизмом, если это отображение есть гомоморфизм системы S в S9 и, кроме того, у (х9 а, у) - = (7i (*), 7а (л). 7з0>))> где 7i: X-* Х\ у2: А-+А',уъ: Y-+Y'. Очевидно, что тройка (7i, 72 > 7з) определяет гомоморфизм автомата CM, Y, 6, X) в автомат^', А', У',5',Х')*=> у2(Ь(а,х)) = б'(7а(*), 7i(*)), 7э(Х(*. *)) = Х'(7а(*), 7i(*))- С каждым ^-автоматом связывается семейство языков в алфавите X, представленное этим автоматом. Язык L(a0,Ai), представленный в Х-автомате А при начальном состоянии а0 множеством заключительных состояний A i, — это множество всех слов р£ X*, для которых существует я допустимый процесс р ® q такой, что а0 -*ах Е Ах или р = е ид0^^- Это определение годится как для детерминированных, так и для недетерминированных Х-ьвтоматов. В случае детерминированных автоматов процесс q определяется однозначно. Теорема 7.3 (основная теорема теории конечных автоматов). Класс языков, которые могут быть представлены в конечных Х-автоматах, совпадает с классом регулярных языков в алфавите X. 3. Ю.В. Капитонова 33
Всякий конечный Jf-автомат есть конечная автоматная система, и L (ао, Ал) \ {е} = y(L(X X {а0}9 X X Ах)), где у(х9а) = х. Поэтому L (а0, Ал) \{ е) конечно-автоматен и, следовательно, регулярен. Эта часть теоремы носит название теоремы анализа. Алгоритм анализа может быть получен применением метода анализа дискретных автоматных систем или прямым построением соответствующих уравнений и их решением. Обратное утверждение — это теорема абстрактного синтеза конечных автоматов. Его доказательство можно провести с использованием теоремы синтеза конечных автоматных систем. Пусть R — регулярный язык без е. Синтезируем конечную автоматную систему S, порождающую этот язык. Пусть R = y(L (Si9 S2)). Рассмотрим Х-автомат А = 2s, определив его функцию переходов равенством 5 (Г, х) ={ s | существует s' Gf Гтакое, что 7(*')'= х, s'-+s), ТС S. Положим Ах ={ ГС S\ ТПБ2Фф) . Тогда L(Slf Ах) =R. Действительно, рG у (L (Slf S2)) *=>&! -*• •-*$л, sx E5l5 sn^S29y(sx ...*„)=*! ...xn = p<=*«xl9 Tx)^(x29 T2) -*...-* (х„, Г„), sxeTx=Sx, s2eT2,...isneTn*Tnns2*<i>*>TneAl)*=>peL(Sx9Ax). Если e G R, то сначала представим R \ {e} в ЛГ-автомате В, считая R \{e) =L(b0, &х)> затем построим автомат А, добавив к состояниям автомата В новое состояние а0 и положив 8(а0,х) = S(b0f x). Получим R=L(a0, Ах),где Ах =ВХ U{a0). Рассматривают также представление языков в X— У-автоматах, Для этого с каждым автоматом (X, Ау У, 5, X) связывают язык L (а, у), полагая, что р S L(a, у) *=* существует допустимый процесс р ® q ® r такой, что я 9 • г 9 а -> а , у ->у . О языке L (а9 у) говорят, что он представлен в автомате А при начальном состоянии а выходным сигналом у. Для языков, представимых в ДГ— У-автоматах, также может быть доказан аналог основной теоремы: язык R представим в Х- Y-автомате <=>Л регулярен. Пусть А есть X— У-автомат, а X — его функция выходов. Если Х(а, х) = = yt (a ) не зависит от входного сигнала х, то А называется автоматом с задержкой, в общем случае - автоматом Мили. Автомат Мура - это автомат Мили, для которого Х(д, х) = ii (5 (а, х)), т.е. выход зависит от состояния в следующий момент времени. X— У-автоматы как открытые системы можно использовать для построения сетей из автоматов. При этом как входной, так и выходной алфавиты могут быть многокомпонентными, т.е. представленными в виде декартовых произведений. Поэтому для построения сетей автомат реструктурируется путем перенесения входных и выходных компонент на верхний уровень. Сеть из автоматов называется открытой, если она имеет по крайней мере один класс отождествленных компонент, состоящий из одних входных компонент. В противном случае сеть называется замкнутой. Теорема 7.4. Открытая сеть из автоматов структурно изоморфна недетерминированному Х- Y-ae томату. 34
Пусть S есть сеть, построенная из автоматов Аг,..., Ащ. Реструктурируем эту сеть путем перехода от структуры ((i*lf aK, Ui), ..., (ит, ат,ит)) к структуре ((*!, ..., хк)у (ai9 ..., ат)У (vl9 ..., um)), где xl9 ..., х* - входные компоненты, взятые по одной из всех.классов отождествленных компонент, не содержащих выходных. Выбрав соответствующим образом входной алфавит X и взяв в качестве У произведение всех выходных алфавитов, получим X— У-автомат. Недетерминированность построенного автомата является следствием возможности обратных связей, как показано на примере, рассмотренном в предыдущем параграфе. Если все автоматы, из которых построена сеть, являются автоматами с задержкой, то сеть является детерминированным автоматом. Это условие можно ослабить, получив следующий результат. Теорема 7.5. Открытая сеть из автоматов Мили структурно изоморфна автомату Мили, если каждый цикл в этой сети проходит по крайней мере через один автомат с задержкой. Действительно, переход сети из состояния (..., (uif ai9 и,-), ...) в следующее состояние (..., (м{, a\yv\)y ...) определяется системой уравнений, состоящей из уравнений а\ = 5/ (ait щ), vf = ХДд,.,*/,.), и уравнений у,- = Л/О,), для автоматов с задержкой и уравнений связей вида х; = х/ и х,- = vy-, где X/ — входные, )'j — выходные компоненты. Уравнения связей исключаются путем подстановок представителей классов отождествленных компонент в уравнения для состояний и выходов. При этом, если класс содержит выходную компоненту, то именно она и выбирается в качестве представителя для этого класса. Уравнения для выходов разбиваются на уравнения для компонент этих выходов. Например, если vt = (yf i,..., у^), то уравнение v\ =Х|(5/(д/, и,), и)) заменяется системой Уц = *|/(8/(«/. Щ\ *>/). / = U •••> *• После этого производятся подстановки выходов в правые части уравнений состояний. Эти подстановки должны привести к полному исключению выходов, ибо в противном случае обнаруживается цикл, не содержащий автомата с задержкой. После исключения выходов для произвольного набора значений свободных входных компонент состояния а] определяются однозначно, а их значения однозначно определяют значения выходных компонент. В дальнейшем сети из автоматов будут рассматриваться с точностью до структурного изоморфизма. 3* 35
Любая современная система преобразования информации на определенном уровне подробности описания может быть представлена как сеть из автоматов. При этом можно в качестве компонент рассматривать только автоматы Мили или Мура, которые могут служить гомоморфной реализацией произвольных квазидетерминированных автоматных открытых систем. Поэтому проектирование технического оборудования систем преобразования информации в качестве одного из основных этапов содержит этап построения сети из автоматов, реализующей некоторую заданную дискретную систему. Поскольку любая дискретная система может быть реализована автоматом, задача сводится к построению сети из элементарных автоматов, реализующей заданный автомат. Элементарный автомат определяется технологией изготовления аппаратуры и элементной базой, применяемой в различных отраслях промышленности, производящей технические средства преобразования информации. На первых порах все сводилось к синтезу автоматов на элементах И, ИЛИ, НЕ и триггерах или задержках. Затем с появлением интегральных схем стали использоваться многовходовые логические элементы, элементы арифметико-логических устройств, различного типа запоминающих регистров и т.п. В настоящее время технология сверхбольших интегральных схем предполагает использование достаточно крупных блоков вплоть до отдельных процессоров. В этой области еще много проблем и нерешенных вопросов, связанных с математическими моделями, однако ясно, что многое в конечном счете может быть сведено к задаче построения сети из элементарных автоматов, реализующей заданный автомат. Эта задача называется задачей структурного синтеза, и мы рассмотрим ее для некоторого класса наборов элементарных автоматов, которые будем называть каноническими базисами. Канонический базис характеризуется некоторым фиксированным конечным структурным алфавитом Z. Входные и выходные сигналы всех элементарных автоматов являются декартовыми степенями этого алфавита. Чаще всего' в качестве структурного алфавита выбирается двоичный алфавит Z = { 0, 1} . Элементы канонического базиса делятся на два класса — функциональные элементы и элементы памяти. Функциональные элементы характеризуются тем, что их функция выходов зависит только от значения входного сигнала в текущий момент времени. Поскольку состояние внутренней компоненты функционального элемента не влияет на окружающую среду, ею можно пренебречь и рассматривать функциональный элемент как двухкомпонентную открытую систему. Сеть из функциональных элементов без циклов называется функциональной схемой или схемой без памяти. Выходы функциональной схемы так же, как и выходы функциональных элементов, зависят только от значений входных компонент в текущий момент времени и являются суп$рпози- циями функций, соответствующих элементам, из которых построена схема. Все эти функции имеют тип X: Zn ->Z. Будем предполагать, что функциональные элементы канонического базиса обладают свойством функциональной полноты. Это свойство означает, что любая функция X: Zn -+Z может быть представлена в виде суперпозиции функций, реализуемых функциональными элементами. Критерии функциональной полноты хорошо извест- 36
ны, и мы надеемся, что читатель знает знаменитую теорему Поста о полноте систем булевых функций, соответствующую случаю Z = { 0, 1} . Относительно элементов памяти будем предполагать, что они содержат по крайней мере один элемент Z), удовлетворяющий следующим условиям. D является £/—К-автоматом с задержкой. Число внутренних состояний автомата D не меньше двух. Функция выходов Цо(а ) определяет взаимно однозначное отображение множества D на V. Для каждой пары а, а9 в D существует входной сигнал и Е U такой, что bD(a9 и) =а'. Автомат, удовлетворяющий перечисленным условиям, называется автоматом с полной системой переходов и выходов. X'—Y'-автомат А' называется подавтоматом Х-У-автомата А, если Хр С Х9 Y' С Y9 А' С А, г функции переходов и выходов являются ограничениями функций переходов и выходов автомата на соответствующие подмножества. Теорема 7.6. Всякий конечный автомат изоморфен подавтомату сети, построенной из автоматов канонического базиса. Пусть А есть X— У-автомат. Рассмотрим взаимно однозначные отображения уг: X -+Zmf у2: А -►/У1, у3: Y -+Zk, которые можно построить, выбрав подходящие значения k, m и п. Построим двухуровневую сеть из автоматов канонического базиса. Структура этой сети изображена на рис. 1.8. Компоненты 5t и52 представляют собой сети из функциональных элементов без памяти. Сеть Si реализует функцию и = </?(z, и), сеть S3 - функцию z'='i//(z, и), где z = (zi9 ...,zm), и =(«!,..., ип), v = (vl9...9vk% z' =*(zi, ..., z£), zf, zjez, ut G U9 Vj £ V. Сеть S2 представляет собой прямое произведение п экземпляров автомата Z). Отбросив все зависимые компоненты, кроме выходов сети £3> получим, что сеть S структурно изоморфна Zm—Z ^-автомату с внутренней компонентой /У1. Функция переходов 6$ этого автомата определяется равенством Ь$(с19 z) = d , где d = (dl9 ..., dn), d'= (<*;, ..., d'n), difd'{<E D, d\= bD{di9ut), (ul9 ..., un) = <p(z,u), а функция выходов \$ равенством \s(d9z) = = ф (у, z), где и{ = XD (di9 щ). В силу функциональной полноты элементов без памяти функции \р и ф могут быть выбраны произвольным образом. В частности, так, чтобы ото- ражение у (х, а, у) = (7i (*), У г (а), 7з (у) ) было изоморфизмом автомата А и S. Для этого достаточно вы- выполнения равенств Уг(5А(а,х)) = Ss(y2(a), 7i(*))> Уз(*А(а,х)) = Х5(72(я), 7i(*)), которые после распространения функций 5D и fiD на векторы могут быть переписаны в виде 72($лО, *)) = ЫТгО), ¥>ОЫ<0, 7i(*)))> 73(M*,*)) = *GM<0,7i(*)). Для определения функций </? и ф на произвольном наборе (y,z) выберем пару (u,z) так, что v = iiD(d) для некото- к * J > s2 1 #7 s, i к г'7 г 37
poro d = 7200»а z =7i (x) для некоторого х. В силу взаимной однозначности ё,хи а определены однозначно. Поэтому однозначно определены левые части равенств. Второе равенство сразу дает значение &а значение \р (и, z) должно быть выбрано так, чтобы выполнялось первое равенство. В силу свойства функции 8о такое значение существует. Определив функции у и ф на других значениях (и, z) произвольным образом, получим, что у есть изоморфизм А в В. Образ автомата А при этом изоморфизме есть подавтомат автомата S. Теорема доказана. § 8. Дискретные преобразователи Использование понятия дискретной системы в качестве модели вычислительного устройства предполагает, что в множестве состояний выделены не только начальные, но и заключительные состояния. Переход системы в заключительное состояние означает окончание вычислений. Система S, для которой заданы множество S0 начальных состояний и множество Sx заключительных состояний, называется настроенной. Предполагается, что Sq содержится в множестве допустимых начальных состояний, но, вообще говоря, не совпадает с ним. Пара (S0f S{) называется настройкой системы 5. Процессом вычислений настроенной системы называется допустимый процесс р, который начинается в множестве 50 и для любого t (0 < t < < IРI ) Р(0 ^ Si. Процесс вычислений ненулевой длительности называется терминальным, если он оканчивается в множестве S\. Со всякой настроенной системой S связывается функция fs: S0 -+2Sl, которая определяется следующим образом. Состояние s' в fs(s) <==> существует терминальный процесс р такой, что s -> s'. Относительно функции fs будем говорить, что она вычисляется системой S. Если система S детерминирована, то функция fs определяет однозначное частичное отображение из 50 в 5Ь и ее можно отождествить с этим отображением. Функция fs может быть однозначной и тогда, когда система S не является детерминированной. В этом случае настроенную систему S будем называть глобально детерминированной. Если всякий процесс вычислений настроенной глобально детерминированной системы можно продолжить до терминального, то функция fg, которую эта система вычисляет, является однозначной всюду определенной функцией. Функция fs определяет также отношение между элементами множеств S0 и Si, которое будет обозначаться выражениемs -*s',s -+s' os Gfs(s). Суперпозиция /о g многозначных функций/: S0 -+2Sl и g: Si -*25j - f° 8 это суперпозиция соответствующих отношений: s—► s' *> для некоторого s" G Si имеет место s -*s" -*s\ Пусть S и Т - настроенные системы, (S0, Si) и (T0,Ti) - их настройки и S - реализация Т с помощью реализующего отображения 7: Р(£) -* ->Р(7}. Будем говорить, что реализация у согласуется с настройкой систем S и Г, если образ у(р) процесса р терминален тогда и только тог- 38
да, когда р терминален и существуют функции у: S0 -+T0 и ф: Si ->7*i такие, что для любого терминального процесса р системы S из s -* s следует ip(s) —► *//(s')- Функции у и ф называются кодирующими функциями реализации S. Теорема 8.1. Если S есть реализация системы Т, согласованная с настройкой, у - реализующее отображение, а криф - кодирующие функции, то fT С v?"1 о fs о ф. Если при этом реализация S полна, Tofj- *р~ р ф Действительно, (г, t ) G y~l о fs о ф о f—► s -*s' -*f , гдер терми- нален => v? (s) ► у/ (s ) => 7 ф) терминален и t —► t => t -* Г . Обратно, если реализация полна, то г -*г' => t ->t'yq терминален =>q = 7(р)> s -*V, 7 (р) <р ~' р Ф р терминален =*^(s) ► i//(s')=*f—► s -*Y ->f =>(/,r jG^'o/^of Если 5 - реализация системы Т, согласованная с настройкой, то будем говорить, что S частично вычисляет отображение fT. Если же эта реализация полна, то S вычисляет fT (при заданном реализующем отображении и кодирующих функциях). Такая терминология оправдана, ибо если система 5 задана конструктивно или физически в виде действующего вычислительного устройства, то ее можно использовать для вычисления отображения /у. Действительно, для того чтобы найти какое-нибудь значение t' Е fait), нужно взять некоторое s Е </Г* (г), т.е. закодировать исходные данные или представить их начальным состоянием s системы S и запустить соответствующее вычислительное устройство. Если это устройство остановится в заключительном состоянии s', то, применив к этому состоянию кодирующую функцию ф, получим одно из значений t' = ^(5) G Е fT (г). Если реализация полна, a fj>(t) =£ф, то, перебирая всевозможные начальные состояния s Е «/Г1 (г) и всевозможные процессы вычислений, можно найти все элементы множества fT (г). Если их бесконечно много, то перечислимость множества значений функции переходов системы S и множества «/Г1 (г) гарантирует перечислимость множества /У (О- В случае физического вычислителя полнота реализации, детерминированность системы S и взаимная однозначность отображения </? гарантируют возможность получения (однозначность) результата, если он существует. Связь между отображениями fs и fT в случае реализации, согласованной с настройкой, может быть представлена в виде диаграммы So £— S, Полнота реализации влечет коммутативность этой диаграммы, так как из теоремы 8.1 следует в этом случае, что/5 ° ф = </? ° /т- Теорема 8.2. Пусть S есть реализация настроенной системы.Т с реализующей функцией у. Тогда существует реализация S', согласован- 39
пая с настройкой и реализующей функцией у'= у" <у, где у" - гомоморфизм S' eS. Если реализация S полна, то S' также полна. Положим 5" = S X Т. Определим функцию переходов 5' следующим образом: 5' ({рг ® p2)(s, t)) = { (s\ t ) \s -+s', yipiss1) = qt' и qt* есть s процесс вычислений} . Положим £0 = { (s, t ) \y(s) = tq, t G T0) , S[ = = {(s, f) |r G 7\} и возьмем пару (So, S'i) в качестве настройки системы £'. В качестве кодирующих функций возьмем ограничения <£ и ф на множества 50 и S1 функции |(s, г) = Г. Наконец, положим у' (s, г) = s, 7' = = У о 7. Тот факт что 7" есть гомоморфизм, а у — реализующее отображение, вытекает из определения и монотонности у. Тот факт что реализация S1 согласована с настройкой, виден из следующей диаграммы (Р\ ® Pi - терминальный процесс системы S*) : А \г t—HbUr Теорема доказана. Теорему 8.2 можно представить в виде следующей коммутативной диаграммы: S^—S' Т В этой диаграмме у — произвольная реализующая функция, у' — гомоморфизм, а у — реализующая функция, согласованная с настройкой. С каждой функцией /: X -* 2Y можно связать настроенную систему Т = XU Y, взяв в качестве функции переходов f(t -► г' о t -* f'), а в качестве настройки пару (X, У). Если S есть реализация системы Г, согласованная с настройкой, то S (частично) вычисляет функцию /. Эта функция, однозначно определяемая системой Г, так же как и сама система Г, называется функциональной моделью настроенной системы S. Основная задача проектирования дискретных устройств преобразования информации состоит в построении системы 5, удовлетворяющей заданным условиям, по ее функциональной модели /. В некоторых случаях эта модель задается с помощью некоторой другой системы S', для которой / является также функциональной моделью. Тогда задача проектирования может быть сведена к построению реализации системы S', играющей роль промежуточной реализации. 40
Кодирующие функции для функциональных моделей могут быть самыми разнообразными, однако они должны быть достаточно простыми. Простейшим вариантом кодирующих функций, наиболее часто встречающимся на практике, является проектирование состояния многокомпонентной системы на одну из ее компонент. В этом случае мы имеем дело с дискретным преобразователем. Многокомпонентная настроенная система S называется дискретным преобразователем над В, если среди ее компонент выделена компонента Ву называемая информационной. Множество состояний информационной компоненты В называется также информационной средой или информационным множеством. Всякий дискретный преобразователь над 5 структурно изоморфен двухкомпонентной дискретной системе S С А X В. Компонента А называется управляющей. В дальнейшем дискретный преобразователь над В будем называть так же, как и его управляющую компоненту. Стандартная функциональная модель дискретного преобразователя А над В с настройкой (£0, Si) - это функция fA = В0 ->2*», определяемая кодирующими функциями \р и ф, которые проектируют состояние (а, Ь) дискретного преобразователя на компоненту В: </?(я, Ь) = Ъь (a, b) 6S0, ф(а, b) = Ь, Ь € Sl9 В0= { Ь\ существует a G А такое, что (д, Ь) G 50} , В1 = { Ь | существует a Е А такое, что (а, Ъ) €lSx} . Бели А - автоматный детерминированный дискретный преобразователь над В с настройкой (50, Sx) такой, что S0 = { а0) X В, St = { ах} X В, то fA = В -+В есть частичное преобразование множества В. Преобразование fA называют также оператором над В. Этот вариант является основным в теории дискретных преобразователей, и большинство моделей реальных вычислительных систем тем или иным способом сводятся к такому варианту. Дискретный преобразователь в этом случае можно представить в виде композиции двух автоматов. Автоматы, составляющие композицию, могут быть выбраны так, что входной алфавит каждого из них совпадает с выходным алфавитом другого, а множество внутренних состояний одного из них совпадает с множеством состояний информационной компоненты В. Заметим, что такое представление неоднозначно и зависит от выбора входных - выходных алфавитов. Теорема 8.3. Пусть настроенная система S имеет функциональную модель fCBt-+ 2Ba, определенную кодирующими функциями у ифире- ализующим отображением у. Тогда S является гомоморфной моделью дискретного преобразователя А над В = Вх U52, имеющего ту же самую функциональную модель с реализующим отображением у = у" ° у, где у" - гомоморфизм преобразователя А в S. Если S - полная реализация /, то А также определяет полную реализацию /. В качестве управляющей компоненты А возьмем множество состояний системы S. Распространим каким-либо образом функцию ф на все множество В. Функцию переходов 5 определим таким образом: S(j>i ®Рг) = = {(Л lKO)IPi -**'} .Настройка ($'0, S\), где S'0 = {(s,*(s)) \se S0) , S\ = { (i, Ф (?)) \s G Si} . Дальнейшее ясно. 41
§ 9. Алгебра отношений Функциональные модели настроенных дискретных систем и дискретных преобразований являются многозначными функциями или соответствующими им бинарными отношениями. Настроенная система, таким образом, может рассматриваться как один из способов задания бинарных отношений. В этом параграфе будет рассмотрен другой способ задания отношений. Он состоит в том, что отношения рассматриваются как элементы некоторой алгебры. Выражения в этой алгебре дают способ построения заданного отношения, исходя из некоторых исходных, уже заданных отношений с помощью операций алгебры отношений. Затем будет установлена связь алгебры отношений с дискретными преобразователями. Зафиксируем некоторое множество S и будем рассматривать всевозможные отношения / С S X S на этом множестве. Определим три основные операции на множестве 2s всех таких отношений. . g t 1. Умножение отношений /о f = g. Как известно, s -* s ^существует п -f a «f i s такое, что s -*s -*s . 2. Объединение отношений / U /' =g. Это обычное теоретико-множест- s , f , f i венное объединение: s ->s о s -*s или s -*s . oo 3. Итерация отношения /* = U /Л, где/0 = e, fn+l =f°fn,e- тож- я = 0 /* дественное отношение: s -* s' *> s = sf. Таким образом, s -*V <> s = s' или f f f существуют sx,..., sn такие, что s = Si -*s2 ~* • • "*Чя = 5 • Множество отношений, замкнутое относительно операций умножения, объединения и итерации, а также содержащее тождественное отношение € и пустое отношение ф, называется алгеброй отношений. Всякое множество отношений Y С 2s порождает некоторую алгебру отношений ЗС(У). Это наименьшее множество отношений, содержащее У, е и ф и замкнутое относительно операций алгебры отношений. Если ввести символы для обозначения элементов множества У, то из этих символов можно строить выражения с помощью операций алгебры отношений. Такие выражения будем называть регулярными. Каждое регулярное выражение представляет собой некоторое отношение. Это отношение будем называть регулярным относительно У. Очевидно, что алгебра K{Y) состоит из всех отношений, регулярных относительно Y. Поскольку одно и то же отношение, регулярное относительно У, может быть представлено различными регулярными выражениями, в алгебре K(Y) возникают соотношения, т.е. равенства регулярных выражений, которые превращаются в равенства отношений, если вместо символов У подставить их значения. Равенство регулярных выражений называется тождеством алгебры отношений, если оно истинно при любых подстановках отношений вместо символов У. Между алгебрами языков и алгебрами отношений существует очевидная связь. В частности, понятия регулярного выражения для этих двух алгебр совпадают. Для того чтобы изучить связь между алгеброй отношений и алгеброй языков более точно, будем различать регуляр- 42
ное выражение R, язык R в алфавите Y и отношение R, которое получается, если вместо символов алфавита Y подставить соответствующие этим символам отношения. Тео ре м а_9.1._Дяя любых двух регулярных выражений Р и Q из Р =Q следуетР = (?. р" — р" I Лемма 9.1. s-+s' о существует слово р€Р такое, что s -*s . Доказательсто проводится индукцией по числу операций в выражении Р. Если операций нет, то Р = у, у € Уи утверждение очевидно. Earn Р = РгР2, TOS-+S <* существует s такое, что s -> s -*s *>s-+s -*s ,гдерх £/i, ~ Pi Pa , Pi Pa , p2 €E r2_no предположению индукции *> s * s , о s ► 5 , и так как РхРг ^ Р\Рг = Л ^2, то для этого случая утверждение доказано. Случаи P=PXU Р2 иР = Р* рассматриваются аналогично. Лемма доказана. - - F , Предположим теперь, что Р -Q. Пустьs ~+s , тогда по лемме 9.1 сущест- — Р , — Q t вует р G Р такое, что s -> s', но р € Q, откуда следует s -> 5 . Обратное утверждение доказывается аналогично. Теорема доказана. Теорема 9.2. Если Р и Q - регулярные выражения над Y, то Р = Q есть тождество алгебры отношений о Р = Q. Пусть Р = Q — тождество. Тогда Р = Q при любой подстановке >> -*5> (у G У). Положим £ = F* и для каждого >> G F определим ~у так, что р -* У я -> q о q = pjv. Из этого определения следует р -> г о г - р#. Покажем, что — — — /^ 2 W — Р = Q. Действительно^ G P =>e -*р =>е -+p=>e-*p=>e-+p=>q =p=>pG Q. Обратное утверждение теоремы следует из теоремы 9.1. Теорема доказана. Поскольку всякое соотношение алгебры языков является тождеством, то из теоремы 9.2 следует, что алгебры языков и алгебры отношений обладают одной и той же совокупностью тождеств. Естественно ожидать, что для алгебры отношений можно построить теорию уравнений, аналогичную теории уравнений в алгебре языков. Это действительно так, но для обоснования удобно использовать общую теорему о неподвижной точке. Эта теорема будет неоднократно использоваться в дальнейшем, и мы приведем уже здесь необходимые определения и доказательства. Частично упорядоченное множество D называется индуктивным, если всякая возрастающая цепочка его элементов dx <d2 < ... <dn <... имеет наименьшую верхнюю грань, т.е. существует такой элемент с/, что dn <d (п = 1, 2,...), и если dn <d' (n = 1, 2,...), то d < d'. Указанный элемент оо обозначают d = U dn. Функция \р: D -+D называется монотонной, если из d < d' следует y(d) < ip(d'). Функция <р непрерывна, если для любой оо оо возрастающей цепочки элементов dt <d2 < ... </?( U dn) = U y(dn). Из непрерывности следует монотонность. Действительно , d < df о d* = = d U df => ¥?(</') = ¥?(</) U ¥?(#') =><p(d) <y(d'). Наименьший элемент 43
множества D, т.е. такой элемент 0, что для всех d G D ф < Z>, называется нулем множества D. Элемент d называется неподвижной точкой функции кр\ D-+D, если v?(d) =d. Определим Л>ю итерацию \р№ функции у?, полагая \р^ (5с) = х, Теорема 9.3 (теорема о неподвижной точке). Если D есть индуктивное частично-упорядоченное множество с нулем, а у?: D -+ D - непре- оо рывная функция, то U *р^(ф) есть наименьшая неподвижная точка * = о этой функции. Действительно, *( U /*>(«) = U *<*+1)(0) = U </*>(0) = U /*>(0), fc = 0 fc = 0 fc=l fc = 0 оо т.е. элемент d°° = U </?^(0) есть неподвижная точка функциикр. Пусть * = о теперь d — неподвижная точка. Из монотонности \р следует 0<c/=»¥>(0)<¥>(cO = rf, </>(0)<d=V(0)<</>(<O = d> vWtf)<d=*<pVc+1\$)<<p(d) = d, откуда по определению наименьшей верхней грани d°° <d, т.е. d°° есть наименьшая неподвижная точка. Если D — индуктивное частично-упорядоченное множество с нулем, то множество /Непорядком,определенным покомпонентно: (d\,..., dn) < < (tf'i,..., d'n) o dx <d\,... , dn <d'n, также является индуктивным и имеет нуль (0,..., 0). Пусть функции ipt: Dn -+D (i = 1, 2, ..., п) непрерывны по каждому из своих аргументов. Тогда функция <р: Dn -* Dn, определенная равенством <р(хх ,...,хл) = foi (*i,... ,хл),... ^„(х! , ...,*„)), также непрерывна. Для доказательства нужно воспользоваться равенством Л( и Л"°,..., и *<т)) = и ч>Мт\ ■ ■ ■ >4т)) т = 1 т = 1 т = 1 для возрастающих цепочек х/1* < хр* < ... (i = 1,..., п), которое справедливо, поскольку для каждого набора тх,..., тп имеет место tt(*fm|\...,*Jm|l))< Y>i(*i(w)>- •> х<т>Кгде m = maxCm,,..., m„). Определим fc-ю совместную итерацию функций <р/ по формулам *>/°> (*!... ,*„) = *,, (9.1) */*♦•>(*„ ... ,*„) = <ft(v>ifc)(*i, • • • >*«) *<fc)(*i, • • ..*«))• Пусть *><"> (*,,...,*„) = U </>/"*>(*,,...,*„). (9.2) m = 0 Применяя теорему 9.3 к множеству £>Л, получим следующее утверждение.
Теорема 9.4. Если D - индуктивное частично-упорядоченное множество с нулем, a Kpf. Dn -> D (i = 1,..., n) - функции, непрерывные no каждому из аргументов, то элемент d°° = (<рГ (0, • • •, Ф), • • • • ••, Фп (Ф> • • • > Ф)) есть наименьшая неподвижная точка функции <p(xl9...,xn) = toi(xi9... 9хп)9... ,<pn(xl9... ,хп)). Для доказательства достаточно заметить, что ^(m' (xl9..., хп) = Перейдем теперь к изучению уравнений в алгебре отношений. Нас будут интересовать канонические системы уравнений, т.е. системы вида Xi = <Pi(xi9... ,хл), /= 1,... ,л, (9.3) где \pj (xi,..., х„) — регулярные выражения относительно неизвестных отношений х 1,..., х„ и, возможно, некоторых заданных отношений. Множество 2s всех отношений на множестве S частично упорядочено отношением / < /', которое означает обычное теоретико-множественное включение, т.е. /</' <>х-+у=>х->у. Наименьшей верхней гранью возрастающей цепочки отношений является их теоретико-множественное объединение, а нулем — пустое отношение ф. Функции /°/', / U /' и/* непрерывны по каждому из аргументов. Например, непрерывность умножения по первому аргументу следует из правой дистрибутивности умножения относительно объединения: ( и /«)•/'- и (fmof). w = 1 m = 1 Действительно, если обозначить левую часть, равенства через g, правую , ~ r , g н г fm /: g' через # , a U fm через л, то имеем х ~+у <* х -* z -*>> <* jc -*z -*д> о л: -*>>. m = l Аналогично доказываются непрерывность умножения относительно второго аргумента (левая дистрибутивность) и непрерывность объединения. Непрерьюность итерации требует установления равенства ( U fm)" = U Гт т = 1 w = I для возрастающей цепочки отношений/! <Д < , g Обозначая левую часть через g, а правую — через#, получим х ~+у =>дг = fmx fm2 fmk fm fm fm -x\ -+ x2-+ ...-* xk=y=>x=xx-+x2 ■+...^хк=у9гйет = ты(т1,...,тк) , . ?т fm g' fm fm g (монотонность) =>x -+y =>x ->y =»jc -*j> =>x -*д> =»x -*y =>x ->y. Поскольку суперпозиция непрерывных функций непрерьюна, то к системе уравнений (9.3) можно применить теорему 9.4, откуда получаем следующую теорему. Теорема 9.5. Система уравнений (9.3) имеет наименьшее решение (¥>Г,..., </>~),которое определяется формулами (9.1) и (9.2). Особый интерес так же, как и для алгебры языков, представляют канонические системы линейных уравнений, т.е. линейных уравнений вида *; = я,1*1 U e,2*2 U ...UainxnUai0, /=1,...,л, 45
(праволинейные уравнения) или вида *i=*t*n U x2ai2 U ... U xnain U ai0, i = 1,.. ..,/t, (леволинейные уравнения), где aiXt ai2t - . . , Я/о — известные, хи х2, . . . . . . , хп - неизвестные отношения. Рассматривая одно уравнение с одним неизвестным х = ах и Ъ или х = дед U Ь, в качестве следствия из теоремы 9.5 получаем, что наименьшее решение первого из этих уравнений может быть определено как </?°° (0), где w-l <p(x) = axUb, (p(w)W = rtUflm-1^U...U!> = flmxU U а*Ь, к = 0 откуда jc = </Г(0) = U <*wb = ( U ат )Ъ = а*Ъ. (9.4) m = О w = О Аналогично для второго уравнения получаем х = Ьа\ (9.5) Формулы (9.4) и (9.5) позволяют получить в явном виде решение канонической системы линейных уравнений в алгебре отношений аналогично тому, как это получалось для уравнений в алгебре языков. Это решение, очевидно, будет представлено в виде регулярного выражения, построенного из коэффициентов уравнений. Окончательно получаем следующий результат. Теорема 9.6. Наименьшее решение канонической системы уравнений в алгебре отношений регулярно относительно коэффициентов. Поскольку всякое отношение на В определяет некоторое многозначное преобразование множества В, а операции над отношениями естественным образом переносятся на преобразования, то каждую алгебру отношений можно рассматривать также как алгебру многозначных преобразований или операторов, действующих на В. Строго говоря, это — различные алгебры, и следует говорить об их изоморфизме, в силу которого все доказанные выше теоремы имеют место также и для алгебры многозначных преобразований. Так же как и раньше, мы не будем проводить различия между отношениями и многозначными функциями (преобразованиями), употребляя терминологию, которая больше подходит по контексту. Применим полученные результаты к анализу дискретных преобразователей. Пусть А — дискретный преобразователь над В. Предположим, что А - автоматный, а настройка имеет вид (А0 XB,At XB). Настройку такого типа будем называть стандартной. Функция переходов преобразователя А {а, Ь) -* (а\ b') однозначно определяется функциями переходов компонент: a' G 6j (a, b). b9& Ь2 (а, Ь, а'). Для каждой пары {a, a1) Е А рассмотрим многозначную функцию уаа* С В2, полагая Ъ ► Ь' <=> bf Е £6(д, Ь9 а) <=> (а, Ь) -> (а, Ъ'). Функцию уаа' назовем элементарным 46
преобразованием дискретного преобразователя Л, выполняемым при переходе из состояния а в а. Теорема 9.7. Преобразование fA, вычисляемое конечным автоматным дискретным преобразователем А над В со стандартной настройкой, регулярно относительно множества всех его элементарных преобразований. Не ограничивая общности, можно считать, что все состояния множества А X В являются допустимыми начальными состояниями, поскольку такое расширение хотя и увеличивает множество допустимых процессов, но не меняет преобразования fA. Для каждого a G А определим преобразование fA С В2, полагая ft—► ft' *=> существует допустимый про- р цесс р такой, что (а, ft) -> (а, ft'), где a GAt. Преобразования fa удовлетворяют системе уравнений fa = U Уаа'/а'> <* G A\Al9 а' е А (9.6) fa = е, а е Л,. Действительно, ft—► ft' <=> (а, ft) -* {ах, Ъх), ах £ Alt p - терминальна' Уаа fa' Уаа'Га ный процесс вычислений <=>Ь—► Ьг или ft ► ft —► Ъ\ <=> b ► b\ (в первом случае а = al9 fa = e). Покажем теперь, что семейство (fa)aEiа образует наименьшее решение системы (9.6). Действительно, пусть (Л')аел ~~ какое-нибудь решение. Покажем, что fa С fj. Обозначим через г (а, ft, ft') наименьшую длительность процесса р такого, что (а, ft) *-* (я\ ft'), где а' € A i. Индукцией по п = г (а, ft, ft') доказываем, что fa fa . f ft -*ft =>b-+b . Если п = 0, то a Е А х, откуда fa = fa = 6, При г(д, ft, ft ) = fa t Уаа1 fat = п + 1, где /i > 0, имеем ft-*ft =>—► ft, —* -ft', и, следовательно, по У1 Рис. 1.9 На, /a, /<r предположению индукции ft ► ft,—► ft =>ft*—»ft. Осталось заметить, что fA = U /fl. a G А0 Рассмотрим пример. Пусть управляющая компонента дискретного преобразователя А имеет диаграмму переходов, изображенную на рис. 1.9. На стрелках показаны элементарные преобразования, соответствующие переходам,А0 ={а0), Ах = {tfi}- Тогда система уравнений для fao =/0 47
и fax = /1 имеет вид /о = У\!г U Л/о, h = Д'з/о U ^4. Решая эту систему относительно /0, получим /л =/о = ^lfJ's/o U;4) U^/o = (7ih ^h)/o U^J4 = = (У\Уъ ^УгУУхУА- Комментарии к главе 1 Для классических динамических систем множество допустимых процессов задается с помощью систем обыкновенных дифференциальных уравнений, а современные обобщения определяют их однопараметрическими группами диффеоморфизмов конечномерных дифференцируемых многообразий [3]. Понятие управляющей системы, предложенное С.В. Яблонским [79]г делает упор на структурном аспекте. Большое влияние на формирование основных понятий кибернетики и информатики оказала теория автоматов, начало которой было положено сборником [1], куда, в частности, вошли основополагающие работы С.К. Клини и Э.Ф. Мура. В этой книге мы следуем традициям алгебраического подхода в теории автоматов, развитого B.M. Глушко- вым [8], который также много сделал для превращения теории автоматов в прикладную инженерную науку [15]. В общей теории систем [43] используются непрерывные аналоги понятия автомата. Общее понятие дискретной автоматной системы в теории проектирования было предложено 3. Павлаком [91] и использовалось в многочисленных работах польских математиков под названием "машина Павлака". Сети Петри [58] стали в последние годы популярной моделью исследования параллельных процессов. Более глубокие знания по современной теории автоматов можно получить из монографий [29,59,78]. Понятие реализации в теоретико-категорных терминах исследовалось Гогеном [86]. Прикладные аспекты реализации дискретных систем рассматриваются в [48]. Понятие дискретного преобразователя как базовой модели ЭВМ содержится в работе В.М. Глушкова [16]. Математические вопросы теории дискретных преобразователей рассматриваются в [28,85]. Дискретные преобразователи используются в качестве основной модели в автоматизации проектирования ЭВМ [19]. Глава 2 АЛГОРИТМЫ § 1. Схемы программ Последовательная программа, выполняемая на вычислительной машине, может рассматриваться как управляющая компонента дискретного преобразователя, информационная среда которого представляет собой обрабатываемые данные, включая состояния регистров процессора и внешних устройств - внешней памяти, устройств ввода-вывода и т.п. Состояние программы в текущий момент времени определяется выполняемой командой. Специфика программы как управляющей компоненты дискретного преобразователя состоит в том, что выполняемые ею элементарные преобразования расщепляются на две компоненты — проверку условия и преобразование состояния информационной среды. В результате про- 48
верки условия происходит выбор оператора, действующего на состояние информационной компоненты, и определяется следующее состояние программы. Указанная специфика сохраняется также в процедурных языках программирования высокого уровня, которые можно рассматривать как языки описания моделей реальных программ. Понятие схемы программы, изучаемое в этом параграфе, представляет собой наиболее распространенную математическую модель программы, которая получается, если отвлечься от конкретной природы информационной среды, над которой она работает. Большая общность понятия схемы программы позволяет использовать его для изучения и представления алгоритмов, реализуемых не только программными, но и микропрограммными, а также аппаратными средствами вычислительных систем. С помощью схем программ можно выражать алгоритмы, реализуемые и другими кибернетическими системами, отличными от ЭВМ, например, биологическими, экономическими и т.п. Пусть U и Y - множества. Первое будем называть множеством базовых условий, второе - множеством базовых операторов. Рассмотрим множество U пропозициональных булевых функций от базовых условий, т.е. будем рассматривать элементы множества U как переменные, принимающие значения 0, 1, и строить из них функции, также принимающие значения 0, 1. Функции такого рода будем называть элементарными условиями. Схемой программы над базисом (£/, Y) или U - Y-схемой программы называется множество Л состояний схемы вместе с множеством ТСА XUX X Y* X А переходов и двумя выделенными состояниями: начальным д<°) и заключительным а ^. Таким образом, формально U — У-схема программы - это шестерка (A, U, Y, Т, а^°\ я(1*). Слова в алфавите F, т.е. последовательности базовых операторов, будем называть элементарными операторами. Каждый переход из множества 7" представляет собой четверку (а, и, q, а'), где и - элементарное условие, q - элементарный оператор. Эту четверку так же, как и высказывание о ее принадлежности Чя , множеству Т, будем записывать в виде а —* а . Если и = 1, то вместо и/я я а —► а будем писать а -* а , если же q = е (пустое слово), то вместо и1я , и I f а—*а будем писать а -> а . Наконец, а -* а обозначает переход, в кото- u/q 9 ром и = 1, q = е. Высказывание а —► а читается следующим образом: при истинном значении условия и схема А может перейти из состояния а в состояние а', выполнив при этом оператор q. Употребление глагола "может" подчеркивает, что допускается рассмотрение программ с недетерминированным поведением. „ "i/flfi "г/Яг л Переходы ах ► а2 иа2 ► аъ называются сопряженными. Последовательность переходов, в которой любые два соседних перехода сопряжены, записывается в виде "i/<7i и*/Яг ит-\1Ят-х ах ► а2 ► . . . * ат 11Л) и называется путем в схеме А. Этот путь начинается в состоянии ах и окан- 4. Ю.В. Капитонова &
чивается в состоянии ат. Путь (1.1) допустим, если а2, . . . , ат _х Ф Фа*1*, ии . . . ,ит_гФ09к из того, что qk = qk+1 = . ..=?/ =е (1<А:< </ <т — 1), следует ик л . . . л щ Ф 0. Допустимый путь (1.1) называется инициальным, если ах = я*0*, и терминальным, если, кроме того, дш = Допустимые пути описывают возможные способы функционирования схемы Л. Их удобно также представлять как процессы функционирова- Л Л ния дискретной динамической системы А = А X U X У*, ассоциированной со схемой А. Процесс (ах, их, qx) ... (am, um, qm) называется допустимым, если ах U > . . "m-i/gm-^ ^ есть допустимый путь схемы Л и либо этот путь имеет допустимое продолжение ат *я™ + 1» либо aw = a*l\ ит = \,qm = е. Система Л рассматривается как настроенная с настройкой (А0, Ах), где Л0 = {(а*°\ и, q)\a*°^ ——>я', я' Е Л), ^ = = {(я*1*, 1, е)}. Таким образом, между допустимыми инициальными путями схемы А и процессами вычислений системы А существует взаимно однозначное соответствие. и/я , Переход а—► а назовем существенным, если и Ф 0. Если все переходы схемы А существенны, то множество допустимых процессов системы А однозначно определяет множество Т переходов схемы А, и А можно рассматривать вместо схемы А. Само множество А также можно рассматривать как дискретную систему, допустимыми процессами которой являют- А ся проекции допустимых процессов системы Л на компоненту А (ах .. .ат допустим, если существует допустимый процесс (ах, их, qx) . . . (ат, ит, qm)),a настройка есть пара ({я*0*} , {д(1)}). Система А является моделью схемы программы А, которую будем называть упрощенной моделью схемы Л. Граф, представляющий упрощенную модель схемы, называется также управляющим графом этой схемы. Отображение у: А -> A1 U - У-схемы программы Л в U- У-схему программы А9 называется гомоморфизмом (U — У-схем программ), если образ начального (заключительного) состояния схемы Л является на- / ч л' u,q ' л чальным (заключительным) состоянием схемы Л и из а—>а в схеме Л и/я t , следует у (а)—>у(а ) в схеме Л . Взаимно однозначный гомоморфизм называется изоморфизмом, и две схемы изоморфны, если существует изоморфизм одной из них на другую. Для того чтобы схему программы превратить в модель конкретной программы, необходимо интерпретировать базовые условия и операторы на некотором множестве В> представляющем информационную среду рассматриваемой программы. Такая интерпретация задается путем сопоставления каждому базовому условию а предиката, заданного на множестве В, т.е. отображения fa: В -*{0, 1}, и каждому базовому оператору у преобразования множества В, т.е. отображения fy\ В -* В. Интерпретация базовых условий и операторов естественным образом переносится на 50
элементарные условия и операторы. Если и = <p(<*i, . . . , ап) — элементарное условие, зависящее от базовых условий al9 . . . , аП9 то ему соответствует предикат/м, определенный равенством fu(b) = ip(f0lx(b),...,fa (&)). Если q = yx . . . ym — элементарный оператор, представленный в виде произведения базовых операторов, то ему соответствует преобразование fq = fyx ° • • • ° fym* равное последовательной композиции преобразований, соответствующих базовым операторам. Пустое слово е (пустой оператор) всегда интерпретируется как тождественное преобразование: fe =e, е(Ь) = Ъ. Схема программы называется интерпретированной, если задана интерпретация ее базиса. Если схема интерпретирована, то базовые условия и операторы будем» отождествлять с их интерпретацией и писать и(Ь) вместо fu(b) и by вместо fy(b), рассматривая^ как оператор, действующий справа. Для элементарных операторов имеем b(qxq2) = (bqx)q2 -bqxq2. Каждой схеме программы А, интерпретированной на множестве В, л естественным образом сопоставляется дискретный преобразователь А над В, Состояние ((я, и, q), b) преобразователя А будем считать допусти- u/q t ( л мым, если и(Ь) = 1 ид —>а для некоторого a G А или а = а*1', и = 1, q = е. Отношение переходов определяется следующим образом: ((а, и, q\ b) -*• -> ((а*, и\ q')9 b') *=>b* = bqf a—>a. Настройка (S0,SX) определяется условиями ((а, и, q), b) G S0 <=>a=a(0\Sx = {((<x(1), l,e),b)}. Проек- Л А ция 7: S -*• А множества S С А Х В допустимых состояний дискретного преобразователя А на управляющую компоненту А, т.е. отображение, определенное равенством у ((а, и, q), b) = (а, и, q), является гомоморфизмом. Действительно, если {(aXt их, qx), bx) . . . ((am, umf qm), bm) "i/?i fiw_,/(7m-i есть допустимый процесс, то существует путь ах ► . . . ► ат, причем щ (pi) = 1. Поэтому, если qk = . . . = qi = е, то Ьк = ... = bt, откуда следует, что ик л ... л щ Ф 0. Все эти условия равны 1 на наборе значений базовых условий ах, . . . , ап, равном (c*i (bk), . . . ,<*„(£*)). Следовательно, рассмотренный путь допустим, и процесс (ах, их, qx) ... (ат, um,qm) является допустимым процессом системы А. Таким образом, интерпретированная схема есть гомоморфная реализация системы А. Следует обратить внимание на то, что эта реализация, вообще говоря, не является полной, поскольку могут существовать допустимые процессы системы Л, не имеющие реализации. Схема программы А, интерпретированная на множестве В, вычисляет многозначную функцию fA: В -* 2В, которая определяется как стандартная функциональная модель /j дискретного преобразователя А над В. Эта функция будет также обозначаться через f&f в » если необходимо подчеркнуть, что схема А интерпретирована на В, и называться оператором или преобразованием, вычисляемым схемой А, интерпретированной на В. Рассмотрим произвольное состояние a U — У-схемы программы А, и ":/<7i "к/Як пусть а- *ах а >ак - все переходы, которые ведут из состояния а. Схема программы называется детерминированной, если для любого состояния а имеет место щ л щ = 0 при / Ф]. Схема называется полно- 4* 51
стью определенной, если и{ v . . . v и^ = 1 для любого состояния, кроме, быть может; заключительного. Схема называется базовой, если для любого перехода а—► а этой схемы q = e или q есть базовый оператор. Если схема А детерминирована, то любая ее интерпретация также детерминирована и вычисляет однозначную частичную функцию /а С В -+В. В этом случае структура дискретного преобразователя, представляющего интерпретированную схему А, может быть сделана более простой, поскольку в качестве управляющей компоненты можно вместо множества А взять само А, Действительно, состояние ((а, и, у), Ь) однозначно восстанавливается по паре (а, Ь). Компоненты и и у получаются из единственного перехода а —► а такого, что и(Ь) = 1. Если такого перехода нет, то 6 (а, Ь) = ф. Таким образом, дискретный преобразователь S С А ХВ структурно изоморфен преобразователю А X В. Упрощенный дискретный преобразователь А X В имеет ту же самую функциональную модель Д, что и преобразователь S С А X В, но в случае недетерминированной схемы его использовать нельзя, поскольку теряется часть информации о функционировании схемы А: не известно, какой из переходов срабатывает на каж- Л дом шаге. Поэтому А X В может не быть реализацией системы А. В то же время А ХВ, конечно же, является реализацией упрощенной модели схемы программы А. Если схема программы А полностью определена, то всякий финальный процесс ее интерпретации либо терминален, либо бесконечен. Всякая схема может быть сведена к базовой, если переход вида u/yt...ym , »/Уг У г а ► а заменить последовательностью переходов а—► Ъх—* . . . Ут — 1 Ут t . . . ► bm _i —> а , добавив новые состояния Ъх,..., bm. Новая схема при любой интерпретации будет выполнять тот же самый оператор, что и старая. Кроме того, она является достаточно простой реализацией старой схемы. Схемы программ удобно представлять графами с нагруженными дуга- и/я , ми. Вершинами таких графов служат состояния схемы. Если а —► а , то вершины а и а' соединяются дугой, и эта дуга нагружается парой u/q. На рис. 2.1 представлен пример схемы программы в графовом виде. Двойной стрелкой выделено начальное состояние. Заключительное состояние отмечено знаком *. Остальные состояния отмечены своими обозначениями. Здесь а*и Р - базовые условия, у и z — базовые операторы. Если в паре u/q условие и j= 1, то вместо пары l/q пишется сам оператор q. Если же q = e, то вместо пары и/е пишется только одно условие и. В теории программирования, а также при документировании реальных программ обычно используется специальный случай схем программ - бинарные схемы. Схема программы называется бинарной, если для любого ее состояния а, кроме заключительного, имеет место одно из двух: 1) из состояния а возможен лишь один переход, который имеет вид у а -*а', где у — базовый оператор; 52
Рис. 2.1 Рис. 2.2 2) из состояния а ведут ровно два перехода, которые имеют вид а -> а ИА->а, где 2/ - элементарное условие. Из заключительного состояния переходы невозможны. Состояния, удовлетворяющие условию 1), называются преобразователями, а состояния типа 2) - распознавателями. Для бинарных схем программ используется более простое графовое представление. Это представление отличается от описанного выше тем, что разметки дуг переносятся на вершины. Вершины преобразователи отмечаются символами базовых операторов, а вершины распознаватели - символами (или выражениями) соответствующих условий. Для того чтобы различать дуги, выходящие из вершины распознавателя (одна из них соответствует условию, другая - jero отрицанию), их размечают знаками +, — или 1, 0 соответственно. Для наглядности вершины распознаватели и вершины преобразователи в графовом представлении рисуют в виде различных геометрических фигур*). На рис. 2.2 изображен пример бинарной схемы программы. Легко увидеть связь между схемами рис. 2.1 и 2.2. Эти две схемы эквивалентны в том смысле, что при любой интерпретации базовых операторов и условий эти схемы выполняют один и тот же оператор (обе схемы детерминированы). Бинарная схема программы всегда детерминирована и полностью определена. Читателю предлагается доказать, что для любой детерминированной схемы программы можно построить эквивалентную ей бинарную схему. Рассмотренные здесь конструкции допускают естественные обобщения. Например, можно рассматривать схемы программ с многими начальными и многими заключительными состояниями. С помощью схем с несколькими заключительными состояниями удобно представлять распознающие алгоритмы, т.е. такие алгоритмы, результат выполнения которых определяется не только состоянием информационной среды в момент оконча- *' Существуют даже стандарты на графическое представление схемы программ (блок-схем) в технической документации. 53
ния вычислений, но и тем, в каком из заключительных состояний этот процесс закончится. Полезно также рассматривать частичные интерпретации, в которых базовые условия интерпретируются как частично определенные предикаты, а базовые функции - как частичные преобразования информационной среды. Можно рассматривать и недетерминированные интерпретации. В этом случае базовые операторы могут интерпретироваться как многозначные преобразования информационной среды . В случае частичных интерпретаций возникает вопрос о том, как доопределить булевы операции, относительно которых замкнуто множество элементарных условий, на частично определенные аргументы. Возникающие при этом трехзначные логики будут рассмотрены в связи с алгеброй алгоритмов в § 4 этой главы. Заметим, что при переходе к частичным интерпретациям, вообще говоря, теряется возможность перехода от произвольных к бинарным схемам программ даже для детерминированного случая. Множество базовых условий и операторов могут быть наделены определенной структурой. Эта структура может накладывать ограничения на интерпретации, которые разрешается использовать для заданного базиса. Например, в языках программирования в качестве базовых операторов используются присваивания, вызовы подпрограмм, операторы ввода-вывода и т.п., которые имеют сложную структуру, в частности используют выражения,составленные из переменных, констант и операций, определенных на множестве значений переменных. Если внутренняя структура базовых условий и операторов нас не интересует, то мы говорим об абстрактном базисе и абстрактных схемах программ. Если же базис связывается с определенным классом интерпретаций, то добавляются соответствующие слова, характеризующие этот класс интерпретаций. Так, например, возникают базисы и схемы программ над памятью, рассматриваемые в следующем параграфе. Как уже было сказано, всякая U— У-схема программы Л, интерпретированная на множестве В, определяет некоторое (многозначное) преобразование fA: В -* 2В этого множества. Возникает вопрос о том, как связано это преобразование с базовыми условиями и операторами. Ответ на этот вопрос может быть получен с помощью аппарата алгебры отношений, рассмотренного в предьздущей главе. Результатом будет теорема анализа схем программ, аналогичная теореме 9.7 гл. 1. При этом удобно перейти от алгебры отношений к изоморфной ей алгебре многозначных преобразований, рассматривая операции умножения, объединения и итерации как операции над преобразованиями. Все множества, участвующие в определении схемы программы, т.е. множества U, У,АиТ, предполагаются конечными. Если v - условие (предикат), определенное на множестве В, аР:5-> -* 2В — произвольное преобразование множества В, то через v/P будем обозначать ограничение Р на множество таких Ъ Е В, что v{b) = 1, т.е. V/P Ъ—► Ъ1 *^и(й) =1, Ь1 G Р(Ь). Преобразование v/P называется фильтром Р с помощью условия у. Каждое условие и можно представить с помощью фильтра и/е тождественного преобразования е по этому условию. Если U— множество условий, то U/e ={ u/e\u Е U). 54
Теорема 1.1 (первая теорема анализа схем программ). Преобразование fA, выполняемое U - Y-схемой программы А, интерпретированной на множестве В, регулярно относительно множества U/e U Y. При этом регулярное выражение, представляющее fA через преобразования множества U/e U Y, не зависит от интерпретации. Пусть я*0* - начальное, я*1* - заключительное состояние схемы А. Рассматривая схему А как управляющую компоненту дискретного преобразователя А X В и используя построения теоремы 9.7 гл. 1, получим, что fA = /fl(o), где / (о) есть соответствующая компонента наименьшего решения ( fA )a e A системы уравнений fa = U /дд'о fa.9 aGA, а Ф *(1>, Осталось найти элементарные преобразования faa>. Для этого рассмотрим Mi/*i ит1Ят , , все переходы а ^ а' » • • • * а * а из а в а • Нетрудно заметить, что faa = "i/?i U ... U Hm/<|m. Aia' , , "//<*/ , Действительно, 6—> Ъ <==> uf(b) = \, bqf - Ъ <=> Ъ ► Ъ для некоторого i = 1 т. Поскольку Wi/yi . . . Ук = ("А) ° JHi ° . • .°Л, получаем, что все коэффициенты системы уравнений для fa регулярны относительно U/e U Y. Поэтому и наименьшее решение будет регулярным относительно U/e U Y. Теорема доказана. Заметим, что теорема 1.1 имеет место как для детерминированных, так и для недетерминированных интерпретаций с частично определенными условиями. В детерминированном случае она может быть усилена путем замены множества U/e множеством U/e U U/e, где U ={ и \ и G U). Действительно, если базовые условия определены, то в выражениях для /fla' можно перейти от элементарных условий к базовым с помощью следующих очевидных соотношений: (и v v)le = u/e U vie, (и v у)/е = (м/е)-(иЛ0 = ("АО * ("АО- Интерпретированные схемы программ представляют собой один из наиболее удобных и употребительных способов представления алгоритмов. Разумеется, схемы программ, используемые для этой цели, должны обладать определенными свойствами конструктивности. Например, функции fa и fy для базовых операторов и условий должны быть вычислимыми. Более того, если множества U и Y бесконечны, то вычислимыми должны быть также функции F(a, b) = /а(Ь) и G(y, b) = fy (b), где a G U, у € Y. Множество переходов, ведущих из данного состояния, должно быть перечислимым и т.д. Обычно требования конструктивности к самой схеме ограничиваются условием конечности. Если же говорят о бесконечных схемах, то рассматривают различного рода частные случаи. Рассматривая частичные интерпретации, можно замкнуть множество базовых операторов относительно операции взятия фильтра по элементарно- 55
му условию. При этом можно перейти к схемам, у которых каждый пере- У ' Ы,У ' ее ход имеет вид а -> а , поскольку переход а —► а можно будет тогда за- менить на а ► а . Этот частный случаи схем возникает при простейшем способе перехода от произвольного дискретного преобразователя S С А X В к схеме программы. Действительно, S можно рассматривать как интерпретированную схему программы, если для любой пары состояний а и а управляющей компоненты определить один-единственный пере- ход а ► а . Для того чтобы получить другие нетривиальные представления S в виде схемы программы, следует выбрать базис (17, Y) так, чтобы каждое элементарное преобразование faa' можно было представить в виде дизъюнкции фильтров. Задача эта имеет чрезвычайно важное практическое значение и решается обычно для целого класса алгоритмов (дискретных преобразователей). Выбор базиса для класса алгоритмов, или алгоритмического базиса, во многом определяет технологию программирования и проектирования дискретных систем и характер используемых алгоритмических языков. Однако общих методов и теории, которая имела бы практическое значение, для задачи выбора алгоритмического базиса в настоящее время не существует. Некоторые практические рекомендации будут обсуждены в ч. II книги. § 2. Алгоритмические языки Схемы программ можно представлять в текстовом виде как программы с переходами. Пусть каждое состояние схемы А обозначено некоторым символом — меткой, а для базовых условий и операторов определен соответствующий язык для их записи. Предположим, что схема А бинарная. Тогда каздому состоянию а поставим в соответствие некоторое предложение. Если а есть преобразователь,отмеченный базовым оператором^, а дуга, выходящая из я, ведет в а\ то поставим ему в соответствие предложение а: (у; на а). Если же а — распознаватель, отмеченный условием, дуга, отмеченная знаком +, ведет в а\ и дуга, отмеченная знаком — , ведет в а", то поставим в соответствие состоянию а предложение (а: если и то на а' иначе на а"). Заключительному состоянию д*1* поставим в соответствие предложение а^ : СТОП. Выпишем все предложения в произвольном порядке, но так, чтобы предложение, соответствующее начальному состоянию, было первым, а предложение, соответствующее заключительному, — последним. Полученный программный текст определяет схему программы однозначно с точностью до изоморфизма и сам строится по схеме программы однозначно с точностью до перестановки операторов, обозначения состояний и выражений для элементарных условий. Использованный для представления схем программ язык программирования является очень ограниченным фрагментом реальных алгоритмических языков, используемых на практике. Кроме того, средств этого языка не достаточно для того, чтобы представлять произвольные схемы программ. Сейчас мы рассмотрим более богатый алгоритмический язык АО, достаточный для представления произвольных схем и содержащий 56
наиболее употребительные конструкции реальных языков программирования. Этот язык в дальнейшем будет расширен и использован для представления примеров программ и алгоритмов проектирования. Рассматриваемый язык является абстрактным в том смысле, что некоторые его конструкции не раскрываются до конца. Добавляя определение соответствующих понятий, можно получать различные конкретные языки, явным образом использующие интерпретацию алгоритмического базиса. Определим синтаксис языка АО, пользуясь общеупотребительными синтаксическими определениями. < АО—программа >: := < непустой оператор >. < оператор >: := < базовый оператор > | < пустой оператор > I < переход > | < фильтр > | < выбор > | < условный оператор > | < составной оператор > < пустой оператор >: := < переход >: := на < метка > < фильтр): := < условие > < вертикальная черта > < оператор > < условие >: := ( конъюнкция > | < конъюнкция > v < условие > < конъюнкция > : := < литера > | < литера > л < конъюнкция > < литера > ::= < базовое условие > | П< литера > | (< условие >) < выбор >: := < оператор отличный от выбора > v < оператор > (условный оператор >: := если < условие > то < последовательность операторов ) иначе < последовательность операторов ) конец если < последовательность операторов > ::= < оператор > | < оператор >; <последовательность операторов > К метка >: (последовательность операторов > < составной оператор): := начало < последовательность операторов ) конец | начало метки < последовательность меток); < последовательность операторов ) конец (последовательность меток >: := < метка > | < метка >, < последовательность меток > Понятия < базовое условие >, < базовый оператор > и < метка > заранее не определяются и уточняются по мере необходимости. Определения понятий (непустой оператор > и < оператор, отличный от выбора > очевидны. Описанный здесь строгий синтаксис расширяется следующим образом. Перед любым понятием и после него разрешается вставлять любое число пробелов. Перед то и иначе можно вставлять запятую. Вместо точки с запятой можно употреблять точку с пробелом. Вместо операторных скобок начало, конец можно употреблять круглые открывающую и закрывающую скобки. Вместо конец если можно употреблять ке. Кроме дизъюнкции, конъюнкции и отрицания для образования условий могут использоваться также и другие пропозициональные связки с необходимыми соглашениями относительно старшинства операций. Соответствующие синтаксические правила включаются в определение понятия < условие) и в конечном счете выражаются через понятие. < базовое условие). При уточнении неопределяемых понятий требуется выдержать единственное ограничение: синтаксис всех понятий должен оставаться однозначным, т.е. каждый текст, построенный с помощью некоторого правила, должен единственным образом разлагаться на составляющие в соответствии с единственно определяемой альтернативой правой части этого правила. 57
Следующая задача состоит в том, чтобы строго определить семантику языка АО. Это будет сделано путем построения отображения, которое каждой программе ставит в соответствие некоторую схему программы над заданным базисом. Для того чтобы определить указанное отображение, на множестве схем программ будут определены некоторые операции, которые превратят это множество в алгебру. При этом мы видоизменим понятие "схема программы'9, перейдя к схемам с размеченными состояниями. Предположим, что понятие < метка > уже определено. Схемой с размеченными состояниями называется схема программы вместе с функцией </?: L -* Л, которая называется разметкой. Разметка определена на конечном множестве L меток и каждой метке / из этого множества ставит в соответствие состояние ¥?(/), отмеченное этой меткой. Если множество L пусто, то размеченная схема называется чистой. Изоморфизм двух размеченных схем должен сохранять их разметки, т.е. отображение 7: А~*А' размеченной схемы А с разметкой </? в размеченную схему А' с разметкой </?' есть изоморфизм, если у есть изоморфизм чистых схем и </?(/)= а =* </>'(/) = У (а). Схемы программ, как чистые, так и размеченные, всегда будут рассматриваться с точностью до изоморфизма. Заметим, что разметка не обязана быть взаимно однозначной, поэтому некоторые состояния могут быть отмечены несколькими метками, а некоторые — вовсе неотмеченными. Прежде чем определять основные операции над схемами программ, введем некоторые вспомогательные операции. Первая операция — отождествление состояний. Пусть р есть отношение эквивалентности на множестве состояний схемы А. Рассмотрим фактор-схему А /р. Состояниями этой схемы являются классы отождествленных состояний. Если 12 и 12' — два класса, то 12 -* 12' <=> существуют а € 12 и а' € 12г такие, что а —>а. Разметка v?: L -* А преобразуется в новую разметку <//: L-+A/p так, что </?'(/) = = p(v?(0). Начальное состояние схемы А/р есть класс, которому принадлежит, начальное состояние схемы А; заключительное состояние определяется аналогично. О схеме А/р будем говорить, что она получается из схемы А отождествлением состояний. На рис. 2.3 показаны две схемы. Вторая получается из первой путем отождествления состояний а0 и аъ. Состояние ~а0 второй схемы представля- 58
ет собой класс {а0, а3 } отождествленных состояний первой. Обе схемы имеют нетривиальную разметку метками h и /2, но если в первой эти метки отмечали два разных состояния, то во второй они отмечают одно и то же состояние. Вторая вспомогательная операция - объединение схем. Она применяется к чистым схемам: (Af T) U (А', Т') = (A U A', T U Т'). Таким образом, объединение - это теоретико-множественное объединение состояний и переходов. В результате объединения получается схема с двумя начальными и двумя заключительными состояниями. Поэтому для того, чтобы получить обычную схему, необходимо изменить настройку или выполнить дальнейшие отождествления. Заметим, что при замене одной из объединяемых схем изоморфной «результат объединения, вообще говоря, изменится. Впрочем, в дальнейшем будут объединяться только схемы с непересекающимися множествами состояний. Теперь перейдем к определению основных операций над схемами программ. Их будет пять: две бинарные и три типа унарных операций. Бинарные операции: последовательная композиция А * А'и альтернативная композиция А чА*. Унарные: отметка 1:А, снятие метки (f) А и фильтр и/А. Здесь А и А — схемы, / — метка, и — элементарное условие. Для того чтобы получить последовательную композицию двух размеченных схем (А, ф) и (Л', <//) с непересекающимися множествами состояний, сначала строим объединение A U А1 чистых схем программ, затем делаем отождествления. Отождествляем заключительное состояние схемы А с начальным состоянием схемы А', а также любые два состояния схем А и А', отмеченные одной и той же меткой. Полученную схему размечаем функцией ф, равной кр на состояниях схемы А и равной \р на состояниях схемы А1. Выполненное ранее отождествление гарантирует однозначность функции ф. Если множества состояний схем Л и Л пересекаются, то сначала переходим к изоморфным схемам с непересекающимися состояниями, а затем выполняем отождествление. Наконец, в полученной схеме изменяем настройку. Начальным объявляем начальное состояние схемы А, заключительным — заключительное состояние схемы А'. Таким образом, результат операции определен однозначно с точностью до изоморфизма. На рис. 2.4 схематично показано построение последовательной композиции. Операция последовательной композиции ассоциативна. Для построения альтернативной композиции поступаем следующим образом. Строим объединение чистых схем Лил', отождествляем начальные состояния этих схем, их заключительные состояния и состояния, отмеченные одинаковыми метками. Новую разметку строим так же, как и в случае последовательной композиции. Настройку оставляем прежней. Если множества состояний исходных схем пересекаются, то освобождаемся от этого, переходя к изоморфным схемам с непересекающимися множествами состояний. Схема получения альтернативной композиции показана на рис. 2.5. Операция альтернативной композиции ассоциативна и коммутативна. Операция отметки /: А определена для любой метки / и состоит в следующем. Начальное состояние схемы А отмечается меткой /. Если в А есть другое состояние, уже отмеченное меткой /, то это состояние до изменения 59
Рис. 2.4 Рис. 2.5 о © =*© Рис. 2.6 разметки отождествляется с начальным. Операция (1)А снимает метку / с состояния, которое она отмечает, и оставляет схему неизменной, если такого состояния нет. Вместо (1г) ... (1т)А будем писать (/i,..., lm)A. Следует обратить внимание на то, что, вообще говоря, (t)0: А)ФА, поскольку после отметки 1:А в схеме А может произойти отождествление, которое сохранится после снятия метки. Будем предполагать, что множество меток, которые разрешается использовать для построения размеченных схем программ, всегда бесконечно. Операция взятия фильтра и/А определена для любого элементарного (о) v/q а, ведущий из началь- UAv/q а. Если же из начал ь- условия и и состоит в том, что любой переход а но го состояния а^°\ преобразуется в переход а^ ного состояния нет переходов, то к схеме А добавляются новое состояние Ъ и переход b-+ а^°\ после чего изменяется настройка: b становится начальным состоянием вместо а^°\ Схемы, изображенные на рис. 2.6, будем называть элементарными. Схему первого типа будем обозначать так же, как и элементарный оператор q> выполняемый на ее единственном переходе. Схему второго типа с двумя состояниями и пустым множеством переходов обозначим через 0. Схему с одним состоянием и пустым множеством переходов обозначим X. Теорема 2.1. Любая конечная размеченная U-Y-схема программы может быть построена из элементарных схем с помощью основных операций алгебры схем программ. Действительно, рассмотрим произвольное состояние а схемы А, и пусть Ui/Qi а ► аи. m > 0, то = 0*^ ,д *т/Ящ >Я т все переходы, которые ведут из а. Если поставим в соответствие состоянию а схему Sa = . :lk:a :(ux/qi *at:0y . ..vum/qm * am: 0)), где ll9. . . , lk - 60
все метки, которые отмечают состояние а. Для того чтобы можно было сами состояния использовать в качестве меток, достаточно перейти к изоморфной схеме, использовав в качестве состояний метки, которые еще не были использованы в начальной разметке. Если же т = 0, то Sa = = 0 *(/i".... :1к:а : 0). Пусть A ={ai,.. . ,лп) , а^°* —начальное, а^ - заключительное состояние. Тогда А можно представить в виде выражения (fli,... ,tfw)((*(0): (sal v • • • ySaJD * (д(1): *))• Теорема доказана. Вернемся теперь к языку АО. Предположим, что синтаксис этого языка дополнен правилами определения понятий < базовое условие) и < базовый оператор). Каждой программе Р в языке АО поставим в соответствие 17-У-схему программы о(Р)> где U — множество всех базовых условий, Y - множество всех базовых операторов, использованных в этой программе. Функцию а определим не только для программ, но и для других понятий языка АО (это определение будет рекурсивным и строится в соответствии с правилами грамматики): о(Р.)=о(Р)- o(q) = q\ а( )«е; а(на/) = *:0; о(и/Р) = и/о(Р); a(PvC) = a(P)va(fi); а(если и то R иначеR' ке) = u/o(R) v и /o(Rr); о (если и то R ке) = и/о(Р) v й/е; а (начало R конец) = o(R); а(начало метки h,..., lm \R конец) = (/i,..., lm)o(R)\ o(P;R)=o(F)*oQiy9 o(l:R) = l:o(R). Здесь Р и Q - операторы, q - базовый оператор, и - условие, Л непоследовательности операторов,l,li,...,lm— метки. Сопоставляя правила строгого синтаксиса и равенства, определяющие функцию а, легко видеть, что эта функция определена на всех программах, удовлетворяющих строгому синтаксису, и каждой такой программе ставит в соответствие схему программы, определенную однозначно с точностью до изоморфизма. Более того, поскольку каждому правилу языка соответствует некоторая операция в алгебре схем программ, выражения языка АО можно рассматривать как выражения этой алгебры, записанные в языке АО. При определении семантики алгоритмических языков следует различать два вида семантики - динамическую и функциональную. Динамическая семантика дает ответ на вопрос о том, как выполняется программа, т.е. какие процессы вычислений она порождает. Обычно динамическую семантику языка определяют, описывая абстрактную вычислительную машину, выполняющую программы данного языка. Мы предпочитаем более прямой путь — сопоставление каждой программе множества порождаемых ею процессов вычислений. Для алгоритмических языков, употребляемых в практике программирования и проектирования вычислительных систем, наиболее естественно задавать это множество с помощью схем программ. Таким образом, функция а есть семантическая функция, определяющая динамическую семантику языка АО. Если базовые условия и операторы 61
интерпретированы на информационной среде В, то дискретный преобразо- ватель а(Р) над В (или а(Р) над В) порождает процессы вычислений, определенные программой Р. Их можно рассматривать также как процессы выполнения программы Р. Язык АО можно использовать также и как язык представления неинтерпретированных программ. Тогда возможные процессы выполнения таких программ (при всевозможных интерпретациях) порождаются системой о(Р) или самой а(Р). Что же касается абстрактной машины, интерпретирующей рассматриваемый язык, то ее можно определить как дискретную систему, которая при подходящей настройке является реализацией преобразователя о(Р) для любой программы Р данного языка. Такое описание может быть полезным в связи с рассмотрением вопросов реализации алгоритмических языков. Другой способ задания семантики языка состоит в построении функции перевода рассматриваемого языка в язык с известной семантикой. Язык АО может быть использован в этом смысле как базовый язык, поскольку на нем можно описать любую схему программы. Это следует из следующей теоремы. Теорема 2.2 Лая любой конечной размеченной базовой схемы программы А существует программа Р языка АО такая, что а(Р) изоморфна А. Доказательство можно получить с помощью конструкции, использованной при доказательстве теоремы 2.1. Действительно, о (начало метки/; на/ конец) = 0; а(если Mi то #1;на tfi ке v ... v если ит то qm; наат ке) = = Uxlqx *ах: 0v ... vum/qm *am:0, поэтому все выражения доказательства теоремы 2.1 можно записать в языке АО. Теорема доказана. Функциональная семантика алгоритмического языка дает ответ на вопрос о том, что вычисляет данная программа, какую функцию. Для языка ДО так же, как и для других языков, для которых динамическая семантика определена с помощью U- F-схем программ, функциональная семантика может быть определена как преобразование, выполняемое дискретным преобразователем а(Р) над информационной средой, на которой интерпретирован алгоритмический базис (U, Y). В частности, если базис языка АО интерпретирован на!?, то его функциональная семантика — это функция а, которая каждой программе Р ставит в соответствие преобразование <F(P) =fa(p),B 'B-+2B. Определение функциональной семантики языка АО через его динамическую семантику имеет один недостаток. Он состоит в следующем. Как уже установлено, всякую схему программы А можно записать в виде некоторого выражения алгебры схем программ, зависящего от базовых условий и операторов, использованных в этой схеме. С другой стороны, преобразование fA выражается через те же базовые условия и операторы в алгебре многозначных преобразований. Однако операции алгебры преобразований и алгебры схем программ связаны очень сложным образом. Поэтому преобразование, выполняемое схемой Л, построенной из Ах и Л2, не выражается через преобразования, выполняемые схемами Ах и А2, в алгебре преобразований. Виновата в этом операция отождествления состояний. 62
Действительно, если А\ и А2 не имеют общих меток, то /а *а ~/а °/а > /а мАг ~/а и/л2 и т-Д- Однако, если при композиции происходит отождествление, указанные связи немедленно разрушаются. Преодоление трудностей, вызванных рассмотренными обстоятельствами, связано с идеями алгебры алгоритмов и структурного программирования, которые будут рассмотрены в § 4. § Э. Схемы программ над памятью В этом параграфе будет рассмотрена наиболее распространенная модель информационной среды дискретного преобразователя — память. Память определяется прежде всего множеством V переменных и областью /Означений, которые эти переменные могут принимать (область данных). Состояние памяти представляет собой частичное отображение Ь С V-+D. Переменная иЕ К при заданном состоянии памяти Ъ имеет значение b(v)9 если Ъ определено на у. В противном случае говорят, что значение переменной у не определено. Если значение переменной у определено, то это означает, что в физическом устройстве, используемом для реализации памяти, должно быть выделено место, где хранится значение этой переменной. Это место может находиться на регистрах, в оперативной памяти или на внешних носителях. Оно может быть определено заранее и не зависит от текущего состояния памяти или изменяется с изменением состояния. В первом случае говорят о статическом, во втором — о динамическом распределении памяти. При статическом распределении памяти переменную можно отождествить с соответствующим запоминающим устройством — регистром, ячейкой оперативной памяти и т.п. Неопределенное значение может интерпретироваться различным образом в зависимостиm реализации. Например, при динамическом распределении памяти тот факт, что значение переменной не определено, может означать, что для данной переменной память не выделена, при статическом - что значение переменной может быть произвольным. Кроме множества переменных и их значений должно быть задано также непустое множество В допустимых состояний памяти, которое включается в множество Y(V, D) всех частичных отображений из V в D. Условие Ъ Е В накладывает определенные ограничения на возможные значения переменных при одном и том же допустимом состоянии памяти. Эти ограничения могут быть двух родов. Во-первых, В ограничивает множество допустимых значений каждой переменной идо множества D(и)CD. По определению d ED (у) <=> существует Ъ&В такое, что b(p) = d. Другой тип ограничений состоит в том, что значения переменных могут зависеть друг от друга. Например, значение, записанное на двоичном регистре, есть функция значений, записанных в его разрядах, значение массива однозначно определяется значениями его элементов. Зависимости между значениями переменных в допустимых состояниях* памяти могут быть сколь угодно сложными. Однако мы ограничимся здесь рассмотрением лишь двух простых типов памяти - простой и функциональной, играющих основную роль в приложениях. Простая память допускает любые состояния Ь, удовлетворяющие условию: для любой переменной у Е К, если b(v) определено, то b(v) E D(v), 63
где D(v) — заранее заданные области значений переменных. Если для всех uG Vимеет место D(v)=D, память называется бестиповой, в противном случае - типизированной. Память (К В) называется функциональной,есть множестве Fвыделено подмножество К0, элементы которого называются простыми переменными, а множество допустимых состояний определяется следующим образом. Простая переменная и может принимать любые значения из D(v), a значение любой другой переменной однозначно определяется значениями всех простых переменных. Очевидно, существует взаимно однозначное соответствие между состояниями всей памяти и состояниями простых переменных (т.е. ограничениями всего состояния на множество V0). Поэтому рассмотрение функциональной памяти может быть сведено к простой, хотя это и не всегда целесообразно. Рассмотрим простую бестиповую память (V,В), т.е. случай, когда В = = Y(V,D). Для задания алгоритмического базиса обычно используют операции и предикаты, заданные на области данных!). Предположим, что для обозначения операций и предикатов заданы множества символов (сигнатуры) 12 и П. Каждому символу приписана арность — целое неотрицательное число. Если символ со имеет арность и, то ему сопоставлена л-арная операция (функция) /(д,:/)л->/). Вместо fu>(di,..., dn)(dit ...,(/nGZ)) будем писать co(d\t..., dn), отождествляя символ операции с самой операцией, если такое отождествление не приводит к недоразумениям. Нульарные операции — это обозначения констант, выделенных сигнатурой элементов области D. Элементы п множества П являются символами предикатов. Они также имеют арности, и если символу я приписана арность п, то он определяет п-местный предикат fn: Dn -* -* {0,1} . Так же как и для операций, будем писать n(dx,..., dn) вместо fn(dl9... ,</„). Нульместные предикаты - это различные обозначения для истинностных значений 0, 1. Множество D вместе с операциями (/^Х^е п и предикатами (/„)„ е п называется алгеброй данных с сигнатурами операций и предикатов £2 и П или Sl-Yl-алгеброй данных*). Используя символы сигнатуры £2 и символы переменных, можно строить выражения в алгебре D, которые также будем называть Sl-термами над V или просто термами, если известно, о какой сигнатуре и каких переменных идет речь. Формальное определение терма известно: 1. Всякий символ переменной или символ нульарной операции есть терм. 2. Если со есть символ /i-арной операции, a t\, ..., tn - термы, то b>(ti,..., t„) тоже терм. 3. Других термов нет. Вместо синтаксиса co{tx , ..., t„) в конкретных алгебрах могут использоваться другие синтаксические правила для образования выражения, обозначающего результат применения операции со к термам f'i, ..., tn. Например, можно использовать левую или правую бесскобочную запись, инфикс- *) На самом деле D является алгебраической системой, но мы употребляем более простой термин "алгебра", предполагая, что допускается рассмотрение алгебр с предикатами. Впрочем, если истинностные значения являются элементами области Д а предикаты рассматриваются как операции, то употребляемая нами терминология вполне согласуется с терминологией, принятой в алгебраической литературе. 64
вые обозначения для бинарных операций и вообще любые синтаксические схемы вида pxtx ... pntnPn+i> допускающие однозначный синтаксический анализ. Здесь рх,..., рп - слова в некотором алфавите (возможно, пустые), a Pi () — ()Рл+1 называется схемой построения терма с помощью операции со. Пусть t(vx, ..., vn) есть терм над К, построенный из переменных Vi, ..., vn. Подставляя вместо vx, ..., vn значения dx, ..., dn G Z>, можно выполнить все операции и получить значение t(dx, ..., dn) G D. В частности, если Ъ € В есть допустимое состояние памяти, в котором определены значения переменных vXi ..., ия, то определено значение t(b(vx\ ..., b(vn)), которое мы называем значением терма t(vx,..., vn) при состоянии памяти Ъ и обозначаем через b(t(vx, ..., и„)). Очевидно, что b(oj(tXi ..., f„)) = = <o(b(f i),..., b(tn)) для любой и-арной операции со. В некоторых случаях удобно считать, что значение b(t(vx,..., vn)) определено и в случае, когда не все переменные vx, ..., vn определены. Классическим примером является функция (если л(их) то v2 иначе v$), рассматриваемая как тернарная операция a)(vx, v2, v3). Если n(b(vx))= I, то o>(b(vx), b(v2), b(v3)) можно считать равным b(v2), даже если b(v3) не определено. Вопросы такого рода будут рассмотрены в главе о рекурсивных определениях. Сейчас можно считать, что t(и) не определено, если v не определено. Если я — символ и-арного предиката, a tx, ..., tn — термы, то выражение я (t!,..., tn) определяет некоторое условие на В. Значение этого условия при заданном состоянии памяти b Е В определяется как n(tx, ..., tn)(b) = = n(b(tx),...,b(tn)). Множество всех выражений вида n(tx,..., tn) обозначим через U(V, П, П). Элементы этого множества называются базовыми условиями над памятью К, определенными сигнатурой (£2, П). Правила вычисления значений базовых условий определяют их интерпретацию на информационной среде В. Эта интерпретация является частичной, поскольку n(tx, ..., tn) определено, лишь если определены значения всех термов tx,..., tn. В качестве базовых операторов, действующих на информационной среде В, рассматривают операторы присваивания. Пусть vx, ..., vn — различные переменные, tx, ..., tn — термы. Оператор присваивания — это выражение вида у = (vx: = tx, ..., vn: = tn). Преобразование, выполняемое у на Ь> определяется следующим образом: by = b\ где b'(и) = ft(f/), если и = v{, и Z>'(u) = b(v), если иФи{(г= 1, ..., и). Равенства для Ь'(и) требуют комментария, поскольку правая часть этих равенств может быть неопределенной. Мы считаем, что равенство двух выражений истинно тогда и только тогда, когда обе части принимают одинаковые значения или обе не определены. Таким образом, by всегда определено, даже если правые части некоторых присваиваний не определены. В этом случае просто не будут определены в состоянии b' значения переменных, находящихся в левых частях соответствующих присваиваний. Каждый оператор присваивания у определяет функцию на множестве термов, если положить y(vt) = f/, y(v) = v при v Ф'и( (/= 1, ..., п) и^(со(5!, ..., sm)) = coOOO, ...,y(sm)). Используя эту функцию, можно определить by с помощью равенства (by)(v) = b(y(v)). (3.1) 5. Ю.В. Капитонова 65
Множество всех операторов присваивания обозначим через У(К, 12, П). Базис (U(V, 12, П), Y(V, 12, П)) назовем стандартным базисом над памятью К, определенным сигнатурой (12, П), или (V, 12, И)-базисом. Если U С U(V, 12, П), Y С У(К, 12, П), то U-Y-схемэ. программы называется стандартной схемой программы над памятью V. Поскольку стандартный базис был введен как базис, интерпретированный средствами алгебры данных Д то схемы над памятью определены как интерпретированные схемы. В то же время легко видеть, что понятия стандартного базиса и стандартной схемы зависят только от множества V переменных и сигнатуры (12, П) и могут рассматриваться независимо от интерпретации символов операций и предикатов , которая определяется семействами функций (/cj)wen и (Лг)тгеп- Поэтому можно рассматривать и неинтерпрети- рованные схемы программ над памятью. Интерпретация схемы над памятью, которая определяется произвольной 12-П-алгеброй D, называется стандартной. При изучении схем программ над памятью обычно рассматривают только стандартные интерпретации. Переходя к рассмотрению типизированной памяти, выделим в D семейство подмножеств (Dt)t^v и предположим, что D = U Dy, и для лю- ~ leg бой переменной и Е V имеет место D(v) = D* для некоторого % Е Е, однозначно определяемого переменной и. Элемент £ называется типом переменной и, D» - областью значений переменных типа £, Е - сигнатурой типов. Множество всех переменных типа £ обозначим через Vy. Очевидно, что V = U V», а семейство (Уу)у^% образует разбиение множества V. Множество V с заданным на нем разбиением (^)^es образует множество типизированных переменных, а область/)с покрытием (Dy)y^v - типизированную область данных. Если V и D типизированы, то Гн(К, D) обозначает множество всех частичных отображений Ъ С V -> D таких, что b(V*)CD* для всех JGH. Символам операций и предикатов сигнатур 12 и П теперь кроме арностей сопоставлены типы операций и предикатов. Если to G 12 есть символ «-арной операции, то тип этой операции есть вектор (£1э ..., £„, £), составленный из типов переменных, а сама операция представляет собой функцию /cj- D% X ... X Dy -> Dy. Аналогично, если я G П есть символ и-арного предиката, то ему сопоставлен вектор (£1у ..., £„) и /я есть функция /я: Dy X ... X Dy -*{0, 1} .Таким образом, семейство (D|)|GS рассматривается как многоосновная алгебра (с предикатами) сигнатуры (12, П, Н), или Sl-Yl-л-алгебра. Для краткости мы иногда будем обозначать эту алгебру так же, как и соответствующую типизированную область D. Рассматриваемые вместе с предикатами и операциями множества Dy называются обычно типами данных. С помощью сигнатур 12 и П так же, как и раньше, строятся термы и базовые условия над памятью V. Только теперь термы имеют типы, которые должны учитываться при образовании новых термов. Более точно, правила образования термов выглядят теперь так: 1. Всякий символ переменной типа* £ или нульарной операции типа (£) есть терм типа £. 66
2. Если со есть символ операции типа (£i, ..., £„, £), a ^, ..., f„ — термы типов ^,..., £„, то <o(f!,..., Г„) есть терм типа £. 3. Других термов нет. Значение терма при заданном состоянии памяти определяется так же, как и для нетипизированной памяти. В силу определения допустимого состояния памяти b{to{tx, ..., trt)) = co(6(fi), •••> b(tn))9 и это значение определено, если b(ti)> ..., b(tn) определены. Базовые условия представляются в виде n(tl9 ..., t„), где я имеет тип (£1? ..., £„), tl9 ..., tn — термы типов £i ,...,£„ соответственно. При построении операторов присваивания правые и левые части также должны иметь одинаковые типы. Это обеспечивает в силу равенства (3.1) сохранение допустимости» состояний при действии операторов присваивания, поскольку v и y(v) имеют одинаковые типы. Таким образом, базис (U(V9 12, П, Е), Y(V, 12, П, а)) для схем программ над типизированной памятью построен. Применительно к типизированному базису будем также говорить о стандартных схемах программ над памятью и о стандартных интерпретациях. На многоосновные алгебры естественным образом переносятся все основные понятия универсальных алгебр и алгебраических систем. В частности, если D = U Dt и D' = U D\ — две однотипные, т.е. с одинаковыми сигнату- £€ЕЕ |еЕ рами (12, П, Е), многоосновные алгебры, то гомоморфизм у: D -* D' называется семейство у = (7^)|ен отображений такое, что для любых £ G a yf D% -* Z>£, и если со G 12 имеет тип (£j, ..., £„,£), то 7$(to(d,, ..., dn)) = cj(7^ (di), ..., y^n(dn))9 а для предиката я G П типа (£i, ...,£„) изя(с/1,...,^„)= 1 следует я(7^(с?1),...,7|я(с?Л))= 1.Если я(^ь ..., dn) = 1 «• 7г(7^1 (rfi), ..., 7^„(^л)) =1» то гомоморфизм называется строгим. Рассмотрим теперь две многоосновные алгебры данных D и £>', и пусть В = ГН(К, D), 5' = ГН(К, Z)'). Тогда всякий гомоморфизм 7- D-+D' переносится на множества В и В'. Именно, можно рассматривать отображение 7': В -* Z?', определенное равенством (y'(b))(v) = 7$(b(v)), если у G К^. Отображение у' обладает следующим важным свойством. Если у = = 0>i: = *i> •••> Уп: ~ 'л) - оператор присваивания на типизированной памяти, то У'№ = (у'ф))у. (3.2) Действительно, ((y\b))y)(v) = (y'(b))(y(v)) = 7s(&04i>))) = 7* ((WOO) = = (7^v))(y)- Пусть теперь А — стандартная схема программы над типизированной памятью V. Множества В и В' представляют собой две различные интерпретации схемы А. Гомоморфизм у индуцирует еще одно отображение у": А X В -* А X В\ Это отображение определяется равенством у "((а, и, у), Ь) = = ((а, и, у), у-'(А)). Теорема 3.1. Отображение у'\ индуцированное строгим гомоморфизмом у: D -* £>', является реализующим гомоморфизмом дискретного А Л • г преобразователя А над В в дискретный преобразователь А над В , согласо- ванный с настройкой. Если у отображает D на D , то А над В является пол- 5* 67
ной гомоморфной реализацией А над В'. Если D и D' изоморфны, то А над В и А над В' также изоморфны. л Покажем сначала, что образ допустимого состояния А над В при отображении у" допустим. Действительно, пусть ((а, и, у), Ь) — допустимое состояние А над В. Тогда и(Ь) = 1. Пусть и =¥?(ai> —>am)> гДе ¥* — пропозициональная функция, ах, ..., ат — базовые условия. Тогда u(b) = ¥?(<*iф), -, <*„,(&)). Пусть а, = я(г1? ..., f„). Тогда af(b) = = *(^i), ..., b(tn)) = fffr^ftfa)), ..., y%n(b(tn))) = "((t'WX'i), .-, (7.'(5))(*л)) = <*/(?'(*))> где Ь, ..., £„ - типы термов /lf ..., tn соответственно. Поэтому и(у'ф)) = и(Ь), следовательно, состояние ((а, и, у),у'(b)) допустимо. Покажем теперь, что .из ((а, м, у), Ь)-+ ((а'', и\ у), b') следует ((а, и, у), у'ф))-+((а',и ,у\у'ф')). Действительно, b' = by, откуда в силу (3.2) у'ф') = у'(by) = (т'С^))^- Кроме того, поскольку состояние ((а\ и\ у'), b') допустимо, то ((а', и, у'), у'ф')) также допустимо, и, следовательно, и'(у'ф')) = 1. Из доказанных предложений вытекает первое утверждение теоремы. Заметим, что по определению 7* D ~* D' означает, что у%: D% -* D$. Пусть теперь b'^B', v € V%. Если b'(v) = d\ то выберем dGD% такое, что y%(d)=d'. Если же b'(v) не определено, то положим b(v) тоже не определено. Таким образом, построено состояние b E В такое, что у'ф) = b\ и, значит, у\ а следовательно, и)" являются отображениями на. Наконец, если у есть изоморфизм, то у" также является изоморфизмом. Теорема 3.1 формализует один из типичных приемов, применяемых при разработке программ и алгоритмов, - переход от одного представления алгоритма к другому путем реализации данных и операций над ними. Из теоремы, в частности, следует, что переход от одной алгебры данных к изоморфной ничего не меняет, поскольку схемы программ над памятью с изоморфными алгебрами данных могут служить реализациями друг друга. Поэтому на начальных этапах проектирования алгоритмов алгебры данных рассматриваются с точностью до изоморфизма. В этом случае они называются абстрактными алгебрами .данных, а их компоненты D% - абстракт- ными типами данных. Рассмотренный выше тип оператора присваивания является частным случаем операторов присваивания, используемых в языках программирования. Он не включает такие понятия, как переменные с индексами, имена полей в записях, указатели и т.п. Эти понятия можно рассмотреть с единой точки зрения с помощью идеи косвенного именования. Предположим, что в сигнатуре типов 2 выделено подмножество 20 и задано взаимно однозначное отображение а: 20 •+ 2. Предположим также, что для £ G 20 имеет место D% = Va%. Таким образом, в качестве значений переменных могут использоваться сами переменные. О переменных типа £ Е 20 можно говорить, что они являются именами переменных типа а£. Теперь, если терм t имеет тип £ Е 20, то на состоянии памяти b можно вычислить не только его значение b(t) типа £, но и значение второго ранга b(b(t)), которое имеет тип а£. С другой стороны, если а~х% определено, то каждую переменную типа £ можно рассматривать как константу ти- 68
па сГ1%, т.е. значение переменной типа of х£. Типы данных D% и их имена для £ Е Е0 называются именующими, а алгебра данных, в которой выделены именующие типы и задана функция а так же, как и память, построенная на этой алгебре, называется алгеброй (соответственно памятью) с косвенным именованием. Для всех допустимых интерпретаций базиса над памятью с косвенным именованием функции а и типы данных D% (£ G а0) предполагаются фиксированными. Для любого допустимого состояния памяти Ь, терма t и типа £ определим функцию val|(/, b) — значение терма t относительно типа £ при состоянии памяти Ь. Пусть терм t имеет тип д. Рассмотрим два случая. 1. Если t = v E Vn и существует m > 0 такое, что aw ~ lr) = £, то val$(f, Ь) = = bm(t), где m минимально. 2. Пусть г = (*)(ti,..., f„), операция со имеет тип (^, ..., £„, ту), и существует w > 0 такое, что атт? = £. Тогда val^(r, Ь) = bm(co(dl9 ..., <*„)), где d{ = val|/(ff-, Ь) (/ = 1, ..., я), w берется минимальным. Разумеется, все значения d\,..., dn должны быть определены. Во всех других случаях val|(f, b) считается неопределенным. Действие оператора присваивания вида у = (s: = t), где s и t — термы, определяется следующим образом. Если s имеет тип £ и а"1 £ определено, то действие оператора у эквивалентно действию оператора vala-i $(s, b): = = val^(r, Ь). Если of *£ не определено, то действие у также не определено. Групповое присваивание у = (si: = tx,..., sm: = tm ) выполняется следующим образом. Сначала вычисляются значения у,- = val^-i^s,-, b), где £,- -г тип терма siy если это возможно. Полученные переменные V\, ..., vm должны быть все различными. Если это не так, действие у на b не определено. В противном случае выполнение у эквивалентно выполнению оператора yi: = val7b ('i> Ъ\ ..., vm: = val^^C^, b), где т?,, ..., t?w - типы термов 'i > •••> ^m соответственно. Рассмотрим пример. Пусть в множестве Е для каждого типа £ и набора из 2k целых чисел /z = (m\, «i, ..., mk, пк) содержится тип £' = Qx, £). Значениями переменных типа £' являются частичные отображения /С Z* -> £>| целочисленной решетки Zk в Z>£, области определения которых содержатся в прямоугольном параллелепипеде [mx: nl9 ..., mk: пк]. Значения типа £' называются прямоугольными массивами элементов типа £ с границами, определенными набором /i граничных пар. Если у Е ^ есть переменная типа £', то в множестве V$ должны содержаться переменные вида u(i"i, ..., /*)> где (il9 ...,/*) — произвольный набор целых чисел, удовлетворяющих условию тпх < ix < пх, ..., тк < /* < пк. Нужны еще вспомогательные типы ixx, ..., iik, областями значений которых являются целочисленные интервалы [/Яр пх], ..., [mfc: я*;] и операция <o(w, /1э ..., ik) типа (of1^', /zi, ..., jik, оГ1£). Результат применения этой операции к термам w, ti9 ..., tk записывается в виде w(fi, ..., tk), т.е. операция имеет синтаксическую схему () ((),..., ()). Таким образом, при выполнении оператора присваивания v(sx, ..., sk): = v(tx, ..., tk) для левой части будет определена переменная v(il9 ..., ik), где il9 ..., /* являются значениями термов s1? ..., sk, а для правой части - переменная w(/i» -./*), где/i, ...,/* - значения термов ^,..., ffc. 69
Возможна также другая точка зрения. Можно считать, что все типы /Zi, ..., цк совпадают в типом целых чисел. Тогда операция доступа к элементу массива v(ii9 ..., ik) либо должна рассматриваться как частичная, либо для набора значений индексов il9 ..., ik, которые не удовлетворяют соответствующим неравенствам, должна давать некоторое специальное значение. Бели это значение появляется в левой части оператора присваивания, результат его выполнения объявляется неопределенным. Память с массивами является функциональной. Значения переменных типа "массив" однозначно определяется значениями переменных, определяющих элементы массивов (переменных с индексами), и в конечном счете значениями переменных, типы которых не являются массивами. Для представления схем программ над простой бестиповой памятью в текстовом виде можно пользоваться языком АО, в котором сигнатура алгебры данных и алгоритмический базис представлены синтаксисом условий, выражений и операторов присваивания. Для типизированной памяти определение выражений (термов) должно учитывать сигнатуру типов. Для каждого типа £ должен быть определен синтаксис выражений типа £. Для обозначения переменных можно использовать идентификаторы, т.е. последовательности букв и цифр, начинающиеся с буквы. Для того чтобы одни и те же идентификаторы использовать для обозначения переменных различных типов в разных программах, описания типов переменных должны быть включены в программу. Эти описания определяют структуру памяти, используемой в данной программе. Язык, в котором используется описание памяти, назовем А1. Его синтаксис имеет следующее представление: (А 1—программа): := НАЧАЛО (описание памяти) (оператор) КОНЕЦ. (описание памяти>:: = (описание переменной) Кописание переменной>; (описание памяти) (описание переменной):: = ИМЯ (идентификатор): (тип) I ИМЕНА (список идентификаторов, разделенных запятыми): (тип) Этот базовый синтаксис может быть изменен или расширен средствами, которые сводятся к базовому. Понятие (тип) определяется для каждой конкретной алгебры своим синтаксисом. Например, синтаксис массивов может быть определен следующим образом. (тип): := (простой тип) I(массив) (массив):: = МАССИВ ((список граничных пар))(тип> (список граничных пар):: = (граничная пара) I(граничная пара), (список граничных пар) (граничная пара):: = (целое):(целое) § 4. Алгебра алгоритмов Алгебра алгоритмов, или алгебра Глушкова, так же как и алгебра отношений (многозначных преобразований), дает возможность явным образом выразить преобразование, выполняемое детерминированной схемой программы, через базовые условия и операторы. Однако в отличие от алгебры отношений здесь, по существу, используется детерминизм и, с другой сто- 70
роны, выражения алгебры алгоритмов достаточно близки к программам соответствующих алгоритмических языков и могут использоваться как инструмент программирования. Использование соотношений алгебры алгоритмов дает возможность выполнять глубокие оптимизирующие преобразования. Поэтому она используется как основная математическая модель при проектировании программ и разработке инструментальных средств проектирования. Алгебра алгоритмов А = (Y, U) является двухосновной алгеброй, компоненты которой называются алгеброй операторов Y и алгеброй условий U. Алгебра операторов состоит из частичных преобразований Р С С В -*• В множества В состояний информационной среды, а алгебра условий - из частичных предикатов а С В -»{ 0, 1), заданных на В. Поэтому алгебра алгоритмов А называется также алгеброй алгоритмов над В. Операции алгебры алгоритмов делятся на операции алгебры операторов и операции алгебры условий. Первые принимают значения в множестве операторов, вторые - в множестве условий. Операции алгебры операторов: 1. Произведение операторов PQ - последовательная композиция 2. Операция а-дизъюнкции (Р v Q), определенная для любого усло- а вия а G U и операторов Р и Q. (Р v Q) (Ь) = если а(Ь)= 1 то Р(Ь) иначе если а(Ь) = 0 а то Q(b) иначе не определено. 3. Операция а-итерации {Р}, определенная для любого условия a Е U а и оператора Р. { Р}(Ь) определено <=* существует п > 0 такое, что а а(ЬРп) = 1, и если п > 0, то а(Ь) = а(ЬР) = . . . = а^""1) = 0. Если {Р}(Ь) определено, то { Р}(Ь) = ЬРп, где п определено предыдущим а. а предложением. Очевидно, что для а-итерации имеет место следующее утверждение: { Р}(Ь) = если а(Ь) = 1 то Ь иначе если а(Ь) = 0 то а { Р}(ЬР) иначе не определено. а Это утверждение может быть использовано для вычисления { Р}(Ь), а если оно определено. Операции алгебры условий: 1. Булевы операции av 0, а л 0, а. На состоянии Ь информационной среды условие а может принимать одно из двух значений 0, 1 или быть неопределенным. Условие ос(Ь) определено <=*• а(Ь) определено и равно отрицанию а, т.е. а(Ь) = 1 <=»<*(>) = 0, а(Ь) = 0 <=>а(Ь) = 1. Результат применения дизъюнкции и конъюнкции представлен следующей таблицей, 71
где Я означает, что значение не определено. с*(Ь) Р(Ь) (с*Л0)(*>) (a v Ю(Ь) <*(Ь) Р(Ь) (аЛШ) («'уШ) я я я о О О я О 1 я о 1 я о я о о о я я 1 я о 1 1 1 1 я о 1 я о 1 1 1 1 Из этого определения следует, что для всюду определенных условий дизъюнкция, конъюнкция и отрицание совпадают с обычными булевыми операциями. В общем случае операции v, л и - удовлетворяют всем основным законам булевой алгебры, кроме законов исключенного третьего a v а = 1 и противоречия аа = 0 (знак л , как обычно, опускается). Иными словами, дизъюнкция и конъюнкция ассоциативны, коммутативны, идемпотентны, удовлетворяют законам дистрибутивности и правилу Де-Моргана, а отрицание удовлетворяет закону двойного отрицания а = а. 2. Операция Ра умножения оператора Р на условие а, называемая также прогнозированием. Значение условия Ра на состоянии Ъ определяется равенством (Pot) (b) = а(ЬР). Таким образом, условие Ра — это "а после Р9\ В некоторых случаях к алгебре алгоритмов удобно добавлять константы: тождественный оператор е, нигде не определенный оператор ф, тождественно истинное условие 1 и тождественно ложное условие 0, рассматривая их как нульарные операции. Таким образом, алгебра алгоритмов - это множество операторов и множество условий, замкнутые относительно операций алгебры алгоритмов. Если в алгебре операторов выделено множество базовых операторов У, а в алгебре условий — множество базовых условий U таким образом, что эти множества порождают всю алгебру алгоритмов, то она называется U-Y-алгеброй алгоритмов (над В) и обозначается А(£/, У), Каждый элемент 17-У-алгебры алгоритмов может быть задан с помощью выражения, построенного из символов, обозначающих элементы множеств U и У, т.е, из базовых условий и операторов, с помощью операций алгебры алгоритмов. Такие выражения называются регулярными выражениями, а соответствующие операторы и условия — операторами и условиями, регулярными относительно базиса (У, U). Регулярные выражения алгебры операторов называются также регулярными программами или регулярными U-Y-программами. Рассмотрим некоторые полезные соотношения алгебры алгоритмов. Операция умножения операторов ассоциативна, т.е. множество операторов является полугруппой, а е и ф играют роль единицы и нуля этой полугруппы соответственно: P(QR) = (PQ)R, (4.1) Ре = еР = РУ (4.2) Рф = фР = ф. (4.3) 72
1. Соотношения для а-дизъюнкции: (PvQ) = (GvP), (4.4) (fv0 = P, (4.5) i (Р v 0 = G, (4.6) о (Pv6) = (/>v (Qv0)), (4.7) (Р v (G v Л)) = (/> v _(Q v /?)). (4.8) а 0 а а(3 2. Аналоги законов ассоциативности для а-дизъюнкции: (Рм (QvR))= ( (PmQ)vR), (4.9) а /3 а v а0 а ((PvQ)v/?)= (Pv (Cv/?)). (4.10) а 0 а0 а0 Если а и 0 — всюду определенные условия, то соотношения ассоциативности могут быть записаны проще: (P\,(QvR))= ( (PvQ)vR)9 (4.11) а 0 a v /3 а ( (Р v 0) v R) = ( Р v ( 0 v Л )). (4.12) 3. Аналог идемпотентности для а-дизъюнкции: (РуР)= (_Pv0). (4.13) а а v а Если а всюду определено, то (Pv P) = P. (4.14) а 4. Соотношения дистрибутивности: (PvQ)R = (РК vGtf), (4.15) а а R(P*Q) = (RPvRQ). (4.16) а Да С помощью соотношений ассоциативности и дистрибутивности любая регулярная программа, не содержащая итераций, может быть приведена к виду (Рг v (P2 v ... ( Рп v б) .-•))> гдеРь .... Р„, б - произведе- ния базовых операторов, al9 . . . 9ап — произвольные условия. При этом, если базовые условия и базовые операторы всюду определены, то можно сделать так, что а* л а7- = 0 при i Ф]. 73
5. Соотношения для умножения оператора на условие: Р(а v (5) = Pa v P0, (4.17) Р(а л 0) = Ра л Р0, (4.18) Ра" = Ра, (4.19) (Р v G) 0 = а л (Р0) v а л (00), (4.20) а (PQ)<* = /Че«. (4.21) 6. Соотношения для итерации: { Р> = (е v Р { Р}) = (е v { Р)Р). (4.22) а а а а Ра Все рассмотренные соотношения являются тождествами алгебры алгоритмов, т.е. они выполняются при любых значениях входящих в них операторов и условий, заданных на любой информационной среде В. Доказательства всех соотношений проводятся непосредственным обращением к определениям операций алгебры алгоритмов. При этом, поскольку речь идет о равенствах частичных функций, каждое доказательство состоит из двух частей: если левая часть определена, то правая тоже определена и они равны и, наоборот, если правая часть определена, то определена и левая и они равны. Докажем, например, равенство (4.20). Выберем произвольное состояние Ь информационной среды. Левую часть равенства обозначим через и, правую - через у. Пусть и(Ь) определено. Тогда а(Ь) также определено. Рассмотрим два случая: а(Ь) = 1 => и(Ь) = P(b(P v Q)) = Р(ЬР) = v(b), а a(b) = 0 =>u(b) = P(bQ) = v(b). Пусть теперь v(b) определено. Тогда a(b) снова определено, и рассмотрение тех же двух случаев дает равенство u(b)=v(b). Рассмотрим теперь равенства (4.22). Первое из них называется левым развертыванием итерации, второе - правым развертыванием. Докажем второе равенство. Обозначим А = { Р}9 В = (е v { Р) Р). Пусть А (Ь) а а Ра определено. Тогда существует п > 0 такое, что а(ЬРп) = 19А(Ь) = ЬРп, а если и > 1,тоа(6) = а(ЬР) =. ..=а(ЬРп~1) = 0. Если и =0,тоа(6) = 1 иВ(Ь) = *>=Л(£).Еслижел>0,тоЯ(£) = ( { Р)Р) (Ь) = Р( { Р}(Ь)). Ра Ра Снова получаем два случая: п = 1 =* (Ра) (Ь) = а(ЬР) = 1 => В(Ь) = ЬР = = А (Ь) и п > 1 => (Ра) (Ь) = а(ЬР) = (Ра) (ЬР2) = а(ЬР3) = . . . = (Ра) X X (ЬРп~2) = а^"-1) =0, (Ра)(ЪРп~1) = а(ЬРп) = 1 =* В(Ь) = = Р(ЬР п~1) = ЬРп = А(Ь). Обратное утверждение доказывается аналогично. Предлагаем читателю провести подробные доказательства для тех утверждений, которые на первый взгляд не представляются очевидными. Операции алгебры операторов легко выражаются через операции алгебры многозначных преобразований множества В. Умножение просто совпадает на алгебре операторов с умножением многозначных преобразований, а а-дизъюнкция и а-итерация выражаются следующими 74
формулами: (PvQ) = a/Pva/Q, (4.23) a </>}= (а/РУ(а/е). (4.24) a Таким образом, 17-У-алгебра операторов вкладывается в алгебру многозначных преобразований, порожденную множеством U(£/, У)/е U У, где U(£/, Y)/e — множество всех фильтров тождественного оператора е по условиям 17-У-алгебры условий. Операция взятия фильтра выражается через операции алгебры алгоритмов: Ф ={ е}, а а/Р = { е)Р. а Поэтому соотношения (4.23) и (4.24) можно рассматривать как соотношения в алгебре многозначных преобразований, расширенной добавлением операций а-дизъюнкции и а-итерации, или в алгебре операторов, расширенной добавлением недетерминированной дизъюнкции и недетерминированной итерации. Такой переход к расширенной алгебре алгоритмов иногда удобно делать для поиска и вывода новых тождеств или конкретных соотношений. Хотя условия сами по себе не погружаются в алгебру многозначных преобразований, но с фильтрами связаны еще несколько полезных соотношений: (a v fi)/e = ф v file, (4.25) (<*л0)/е = (Ф)(Р1е), (4.26) ((Ра)/е)Р = Р(а/е) = (Ра)/Р (4.27) Расширенная алгебра алгоритмов может быть практически полезной в ряде случаев. Во-первых, некоторые тождества и соотношения алгебры алгоритмов удобно доказывать, переходя сначала к недетерминированному представлению, а затем, выполнив преобразования в алгебре многозначных преобразований, возвращаясь к детерминированному случаю. Таким образом, можно, в частности, взять на вооружение все тождества алгебры языков, которые, как было показано в § 9 гл. 1, являются тождествами и алгебры отношений (многозначных преобразований). С другой стороны, недетерминированность удобно использовать при описании моделей проектируемых систем, предполагая, что детерминизация произойдет на этапе построения реализации путем выбора конкретных процессов вычислений из множества процессов, приводящих к одному и тому же результату. Наконец, в некоторых случаях недетерминированность указывает на возможность параллельных вычислений. Например, соотношение (4.25) показывает, что дизъюнкцию можно вычислять путем параллельного выполнения операторов а/е и file. Важность такого параллелизма станет особенно наглядной, если предположить, что, например, a ={P}ol", а a fi = { Q)fi" • Не следует, однако, думать, что все вопросы параллельных 0' вычислений сводятся к не детерминизму. В дальнейшем у нас будет повод поговорить об этом более подробно* 75
Поскольку алгебра операторов содержится в алгебре преобразований, естественно ожидать, что на нее можно перенести технику решения уравнений. Действительно, рассмотрим уравнение вида X * (PXvQ). (4.28) а в котором X — неизвестный оператор. Такое уравнение назовем лево- линейным каноническим уравнением с одним неизвестным. Решением уравнения (4.28) может служить регулярная программа Х0 = { P)Q. (4.29) а Действительно, применяя левое развертывание итерации (4.22), правую дистрибутивность (4.15) и перестановочность для а-дизъюнкции (4.4), получим Х0 = i P)Q = (evP{P})Q = (QvP{P)Q) = а а а а а = (Р(( P}Q)vQ) = (PXo v0; с* « а следовательно, регулярная программа (4.29), а точнее, представляемый ею оператор, удовлетворяет уравнению (4.28). Решение (4.29) является наименьшим. Действительно, пусть .Хл - другое решение. Включение Х0 С Хх означает, что если ЬХ0 определено, то и ЪХХ определено и ЬХ0 = = ЪХХ. Пусть ЬХ0 определено. Тогда ЬХ0 = bPnQ, причем а(Ь) = . . . . . . = а(ЬР"-1) = 1, а(ЬРп) =0. С другой стороны, ^ = (РХХ vfi) = =(P(PX1vQ)vQ)=( (P2X1vQ)vQ)=...= ( (... ( Рп<Х{Рп^Ххм act <x "Pot <x Pot p«-la р«а v Q) v Q) v ... v Q) v Q), поэтому ЪХХ = ЬРп ( Pn + 1Xl v Q) = Pnot = bPnQ = bXQ. Перейдем теперь к рассмотрению системы линейных уравнений вида Xt =Fi(Xl,...,Xn), i = 1 я, (4.30) где Xt — неизвестные операторы, Ff - леволинейные регулярные выражения, т.е. выражения вида Ft(Xl9..., Хп) = (Л*1 v (P2X2 v... ( PnXn vP„ + 1)...)), Pi . . . , Pn + i - известные операторы (коэффициенты и свободный член), <*i, . . . , осп - известные условия. Систему (4.30) называют канонической системой линейных уравнений. Ее можно решать методом исключения неизвестных. Если правая часть первого уравнения не зависит от Xi9 т.е. коэффициент при Хх равен ф, то Хх можно исключить, если же этот коэффициент не пуст, то Хх = (РХгу F\{X2,..., Хп)) = { P}F\(X2f..., Хп) и снова Хх исключается. После исключения Х\ неизвестных стало на одно 76
меньше, а система снова может быть приведена к каноническому виду путем применения законов левой дистрибутивности, раскрытия и перестановки скобок с помощью левой дистрибутивности и ассоциативности, а также вынесения неизвестных за скобки с помощью правой дистрибутивности. В результате решение будет найдено в виде выражения, регулярного относительно коэффициентов и свободных членов. Поскольку на каждом шаге получается наименьшее решение, имеет место следующая теорема. . Теорема 4.1. Каноническая система линейных уравнений в алгебре алгоритмов имеет наименьшее решение, регулярное относительно коэффициентов и свободных членов. С помощью теоремы 4.1 можно доказать важную теорему Глушкова о регуляризации схем программ. Теорема 4.2. Если А - детерминированная U- Y-схема программы, интерпретированная на множестве В, а базовые условия всюду определены, то fA регулярно относительно U и Y. Действительно, пусть а — произвольное состояние, отличное от заключи- "i/^i ит/Ут тельного, а ► аи . . . , а ► ат - все переходы, которые начинаются в этом состоянии. Тогда преобразование fa — оператор, который выполняется схемой при настройке (а, а*1*), — удовлетворяет соотношению fa = ( У\!ах V ( УгГаг V ...V ( Ут/аЧ Ф) • • • ))> и, и2 ит т справедливость которого вытекает из независимости условий переходов (детерминированность). Вместе с соотношением указанные соотношения образуют каноническую систему линейных уравнений, для которой (fa)a&A является наименьшим решением, что было доказано в § 1. Поэтому все fa регулярны. Поскольку fA = /(0)>теоРе- ма доказана. а Операции алгебры операторов а-дизъюнкция и а-итерация естественным образом выражаются в текстовом виде. (Р v Q) - это то же самое, or что и ЕСЛИ а ТО Р ИНАЧЕ QKE. {Р} обычно выражается в виде оператора цикла: а ПОКА Па ВЫПОЛНЯТЬ Р КОНЕЦ ЦИКЛА. В практических языках программирования помимо цикла по условию применяются и другие виды операторов цикла. Например, ДЛЯ /:=/<> ШАГ Я ДО 1г ВЫП Р КЦ или ДЛЯ ВСЕХ х G X ВЫП Р КЦ. 77
Семантика таких операторов естественным образом может быть выражена через цикл по условию. Например, первый оператор при Я > О может быть определен как эквивалентный оператору НАЧАЛО /:=/о; ПОКА / < Л ВЫП Р\ КОНЕЦ ЦИКЛА КОНЕЦ. Второй оператор можно определить так: ПОКА X Ф ф ВЫПОЛНИТЬ ВЗЯТЬ х ИЗ Х\ Р КОНЕЦ ЦИКЛА; Возможно более ограниченное толкование операторов ДЛЯ /: = ..., не допускающее изменение оператором Р параметров цикла. Для первого оператора такое толкование может быть выражено с помощью оператора; НАЧАЛО / :=/0, /i :-/i, Я :=//; ПОКА /' < // ВЫПОЛНЯТЬ Р; Г :=/'+Я', /:=/' КОНЕЦ ЦИКЛА КОНЕЦ Для второго оператора возможно такое толкование: НАЧАЛО X' :=Х; ПОКА X1 Ф ф ВЫПОЛНИТЬ ВЗЯТЬ х ИЗ Х'\ Р КОНЕЦ ЦИКЛА КОНЕЦ Ограниченное толкование операторов _ цикла более естественно для структурного программирования. Если оператор Р не содержит изменения параметров, то рассмотренные виды циклов можно также толковать просто как произведения: П />(/0+/*Я) = />(/0)Р(/о+Я)...Р(/о+Я* [Л/Я]) /=о 78
и П Р(х) = P(Xl)...P(xn), если Х={хи...9хп). ХЕ:Х Всякую регулярную 17-У-программу над В, не использующую операцию прогнозирования, можно рассматривать как £/-У-схему программы, интерпретированную на В. Действительно, операции умножения и «-дизъюнкции имеют соответствующие аналоги в алгебре схем программ, а а-итера- ция оператора Р может быть представлена текстом: НАЧАЛО МЕТКИ L, М\ М: ЕСЛИ а ТО НА L; Р\ НА М; L: КОНЕЦ. Теорема о регуляризации показывает, что всякую U-Y-схему программы можно представить в виде регулярной 17-У-программы. Если множество U базовых условий замкнуто относительно операции прогнозирования, то, переходя от регулярной программы к [/-У-схеме, получаем возможность устранить произвольные переходы, заменив их циклами по условию, регулярно вложенными друг в друга. Такие схемы программ будем называть структурными, а представляющие их тексты в языке АО, расширенном введением операторов цикла, - структурными программами. Язык АО без оператора перехода, но с операторами цикла будем называть структурным вариантом языка АО. Этот язык обладает тем важным преимуществом, что его функциональная семантика может быть непосредственно выражена путем сопоставления каждой структурной программе Р вычисляемого этой программой преобразования ~о(Р) без перехода к схеме программы. При этом преобразование Ъ(Р) выражается через преобразования алгоритмического базиса с помощью операций алгебры алгоритмов. Возможность устранения операции прогнозирования, которая появляется в доказательстве теоремы о регуляризации, может быть проиллюстрирована следующим примером. Пусть а. = (а <Ь)9 у = (а : = 2Ь - а). Тогда у а = (2Ь - а < Ь) = (Ь < а). В общем случае элиминировать прогнозирование можно, расширив информационную среду В, Действительно, рассмотрим множество В* всех конечных последовательностей, составленных из элементов множества В. Отождествляя одноэлементные последовательности с элементами множества В, получим В С В*. Распространим действие операторов и условий на В *, полагая (b i,..,, bn)y = (Ъ i,..., bny\ <x(bl9 . . . , bn) = ot(bn). Введем на множестве В* два новых оператора t и I. Действие этих операторов определяется следующими правилами: Ф\> •• • , bm) t = (bx bm, bm\ (bu...fbm)l = (fti, ...,ftm_i). Имеет место следующая теорема синтеза схемы программы по регулярному выражению. 79
Теорема 4.3. Для любой регулярной U-Y-программы Р над В существует f/Tult,^} -схема программы А над В* такая, что fA (b) = ЬР для любых Ъ&В. Для доказательства достаточно заметить, что ( Qy R) = t/>(IGv ФД), Ра а {Q} = t/>{ IQtPH. Pot а Операторы t и i дают, таким образом, возможность проверки условия Ра с помощью одного базового условия а. Оператор t позволяет запомнить текущее состояние информационной среды, а проверяется после выполнения Р, а оператор 4 восстанавливает состояние информационной среды, измененное оператором Р. § 5. Логика алгоритмов Первая компонента Y алгебры алгоритмов (Y, U) над В, как мы уже видели, может быть использована для построения языка представления алгоритмов преобразования множества В. Это язык регулярных программ или структурный вариант языка АО, которые получаются, если определить язык для записи элементов алгоритмического базиса (17, Y)\ Алгебра условий, в свою очередь может быть использована для построения языка представления свойств алгоритмов, действующих на информационной среде В. Такой язык необходим для развития общих методов доказательства утверждений об алгоритмах и программах, т.е. логики алгоритмов. Язык логики алгоритмов прежде всего должен содержать средства для представления свойств произвольного текущего состояния Ъ информационной среды В. Простейшими, или базисными, высказываниями о состояниях информационной среды могут служить элементы базиса U. Если а - базисное всюду определенное условие, то его можно использовать как высказывание, которое истинно на состоянии Ь, если а(Ь) = 1, и ложно, если а(Ь) = О, В случае частично определенных условий а можно рассматривать высказывания а = 1,а = 0иа=Я, где Н обозначает неопределенное значение. Высказывание а = 1, например, истинно на состоянии Ь, если а(Ь) = 1, и ложно, если а(Ь) = 0 или не определено. Более сложные высказывания образуются из базисных с применением обычных пропозициональных связок. Таким образом, получаем элементарные высказывания языка логики алгоритмов, которые соответствуют л элементарным условиям U. Базисных условий может быть недостаточно для построения рассуждений о программах. Поэтому элементарные высказывания языка логики алгоритмов строятся, исходя из некоторого расширенного множества базисных высказываний, которое, как правило, включает в себя высказывания, построенные из базисных условий. Если ВС Г (К, D) есть память над Л-П-алгеброй D, то язык элементарных высказываний фактически совпадает с языком бескванторных формул исчисления предикатов. Для построения сложных высказываний кроме пропозициональных связок могут теперь применяться также и кванторы по переменным, про- 80
бегающим область D. При этом для связывания переменных кванторами следует использовать расширенный алфавит переменных, не допуская связывания кванторами переменных из множества V, которые фактически играют роль констант в элементарных высказываниях. Действительно, каждое такое высказывание относится к произвольному, но фиксированному состоянию памяти Ь, а переменные из множества V представляют свои значения при этом состоянии памяти. Для памяти над областью D расширение языка базисных высказываний может быть выполнено путем расширения сигнатур & и П, а также добавлением констант из области D. В случае многоосновных алгебр данных может быть одновременно расширена и сигнатура а типов данных. Итак, предположим, что зафиксирован некоторый язык элементарных высказываний логики алгоритмов, предложения которого могут быть истинными или ложными в зависимости от выбранного состояния информационной среды. Элементарные высказывания могут также зависеть от параметров, пробегающих те или иные области значений, и тогда истинность высказываний зависит не только от состояния информационной среды, но и от значений параметров. Следующий уровень высказываний может быть построен с помощью идеи прогнозирования. Если Р — программа в некотором алгоритмическом языке, интерпретированном на информационной среде В, а а — элементарное высказывание, то можно рассматривать высказывание (Ра) = 1, которое истинно на состоянии информационной среды Ъ в том и только в том случае,.когда а истинно на состоянии ЬР. Это высказывание записывают также в виде [Р]а. Заметим, что из истинности высказывания [Р]а на Ъ следует, что действие программы Р на Ь определено. Высказывание [Р]а можно читать так: "Р останавливается и а после Р", Иногда полезно рассматривать более слабое высказывание, также связанное с прогнозированием: (Р)а. Это высказывание имеет следующий смысл: (Р)а истинно на состоянии Ъ тогда и только тогда, когда из того, что ЬР определено, следует, что а истинно на ЬР. Читается это высказывание так: "если Р останавливается, то а после Р". Таким образом, помимо операции прогнозирования Ра имеем . два способа образования прогнозирующих высказываний логики алгоритмов: строгое прогнозирование [Р]а и слабое прогнозирование (Р > а. Связь строгого и слабого прогнозирования с операцией прогнозирования может быть выражена следующими эквивалентностями: [Р]а «=> Ра = 1, {Р)а <==> Ра Ф 0. Применяя к прогнозирующим и элементарным высказывания пропозициональные связки, а также связывая кванторами параметры, от которых могут зависеть элементарные высказывания, получим новый уровень высказываний языка логики алгоритмов. Эти высказывания можно использовать для образования новых высказываний прогнозирующего типа и т.д. Описанный путь построения языка логики алгоритмов можно было бы описать более точно, зафиксировав язык для задания алгоритмического базиса. Мы этого здесь делать не будем, а ограничимся лишь рассмотре- 6. Ю.В. Капитонова 81
нием некоторых специальных видов высказываний, играющих важную роль в практических задачах. Высказывание языка логики алгоритмов называется тождественно истинным на В, если оно истинно при любых состояниях информационной среды В и при любых допустимых наборах значений свободных параметров, от которых зависит это высказывание. Тождественно истинные высказывания можно рассматривать как выражение свойств программ, которые в них входят. Язык логики алгоритмов можно строить и независимо от конкретной интерпретации, рассматривая только сигнатуру абстрактного алгоритмического базиса или алгоритмического базиса над памятью (возможно, с необходимыми расширениями). В таком случае можно говорить о тождественно истинных высказываниях как о высказываниях, истинных для любых состояний информационной среды, допустимых при произвольных интерпретациях алгоритмического базиса. На практике удобно фиксировать лишь некоторые свойства рассматриваемой интерпретации и говорить о тождественной истинности высказываний логики алгоритмов относительно класса интерпретаций, обладающих заданными свойствами. Рассмотрим высказывание вида <*=> [Р]А (5.1) где а и 0 - элементарные высказывания (не зависящие от программ); Р — программа, интерпретированная на В\ а и /3 могут зависеть от параметров. Высказывания вида (5.1) употребляются для определения понятия правильности программы относительно требований, которые к ней предъявляются. Условие а называется начальным условием, /3 - заключительным. Условия а и Р определяют требование к программе Р, выраженное высказыванием (5.1). Это требование состоит в следующем. Каковы бы ни были исходные данные, представленные начальным состоянием информационной среды Ь, если только выполняется начальное условие, то программа Р останавливается и на заключительном состоянии информационной среды ЪР выполняется условие 0. Иначе говоря, требование состоит в том, что высказывание (5Л) должно быть тождественно истинным. Программа Р9 удовлетворяющая условию (5.1), называется также правильной или корректной относительно условий а и 0. В некоторых случаях вместо условия (5.1) рассматривают более слабое условие а * <P>ft (5.2) которое называется свойством частичной корректности программы Р относительно условий а и 0. Для того чтобы программа была корректной, необходимо и достаточно, чтобы она удовлетворяла двум условиям — условию частичной корректности (5.2) и условию завершимости: а =* [Р] 1. (5.3) Разделение условия полной корректности на частичную корректность и завершимость оправдывается тем, что методы доказательства этих двух свойств различны. 82
Рассмотрим пример. Пусть/? - следующая программа: НАЧАЛО х :=а, у : =Ь\ ПОКА у - х > е ВЫПОЛНЯТЬ z:=(x+y)/2; w:=/(z); ЕСЛИ w <0 ТО х : = z ИНАЧЕ ЕСЛИ w>0 TO >>:=z ИНАЧЕ x:=z, y:=z KE КЦ; z :=(*+>;)/2. КОНЕЦ. Программа Р ищет приближенное значение одного из корней уравнения fix) = 0 на интервале [а, Ь]. Предполагается, что числовая функция / определена и непрерывна на интервале [а, Ь], а на его концах принимает значения разных знаков: f(a) < О, fib) > 0. Кроме того, е > 0. Эти предположения составляют начальное условие а. Заключительное условие 0 формулируется следующим образом: существует с такое, что а < с < Ь, fie) =0h|c-z|<6, т.е. z есть приближенное состояние одного из корней уравнения f(x) = 0. Докажем корректность программы Р относительно условий (а, 0). Программа R является регулярной программой и имеет вид R = Pi IQ)P2. 7 Здесь у <^=> У - х < е, смысл операторов ?ь Р2 и Q очевиден. Обозначим через а условие а <х <у <b, fix) <0, fiy) > 0. Рассматривая работу операторов Plf P2 и Q, нетрудно убедиться в справедливости следующих условий: а =* <Л ><*', а =* <<2>а', а => (Р2 >а\ Из второго условия следует также, что а =* <{Q))a. 7 Кроме того, очевидно, что < { Q) )у и <Р2 >а", где а" <=>х <z <y. По- 7 этому имеет место условие а =></?> 7 а а' л а", откуда вытекает частичная корректность программы Р. Действительно, 7 л а л а" => 0 в силу непрерывности функции /. 6* 83
Для доказательства завершимости программы R достаточно заметить, что после каждого выполнения оператора Q, который повторяется в цикле, разность у - х уменьшается вдвое, и поэтому через конечное число шагов она станет меньше е, что приведет к завершению цикла {(?}. Таким обра- 7 зом, программа/? корректна относительно условий (а, 0). Доказательство частичной корректности программы Р является частным случаем общего метода доказательства частичной корректности, который носит название метод Хоара. Идея этого метода состоит в сведении доказательства утверяодения типа (5.2) к доказательству некоторого количества элементарных утверждений. При этом предполагается, что программа Р представлена как регулярная программа и не содержит операции прогнозирования в условиях. Сведение осуществляется по правилам, соответствующим трем основным операциям алгебры операторов и вытекающим из следующих утверждений: <*=></>>7, 7=*<б>0 ,СА. - ; (5.4) a^(PQ)fi а лц=><Р)р, ал й =»(Q)g <*=*<(Pv 0>0 и а=>6, 8 л ц=»<Р>5, 5 л и =>0 а=*<{/>}>0 и (5.5) (5.6) Утверждения (5.4) —(5.6) представлены в форме правил вывода логики алгоритмов, и каждое из них означает, что если все высказывания, написанные над чертой, истинны, то истинно также и высказывание, написанное под чертой. Правила сведения противоположны правилам вывода и предписывают переходить от следствия к посылкам. Правило 1. Для того чтобы доказать утверждение вида a=*(PQ)f}, достаточно найти элементарное высказывание у такое, что а => (Р)у и 7=*<G>0. Правило 2. Для того чтобы доказать утверждение вида <х => =* ( (Р v Q) > 0, достаточно доказать посылки утверждения (5.5). и Правило 3. Для того чтобы доказать утверждение а => <{Р}>0, и достаточно найти условие 5, для которого можно доказать посылки утверждения (5.6). Условие 5, которое фигурирует в правиле 3, называется инвариантом цикла. Докажем утверждения (5.4) — (5.6). 1. Пусть верны посылки правила (5.4). Рассмотрим произвольное состояние Ь информационной среды. Предположим, что а(Ь) = 1 и bPQ определено. Тогда ЬР определено, и у(ЬР) = 1. Поскольку (bP)Q определено, то fi(bPQ) = 1. Доказано. 84
2,- Утверждение (5.5) доказывается аналогично путем рассмотрения двух случаев: и(Ъ) = 1 и и(Ь) =0. 3. Предположим, что имеют место посылки утверждения (5.6). Рассмотрим состояние Ь информационной среды такое, что а(Ь)= 1 кЬ{Р) и определено. Тогда 5 (Ь) = 1. Если и(Ь) = 1, то Ъ { Р) = Ъ и &(Ъ) = 1. В про- тивном случае существует такое п, что и(Ь) =и(ЪР) =..'.= и(ЪРп~1) = 0, и(ЪРп) = 1 иЬ{Р} = Ь/>л. Учитывая предположения, имеем 8(b) = . . . . ..=5(Ы,Л) =1,откуда |3(ЬРЛ) =1. Доказано. Применяя правила сведения 1 - 3 к произвольной регулярной программе Р и условиям ее корректности (а, 0), получим, что для доказательства утверждения а => (P)fi достаточно доказать некоторое множество элементарных утверждений и утверждений типа и => (у )v (где у — базовый оператор, и, v - элементарные высказывания). Если высказывания вида (y)v эквивалентны элементарным высказываниям, то доказательство утверждения о частичной корректности полностью сведено к доказательству элементарных утверждений. Такое сведение, в частности, возможно для схем программ над памятью с операторами присваивания в качестве базовых. Действительно, если>> = (v i: = t lf,.. f vn: = tn\ то (у >|3(y i,..., vn)*=> *=* 0(?i,..., tn). Поэтому для операторов присваивания имеет место правило вывода a=><ui : = fb ...,u„ : = f„>0(ui,.. • ,"„) и соответствующее правило сведения: Правило 4. Для доказательства утверждения а => ( (и! : = f i, . . . • • • » vn '- = tn))$(vu . . . , vn) достаточно доказать, что a=>0(f i,..., tn). Сделаем некоторые замечания относительно действий "с числовыми данными. Хорошо известно, что операции над вещественными числами в реальной вычислительной машине выполняются приближенно. Поэтому все рассуждения о корректности программы R имеют смысл только для идеальной машины с точными вычислениями. Разумеется, такие вычисления можно промоделировать на любой универсальной машине, однако в большинстве практических задач предполагается, что арифметические операции, реализованные аппарахно, выполняются приближенно. В этом случае обоснование корректности программы/? неправомочно. Она вообще не будет корректной относительно (а, 0), хотя при некоторых достаточно сильных ограничениях на функцию / программу все же можно использовать. Как же поступать для доказательства свойств приближенных числовых программ? Есть два возможных подхода. Первый подход состоит в том, что арифметические операции интерпретируются на конечной области чисел, которые могут быть представлены в рассматриваемой машине, и обозначают именно те операции, которые в ней реализованы. Недостатком такого подхода является то, что теряются основные свойства этих операций — даже такие, например, как коммутативность, ассоциативность и тем более дистрибутивность. Теряют смысл также любые рассуждения, связанные с непрерывностью. 85
Другой подход состоит в том, что все арифметические операции сохраняют свой первоначальный математический смысл, и интерпретируются на области вещественных чисел, но свойства оператора присваивания, выраженные общим правилом (5.7), трансформируются с учетом приближенного вычисления выражений ti9 . . . , tn. Действие приближенного оператора присваивания может быть охарактеризовано следующим основным свойством: щ =*! л ... *vn=xn л а0(хи...,хп)=> 3(e!,...,ew), |e1|<61 л ... • • • л I еп | <5Л л [Vl : = tiiv),..., vn : = tn(v)] (Vi = t^x) + €г л ... ..л vn=tn(x) + en). (5.8) Здесь х = (jCi, ..., xn) — произвольный набор чисел, v = (ul9..., vn). Условие <Xo(xlf ..., xn), которому должны удовлетворять числовые значения переменных vi9 ..., vn, а также значения констант 5i, ..., 5Л зависят от структуры выражений ti9 ..., tn, В частности, если tt есть просто переменная, то естественно считать, что ее значение передается точно и 5,- = 0. Условие а о определяет диапазоны возможных значений хг,,.., х~ и обычно выражается в виде системы неравенству которых фигурируют наибольшее и наименьшее из чисел, представимых в рассматриваемой машине. Вместо абсолютных оценок погрешностей, разумеется, могут быть использованы более точные относительные оценки. В соответствии с рассмотренным основным свойством приближенного присваивания правило (5.7) должно быть теперь заменено более общим правилом: а^«о(Ц1,...,^)лУ(еь..^ а=>[У! :=fi(u), ..., vn :=r„(y)]j3(u1, ... , vn ) ' Разумеется, квадратные скобки могут быть заменены угловыми. Справедливость правила (5.9) непосредственно вытекает из условия (5.8). Действительно, пусть у = (vx : = tx (и), ..., u„: = tn(v)) и посылка правила (5.9) имеет место. Рассмотрим произвольное состояние памяти Ь, на котором истинно условие а. Пусть в состоянии Ь переменные vi9 ..., vn имеют значения xi9 ..., хп соответственно. Из а следует a0(xl5 ..., х„), откуда в состоянии by переменные vt,..., vn примут значения tx (x) + в!,... ..., tn(x) + еп соответственно для подходящих ег,..., еп. Тогда по предположению условие $(t! (jc) + ei, ..., tn (jc) + en) истинно и, следовательно, в состоянии by истинно условие ]3(и х,..., v n), что и требовалось. В случае точных вычислений 5Х = ... = 8п = 0, и основное свойство присваивания превращается в свой частный случай: Щ^х1,...9ип=хп^[(щ : = Г1(у),...,^1: = ГЛ(у))](и1=Г1(х),...,уЛ = гЛ(х)). Пусть у = (vt : = fi(u), ..., vn: = tn(v)) и у' = (их : = rj(u), ... • • •, у л •= t'n (у )) — два оператора присваивания. В случае точных вычислений существует оператор присваивания z такой, что z = уу%\ В качестве z можно взять оператор z =(ux :=t[(ti(v), ..., tn(v)),..., vn : = fi(fi (и),... ..., tn(v))). Композиции присваиваний удобно использовать для доказа- 86
тельства корректности бесцикловых программ. При этом бесцикловую программу удобно приводить к канонической форме вида ( Рх v ( Р2 v ... ... v ( Рп v Рп+\) ••• )), где Pl9 ..., Pn+i - произведения присваиваний. «я Доказательство корректности такой программы сводится к разбору случаев (ах = 1, ах = 0 л а2 = 1, ..) и доказательству корректности для присваиваний. Заметим, что условия ах, ..., ап не содержат операции прогнозирования, поскольку она исключается применением соотношения (vx :=*!,..., vn :=ОФ1 ул) = <*0i, •••, '*)• В случае приближенных вычислений дело обстоит несколько сложнее, поскольку произведение уу уже нельзя заменить одним присваиванием. Однако можно воспользоваться следующим свойством: vx = хх л ... лим=х„ =* 3 (е1э ...,ея, ej еД) | et I < < Ъх л ... л | еп | < 6„ л | е[ \ < д\ л ... л | е'п | < b'n л vx = = t[(tl +€!,..., Г„ +€„) + €i Л...ЛУЛ =^(Г! + €i , ..., tn + €п) + 6^ . Это свойство и соответствующая модификация правила (5.9) легко обобщаются на произведение любого числа операторов присваивания и могут быть использованы при доказательстве утверждений о программах с приближенными вычислениями. В качестве примера рассмотрим программу R9, которая так же, как и R, ищет корень уравнения f(x) = 0, но с учетом приближенных вычислений. Программа R имеет следующий вид: НАЧАЛО х : = а, у :=&; z:=(x+;>)/2; ПОКА \w | > е ИЛИ у - х > е ВЫПОЛНЯТЬ ЕСЛИ w < -€ ТО jc: = z ИНАЧЕ ЕСЛИ w > е ТО y:=z KE; z:=(x+>0/2; КЦ; zi :=(z+>>)/2; w: = /(zi); ПОКА | w | > e ИЛИ у - z > e ВЫПОЛНЯТЬ ЕСЛИ w > e TO y: = zx KE; *i :=(z+>0/2; w:=/(*i); КЦ; zx :s(jc+z)/2; w: = /(zt); ПОКА |w| < -e ИЛИ z-x > e ВЫПОЛНЯТЬ 87
ЕСЛИ w < -е ТО x: = zx KE; zx : = (z+x)/2; w: = /(z!) КЦ. КОНЕЦ. Программа /?' представляется регулярным выражением Rf = Рг{ Qx) X ^ ^2 ( йг)Ръ i йъ ) • В первом цикле интервал [я, Z>], в котором находит- ся искомый корень уравнения f(x) = 0, сокращается путем последовательного деления пополам. Цикл кончается, если интервал [jc, у] стал меньше е или внутри его функция принимает значения, близкие к 0, и знак этих значений не может быть точно определен. Два следующих цикла делают попытки дальнейшего сокращения интервала путем уменьшения его правой границы и увеличения левой границы. Начальное условие а для программы R9 содержит ту же самую информацию, что и начальное условие Для R, и, кроме того, некоторое условие а0(а,Ь)у которое является Достаточным для возможности вычисления приближенного значения f(x) в любых точках jc этого интервала. Заключительное условие /J для программы R9 существенно ослабляется. Мы можем доказать только, что после выполнения программы R внутри интервала [х, у] существует такое с, что f(c) = 0. Доказательство корректности программы R существенным образом опирается на правило (5.9), заменяющее теперь (5.7). Применительно к конкретным операторам, используемым в программе R , будем считать, что <z:=(x+>>)/2> (^(х+дО/г + б!), <w: = /(z)> (w = /(z) + e1) Для некоторого ei такого, что | ех | <е0 • Предполагается, что константа е, Используемая в программе, удовлетворяет неравенству Ъ — а> е и что в > 2 е0. Для применения метода Хоара достаточно найти инварианты трех Циклов — «i, а 2 и а3 соответственно — и доказать следующие утверждения: а =► (Рх > <*!, 7i л с*! => {Qx >«!, 7i л ах => (Р2)<*г, у2 л а2 => (Q2 )а2, 72 л а2 => (Р3 ><*з, 73 л <*3 => <(?з> <*з, 7з л <*3 => 0. Заметим, что при таком подходе фактически отсутствуют промежуточные условия для произведения, поскольку в качестве таких условий 88
используются инварианты циклов. Это общий прием, который вместе с приведенными выше соображениями о доказательствах корректности бесцикловых программ показывает, что искусство применения метода Хоара состоит прежде всего в отыскании инвариантов циклов. < Для рассматриваемого примера инварианты могут быть определены следующим образом. Все инварианты аг, а2, а3 содержат условие а#, использованное для доказательства корректности программы R: на концах интервала [х,у] С [а,Ь] функция / принимает значения разных знаков, f(x) < 0, f(y) > 0. Условие аг включает в себя также условия | z - (х + у) 12 | < е0 , I f(z ) — w | < е0. Условие а2 включает неравенства х< z < zx < у, \zx - (х +у)/2 I < e0, I f{zx) - w | < е0,аа3 - неравенства х < zx <у, \ zx - (x + z)/2 I < е0, I /(zi) -w|<e0. Докажем, например, что 71 Л <*i =><Qi > <*i • Предположим, что yx л ах, и рассмотрим два случая. 1. w < — е. Тогда Qx эквивалентен последовательности присваиваний (jc: = z, z := (х + у)\2\ w: = /(z)). Доказательство условия 7i Л <*i =* =* <Qi > <*i сводится в этом случае к доказательству утверждения 7i a ax(x,y,z, w)=>ax (z,y9(x+y)l2 + ex,*f((x +у)/2 +ех) + е2)) для произвольных ех и е2 таких, что |6i |, |е2 I <£0> или, выписав явно все условия, получим, что требуется доказать импликацию п<-€ь(\п\>€у/у-х>е)иа<х<у<Ь/ь/(х)<0ь/(у)>0А л | z - (х +у)/2 | < е0 л | /(z) -w\<e0=>a<z<y<bib ^f(z)<0^f(y)>0^\(x+y)|2+€l ~(х +у)/2 \< е0 л *\f((x+y)l2 + €x)-f((x+y)l2 + €x)-€2\ < е0. Доказательство тривиально и предоставляется читателю. 2. w > е. Доказывается аналогично. Все остальные условия также получают тривиальные доказательства после сведения их к элементарным. Метод Хоара применяется для доказательства корректности регулярных программ. Для программ, представленных в виде схем, применяется другой метод, называемый методом Флойда. Пусть А — детерминированная £/—Ксхема программы, интерпретированная на В, Рассмотрим путь "i/^i "а/У* ищ/Ут р = ах ► а2 ► ... > <*т+1- Сопоставим пути р условие а(р) и оператор у(р), определив их следующим образом: У(Р) = Ух ... Ут, <M» = "lA <У\ >"2 *<УхУ2 )u3h...h{yx ... ут_х )ит. Очевидно, что у(р) — это оператор, который выполняется при прохождении пути р, а а(р) — условие, которое истинно тогда и только тогда, когда программа А пройдет по пути р из состояния ах. 89
Метод Флойда применяется для доказательства утверждения вида а => (fA > 0 и состоит в следующем. В множестве А состояний схемы программы выбирается подмножество С = А, элементы которого называются контрольными точками. Множество С должно содержать начальное и заключительное состояния схемы. Путь р называется контрольным, если он начинается и оканчивается в контрольных точках, но ни одно из промежуточных состояний не принадлежит множеству С. Множество контрольных точек выбирается таким образом, чтобы любые две контрольные точки соединялись не более, чем конечным числом контрольных путей. Каждому состоянию а Е С ставится в соответствие некоторое условие у (а), называемое инвариантом состояния а. Далее строятся условия, называемые условиями корректности схемы А. Каждое условие корректности соответствует начальному или заключительному состоянию либо паре контрольных точек. Начальному состоянию я*0* соответствует условие а => у (а *°) ), заключительному — условие у (а *1 * ) => 0. Паре контрольных состояний а9 а' соответствует условие р а—+ а' где дизъюнкция берется только по контрольным путям. Теорема (Флойда). Если условия корректности схемы А истинны, то схема А частично корректна. Действительно, пусть /а(Ь) определено и ct(b) = 1. Тогда существует путь р такой, что а*°* -* а^у\ а(р) = 1 на b и /a(b) = b' = Ьу(р). Путь р может быть разложен единственным образом в последовательную композита Pl Pl Pm (\\ * цию контрольных путей: ау '—► ах—>а2 -*...—► am =aK }. В моменты прохождения контрольных точек я*0', а\, ..., ат =а^1^ информационная среда находится в состояниях b = b0, ЬЛ, ..., bm = b1, где bj + \ = = ^J>(P/) О' = 0,...,/и- 1). Покажем индукцией по / = 0, 1, ..., что 7(^/) = 1 на состоянии bt. у(а^) = 1, поскольку а =>у(а^). Пусть у (а;) = 1 на bt. По условию корректности y(af) л а(р{) =* <j>(p/)> у (а{ + 1), откуда y(ai + i) = 1 на bi + i. Наконец, поскольку у(а^1^) => 0, получаем, что p(b') = 1. Теорема доказана. Поскольку регулярную программу всегда можно представить в виде схемы, метод Флойда применим и к регулярным программам, В некоторых случаях его удобнее применять, чем метод Хоара. § 6. Параллельные алгоритмы Наиболее общая модель параллельных вычислении — это многоуровневая многокомпонентная система. Она может быть настроенной, если используется в качестве модели параллельной программы, или ненастроенной, если используется в качестве модели вычислительной системы или компо- 90
нент общесистемного математического обеспечения. Многокомпонентная система может иметь также переменную структуру, т.е. менять время от времени число компонент на различных уровнях. В процессе функционирования компоненты выполняют вычисления над данными, расположенными в них, а также взаимодействуют с другими компонентами, порождая вычисления над распределенными данными. Многоуровневая иерархия компонент определяет их организацию и распределение функций по управлению, вычислениям, перемещениям данных и перестройке различных частей системы в процессе решения данной задачи или совокупности задач. Для того чтобы иметь возможность удобного описания различных конкретных классов многоуровневых систем, рассматривают различные специальные способы организации взаимодействия компонент в таких системах. Проще всего взаимодействие организуется в сетях из автоматов. При синхронной работе сети считается, что изменения состояний входных компонент происходят мгновенно и достаточно редко для того, чтобы внутри сети успевали закончиться все переходные процессы. Сети из автоматов применяются обычно для описания проектируемой аппаратуры. Выполнение указанных условий обеспечивается, например, с помощью генераторов тактовых сигналов, разрешающих реакцию на входные воздействия после окончания их изменения. Тактовая частота является основным параметром, характеризующим быстродействие аппаратуры. Использование асинхронных сетей из автоматов требует их усложнения для обеспечения детерминированности на уровне моделей более высокого уровня, но позволяет добиться лучших временных характеристик. Алгоритмическое описание взаимодействия устройств и программ требует перехода от синхронного описания функционирования сетей к асинхронному. Действительно, время в различных компонентах протекает по-разному, поскольку количество тактов, которое затрачивается на один переход, зависит от реализации действий, совершаемых на этом переходе. Лишь для некоторых переходов требуется, чтобы они происходили быстрее, чем изменение состояния некоторых входных сигналов. Например, автомат, управляющий устройством ввода-вывода или внешним запоминающим устройством, инициирует работу этого устройства, посылая управляющий сигнал, после чего на его вход подается с определенной частотой последовательность сигналов. Эти сигналы необходимо принять и запомнить, или следует произвести некоторую их обработку в реальном масштабе времени. Очевидно, что переход из очередного состояния ожидания поступления сигнала с внешнего устройства в следующее состояние ожидания должен произойти до того, как поступит новый сигнал. Асинхронное взаимодействие компонент удобно представлять с помощью сетей из алгоритмических модулей. Алгоритмический модуль — это дискретный преобразователь над памятью, информационная среда которого кроме собственной внутренней памяти включает в себя дополнительные компоненты, выполняющие особые функции и предназначенные для описания взаимодействия модулей между собой. К ним относятся входные и выходные компоненты и общая память. Все эти компоненты называются внешними. Если их структурно объединить в одну внешнюю компоненту, то получится, что алгоритмический модуль структурно изоморфен трех- 91
компонентной системе, состоящей из управляющей компоненты, внутренней памяти и внешней компоненты. Входные и выходные компоненты устроены так же, как и обычная память, т.е. состоят из переменных, каждая из которых имеет свою область значений, однако базис операторов и условий определен таким образом, что управляющая компонента, как правило, только изменяет, но не использует выходные переменные и использует, но не изменяет значения входных переменных. Кроме того, будем рассматривать некоторые дополнительные характеристики входных и выходных переменных. Будем различать переменные с памятью и без памяти, с простыми очередями и ветвящимися очередями. Переменные с памятью меняют свои значения так же, как и переменные обычной памяти, т.е. в результате выполнения операторов присваивания. Некоторые из выходных переменных с памятью могут быть одновременно и внутренними. В этом случае модуль может не только изменять, но и использовать значения этих переменных. Переменные без памяти перевычисляются на каждом такте работы алгоритмического модуля с помощью функции выходов у = \р (а, Ъ9 х), заданной для каждой выходной переменной .у. Эта функция зависит от состояния а управляющей компоненты модуля, состояния памяти Ъ (внутренней и общей), а также от состояния jc входных переменных, исключая переменные с очередями. Переменная с простой очередью принимает в качестве значений последовательности, составленные из элементов некоторой области D. Изменение значения переменной с очередью х происходит при выполнении операторов ПЕРЕДАТЬ у В х и ПРИНЯТЬ у ИЗ х. Первый оператор применяется в алгоритмическом модуле, для которого эта переменная является выходной, второй — в алгоритмическом модуле, для которого эта переменная входная. Если х = dx .~dni то после выполнения оператора ПЕРЕДАТЬ у В х она получит значение dx ...dndn+i, где </w+i есть значение выражения у в текущем состоянии памяти. В операторе ПРИНЯТЬ у ИЗ х у есть переменная. В результате выполнения этого оператора новым значением х будет d2 ...dn, а новым значением переменной у — значение dx. Если п = 1, новым значением х будет пустая последовательность е (ed = d). Если jc = e, то оператор приема выполняется как оператор ожидания момента, когда х станет непустым, после чего будет выполнен прием. В условном операторе прием и передача по времени не совмещаются с проверкой условия. Это значит, что оператор ЕСЛИ и ТО ПРИНЯТЬ... КЕ выполняется как последовательность из двух операторов: ЕСЛИ и ТО НА / КЕ; /: ПРИНЯТЬ ... . Переменная с ветвящейся очередью может быть использована в качестве общей входной переменной для нескольких алгоритмических модулей. При этом оператор ПРИНЯТЬ не отбрасывает первый элемент очереди, а лишь продвигает данньш модуль по очереди для того, чтобы'при следующем выполнении оператора ПРИНЯТЬ был принят следующий элемент очереди. Первый элемент очереди х отбрасывается лишь после того, как он был принят всеми модулями, для которых х есть входная переменная. 92
Сети из алгоритмических модулей получаются так же, как и сети из автоматов, — путем отождествления некоторых внешних компонент. Отождествления должны удовлетворять следующим условиям корректности. 1. В каждом классе отождествленных компонент лишь одна выходная, а все другие входные, либо все входные, либо все переменные общей памяти. 2. Если в классе отождествленных компонент одна выходная, то ее область значений содержится в областях значений всех других, и все они имеют одинаковые характеристики (с памятью, без памяти и т.д.). 3. Если в классе отождествленных компонент все входные, то они имеют одинаковые характеристики и области значений: 4. Если в классе отождествленных компонент все общие, то они должны иметь одинаковые области значений. Понятия открытой, полуоткрытой и замкнутой сети из алгоритмических модулей вводятся аналогично тому, как это было сделано для сетей из открытых систем. При этом следует только учесть, что для определения этих понятий кроме входных и выходных переменных следует использовать также понятия переменных общей памяти, которые играют роль одновременно как входных, так и выходных переменных. Кроме того, переменные с очередями ведут себя не как свободные компоненты, а изменяют свои значения определенным образом. А именно, если х есть входная компонента сети, то в произвольный момент времени ее значение может измениться только путем добавления к очереди нового элемента или удаления первого при выполнении оператора ПРИНЯТЬ в одном из модулей. Таким образом, сеть из алгоритмических модулей сама может рассматриваться как алгоритмический модуль и использоваться для построения многоуровневых сетей. Замкнутая сеть из алгоритмических модулей может рассматриваться как дискретньш преобразователь, если выделить информационную компоненту и определить настройку. Открытая сеть также может рассматриваться как дискретный преобразователь, если она не имеет входных и выходных переменных без памяти, а значения очередей и общей памяти изменяются только самой сетью. В случае открытой сети нас может интересовать ее взаимодействие с некоторой внешней средой, представленной своей дискретной моделью. В этом случае основная характеристика сети есть проекция композиции сети и внешней среды на внешнюю среду и внешнюю компоненту сети. Для того чтобы уточнить правила функционирования сети из алгоритмических модулей, предположим, что управляющая компонента каждого модуля представлена U— Ксхемой программы над памятью. Базис (U, Y.) является базисом операторов и условий над памятью данного модуля и, разумеется, зависит от этого модуля. Базис операторов Y кроме операторов над памятью содержит операторы обращения к очередям. Для каждого оператора Р € У и для каждого состояния Ь информационной среды модуля М заданы множества \п(Р9 Ь) и Out(/>, Ь) переменных. Множества In и Out определяют переменные, которые оператор ^.использует и вырабатывает соответственно. Зависимость множеств In и Out от 93
текущего состояния Ъ информационной среды необходимо учитывать при работе с массивами и другими видами памяти косвенным именованием. Схема может быть недетерминированной или частично определенной. Состояние сети есть набор состояний ее компонент, включая состояния входных и выходных компонент и общей памяти сети. Для сети задана система равенств, определяющих связи (отождествление компонент). р Рассмотрим произвольное текущее состояние Ь сети. Переход а —► а9 называется выполнимым, если и(Ь) = 1 или и = 1 (независимо от текущего состояния сети), Р есть оператор приема из входной очереди х (значение х отлично от е). В состоянии а управляющая компонента каждого модуля определяет некоторое множество выполнимых переходов, либо находится в заключительном состоянии, либо находится в тупиковом состоянии, т.е. в таком состоянии, что все условия всех переходов для этого состояния либо ложны, либо не определены. Если все модули находятся в заключительном состоянии, считаем, что сеть перешла в заключительное состояние. Если хотя бы один модуль находится в тупиковом состоянии, считаем, что вся сеть находится в тупиковом состоянии. Пусть текущее состояние сети не является ни заключительным, ни тупиковым. Рассмотрим на множестве переходов отношение совместимости. Два перехода совместимы, если операторы, соответствующие этим переходам, не изменяют одновременно одну и ту же переменную общей памяти и не используют одновременно оператором ПРИНЯТЬ одну и ту же переменную с простой очередью (все это с учетом отождествлений, определяемых связями). Переход в следующее состояние происходит в два этапа. На первом этапе выполняются некоторые из переходов, на втором определяются значения переменных без памяти. Операторы Р' и Р" модулей М' и М" соответственно называются совместимыми относительно состояния Ь информационной среды сети, если Out(P', Ь1 )ПОи£(Р",й")==0, где Ь и b" — компоненты информационной среды, соответствующие модулям М' и М"9'к 1п(Р', Ъ' )П1п(Р", Ь")"не содержит переменных с простыми очередями (все это с учетом отождествлений, определяемых связями). Если сеть имеет общую память, то для выполнения первого этапа выберем сначала произвольным образом оператор Q0 = (yi:=c/b ... ..., vm : = dm)> изменяющий переменные v t,..., v m общей памяти, и выберем операторы Q\, Q2,..., изменяющие некоторые из входных и выходных переменных сети с очередями. Выберем теперь некоторое множество выполнимых переходов так, чтобы операторы Р%9 Р2,..., определенные этими переходами, вместе с оператором Q0 были попарно совместимы. Выполним все выбранные операторы. Первый этап выполнен. Для выполнения второго этапа определим сначала произвольным образом значения входных переменных без памяти для всей сети и рассмотрим систему уравнений v =y(at b, x), определяющих значения выходных переменных без памяти для компонент сети. Если эта система имеет решение, то возьмем это решение в качестве нового состояния выходных переменных компонент. Если решения нет, то переход не определен. Модули, для 94
которых были выполнены переходы в данный момент времени, называются активными. Остальные модули называются задержанными. К описанным правилам можно добавить еще одно: ни один модуль не может быть задержанным бесконечно долго. Впрочем, это дополнение существенно лишь в случае, если нас интересует рассмотрение бесконечных процессов. Состояние а модуля называется состоянием ожидания, если имеет- ся переход а ► а и условие и истинно. Если все модули замкнутой сети находятся в состоянии ожидания, то такое состояние также назьюается тупиковым. Из тупикового состояния выйти невозможно. Очевидно, сеть из алгоритмических модулей, вообще говоря, является недетерминированной системой, даже если все модули управляются детерминированными схемами программ, а сеть замкнута. Основным источником недетерминизма является произвол в выборе модулей, которые реализуют свои переходы на некотором шаге. Если замкнутая сеть из алгоритмических модулей используется для реализации однозначного преобразования, то важным свойством сети является ее глобальная детерминированность. Источники глобальной недетерминированности — общая память и входные переменные, за исключением ветвящихся очередей. Действительно, если два модуля вырабатывают значение некоторой переменной из общей памяти, результат зависит от того, какой из них сделает это раньше. Очередное изменение значения переменной с памятью может произойти раньше, чем предыдущее значение будет использовано. Наконец, если простая очередь является входом одновременно для нескольких модулей, то один из них может прочесть и, следовательно, удалить очередное значение из очереди раньше, чем другой. Интересная модель глобально детерминированной системы получается, если ограничиться рассмотрением входных и выходных переменных с простыми очередями без ветвлений, т.е. каждый выход соединен не более чем с одним входом. Такие сети будем называть простыми асинхронными сетями. Теорема 6.1. Простая асинхронная замкнутая сеть из алгоритмических модулей, управляемых детерминированными схемами программ, глобально детерминирована. Справедливость этого утверждения достаточно очевидна, но мы рассмотрим его доказательство для демонстрации общего метода. Рассмотрим сначала важное понятие коммутативного отношения. Отношение а -+ а' на множестве А назовем коммутативным, если из л->а' ид -*д" вытекает существование такого Ъ Е А, что а1 -* Ъ и а" -* Ь. Это условие можно также изобразить в виде коммутативной диаграммы: а ^а! \, 1 а" ^Ь Лемма 6.1. Рефлексивно-транзитивное замыкание коммутативного отношения коммутативно. 95
Доказательство получается заполнением коммутативной диаграммы: а —► а± —*»... —► ап = а' i j ■ J | I I В случае же, если an = bm, имеем коммутативную диаграмму: в *~а Докажем теперь теорему 6.1. Пусть S — сеть, удовлетворяющая условиям теоремы. Рассмотрим произвольное состояние s сети 5, и пусть Т — множество всех выполнимых переходов этой сети. Выберем произвольным образом Т' С Т. Очевидно, операторы, порождаемые всеми переходами из Г', совместимы. Выполнив их, получим новое состояние сети s': s -+ sf. Пусть Т" С Т — другое подмножество множества Т. Выполняя переходы из Г", получим состояние s" : s -+ s". В состоянии s' все переходы множества Т\ Т' останутся вьшолнимыми, так же как и все переходы множества Т\ Т" в состоянии s". Но тогда, если sf -> s'" путем выполнения переходов множества Т" \ Т\то s"-*s'" путем выполнения переходов множества Т' \ Т". Таким образом, отношение непосредственных переходов коммутативно и по лемме 6.1 будет коммутативным и его рефлексивно-транзитивное замыкание, т.е. отношение достижимости. р я Поэтому если s ->s' и s -* s" — два терминальных процесса, то s' = s" . Теорема доказана. Частным случаем простых асинхронных сетей является сеть, в которой любые два модуля Mt и Mj связаны очередью *# (выходной для Мt и входной для Mj). В этом случае в операторах приема и передачи вместо имен каналов можно обращаться к именам модулей. Например, вместо ПРИНЯТЬ у ИЗ хц можно писать ПРИНЯТЬ у ИЗ Mj. Такая модель соответствует взаимодействующим процессам Хоара. При работе с моделями рассмотренного типа следует соблюдать осторожность. Так, например, для работы с очередями удобно иметь возможность пользоваться условием х = е, где х — входная переменная с очередью. Уже одно это обстоятельство может нарушить глобальную детерминированность, поскольку оператор ЕСЛИ х = е ТО Р ИНАЧЕ Q КЕ является недетерминированным, и эта недетерминированность может повлиять на окончательный результат. 96
Рассмотренный набор средств взаимодействия параллельных процессов, протекающих в сетях из алгоритмических модулей, является в некотором смысле избыточным. Одни из них могут быть выражены через другие. С другой стороны, рассмотренный набор средств дает возможность программировать более сложные средства взаимодействия параллельных процессов. Рассмотрим некоторые из таких конструкций. Ветвящиеся очереди можно заменить простыми очередями, вводя для каждой ветвящейся очереди дополнительный модуль. Пусть, например, z есть выходная ветвящаяся очередь некоторого модуля сети S, связанная со входами хг, ..., хт некоторых других модулей. Введем новый модуль М, который имеет одну простую входную очередь хит выходных J>l>-> Ут- Алгоритм работы модуля М имеет вид ПОКА а ВЫПОЛНЯТЬ ЕСЛИ z Ф е ТО ПРОЧИТАТЬ z В и; ДЛЯ / := 1 ДО/и ВЫПОЛНИТЬ ЗАПИСАТЬ и В yt КЦ КЕ КОНЕЦ ЦИКЛА. Условие а используется для того, чтобы можно было прекратить, если это нужно, работу модуля М. Теперь в сети S переменные z, хг,..., хт можно заменить простыми очередями, разорвать между ними связи и добавить модуль М, связав его с компонентами данной сети связями z = x и ух = xl9 ..., ут = хт . Для того чтобы сохранить неизменной функциональную модель сети 5, т.е. вычисляемую ею функцию fs (предполагается, что S есть дискретный преобразователь), необходимо обеспечить прекращение работы компоненты М после того, как все остальные перешли в заключительное состояние. Для этого можно ввести общую переменную р, значение которой в начальный момент времени всегда равно 0, а в каждый модуль добавить в конце оператор р: = р + 1. Если п — общее число модулей в исходной сети, то в качестве условия а. следует взять условие р< п. Ограничения реализации могут потребовать использования очередей ограниченного объема. Этого можно добиться, если для каждой очереди использовать переменную общей памяти, хранящую в произвольный момент времени число элементов, находящихся в очереди (счетчик очереди). Каждая передача в очередь должна сопровождаться увеличением этого числа, а каждый прием — уменьшением. Если число элементов в очереди превышает заданный порог, то модуль, который пытается передать данные в очередь, должен ждать уменьшения числа элементов очереди. Частным случаем является очередь длины 1. В этом случае счетчик принимает лишь два значения - 0 и 1, а сама очередь превращается в переменную с памятью (входную или выходную). Переход от сети с неограниченными очередями к сетям с ограниченными очередями, ^вообще говоря, сокращает область определения функции, вычисляемой сетью, поскольку могут добавиться тупиковые состояния, связанные с ожиданием освобождения места в очереди. 7. Ю.В. Капитонова 97
Сети из алгоритмических модулей сохраняют свою структуру на протяжении всего времени их функционирования. Во многих случаях естественным образом возникают модели параллельных вычислений с переменной структурой. Простейший способ введения переменной структуры — порождение параллельных ветвей внутри одного алгоритмического модуля. Для этой цели расширим понятие перехода. Вместо простого перехода а *а будем рассматривать параллельный переход а—*al9 ..., ат. Интерпретация схемы (вернее, ее базиса) определяется так же, как и для обычных схем программ, но функционирование определяется иначе. А именно, состояние интерпретированной параллельной схемы программы А — это пара ( (a i, ..., а т ), Ь), где а х,..., а т Е A, bGB - состояние информационной среды (внутренняя и внешняя компоненты алгоритмического модуля). Переход в следующее состояние определяется так, как если бы на общей информационной среде действовали т экземпляров одного и того же алгоритмического модуля. А именно, для того чтобы выполнить переход в новое состояние ({а\,..., а\ ), bf), необходимо сделать следующее. Выбираем множество Т выполнимых переходов для состояний a i,..., am так, чтобы выполнялись следующие условия: 1. Все операторы переходов множества Т попарно совместимы. 2. Операторы приема из входных переменных с очередями применяются только для непустых очередей. После того как Т выбрано, выполняем все операторы, получая новое состояние информационной среды Ъ\ Новый вектор (а[, ..., а\ ) состояния управления получается следующим образом. Если переход и jP а{ —► д/ , ..., aifc попал в множество Г, то состояние я,- заменяется на вектор (aii, ..., а^к). После подстановки вместо всех состояний соответствующих векторов скобки опускаются, чтобы получить одноуровневый вектор. Если среди новых состояний имеются заключительные, то они вычеркиваются. Если же все новые состояния оказались заключительными, то весь вектор заменяется одним заключительным состоянием. Заметим, что параллельная схема программы фактически эквивалентна некоторой последовательной схеме, в которой параллелизм выражается в терминах групповых операторов. Другой тип изменения структуры сети из алгоритмических модулей в процессе ее функционирования может быть представлен понятием управляемой сети из алгоритмических модулей. Формально это дискретный преобразователь, информационная компонента которого представляет собой сеть из алгоритмических модулей. В состав информационной компоненты могут также входить и другие компоненты, например память. Часть этой памяти может быть внешней компонентой данной сети. Управляемая сеть может быть также алгоритмическим модулем с внешней компонентой. Такая точка зрения на управляемую сеть позволяет ввести ряд операторов, с помощью которых можно изменять структуру и поведение сети в процессе ее функционирования. Если модули, из которых построена сеть, настроены, то каждый из них-при переходе в заключительное состояние останавливается. Если все модули сети перешли в заключительное 98
состояние, т.е. сеть закончила работу, она может быть вновь запущена оператором установки некоторых модулей в определенное начальное состояние. Работа сети может прерываться и возобновляться. Изменение структуры состоит в добавлении или удалении новых компонент и связей. В управляемых сетях из алгоритмических модулей можно получить различные варианты алгоритмов функционирования сетей, рассматривая конкретные методы выбора реализуемых переходов на каждом шаге функционирования сети. В управляемых сетях возможно реализовать также различные глобальные механизмы управления и синхронизации, зависящие от свойств состояния сети в целом в отличие от механизмов локального управления и синхронизации, которые определяются в результате попарного взаимодействия модулей. Один из таких механизмов реализуется в синхронизированных сетях, устроенных следующим образом. В управляющей компоненте каждого модуля выделяется множество синхронизируемых состояний. Если некоторый модуль попадает в такое состояние, он остается в нем до тех пор, пока все модули сети не перейдут также в синхронизированное состояние. Таким образом, процесс функционирования синхронизированной сети распадается в последовательную композицию процессов, называемых сегментами синхронизации. В конце каждого сегмента синхронизации каждый модуль сети находится либо в синхронизированном, либо в заключительном состоянии. В качестве алгоритмического языка для описания сетей из алгоритмических модулей можно использовать язык A3 со следующим примерным синтаксисом: ( АЗ-программа >:: = СЕТЬ (имя >; < описание внешней компоненты сети >; < список описаний модулей >; < список связей > КОНЕЦ. < описание модуля >:: = МОДУЛЬ < имя >; (описание информационной среды модуля > < оператор > КОНЕЦ МОДУЛЯ (связь >:: = (входная переменная модуля > = < выражение > Язык может расширяться разнообразными средствами для описания семейств модулей и связей, зависящих от параметров. Комментарии к главе 2 Первые подходы к построению и изучению математических моделей программ были найдены А.А.Ляпуновым [66] и его учеником Ю.И.Яновым [80], которые заложили основы теории схем программ. Ю. И. Янов впервые ввел отношение эквивалентности (равносильности) абстрактных схем программ и доказал алгоритмическую разрешимость этого отношения. Бинарные детерминированные абстрактные схемы программ называются в литературе схемами Янова. Дальнейшее развитие теории схем программ в СССР связано с именами А.П.Ершова, С.С.Лаврова, В.В.Мартынюка. Обзоры результатов, полученных в теории схем программ, сыгравшей важную роль в развитии теоретического программирования, можно найти в работах [42, 57]. Понятие интерпретированной схемы программы над памятью содержится в работе А. П. Ершова [41]. На Западе теорией схем программ активно стали заниматься лишь в конце 60-х, начале 70-х годов. Значительный вклад в развитие этой теории сделали Лакхэм, Парк, Патерсон, Чандра, Манна и др. Использование понятия дискретного преобразователя в качестве автоматной модели программы обсуждается в работе [27]. Фактически идея рассмотрения программы (микропрограммы) как автомата содержится в [12], а в [11] явно устанавливается 7* 99
связь автоматов со схемами Янова и обобщаются результаты о равносильности схем программ. В отличие от работы Рутледжа [4], в которой основные понятия работы Янова лишь переводятся на автоматный язык, работы В.М. Глушкова положили начало новому направлению в прикладной теории алгоритмов, обогатив ее автоматно-ал- гебраическими методами исследования. Развитию математических моделей программ способствовал анализ семантики практических языков программирования от фортрана и алгола до паскаля и ады, а также исследования по теории трансляции [4]. Интересный обзор взаимодействия прикладных и теоретических идей дает статья П. Вегнера [93]. Применение недетерминированных конструкций при разработке программ обсуждается Э. Дейкстрой [39] (охраняемые команды). Идея косвенной адресации еще в 60-х годах была использована в одной из первых отечественных технологий - адресном программировании [76]. Алгебра алгоритмов впервые определена в работе [17], где также дано первое доказательство теоремы о регуляризации. Операции алгебры алгоритмов предвосхитили основные конструкции структурного программирования, завоевавшего большую популярность в 70-х годах. Обычно идея структурного программирования связывается с высказываниями Э. Дейкстры о программировании без GO TO [82]. Более широкий взгляд на эту проблему содержится в книге [37]. Приведение произвольных программ к структурному виду рассматривается также в [83]. В отличие от теоремы Глушкова метод Бема и Джакопини требует перехода к новой информационной среде (введение новых логических переменных) и не затрагивает проблем преобразования регулярных программ. Проблемы использования алгебры алгоритмов в качестве технологического средства структурного программирования обсуждаются в монографии [31]. Исследования по логике алгоритмов активно начались после работы Хоора [ 87 ], в которой был предложен аксиоматический подход к определению семантики алгоритмических языков и построено исчисление, в терминах которого сформулирован метод доказательства частичной корректности регулярных программ. Его можно рассматривать как частный случай метода Флой да, построенного в [84] для произвольных программ с переходами. Обзоры исследований в области верификации представлены в [71, 77], а обзор по программным логикам -в [72]. Исследование математических моделей параллельных алгоритмов и программ имеет достаточно обширную литературу. Сети из алгоритмических модулей были введены в работе [27 ], где рассмотрены также и другие структуры и динамические модели параллельных вычислений. Теорема, аналогичная теореме 6.1, доказана Келлером в [88]. Глава 3 РЕКУРСИВНЫЕ ОПРЕДЕЛЕНИЯ § 1. Функциональные уравнения Если заданы некоторая область данных D и на ней система базовых функций и предикатов, то можно получать новые функции и предикаты, рассматривая множество состояний В = Г(К, D) памяти V = {vl9..., vn) и стандартные схемы программ над этой памятью. Действительно, если А — схема программы над В, a fA — реализуемое ею отображение, то, отождествляя состояние памяти Ъ.с набором (b(vi), ...9b(vn)) элементов множества D, получим, что /л есть (частично определенная) функция типа Dn -+D", при этом fA(vl9 ..., vn) = (A(ui, ..., vn), ..., fn(vl9 ..., u„)). Схема программы А определяет также набор функций fi9 ..., /„ типа Dn -* D. Это определение конструктивно в том смысле, что если базовые 100
функции и предикаты вычислимы, то и функции /i,..., /„ также вычислимы, а схема программы А, интерпретированная на В, дает алгоритм их вычисления. Другой конструктивный способ построения новых функций из уже заданных — рекурсивные определения. Этот способ является основным методом в теории рекурсивных функций натурального аргумента. Современная точка зрения на.рекурсивные определения трактует их как специальный вид функциональных уравнений. Для того чтобы уяснить эту точку зрения, вспомним основные конструкции теории рекурсивных функций. Рассмотрим сначала оператор примитивной рекурсии. Он, в частности, дает возможность строить новую функцию /(х, у), исходя из двух заданных функций: g(x9y, z) и h(x). Функции •/, g. и h связаны соотношениями Г(х,У) = g(f(x,y-l),x,y), у> О, /(х,0) - h(x). Эти соотношения определяют функцию /(х,у) однозначно. Действительно, f(x,y) определено <=>/ (х, 0),...,/ (х,у - 1) определены, поэтому g (/(х, у — 1),х,у) также определено при у >0 или h (х) определено при у = 0. Соотношения для примитивной рекурсии можно переписать в виде одного равенства, используя функцию если ... то ... иначе ... : /(х, у) = если>> = 0 то h(x) иначе#(/(х, у - 1),х, у). Это определение имеет вид Ax,y)=F(f.x,y)9 где F — функционал, аргументами которого являются функция и числовые значения. Последнее равенство можно рассматривать как функциональное уравнение с неизвестной функцией /. В случае примитивной рекурсии такое уравнение имеет единственное решение. Рассмотрим теперь оператор наименьшего корня ixyif (x,y) =0) =g(x). Функция g (х) определена и равна у тогда и только тогда, когда / (х, 0), /(х, 1) ,.».,/ (х,у - 1) все определены и отличны от нуля, а/(х,>>) =0. Грубо говоря, ixyf (x,y) есть наименьшее у такое, что/ (х,у) = 0. Для того чтобы придать этому определению вид функционального уравнения, нужно ввести вспомогательную функцию h (х,у) =у + /xz (f(x,y + z) =0). Функции/,# и h связаны следующими соотношениями: g(x) = h(x,0), h(x,y) = ccjmf(x,y) = 0Toy иначе Л(х,>> + 1). Таким образом, приходим к системе уравнений с двумя неизвестными функциями g и h. Кроме решения g(x) =l*y(f(x,y) = 0) и h(x,y) =y + + д z(f(x,y +z) =0) рассмотренная система может иметь и другие решения. Например, функция </? (х, у) такая, что <р (х, у) =h (х, у), если h (x,y) определено, и </? (х,у) =а, если h(x,y) не определено, удовлетворяет второму уравнению. Правда, функция у (х,у), вообще говоря, не является вычислимой. С другой стороны, основное вычислимое решение (g,h) является наименьшим в том смысле, что любое другое решение продолжает основное. 101
Рассмотренные примеры подсказывают естественное обобщение, состоящее в рассмотрении систем функциональных уравнений вида /i(xi,...,x„) = FI(/1,...,/w,x1,... ,хЛ), /=1,...,т, (1.1) где Ff — выражения, построенные из аргументов xl9... ,хп, символов неизвестных функций fx,... ,/w, констант и операций, заданных на области Д которую пробегают аргументы. Такого вида уравнения часто встречаются на практике. Для их изучения удобно использовать теорему о неподвижной точке, доказанную в § 9 гл. 1. Переходя к общему случаю, рассмотрим сначала область Д>, на которой задана система базовых операций с сигнатурой £2 (алгебра данных). Нас будут интересовать частично определенные функции / CDS -* А> • Пример функции если ... то ... иначе ... показывает, что рассматриваемые функции могут быть определены и при неопределенных значениях некоторых аргументов. Для того чтобы формализовать эту ситуацию, удобно расширить область Д) до области /)-Д> U {w}, добавив к ней неопределенный элемент н>. Тогда частичная функция над Д> будет моделироваться всюду определенной функцией над D. При этом равенство / (х) =и> интерпретируется как то, что / (х) не определено на наборе х = (xi,..., х^). Если же какие-либо из компонент вектора х равны w, функция /, первоначально заданная на £>0, может быть продолжена на эти наборы произвольным образом. Область D называется стандартным расширением области D0. На D определяется частичный порядок С такой, что wCx для любого элемента хЕ Д а все элементы из Д> попарно не сравнимы, т.е. из хПу и хФю следует х=у. Отношение С, имея в виду дальнейшие построения, будем называть отношением аппроксимации (хП.у читается: "х аппроксимирует у" или "у продолжает *")• В стандартных расширениях областей данных отношение аппроксимации тривиально: неопределенный элемент аппроксимирует все, остальные могут аппроксимировать только себя. Однако в дальнейшем будут использоваться и другие конструкции областей данных с отношением аппроксимации, более богатым по сравнению со стандартным расширением. Другая интерпретация отношения С состоит в том, что это отношение вводит степени определенности объектов области D. В этом случае, если хПу, говорят, что х менее определен, чем у, или равен ему. Итак, рассмотрим произвольную алгебру данных D с отношением аппроксимации С, относительно которого будем предполагать только, что это отношение есть частичный порядок с нулевым (наименьшим) элементом w. Элемент w и в общем случае будем называть неопределенным, а при рассмотрении функций на D в случае, когда у (х) = w, будем говорить, что ip не определена на х. Важным свойством отношения аппроксимации является индуктивность, т.е. существование в множестве D наименьшей верхней грани произвольной возрастающей цепочки элементов. Если D индуктивно, то наименьшую верхнюю грань цепочкихх С х2 С ... будем ©о обозначать через U Xj. /=i Рассмотрим некоторые конструкции, сохраняющие индуктивность. Если Д,...,Д, — индуктивные частично упорядоченные множества с нулями, то D\ X ., .ХД, также является индуктивным частично упоря- 102
доченным множеством с нулем (w,...., w) относительно порядка, определенного отношением (xt,...,хп) С (х[,...,х'п ) <=>xi \Zx[,..., х„ L ^„.Действительно, U (х/*> ,...,*<*>) = ( U д/*>,..., U *„<*>). В области Д X ... X Д, кроме неопределенного элемента (w,. .., w) возможны также частично определенные элементы (jci, ... ,х„), для которых некоторые из xt (но не все) равны w. Здесь возможны длинные возрастающие цепочки х*1) С х *2* С .. , состоящие из различных элементов, но всякая бесконечная цепочка должна стабилизироваться через конечное число шагов, поскольку элементы, не содержащие w, могут аппроксимировать только самих себя. Если Д и Д индуктивны, то множество D2Di всех отображений из Д в Д также индуктивно. Частичный порядок определяется следующим образом. Если tpx: Д -*Д и <р2 • Д ~*Д> то Фх Cv?2 «^для всех хЕД имеет место фх (х) С</?2 00- Наименьшим элементом служит нигде не определенная функция </?w, т.е. такая функция, что ipw(x) =w для любого х Е Д. Наименьшая верхняя грань цепочки оо </>! Е(/?2 С .. есть функция </? такая, что v?(x) = U </>,-(*), xG Д. Если /=i Д и Д — стандартные расширения некоторых областей, то отношение крх С</?2 означает, что функция кр2 есть продолжение функции </?i, т.е. из того, что </?i (х) Ф w, следует, что крг (х) =ipt (x). Функции типа Dn-+D будем называть />-функциями. Из базовых D- функций можно образовывать новые функции с помощью суперпозиции, т.е. определений вида f(x J,... ,xn) = F(xlf... ,*„), где F(x\,... ,хп) — выражение (терм), построенное из базовых функций и символов переменных Хх,...,х„. Суперпозиции базовых /^функций будем называть элементарными D-функциями. Таким образом, всякая элементарная />функция есть либо селекторная функция f(x\,... ,хп) = Х/, либо базовая константа / (xlf ... ,хп) =я, где а есть 0-арная базовая функция, либо может быть представлена в виде/ (xi,..., хп) =g (hi (xi,... • • >*w)> • • ->bm(xi>- • >xn)), где g - базовая, a h i,..., h m — элементарные базовые функции, построенные раньше. Важными свойствами />функций являются монотонность и непрерывность, которые определяются через отношение аппроксимации на множестве D. Эти свойства определяются для функций типа/: Д -*Д и произвольных областей данных Д и Д. Функция / монотонна, если из х Су следует fix) П /(у) для произвольных элементов х,уЕ Д. Неопределенность определяется для индуктивных областей Д и Д. Функция / непрерывна, если для любой возрастающей цепочки Х\ С х2 С. • • элементов ОО оо области Д имеет место / ( U xt) = U /(*/). Рассматривая /i-арную 2> функцию как отображение области Dn в Д получим понятие монотонности и непрерывности />функций. Если зафиксировать значения всех аргументов функции /(*!,..., *„), кроме некоторого одного, получим функцию из D в D. Если эта функция монотонна или непрерывна, то говорят о 103
монотонности или непрерывности функции / по соответствующему аргументу. Нетрудно видеть, что />функция монотонна и (непрерывна) тогда и только тогда, когда она монотонна (непрерывна) по каждому из своих аргументов. Действительно, если / монотонна по каждому аргументу, то (*!,..., хп) С (х\,.. . , х^) =>/ (xi,. .., хп) Q/ (х\, х2,. •., х„) С ... ... П./(х\,... ,х'п). Если же / непрерывна по каждому аргументу, то /( U *i(*\..., U х<*>) = U /(х,(*\..., *<*>), поскольку (х^11.. fc=l fc = l И А: = 1 Л ... ,х„<*">) С (*/*>,... ,хл(/°), где* =тах {*!,...,*„>. Заметим также, что из непрерывности следует монотонность. Действительно, хх Сх2 =*/(х2) =f(xl Ux2) =f(x1) U/(x2) =>/(*!) С/(х2). С другой стороны, если D - стандартное расширение некоторой области данных, то всякая монотонная D-функция непрерывна. Действительно, если Xi Сх2 С • .. — возрастающая цепочка элементов области Д то либо Xj = оо оо = Х2 = . . . = U Xf = W, ЛИбОХ! = . . . =Jtfc = W,X*+1 =Xfc+2 = . . . = U X/ =Я. 1 = 1 1 = 1- В первом случае /( U *,) = U /(*/) =/(w)> во втором /(U х,) = /=i /=i '-1 =/(*)=/(w)U/(*) = U /(*,). /=1 Суперпозиция f(xl9. . . ,х„) монотонных (непрерывных) />функций также монотонна (непрерывна), что доказывается индукцией по длине выражения F(xj,. .. ,х„), которое определяет значение /(xi,... ,х„) через X!,. .. ,х„ и заданные />функции. Действительно, селекторные функции и константы, очевидно, монотонны и непрерывны. Далее, если/ (xi,.. . •••>**) =/(*) =g(hi(x)9. -.,hm(x)) =#(Л(х)), где^,/г!,...,Лт - монотонные (непрерывные) функции, то x\lx'=>h(x) \Zh(x') =>g(h(x)) С Cg(h(x')) и /(*( U х<*>)) = /( U Л(х(Д:)))=и /(Л(х(*>)). В *=1 fc = l *=1 частности, если базовые D-функции монотонны (непрерывны), то и элементарные D-функции также монотонны (непрерывны). При построении стандартных расширений областей данных возникает вопрос о продолжении операций. Как правило, эти продолжения должны быть монотонными. Простейший способ обеспечить монотонность состоит в следующем. Операция <o(Xi,,.., хп ) продолжается таким образом, что если хотя бы один из аргументов не определен, то значение co(xi,. . ., хп) также не определено, т.е. равно w. Такое продолжение называется стандартным. Возможны и другие, не стандартные монотонные продолжения. Например, если для любого продолжения (у i,... ,у„) набора (xi,.. ., Хп) до определенного функция со{у\,... ,уп) принимает одно и то же значение а, то можно положить <o(xi,. .. ,х„) =а. Именно таким образом б.ыли построены продолжения пропозициональных функций в алгебре условий. С помощью базовых />функций можно строить не только новые D- функции, но также и функционалы над Д т.е. функции, аргументы и зна- 104
чения которых являются />функциями. Пусть Ф„ С D — множество всех непрерывных />функций п аргументов. Функционал г: Фт ->Ф* назовем элементарным функционалом надД если г (/i,... ,/w) (х) =r(f,x) = = (Fi(f,x)9:..9Fk(f9x))=F(f,x)9 где Fx </,*),. .. 9Fk(f,x) - вы- ражения, построенные из символов предметных переменных с помощью базовых функций и символов переменных функций/!,... ,fm. Теорема 1.1. Пусть D — индуктивная область данных. Если базовые 1>операции непрерывны, то элементарные функционалы над D также непрерывны. Действительно, пусть Т:Ф^-*Ф* - элементарный функционал и т (/)(*) =F(/,x).Toraar( U /<'>)(*) =(F,( U /<'> ,*),... ,F*( U /<'>, x)) = (UFi(/(,)4...,UFfc(/(,)^))= U (F(/(/),x)) = /=i /=i /=i = U r(/(/>) (x), откуда r( U / (/) ) = LJ r(/(/)). /=i /=i /= l Понятие элементарного функционала позволяет перейти к рассмотрению функциональных уравнений вида (1.1), правые части которых построены из базовых переменных х19... 9хп с помощью базовых и неизвестных />функций. Теорема 1.2. Пусть D - индуктивная область данных, а базовые ГУ- функции непрерывны. Тогда система уравнений (1.1) имеет наименьшее решение, которое определяется следующими соотношениями: fc=0 ' f(°\x) = w, xGD", //*+1>(*) = ^(Л(*\ ... ,/£> , х), x&D". Действительно, с уравнением (1.1) связан элементарный функционал т:Фт-*Фш, определенный на индуктивном частично упорядоченном множестве Ф™ с нулем с помощью соотношений г (/ ) (х) = (Fx (/, х),... ... >Fm (/, х)). Каждое решение уравнения (1.1) является неподвижной точкой этого функционала. Поскольку г непрерывен, можем применить теорему о неподвижной точке § 9 гл. 1. Получим, что наименьшая неподвижная точка этого функционала определяется как объединение итераций оо нулевого элемента (нигде не определенной функции) :/= U т^к' (w) = к = 0 = U /<*>. Поскольку / <*+ х> (х) = т {f (*>) (х) = F(f (*>, х), получаем к = 0 утверждение теоремы. Система функциональных уравнений (1.1) называется также канонической системой функциональных уравнений в алгебре D. Ее можно рассматривать как систему рекурсивных определений функций /i,. . . ,/w, 105
имея в виду, что эти функции определяются как компоненты наименьшей неподвижной точки функционала г или как наименьшее решение системы (1.1). Функции, которые могут быть определены таким образом, называются алгебраическими /функциями. Конструктивность алгебраических />функций можно подтвердить следующими рассуждениями. Предположим сначала, что D есть стандартное расширение некоторой области данных. D-функция / называется вычисли- мой, если существует алгоритм, который по значению аргументов Xi,.. . ..., хп находит значение f(xx,..., хп), если оно определено, т.е. алгоритм останавливается и дает результат для всех случаев, когда/ (х\,... >х„) Ф w. Это неформальное определение зависит, разумеется, от способа представления наборов (*!,... ,х„) состояниями информационной среды, над которой работает алгоритм, и может быть сделано точным с использованием любого из известных понятий алгоритма. Если базовые />функции вычислимы и монотонны, то алгебраические D- функции также вычислимы. Покажем сначала, что элементарные функции вычислимы. Для селекторных функций и констант это очевидно. Пусть f(xi9...9xn) =tf(Ai (*i,...,*„),.. . ,Лт (xi,...,*„)), где g,hi9 . . . ..., h m — монотонные вычислимые функции. Алгоритм вычисления значения f (x i,..., xn) можно тогда построить следующим образом. Запустим одновременно т + 1 вычислительных процессов. Первые т процессов вычисляют значения hX9... ,hm, а т + 1-й — значение g(y\, • - - ... ,у„) для ух = . - . = уп = w. Следим за всеми процессами. Если какой- либо из первых т процессов завершился и получено значение, скажем, ht (xi,..., хп), то прерываем процесс вычисленияg (ух,... ,уп), заменяем yt на полученное значение ht (x) и запускаем этот процесс сначала с новыми значениями уг,,.. ,уп. Если процесс вычисления g (yt,... ,уп) завершился, прекращаем все остальные процессы и берем в качестве результата значение g(yi,.. • ,уп) Ф w. Монотонность функции g гарантирует правильность полученного результата. Указанный метод вычисления суперпозиции можно также реализовать с помощью последовательного алгоритма, который моделирует все т + 1 параллельных процессов. Алгоритм вычисления значения алгебраической D-функции требует последовательного запуска неограниченного числа параллельных процессов вычисления элементарных .О-функций/^** (jc) ,... ...,/*** (х), аппроксимирующих компоненты наименьшего решения fh-yfm ДЛЯ к = 0,1,2,... . Если один из этих процессов для интересующей нас компоненты завершится, то полученное значение и есть искомое. Все запущенные к этому времени процессы можно остановить и получить результат. Если отношение аппроксимации устроено более сложно, Чем в стандартном расширении, то конструктивность алгебраических />функций приобретает более сложный характер и требует пересмотра самого понятия вычислимости. Дело в том, что в отличие от стандартного расширения, где на каждом шаге значение любой вычисляемой функции либо полностью не определено, либо полностью определено, в общем случае возможны различные степени определенности и предельные значения, которые нельзя получить за конечное число шагов. 106
В заключение отметим, что частично рекурсивные функции можно получить как алгебраические />функции, где в качестве области D берется стандартное расширение множества Af={0,1,2,...} натуральных чисел, а в качестве базовых функций -0,х+ 1 и если х = 0 то у иначе z. Монотонное продолжение функции х+ 1 определяется так, что w + 1 = w. Для функции если ... то ... иначе ... справедливы равенства (если w = О то>> иначе z) =w, (если 0 = 0 то у иначе z ) =у, (если х = 0 то у иначе z) =z, ecnnx^w их^О. Упраж нения 1. Описать в каком-либо конкретном алгоритмическом базисе сеть из алгоритмических модулей для вычисления суперпозиции /Хфункций. 2. Доказать, что наименьшее решение уравнения f(x) = еслих > 100 то х - 10 иначе/(/(х +11)), рассматриваемого в области целых чисел, есть функция f(x) = если х > 100 то х - 10 иначе 91. § 2. Анализ схем программ над памятью Естественно ожидать, что функции, вычислимые детерминированными схемами программ над памятью, интерпретированными с помощью стандартной интерпретации, определенной 12 — П-алгеброй данных D, будут алгебраическими D-функциями. В этом параграфе будет получен ответ на вопрос достаточно ли базовых функций, определенных сигнатурой (12, П), или множество базовых функций необходимо расширить, а если да, то как. Прежде всего заметим, что, рассматривая схемы на памятью, мы допускаем неопределенные значения переменных, откуда следует, что вычисление значений термов и условий должно быть определено и для неопределенных значений некоторых переменных. Поэтому естественно предполагать, что неопределенное значение w рассматривается как элемент области D. Это предположение не противоречит построениям, рассмотренным в, связи с понятием схемы программы над памятью. Предположим также, что на D задано отношение аппроксимации С, неопределенный элемент есть наименьший элемент этого отношения, а все функции и предикаты сигнатуры (12, П) монотонны относительно аппроксимации. Для того чтобы иметь дело только с /^-функциями, удобно также предполагать, что истинностные значения 0 и 1 входят в область D. В схемах программ кроме базовых условий разрешается пользоваться элементарными условиями, которые получаются путем применения произвольных пропозициональных функций к базовым условиям. Для частичных интерпретаций, которые теперь допускаются, необходимы соглашения о монотонных продолжениях произвольных пропозициональных функций. Проще всего предположить, что при переходе к интерпретации допускаются любые монотонные продолжения пропозициональных функций. При этом, однако, требуется, чтобы для каждого элементарного условия в неинтерпретированной схеме были явно указаны базовые условия, от которых зависит данное элементарное условие (не обязательно 107
существенно). Действительно, функция 1, например, имеет единственное монотонное продолжение, а равная 1 фукнциях v x имеет два монотонных продолжения. Таким образом, зафиксировав интерпретацию базовых предикатов П, необходимо расширить это множество до множества П предикатов, которые получаются путем применения к базовым предикатам произвольных монотонных продолжений произвольных пропозициональных функций. Элементы множества П рассматриваются как D-функ- ции, принимающие значений 0, 1 и w. Частичные предикаты (условия) Mi (*i,..., хп) и и2 (xi,.. ., хп) называются несовместимыми, если из того, что Ui(x) Ф w и и2 (х) Ф w, следует их (х) л и2 (х) = 0. Пусть и\ (х) ,. .., ит (х) - попарно несовместные условия, зависящие от переменных Xi,.. ., хп, пробегающих область D (х = (xt,..., хп)). Рассмотрим п + w-арную функцию \р(х\, ..., хп, х\, ..., хт) = = Ui (х)]х\ v ... v ит (х)/х'т, равную х|, если щ (х) = 1, и равную w, если ни одно из условий Ui (х),..., ит(х) не равно 1. В силу попарной несовместности условий «!,..., ит значение функции \р определено однозначно. Функция вида их (х)/х\ v ... v um (x)/x'm называются функциями параллельного выбора. Если и (х) ии(х) интерпретированы таким образом, что для любых х они одновременно определены или не определены, то функцию и(х) /х' v и(х)1х' можно заменить последовательным выбором (если и(х) то х' иначе х"). Вообще, если попарно несовместные условия И] (х),..., ит (х) одновременно все определены или все не определены, то их (x)lxi v ... v um (x)/x'm = если их (х) то х\ иначе если и2 (х) то х2 иначе ... иначе если ит (х) то х'т иначе w. Обозначим через F(£l, П) множество всех функций параллельного выбора, которые можно построить с помощью условий из множества П. В качестве базовых /^-функций возьмем множество £2 U F (£2, П). Пусть А есть детерминированная U — У-схема программы над конечной памятью V = {v\,... , v„) , интерпретированная с помощью 12-П-ал- гебры D с отношением аппроксимации. Поскольку память конечна, а w G D, то ее состояние Ь: V -*D можно отождествить с конечным вектором (b(Vi),. .., b(vn)), а частичное отображение fA со всюду определенным отображением fA : Dn •+ Dn, отождествляя неопределенное значение /д (*) с вектором w = (w,..., w). Каждая компонента у; вектора (У1,--->Уп) =/а(х19...,хп) =fA (x) есть /)-функция, которую обозначим через fAj (x) и будем называть /)-функцией, вычисляемой схемой программы А. Теорема 2.1 (вторая теорема анализа схем программ). Всякая D- функция, вычисляемая детерминированной схемой программы над конечной памятью, интерпретированной с помощью 12 - U-алгебры D, является алгебраической D-функцией. В силу построений, использованных в доказательстве первой теоремы анализа схем программ (теорема 1.1 гл. 2), имеем /л =/>), где /д(о) определяется как соответствующая компонента наименьшего 108
решения (fa)a<=A системы уравнений /*= и faa°fa, aGA, аФа{1\ а (ЕА Заметим, что отношение аппроксимации, которое использовалось при доказательстве первой теоремы анализа, на множестве однозначных функций есть отношение продолжения. Это отношение является более сильным, чем отношение аппроксимации на множестве функций, индуцированное отношением аппроксимации на/). Действительно, если /' есть продолжение /, то / С /', поскольку из f(x) Ф w следует, что /' (х) =/(х). Поэтому наименьшее решение в смысле продолжения остается наименьшим и в смысле аппроксимации. Пусть а ► ах,..., а ► ат — все переходы, которые ведут из состояния а Ф а^ . Тогда уравнение для fa после раскрытия скобок может быть переписано в следующем виде: fa=Ull(yi°fal)V...Vuml(ymofaJ. Обозначим через /<,/(*) /-ю компоненту вектора /<,(*). Принимая во внимание, что в силу детерминированности условия и\,..., ит попарно несовместны, получим faj(*) = Ul(x)/fai j(уг(*)) V . . . V Um (x)/famj(ут (*)), / = 1, . . . , П. Если у = (у2: = tx (v),..., vn:=tn(y%ioy(x) = (tt (x),. .., tn(x)). Поэтому уравнения для faj являются уравнениями в алгебре D с базовыми функциями £1 U F(12, П). Будучи компонентами наименьшего решения, функции fQj сами образуют наименьшее решение и, следовательно, являются алгебраическими £>-функциями. Теорема доказана. Вопрос о том, можно ли произвольную алгебраическую D-функцию вычислить схемой программы над памятью, интерпретированной с помощью алгебры D, более сложен и будет рассмотрен в дальнейшем после соответствующей подготовки. Упражнения 1. Доказать, что все функции множества F(J2, П) вычислимы схемами программ над памятью, интерпретированными с помощью ft - П-алгебры D. 2. Показать, что многозначные функции, вычислимые с помощью недетерминированных схем программ, можно рассматривать как алгебраические 2 -функции. § 3. Вычисление алгебраических D-функций Рассмотрим снова каноническую систему функциональных уравнений //(*!,. . .,x„) = F/(/1,. . .,/m,*i,. ..,*„), /=1,...,/и, (3.1) в алгебре D с индуктивным отношением аппроксимации и непрерывными операциями. Нас будут интересовать способы вычисления значений // (*!,..., хп) в предположении, что известно, как вычислять элементарные D-функции. Общий метод вычисления содержится уже в самой формулировке основной теоремы 1.2 и описан в § 1. Этот метод будем назы- 109
вать методом параллельного вычисления последовательных приближений или просто методом последовательных приближений^^.практике обычно базовые функции и отношение аппроксимации устроены значительно проще, чем в общем случае, что дает возможность искать более простые и эффективные алгоритмы вычисления значений алгебраических /^-функций. Собственно отыскание таких алгоритмов и представляет собой основную цель проектирования алгоритмов, поскольку построение канонической системы функциональных уравнений, или, что то же самое, отыскание рекурсивного определения для вычисляемых объектов, есть лишь первый шаг, устанавливающий сущестование алгоритма решения задачи или конструктивность ее постановки. Дальнейшее проектирование состоит в отыскании эффективных алгоритмов с использованием свойств алгебры данных/) и функций, использованных в системе (3.1). Методы, рассмотренные в этом параграфе, носят достаточно общий характер, но они могут служить исходной позицией для поиска эффективных решений. Предположим, что отношение аппроксимации получено путем стандартного расширения области данных D0, и, следовательно, из х С у и х Ф w вытекает х = у. Другое предположение состоит в том, что для каждой базовой, а следовательно, и элементарной /^-функции / существует алгоритм, который за конечное число шагов устанавливает, определено ли значение f(x) для произвольного х Е D. Иными словами, элементарные функции являются общевычислимыми. Это предположение дает возможность освободиться от необходимости обязательной организации параллельных вычислений или их моделирования и вычислять значения функций //°*(х),//^(х),... последовательно. При этом, разумеется, возможность использования параллелизма для ускорения вычисления указанных значений остается, но она должна учитывать наличие реальных средств организации параллельных вычислений. Другой метод вычислений, отличный от метода последовательных приближений, состоит в следующем. Вычисления производятся по шагам. На каждом шаге требуется вычислять значение выражения G(fi,...,fm, d\»• • • > dn) в алгебре D с сигнатурой операций, расширенной символами неизвестных функций/!,... ,fm арности п, для заданного набора di,...,dn элементов области D. На первом шаге в качестве такого выражения выбирается fi(dl9..., dn), где // — та из функций, определенных системой (3.1), значение которой необходимо вычислить. Заканчиваются вычисления в момент, когда выражение, полученное на очередном шаге, есть элемент области D. Шаг вычислений состоит из трех этапов: 1. Выделение вхождений неизвестных функций fx,..., fm в выражении G для подстановки. 2. Подстановка вместо подвыражений вида fj (Е\,... ,Еп), где fj — выделенное вхождение, правых частей системы (3.1), т.е. выражений Fj (Л> • • • ,/w > Ех,.. ., Еп). 3. Упрощение полученного выражения. Если для некоторого подвыражения Е(/х,..., fm) имеет место равенство E(w,..., w) = а Ф w, то это выражение заменяется на а, а все подвыражения, не содержащие символов неизвестных функций, заменяются их значениями в D. 110
Первый этап шага вычислений — выделение вхождений — недетермини- рован и разрешает выделить любую непустую совокупность вхождений. Формально это выделение состоит в замене вхождения символа ft на его дубликат в другом алфавите. Будем обозначать этот дубликат/}. Второй t этап детерминирован. Его можно определить как переход от выражения G к выражению a(G), где о — функция, определенная следующими соотношениями: a(z) = z, zGD, a(co(d,. .. ,<?„)) = со (a (GO,. . . , a (<?*)). coGS2, o(fi(Gi,. • -,£„))=//(a (GO, • • •, o(Gk))9 /= 1,... ,m, a(f/(<M,.. .,Gn)) = Ft(fl9... ,/w, a(GO,... ,*(<?*)). i = l,...,m. Третий этап выполняется по всем подвыражениям Е выражения G. Если подвыражение Е не содержит символов неизвестных функций, то просто вычисляется его значение в алгебре Dy и это значение подставляется вместо Е. Если Е = E(fi,. .., fm) содержит вхождения неизвестных функций, то эти вхождения вместе с их аргументами заменяются на w, и вычисляется значение полученного выражения, т.е. вычисляется E(w,..., w). Если полученное значение отлично от w, то Е заменяется этим значением, в противном случае Е остается нетронутым. Процесс упрощения повторяется до тех пор, пока в Сне останется подвыражений, которые можно упростить. Очевидно, процесс упрощения всегда завершается, а результат не зависит от порядка рассмотрения подвыражений. Таким образом, третий этап также детерминирован. Результат упрощения выражения G обозначим через val(E). Описанный метод будем называть методом преобразования D-выра- жений. Его можно определить также с помощью дискретной системы S(f, F). Состояниями этой системы являются выражения алгебры D в расширенной сигнатуре: к операциям сигнатуры Г2 добавляются символы неизвестных функций из набора / = (fx,..., fm), а также символы констант — произвольных элементов области D. Отношение переходов Е -* -* Е9 о Е' можно получить за один шаг при некотором выборе вхождений для подстановки. Система S = S(f, F) является настроенной. Настройка определяется парой (S,D), т.е. начальные состояния — все /^-выражения, а заключительные — выражения, которые сводятся к константам. Как обычно, многозначную функцию, вычисляемую системой 5, обозначим через fs. Пусть / = (fi,... ,/w) - наименьшее решение системы (3.1), G(f) - D-выражение. Теорема Ъ Л. Если fs (G (f)) *ф,то fs(G(f)) =G(/). Действительно, легко видеть, что если E(f) -* £'(/), то E(f) = Е' (/) для любых функций fx,.. ., fm, которые образуют решение системы (3.1). Поскольку / - одно из них, то отсюда следует утверждение теоремы. Из теоремы (3.1), в частности, следует, что, вообще говоря, недетерминированная система S (/, F) глобально детерминирована. ^ Обратное утверждение также имеет место: если G(f) определено, то fs(G(f)) = G(f)» но доказательство его не так тривиально. 111
Рассмотрим некоторые полезные детерминированные подсистемы системы S. Каждая из этих подсистем получается путем детерминизации первого этапа шага вычислений, т.е. путем фиксирования некоторого алгоритма выбора вхождений для подстановки. Зафиксировав алгоритм выбора вхождений, получаем также алгоритм выполнения шага вычислений. Этот алгоритм называется правилом вычислений. Следующие правила вычислений, обозначаемые в дальнейшем символами ох, о2,.. ., оказались наиболее интересными на практике. cjj (правило вызова по значению). Для подстановки выбирается одно самое левое и самое внутреннее вхождение, т.е. такое вхождение символа неизвестной функции, что подвыражение, которое начинается этим вхождением, не содержит других вхождений неизвестных функций. о2 (правило вызова по наименованию). Для подстановки выбирается самое левое и самое внешнее вхождение, т.е. такое, которое не содержится внутри подвыражения, начинающегося символом неизвестной функции. а3 (параллельная внутренняя подстановка). Для подстановки выбираются все самые внутренние вхождения. а4 (параллельная внешняя подстановка). Для подстановки выбираются все самые внешние вхождения. а5 (полная подстановка) . Для подстановки выбираются все вхождения. Подсистему системы 5, которая получается путем выбора правила вычисления £, обозначим через S%. Правило £ называется корректным, если из того, что// (х) определено, вытекает,fsJfi (x)) =// (х). Простой пример показывает, что правила ох, о2 и а3 не являются корректными. Пусть D0 = Z - множество целых чисел. Рассмотрим монотонное продолжение операции умножения целых чисел, определенное следующими соотношениями: w 0 = 0 • w = 0, w- х = х • w = w, х Ф0. Функциональное уравнение fix> У) ~ если х = 0 то 0 иначе f(x + 1, f(x, у)) • f(x - 1, f(xt у)) имеет наименьшее решение f(x, у) = 0. В то же время правила ох, о2 и а3 для х Ф 0 порождают бесконечные процессы вычислений, а правила а4 и о5 дают правильное решение. Выбор вхождений для подстановок, определяемый правилами ох,. . ., о5, для правой части рассмотренного уравнения дает следующие результаты: ох: если х = 0 то 0 иначе f(x + 1. fix, у)) • f(x - 1, f(x, y))\ t о2: f(x + lj(x,y)) fix - l,f(x.y)); t 03' /(* + U(x,y)) fix - l,f{x.y)y, t t °a'. f(x + lj(pc,y)) -f{x - \Jix,y))- t t °s'. f(x + l,f(x,y)) -f{x - I, f(x, y)\ t t t t 112
Правила о4 и а5 оказываются корректными. Рассмотрим доказательство корректности правила а5. Сначала получим некоторые общие свойства полной функциональной подстановки. Пусть х = (*i,..., хп) — набор символов переменных. Рассматриваемые дальше D-выражения, кроме констант, могут также содержать переменные из этого списка. Пусть G = (Gi9..., G„) - набор D-выражений, Я - некоторое £>-выражение. Определим предметную подстановку ох (G, Я) с помощью следующих правил: 1) ox(G,Xj) = val(Gf)9 /=l,...,/i; 2) ox(G,<p(Hl9.. . 9Hk))=val(<p(ox(G,H1)9.. . 9ox(G,Hk)))9 здесь у - операция алгебры D, или неизвестная функция, или константа (0-арная операция, к = 0). Пусть теперь/= (/i,... ,/w) - набор символов неизвестных функций, Е = (Ei,..., Ет) - набор Ь-выражений. Функциональная подстановка OfyX (Е, Я) = Of(E9 Я) определяется по правилам: 1) Of (E, z) = z9 если z - переменная или константа; 2) of(E,u(H1,...9Hk)) = val(u(of(E,H1)9...9of(E,Hk)))9 <oGS2, 3) OfiEJjQI, ,...,Я*)) = val(ox((of(E, ЯД..., of(Et Hk))9Ef))9 / = 1,...,/я. Для функции val можно пользоваться следующим определением: 1) val(z) = z, z — переменная или константа; 2) val(fj (Я1?. . .,Я„)) = /;- (ш/СЯД .. ., val(Hn))9 /= 1,. .., w; 3) val (оз(Нг,. .., Я^)) ='если Of (w, со(ш/(Hi),..., val(Hk))) = d =£ w то с/ иначе со (val (Hi),. .., val(Hk)). Очевидно, что as (G) =OftX(F,G), гцеЕ = (/*\,.. jF^) - набор правых частей системы (3.1). Функции аХ9 о/ и war/- это функции над D-выраже- ниями, поэтому в пунктах определения этих функций равенство есть равенство D-выражений (исключением является равенство в условии правой части п. 3) определения функции val). Более широкое понимание равенства D-выражений означает следующее. Равенство H(f,x) = Hf ( /, х) истинно о для набора D-функций g = (gi9... . .., gm) и любого набора d = (di9. .., d„) элементов множества D имеет место равенство значений H(g9 d) = Н' (g9 d). В дальнейшем, если не оговорено противное, равенство D-выражений понимается именно в этом смысле, т.е. как функциональное тождество в алгебре D. Заметим, что в силу монотонности D-функций и из того, что H(w9 x) = = d Ф w, следует, что Я(/, х) = dтождественно. Поэтому из определения функции val вытекает, что val (Я) = Я (строгое доказательство получается индукцией по числу операций в выражении Я). Поскольку H(g, d) = = cj^CC^i dn)> ff/(Ui (*)>••> 8m(x)), Я(/, *))), то из равенства Я = Я' вытекают равенства ox(G, Я) = ox(G, Я') и Of(E, H) = о/(Е, Н ). Индукцией по числу операций в Я доказываются импликации G = G => -=► ох (G, Я) = ах (G', Я) и £ = #'=* а, (Е, Я) = af(E\ Я). Комбинируя эти факты получим G = G'иН = Н'=>ox(G, H)=ox(G',H'), Е = Е'иН= Н' => => o/CjK Я) = (;/(#', Я'). Действительно, ox(G, Я) = ax(G', Я) = ax(G', Я'); аналогично для оу. 8. Ю.В. Капитонова 113
Теорема 3.2. Правило а5 корректно. Доказательство использует следующие леммы, устанавливающие ряд полезных свойств функциональных и предметных подстановок. Лемма 3.1. of(E9ox(G9H))=ox{(of{E9Gl)9...9of(E9Gn))9 of(E9H). Лемма 3.2. of{E. ar(G, Я)) = of((of(E, G,),..., of(E. Gm)),H). Обозначим через о$(Е, Я) fc-кратное применение подстановки Е в Я, т.е. о}(Е,Н)=Н, ok+l(E,H)=of(E,ok(E,H)). Лемма 3.3. ak(EfH) = Gf((ok(E9fl(x))9...,ok(E9fm(x))lH). Л е м м а 3.4. ffk)(d) = of (w, о)(Ff ff (d))). Докажем теорему 3.2. Пусть/} (d) = а Ф w. Тогда для некоторого к fj(d) = /J(*>(d) = а. В системе 5а5 имеем/;(d) ->Fy(1) -... -*F/*>, где F/,+1> = a(F, F/°) = oi+1(F,ff(d)) (i = 0, 1,. .., * - 1). Применяя лемму 4, получим of(w,Ffk)) =of(w, ajE (F,/у (d))) =//*) (d) =a=>Ffk) = -a^fso (//(d)) =Д =//(d). Теорема доказана. Перейдем к доказательству лемм. Лемма 3.1 доказывается индукцией по числу операций в выражении Я. Доказательство сводится к тривиальному разбору случаев определения подстановок и предоставляется читателю. Лемма 3.2 также доказывается индукцией по числу операций в Я. Случаи, когда Я есть константа, переменная или Я =G)(Hl9. . ., Нк), разбираются тривиально. Рассмотрим случай, когда Я = //(#i,..., Я^). Тогда of«of(E, G,),..., o/№ Gm)),H) = а/(а/(Д G), //(Я,. .... Я*)) = = oxUof{of(E9 G), Я,), • . ., су (о/(Д О, Я*)), ar(£ G/)) = а* ((*/(£ a/(G, Hi)),...9 Of(E, Of(G, Я„))), о/(£, G/)) (предположение индукции) = of(E, ox((of(G, Hi),.. .,Of(G, Hn)),Gj)) (лемма 1) = of(E, of(G,H)). Лемма 3.3 доказывается индукцией по к. Для к = 0 доказательство очевидно. Шаг индукции ak + l (Е, Н) = а/(£; а*(£ Я)) = of(E, of((ok {Е, /i (x)),..., о*(£ /w (*))), Я)) (предположение индукции) = Of(of(E9 ок(Е, Л (*))), ..., af(E9 о*(£ /w(x))), Я) (лемма 3.2) = of((ok+l(E, fi (х)),...,4+1(^/ш(х))),Я). Лемма 3.4 также доказывается индукцией но к. Для А: = 0 доказательство очевидно. Шаг индукции //* + l) (d) = a/((/,(fc) (d),..., № (<*)), /=}) = = of((of(w, of(F, /, (d))),..., af(w, akf(F, fm(d)))), Fj) (предположение) = of(w, of((ok{F, /,(d)),..., ok(F,fm(d))), Fj) (лемма 3.2) = = of(w,ot{F,F/)) (лемма 3) = af (w,ak(F,af(F,f,(<!)))) =of(w,ok + 1(F, №)). Поскольку система S0 является подсистемой системы S(f, F), то в качестве следствия из теорем 3.1 и 3.2 получаем теорему 3.3. Теорема 3.3. G (f) = a*w<* fs (G (f)) = a*w. Вообще говоря, система S дает несколько больше. В некоторых случаях она останавливается и дает в качестве верного результата и неопределенное значение. Однако, разумеется, возможны случаи, когда G(/) = w, а S не останавливается. 114
Правила ot, a2, a3, несмотря на некорректность, имеют практическое значение. Например, если доказано, что система S не имеет бесконечных процессов, начинающихся в состояниях вида /;-(d), то любое из этих правил для соответствующей системы дает правильный результат. Простота реализации правил Oj иа2 привела к тому, что именно они чаще всего используются в системах программирования, допускающих функциональные рекурсивные определения. Упражнение Доказать корректность правила параллельной внешней замены. Указание: показать, что для этого правила справедливы леммы 3.1 и 3.2. § 4. Функционалы высших типов Теорию функциональных уравнений, изложенную в § 1, нетрудно перенести на случай, когда D представляет собой многоосновную алгебру данных D = ф|)|ен- Для этого достаточно предположить, что каждое множество D% частично упорядочено отношением аппроксимации с минимальным элементом w, общим для всех множеств, а операции алгебры D монотонны. Теперь D-функции различаются по типам. Тип /^-функции, определенной на множестве D$x X...XZ)g и принимающей значения в множестве /)|, будем обозначать (£х,..., £„) -*{• (вместо обозначения (£i> • • •> £л> £)> использованного в § 3 гл. 2 которое мы сохраним для обозначения типа декартова произведения). Каноническая система функциональных уравнений теперь имеет вид fi(xgi9...9Xini) = Fi(fl9. .., fm, *n,...,*/„,), /= 1,...,/я, (4.1) где Fg — выражения многоосновной алгебры D в расширенной сигнатуре, а символам неизвестных функций fx,..., fm и переменным хц9..., хщ приписаны соответствующие типы. Отношение аппроксимации переносится естественным образом на множество Гф| X . .. X D$n, /v) = Dt Х-..XDt l = Z>£ 5l "" kn всех функций из D^ X ... X D%n в^,а правые части , уравнений определяют элементарный функционал над Д т.е. отображение множества Г2 X ... X Гт в себя, где Г1?. .., Гт — множества функций соответствующих типов. Таким образом, для многоосновной области имеет место теорема 1.1, а также все остальные утверждения и построения § 1. Единственное изменение состоит в том, что при образовании термов должны быть выполнены условия согласования типов: если операция (функция) кр имеет тип (£ х,..., £„) -* £, то составляющие tх,..., tn терма У (* 1»• • >tn) должны иметь типы £ t,..., £„ соответственно. Из области D можно строить новые области данных, переходя от уже имеющихся областей к декартовым произведениям и областям вида Гфи D2). В случае многоосновной области D для образования новых областей используются ее компоненты D%. Так возникает широко используемая в математической практике иерархия функциональных объектов. Более точно ее можно определить следующим образом. Расширим исходное множество типов Е до множества S ь полагая, что &t есть наименьшее множество, содержащее S и вместе с каждым набором типов £i>..., £„ 8* 115
также типы (£г,..., £„) и ^ -+ %2* Каждому типу £ G Е, поставим в соответствие область £)$ следующим образом. Для £ Е Е области D$ уже определены. Будем называть эти области и соответствующие им типы базовыми. Типу £ = (£1?..., £„) поставим в соответствие область D% = = Z)ti X...XZ>t||, а типу $!->Ь -область Z)^_|2 =Г(/)?1, Z)|2) = = Dz2D% . Элементы области D^-^ будем называть функционалами типа %х -* £2 и, если £! или £2 отличны от декартова произведения базовых типов, функционалами высших типов. Функционалы, построенные с помощью семейства D базовых областей, будем называть D-функцио налами или функционалами над D. Семейство всех функционалов будем обозначать через Ф(Л) = (D|)|GH ,- На области функционалов высших типов и на декартовы произведения переносится отношение аппроксимации, заданное на базовых областях. Этот перенос делается индукцией по длине выражения, определяющего тип £ рассматриваемой области. Пусть на областях D% j >•••,£>£„ отношение аппроксимации уже определено. Тогда, если £ = (£i,..., £„), отношение аппроксимации на D% определяется условием (di,. .., dn) С (d[,..., d„) ° ~d, С <*;,...,<*„ С d;. Если же J = (£, -*£2), то / Cg(f,g GD^^2) * о для любого х G £>£ t имеет место /(х) С £ (*) • Поскольку £>£ состоит из всех объектов типа £, то из индуктивности базовых областей следует индуктивность областей D% для £ Е Ei. Прикладное значение функциональной иерархии состоит в том, что с ее помощью удобно описывать структуры данных высших типов, а отношение аппроксимации позволяет исследовать вопросы вычислимости. Помимо функциональной иерархии в математике используются и другие способы построения сложных структурных объектов, которые используются для описания (определения) сложных структур данных. В частности, важную роль играет теоретико-множественная иерархия, позволяющая конструировать новые множества из уже построенных с помощью декартовых произведений и образования множества всех подмножеств. Теоретико-множественная и функциональная иерархия легко моделируют одна другую, поскольку множество можно заменить характеристической функцией, а функцию — ее графиком. Однако с практической точки зрения во многих случаях удобно различать множества и функции. Теоретико- множественную и функциональную иерархии удобно также использовать для построения состояний сложных динамических систем. Для того чтобы говорить о вычислимости функционалов высших типов, на компонентах семейства Ф(1>) = Ф|)^ек необходимо определить базовые операции. Помимо операций, связанных со спецификой базовых областей данных, есть целый ряд полезных операций, которые могут быть определены над /^-функционалами независимо от природы области D. Рассмотрим некоторые из них. Наиболее ясной и естественной операцией является операция применения функции к своему аргументу, называемая иногда аппликацией. Эта операция имеет тип (£ -*т, £) -*т. Точнее говоря, для каждой пары типов J и г определяется своя операция применения соответствующего типа. Но, как обычно, для всех этих операций используется одна и та же синтаксическая схема ()(()), и, следовательно, результат применения этой операции 116
обозначается для всех типов одинаково: /(х). Операция аппликации монотонна по первому аргументу: fCg=> f(x) Cg(x). Она также непрерывна по первому аргументу, что следует из определения наименьшей верхней грани. Но по второму аргументу аппликация даже не монотонна, поскольку f(x) С /(*') следует из х Сх' только для монотонных функций, но не всякая функция монотонна. Другой общий метод образования операций на областях высших типов состоит в переносе на эти области операций, определенных для базовых областей. Например, пусть со есть операция типа £ -> т?. Тогда можно рассмотреть новую операцию со' типа (f -*£) -* (f -*т?), полагая (со'(/)) (х) = = со ( / (х)) для любого х Е D$. Относительно операции со' можно говорить, что она получается путем переноса операции со на область D$_*$. Поскольку операции любого типа являются функциями, их можно рассматривать как константы соответствующего типа и выделять в соответствующих областях как 0-арные операции. Поскольку каждая из областей £>£, £ Е л1 частично упорядочена отношением аппроксимации, можно говорить о пересечении и объединении элементов этой области. Вообще говоря, эти операции определены не всегда. Но если, например, в области Dn пересечения х п у и объединения х U у определены для любых пар (jc, у), то они будут также определены и для функций типа £ -* т?, поскольку (/П*)(*)=/(*)П*(х) и (fug)(x) = f(x)ug(x). Уже говорилось о том, что базовые операции над /^-функционалами не всегда монотонны (непрерывны). Поэтому обычно рассматривают подмножества областей D% (£ Е Sj), замкнутые относительно выбранной системы базовых операций, на которых эти операции оказываются монотонными (непрерывными), т.е. рассматривают подалгебру алгебры Ф(/)) всех /Э-функционалов. Важным примером такой алгебры является алгебра всех непрерывных функционалов. Поскольку применение непрерывной функции к своему аргументу непрерывно по обоим аргументам, аппликация может рассматриваться как операция этой алгебры. Пусть теперь Е = (£\)\ел ~ произвольная алгебра /^-функционалов, Н С Л С Е1? Е\ С D\. Выбор базовых операций определяет понятие элементарного D-функционала и, если базовые операции непрерывны, понятие алгебраического D-функционала, частным случаем которого является понятие алгебраической D-функции. Что же касается вычислимости алгебраических /^-функционалов, то здесь встречаются две принципиальные трудности. Первая трудность состоит в том, что область определения и область значений функционала могут содержать неконструктивные объекты, поскольку компоненты £>| (£ Е Н^) могут иметь мощность континуума и выше; поэтому возникает вопрос о конструктивных способах задания аргументов и значений функционалов высших типов. Если область D конструктивна, т.е. любые ее элементы могут быть заданы выражениями в некотором языке, если также сигнатура базовых операций задана конструктивно, то конструктивно могут быть заданы все элементарные и алгебраические D-функционалы, поскольку для их задания могут использоваться D-выражения и канонические системы функциональных уравнений. Другие объекты могут задаваться как пределы возрастающих последовательностей элементарных или алгебраических функционалов. При 117
этом можно рассматривать и неконструктивные последовательности, учитывая, что их конечные начальные отрезки задаются конструктивно; и, увеличивая длину этих отрезков, можно получить'любую степень приближения к предельному объекту. Поскольку алгебраические D-функ- ционалы непрерывны, то, вычисляя значения заданного функционала на элементах последовательности, получим новую последовательность, предел которой дает значение функционала на предельном элементе заданной последовательности. Вторая трудность состоит в следующем. Представим себе, что происходит вычисление значения алгебраического функционала fl9 заданного как первая компонента наименьшего решения (fl9.. .,/m) канонической системы уравнений (4.1), на элементе z. Для этого вычисляются последовательные приближения ffk) (xi) функционалов /,- по формуле //* +1 * (х/) =Ff(f(k\xi). Последовательность /1(0>(z)c:/f1)(z)c:... (4.2) сходится к результату fx (z). В случае обычных функций над областью D, заданной как стандартное расширение множества определенных значений, последовательность (4.2) либо вся состояла из неопределенного значения, либо стабилизировалась на конечном шаге. Теперь, когда значениями //*) (z) могут быть функции, эта последовательность может состоять из различных элементов и сходиться в пределе к определенному значению /i(z). В этом случае остается удовлетвориться тем, что последовательность (4.2) сходится, и считать ее результатом вычислений. В случае, когда сам аргумент z задан как предел последовательности z0 С zx E..., в качестве результата можно рассматривать последовательность //°* (z0)C Е//1* (zi) С ..., которая также сходится к результату fx (z). Действительно, /£*) (г*) С /J** (z) С /i (z), т.е. /i (z) есть верхняя грань всех элементов f[k^ (zfc). С другой стороны, если /£** (zk) С и для всех к, то fik + l) (г*) С /i(* + /) (z* + /) С и для всех к и /, откуда fx(zk) С и для всех и; следовательно, fx (z) С w, т.е. /i (z) есть наименьшая верхняя грань (предел последовательности /£** (z*) (А: = 0, 1,...)). Таким образом, всегда можно говорить о приближенном вычислении алгебраических /^-функционалов. Вопрос о конструктивности самих приближений зависит.от того, каким образом заданы операции алгебры функционалов, и сводится к изучению конструктивности элементарных функций. На практике дело упрощается тем, что в большинстве случаев достаточно рассматривать элементарные функционалы с конечными областями определения, ограниченными некоторой заданной областью, а конструктивность базовых функций достаточна для распознавания стабилизации возрастающей последовательности таких функционалов. Такие функционалы достаточно хорошо описывают различные виды многоуровневых функциональных структур данных, используемых при проектировании алгоритмов, в частности, многоуровневые массивы и файлы с прямым доступом. В гл. 4 будут рассмотрены конкретные алгебры функционалов, для которых могут быть построены эффективные методы вычислений. 118
§ 5. Рекурсивные программы Теория рекурсивных определений дает возможность точно определить понятие рекурсивного вызова программ (подпрограмм), которое играет большую роль в программировании. Начнем с определения системы детерминированных схем программ. Так будем называть семейство (Л\)\ед» членами которого являются UX*YX-схемы программ и в котором выделена схема AKq =A0, называемая основной. Базис операторов Yx (X£ А) имеет определенную структуру: Yx = Y^ U U Y^. Операторы>>E y{0) на- juGA зываются внутренними, а операторы у Е Y ^ - вызовами программы Ац из программы А\. Различные операторы вызова одной и той же программы могут различаться способами передачи параметров и возвращения результатов. Интерпретация системы (Ах) задается следующим образом. Для каждого индекса X Е Л выбирается своя информационная среда Вх, на которой интерпретируются элементы базиса (Ux, Y\). Предполагается, что на множестве Вх задано индуктивное отношение аппроксимации. Каждое условие и Е Ux интерпретируется как непрерывная функция и: Вх -МО, 1, w} (частичный предикат), а каждый оператор у Е YW — как непрерывное преобразование у: Вх -+Вх (для того чтобы упростить обозначения, мы отождествляем, например, символ оператора у с интерпретирующим его преобразованием /у). Оператору вызова^ Е Y$ сопоставляются два непрерывных преобразования у^ : Вх -* Вц и уМ : ВхХВц -> В\. Первое из этих преобразований соответствует передаче параметров, второе — передаче результатов после окончания работы вызванной программы. Сам оператор у интерпретируется как преобразование^: Вх -*#\> которое определяется соотношением у{Ь)=уЮ(Ь,ЫуМШ (5.1) Преобразование /Ц:ВЦ-+ВЦ- это функция, вычисляемая схемой программы Ац при заданной интерпретации. ФункцииД находятся из системы уравнений, которые строятся по схемам программ обычным образом. "i/^i "т/Ут Именно, пусть а >al9..., а ► ат — все переходы из состояния а схемы А х- Сопоставим этому состоянию уравнение /a,\(^) = ("i/>;i%1,xv...vMw/3;wo/aw,x)(b). (5.2) Для любой системы и\,..., ит попарно не пересекающихся условий на В\ определена функция параллельного выбора </>(£, bi9..., bm) = Ui(b)/bi v... ... v um (b)/bm, равная тому из элементов b\,..., bm, для которого условие щ(Ь) истинно. Эта функция равна w, если все условия ложны или не определены. Очевидно, функция параллельного выбора непрерывна. Пользуясь этой функцией, уравнение (5.2) можно переписать в виде fa,ЛЪ) = и.(*)//.„*tVi(*))v- vum(b)/famtX(ym(ft)). Подставляя для операторов у Е Y$ вместо у(Ь) правую часть равенства (5.1) и полагая Д =Д Л, где а0 - начальное состояние схемы Л^ и /fl(i) хФ) = Ь для заключительного состояния аМ схемы Ах, получим 119
окончательно интересующую нас систему уравнений для определения функций Д(ХЕЛ). Если множество Л конечно, то и система уравнений также конечна. Семейство множеств (Вх)\^в является многоосновной алгеброй с унарными операциями у G У^0), у(°> G Y$, бинарными операциями yW G Y^ и операциями параллельного детерминированного выбора. Все эти операции непрерывны, и система уравнений вида (5.2) имеет наименьшее решение, которое определяет функции Д и, в частности, функцию /о =/\ » вычисляемую основной схемой А0. Интерпретированная система схем программ, представленных в некотором языке программирования, называется также схемой рекурсивных программ или программ с рекурсивными вызовами. Иногда термин "программа" относят только к основной программе, а все другие члены семейства (Ах) называют ее подпрограммами. Наконец, термин "рекурсивный" часто относят к тому случаю, когда некоторая программа, возможно, через цепочку вызовов обращается к самой себе. Таким образом, функциональная семантика рекурсивных программ построена. Основным механизмом взаимодействия программ при вызовах является аппарат формальных и фактических параметров. Его можно описать в терминах схем программ над памятью. Каждый из базисов (UXi Yx) определяется как стандартный базис над памятью Ух с помощью сигнатуры (Т2Л, 1\х) операций и условий, интерпретированных на области £>Л. Память Ух может быть типизированной. В этом случае Ух = U Ух*, Dx = = U DXy. Допускается также использование косвенного именования. *GS* (ал Операторы у G Y^' — это обычные операторы присваивания, а операторы вызова^ G У^ имеют следующую структуру. Для каждой программыАц заданы конечные последовательности 1пц и Out^ соответственно входных и выходных параметров, составленные из переменных множества Уц. Если /яд = (их,..., ит), Ошц = (vi,..., vn), то вызов у может иметь синтаксическое представление вида (sx,..., sn) := P^{ti,..., fw), где sl9..., sn G Ух, h > •••> tm - £1 ^-термы над Ух, Рц - имя программы Ац. В дальнейшем для экономии обозначений вместо Рц будем употреблять Аи. В случае типизированной памяти должны выполняться условия соответствия типов. Именно, области значений термов fi,..., tm должны содержаться в областях значений входных параметров Mi,..., um, а области значений выходных параметров должны содержаться в областях значений переменных sx,..., sfc. В случае косвенного именования st,..., sk — это термы, принимающие значения в классах имен, типы которых согласованы с типами выходных параметров. Функции j>(o) ну О) определяются следующим образом. Если/): yx-+Dx, то у (°) (b) = b0z, где Ь0: Уц -+0^ - нигде не определенное состояние памяти, т.е. b0(v) = w для всех v G Уц, а z = (ux :=b(tx),...,um :=b(rm)). Пусть теперь b: Vx -+D\, b': Уц ~+Оц. ТогдаyV)(b, b') = bz, где z = (Si :=Ь'(У!),...,«„ :=b'(vn)). 120
Система программ (интерпретированных схем) над памятью, для которой семантика вызовов определяется описанным выше способом, называется системой программ с распределенной памятью. Другая семантика вызовов используется для систем программ над общей памятью. Такие системы используют общий базис (U, У),интерпретированный на одной и той же памяти V (все множества Vx и Вх совпадают). ФункциядД°) эквивалентна оператору присваивания (их :=tly...,um :=fw), а функцияуМ определяется так, чтоу^ф, b') = b'z, где z = (si :=«!,...,** :=u„)- На практике часто применяют смешанные варианты, разделяя всю память на части, используя некоторые из этих частей как общую память для одних программ, а некоторые локализуя внутри других. Структура памяти обычно определяется путем взаимного расположения текстов программ внутри общего текста, представляющего семейство. Для текстового представления схем программ можно использовать язык А2 со следующим примерным синтаксисом: <А2-программа>: := НАЧАЛО (последовательность описаний); (оператор) КОНЕЦ (описание) : := (описание переменной) | (описание подпрограммы) (описание подпрограммы): := (заголовок) | (заголовок) < тело) (заголовок) ::= ПОДПРОГРАММА (идентификатор) ((список входных параметров)) РЕЗУЛЬТАТ ((список выходных параметров)) (входной параметр) ::= (имя): (тип) (выходной параметр): := (имя): (тип) (тело) ::= НАЧАЛО ПОДПРОГРАММЫ (последовательность описаний); (оператор) КОНЕЦ ПОДПРОГРАММЫ. Отсутствие тела подпрограммы означает возможность подстановки любого описания, согласованного с заголовком. Оператор вызова такой подпрограммы оказывается неинтерпретированным, и мы получаем возможность использования частично интерпретированных схем программ над памятью. С функциональной точки зрения подпрограмму с неполным описанием можно рассматривать как аргумент основной программы, вместо которого могут подставляться соответствующие функциональные значения. Так получается возможность описания функционалов высших типов. Для реализации рекурсивных вызовов программами подпрограмм используется магазинная память, которую можно реализовать путем следующего расширения базиса. Пусть (£/, У) — стандартный базис над памятью V, интерпретированный на области D. Предполагая память V типизированной, введем новый тип данных D* (множество всех конечных последовательностей элементов D, включая пустую). Элементы множества D* будем называть состояниями магазина, а новые переменные, принимающие значения в D*, - магазинными переменными. Определим наD*операциих oy,head(x), tail(x), полагая, что* оу есть конкатенация,head(di d2 ...) =<2i, tail(dx d2...) = = d2 ..., head(e) = tail(e) = e. 121
Пусть V — расширенная память, а (£/', У') — расширенный базис. Пусть (Лх)\^а ~ система программ над распределенной памятью. Рассмотрим объединенный базис (U, У), где U = U Ux, У = U УЛ, над памятью V = U К^. Для того чтобы не возникало коллизий, можно считать без \ел ограничения общности, что сигнатуры операций и предикатов, а также множества переменный для различных базисов не пересекаются. Расширим полученный базис до (£/', У'), добавив магазинный тип. Удалим теперь из базиса операторов У' все операторы вызова подпрограмм. Новый базис операторов обозначим через У". Пусть V0 = Vx (X0 — индекс основной схемы программы семейства). Базис (£/', У") интерпретирован на области D' = D*, где D = U Dx (элементы области D С D* отождествляются с \е л одноэлементными последовательностями). Поскольку Ux С С/, УЛ С У, то все программы Ац можно рассматривать как СТ-У-программы над объединенной памятью V, использующие и изменяющие только свои части Уц этой памяти. Будем считать, что область D содержит бесконечно много элементов fli, д2>— одного и того же типа; с помощью условий сигнатуры П можно реализовать каждый из предикатов v = ai9 v = а2 ,.•• . Предположим также, что для всех типов переменных допускается оператор v := w присвоения неопределенного значения, память V функциональна и ее состояние однозначно определяется значениями переменных Zj,..., zh. При этих условиях имеет место следующая теорема. Теорема 5.1 (об устранении рекурсии). Для любой конечной системы программ (Ах) над распределенной памятью, интерпретированной на области D, существует (U\ У") -схема программы А' над памятью V* такая, что для всех v G V0 имеет место (fo(b)) (v) = (fA*(b')) (b), где b' совпадает с Ьна V0 и не определено на всех других переменных. Построение программ А' состоит в последовательном преобразовании схем программах- На одном шаге преобразования устраняются все вызовы одной из программ Ах из всех программ. Преобразованию подвергаются тела описаний подпрограмм, представляющих программы Ах в текстовом виде. После устранения всех вызовов основная программа будет представлять программу А\ Перед началом преобразования к памяти каждой из программ добавляется переменная р магазинного типа. Эта переменная рассматривается как общая переменная всех программах, т.е. ее значение сохраняется при любых вызовах (вместо этого предположения можно было бы р добавить в качестве входного и выходного параметров каждой из программ, передавать и возвращать значение этой переменной при всех вызовах). Рассмотрим устранение вызовов программы Ах. Пусть ult..., um — входные, a Vi,..., vn — выходные параметры этой программы и пусть в текстах программ Ац встречается k вызовов программы Ах- Сопоставим каждому из этих вызовов метку /,- (/ = 1,..., к) и установим взаимно однозначное соответствие меток /i,..., /* и элементов ai9..., ак Е D. Введем оператор х -*р записи в магазин и оператор* <-р чтения из магазина, полагая (х-+р) = (р:=хор)9 (х <-р) = (х: = head(p), р: = tail(x)). 122
Положим также (хх, ..., xs -> р) = (xs -+ р, ..., jcj -> р) а (л*!, ..., *у «- р) = = (*! *-р; ...;х5 *-р). Очевидно, 4to(xj, ..., xs -* p)(xu ..., xs «- р)= € (тождественный оператор). Сопоставим программе А х оператор Qx следующего вида: X: НАЧАЛО zx\ = w; ...;гл: =w; uXi...,um *-p; (оператор из тела описания Ак)\ г*-р\ vi9...9vn-+p\ ВЕТВЛЕНИЕ ПО г: 01 =* НА /i, д2 => НА /2, ак => НА /* КОНЕЦ ВЕТВЛ. КОНЕЦ. ♦ Вставим этот оператор в каждую из программ АЦ9 окружив его обходом: (НА/; 0х;/:е). Очевидно, что такая вставка не изменит функционирования программы Ац. Теперь устраним вызовы. Вызов вида (sx,..., sn): = A\{t\,..., tm), сопоставленный метке //, заменим оператором St: НАЧАЛО t\9 —9tm9ai9zl9 ...,zn ->р; НА X; //:х,;...,дги<-р; Z!,...,z/2<-p; C-^i: = *i > •••» 5„: = хп) (хх: = н\ ...,хл: = w,/*: = w) КОНЕЦ. Систему уравнений (5.2) можно решить относительно операторов вызова в алгебре алгоритмов. Выделяя в этом решении вхождения Тх, ..., 7* вызовов программы А \, получим Гц=Яц(Т19...,Тк)9 д€Л; (53) Ti(b)^yjl\bJx(y^(b)))9 /=1,...,*. 123
В этих равенствах предполагается, что /м обозначают компоненты наименьшего решения системы (5.2). Аналогичную систему равенств можно сопоставить преобразованным программам АЦ9 рассматриваемым как программы над объединенной памятью V= U Уц. /пел Введем следующие обозначения. Пусть /-й вызов программы Ах находится внутри программы Ац. Тогда через QiX обозначим функцию (оператор), вычисляемую программой Ац при следующей настройке: начальное состояние — состояние, отмеченное меткой X: заключительное состояние — состояние, в котором выполняется ветвление в операторе Q\ в программе Ац. Рассмотрим теперь настройку программы Ац, при которой в качестве начального состояния выбирается состояние входа в оператор Sf, а в качестве заключительного — состояние выхода из этого оператора. Функцию, вычисляемую программой Ац при такой настройке, обозначим так же, как и оператор 5,-. Если через #м обозначить функцию, вычисляемую преобразованной программой Лд, то получим £д=Ям(51,...,ЗД, МЕЛ; Здесь Zj — запись в магазин текущего состояния памяти, предшествующая переходу на X в S,; z\x' — восстановление памяти и передача результатов после возвращения на метку /,-. Из (5.3) вытекает система Ti(b)=y?\b,Rx(Tl..... Tk)(jf°\b))), i= 1, ...,*, а из (5.4) — система S^zj0)RiiX(Slf^Sk)zf{\ i=l,...,*, где Ritx — регулярная программа, которая выражает Qix через операторы Si, ..., Sk. Эта программа может быть получена путем анализа схемы АЦ9 в которую входит /-и вызов Ах (теорема 1.1 гл. 2). Поскольку Тх, ..., Тк и Si,..., Sk образуют наименьшие решения полученных систем, то г,= и т\,п\ s(= и s<w), m = О m - О где Tim + %)-y}l\b,Rx(Tim\.... Tklm))(yj°\b))), sjm+1) = zj0)R^(s\mK...,^('"))г/,)) tj0) = sP = w, /= i,...,*. Индукцией по m доказывается, что Tj' = SJm\ Действительно, пусть b — произвольное состояние памяти, в котором значения вспомогательных переменных хх, ..., хп и г не определены. Оператор т>т + 1^ преобразует его в состояние, которое можно получить, выполняя следующую последовательность операторов: 124
НАЧАЛО (zi: =w, ...,z,2: =w); ("1:=Ь(Г0, ...,ww:=^(rm)); /^(Г<т),...,Г<т)); (z1:=Z)(z1),...,z^:=^(z^)); (si:=*'(ui), -.,^:=Ь'(ул)) КОНЕЦ. Здесь b' — состояние памяти, полученное после выполнения первых трех операторов. Все это вытекает из определения операторов jy ' и у}1' для вызова (si, ..., s„): = Лх(?ь ..., tm). Очевидно, что значения вспомогательных переменных xt, ..., хп и г, а также значение магазина р остаются неизменными. Действие оператора S^ + 1' эквивалентно выполнению следующей последовательности операторов: НАЧАЛО 'i, —,tm, ah z1? ...,zh ->p; (Z!:=w, ...,z^: =w); ^(S[W\...,S<W>); r-p; Xi, ...,x„ «-p; ^Si • "" X\ , ..., 5И . — Xn J, (x!i =w, ...,*„: =w, r:=w) КОНЕЦ. Это верно, поскольку по предположению индукции т\т^ = sfm\ и, следовательно, оператор Rx(Si\ ...,5^m)) не меняет магазина. Применяя предположение индукции, получим, что Tfm + l\b) =SJm + 1\b), Таким образом, Т; = 5/, откуда и вытекает справедливость теоремы (5.1). Упражнения 1. Уточнить вариант языка А2 и построить его строгую динамическую семантику, определив функцию, которая по тексту А2-программы строит систему схем программ вместе с их базисами. 2. Доказать аналог теоремы 5.1 для систем программ над общей памятью. Комментарии к главе 3 Классическая теория рекурсивных определений содержится в монографиях [55, 67]. Первые применения рекурсивных определений в программировании связаны с языком ЛИСП [90]. Теорема 1.2 для частично рекурсивных функционалов доказана Клини [55] и известна как первая теорема Клини о рекурсии. Общая теория аппроксимации и теория функционалов высших типов разрабатывались Д. Скоттом [74] и Ю.Л. Ершовым [43]. Методы, вычисления функций, заданных рекурсивными определениями, рассматривались в [68]. Алгебры с аппроксимацией рассматриваются в [60]. 125
Глава 4 СТРУКТУРЫ ДАННЫХ § 1. Функциональные структуры данных Пусть D — базовая 12-алгебра данных с индуктивным отношением аппроксимации. Рассмотрим множество Г(С, D) всех отображений из С в D. Элементы этого множества будем называть функциональными структурами данных, расположенными на С и принимающими значения в D. Поскольку в D есть неопределенный элемент w, структуру данных можно рассматривать как частичное отображение области расположения С в область значений D. Удобно считать, что любые два элемента di и d2 алгебры D имеют наименьшую верхнюю грань dx U d2 (относительно аппроксимации). Если D является стандартным расширением области определенных элементов, то эту область можно еще раз расширить, добавив наибольший элемент w. Тогда объединением двух неравных определенных элементов будет vv. Иногда w называют переопределенным элементом. Операцию объединения будем считать одной из операций базовой алгебры данных. Одним из наиболее важных примеров функциональных структур данных является структура данных, расположенная на целочисленной решетке Z" и принимающая значения в D. Если область определения структуры данных х G r(ZM, D) есть прямоугольный параллелепипед [ах: bi, ..., ап: bn], то мы имеем дело с прямоугольным многомерным массивом элементов типа D. Алгебра D обычно рассматривается как одноосновная алгебра и считается определенной с точностью до изоморфизма, т.е. как абстрактный тип данных. Это не исключает возможности для D быть компонентой D = £>£ некоторой многоосновной алгебры. В этом случае среди операций сигнатуры £2 могут быть кроме внутренних еще и внешние операции, использующие данные из других компонент. В качестве D можно использовать и многоосновную алгебру. Однако в этом случае удобно заменить ее одноосновной алгеброй, объединив непересекающиеся компоненты и считая операции принимающими значение w в случае нарушения соответствия типов. Для того чтобы сохранить структуру типов, можно ввести в рассмотрение одноместные предикаты, выделяющие различные типы из объединения. Определим на множестве Г(С, D) операции, превратив его в алгебру (структур данных) . 1. Базовые операции сигнатуры Г2 над структурами данных получаются путем перенесения операций базовой алгебры D на Г(С, D). Если *i, ..., хп G Г(С, D), то oo(xl9 ..., хп) = у есть структура данных такая, что для всех cGC имеет место v(c) = со(*!(<•), ...,х„(с)). 2. Операция вырезки х/Н определена для любого множества ЯСС. Структура данных v = х/Н определяется равенством у(с) = если сЕЯ то х(с) иначе н\ 126
Сдвигом области расположения называется частичное преобразование g С С -* С области С. Действие сдвига g на точку с обозначается eg. 3. Операция сдвига х* структуры данных х G Г(С, D) с помощью преобразования g С С-> С определяется следующим образом. Если >> = xg, то для всех с Е С у (с)- если eg определено то x(cg) иначе w. 4. Операция наложения х и у структур данных х и у определяется как их наименьшая верхняя грань. Если z = x U у, то для всех с Е С z(c) = x(c)U Яс). Наложение можно также рассматривать как одну из базовых операций, однако в связи с его особой ролью оно выделяется и как самостоятельная операция, которая может быть определена и в том случае, когда базовая алгебра не имеет объединения. Требуется только, чтобы для структур данных с непересекающимися областями определения их наложение совпадало с объединением. Обычно для определения операций вырезки и сдвигов используются не произвольные подмножества и преобразования области С, а лишь некоторые допустимые. При этом допустимые подмножества должны быть замкнутыми относительно следующих операций. 1. Множество допустимых сдвигов G замкнуто относительно умножения (последовательного действия) и образует полугруппу сдвигов. 2. Совокупность допустимых множеств замкнуто относительно булевых операций (объединение, пересечение и дополнение), а также относительно умножения на допустимые сдвиги Hg= {cg\c€H)n деления на допустимые сдвиги H/g = {с \cg Е Я}. Алгеброй структур данных, расположенных на С и принимающих значения в £>, в этом параграфе называется любое подмножество множества Г (С, D), замкнутое относительно базовых операций, допустимых вырезок, сдвигов и наложений. Отметим некоторые тождественные соотношения алгебры структур данных (xi, ...,jc„,jc,у — произвольные структуры данных): (xg)h=xhg, (1.1) <о(..., х U у, ...) = со(...,х,...) и ы(...,у,...), (1.2) со(...,х/Я,...) = (о(...,х,...)/Яи со( ...,н>,...)/Я. (1.3) В соотношении (1.3) символ w обозначает нигде не определенную структуру данных. (х иу)/Н = х/Н иу/Н, (1.4) (х/Н)1Н'=х/НПН'у в (1.5) <*>(*!, ..;Хп)* = <*>(*(, ...,Xg), (1.6) (x/H)g=xgl(H/g), (1.7) (х uy)g=xg uyg, (1.8) x/H1 иЯ2 = x/Hx u x/H2. (1.9) 127
Соотношение (1.2) является следствием непрерывности операций базовой алгебры. Остальные доказываются исходя из определения операций I путем сравнения значений соответствующих структур данных на произ- I вольном элементе области расположения. Докажем, например, соотношение (1.7). По определению для произвольного с £ С имеем ((х/Н)8)(с) = = (x/H)(cg) = если eg Е Я то x(cg) иначе w = если с G H/g то xg(c) иначе I w = (x8/(H/g)) (с), откуда вытекает (1.7). 1 В соотношениях (1.2), (1.3) и (1.6) вместо операции со базовой алгебры данных можно, очевидно, взять любую суперпозицию базовых функций ' (элементарную базовую функцию). Если f{xx, ..., хп) — элементарная базовая функция (точнее, выражение, представляющее такую функцию), то выражение <p(xf!, ..., х8пп), где хх, ..., хп - переменные структуры дан- ■ ных или константы, будем называть базовым термом. I Если базовые операции дают определенное значение только в случае, когда определены все аргументы, т.е. <о(..., w,...) = w, то соотношение (1.3) можно переписать в более простом виде: со(...,х/Я,...) = со(...,х,...)/Я. В качестве следствия в этом случае можно получить также соотношение со(*!, ...,х„)/Я= со(х!/Я, ...,хм/Я). С помощью соотношений (1.1)-(1.9) любое выражение алгебры структур данных может быть приведено к виду ^!,...,х„)= U FJHb (1.10) i= 1 где х\, ..., хп — произвольные структуры данных, Fx, ..., Fk — базовые термы и Я/ ПН1 = ф при i Ф-j. Действительно, применяя соотношения (1.1) —(1.8) слева направо в любой последовательности, пока это возможно, получим наложение базовых термов и вырезок базовых термов. Вводя вырезки, если их нет, с помощью соотношения х=х/С (1.11) получим выражение вида (1.10). Для того чтобы множества Я/ не пересекались, применяем соотношение х/Н U у/Н'=х1(НПН'иНПН') U у/(Я'ПЯиЯ'ПЯ) = = х/НПН' Q (x U у)/НПН' U у/Н' ПН, которое вытекает из (1.9). Дальнейшие упрощения можно получить с помощью соотношений Jt/0 = w, (1.12) х и w = x, (1.13) а также тождеств базовой алгебры данных. Функция, аргументы и значения которой содержатся в 7(С D), называется функцией над структурами данных или структурной функцией. Структурная функция называется элементарной, если она выражается через опе- 128
рации алгебры структуры данных и, возможно, некоторые константы. Элементарные структурные функции допускают другое представление, которое называется скалярным. Пусть у = F(xl9 ..., хп) — структурная функция, заданная с помощью канонической формы (1.10), xl9 ..., хп — переменные структуры данных. Тогда ее можно представить системой соотношений, выражающих значения структуры данных >> в точках с области расположения: y{c) = Fi(zn(cgn\ ...,zimi(cgim.)), cGHh i=l,...,fc, (1.14) гдeF/ = FДzf/^...,2|4/p•),zп,...,z/m/G{x1,...,xJ^ Соотношения (1.14) связывают значения скалярных переменных вида у(с) и x(cg) (х, у - структурные переменные) и в совокупности составляют скалярное представление структурной функции. Возможность скалярного представления определяет практическое значение алгебры структур данных, поскольку именно в такой форме представляются основные операции над структурами данных, которые встречаются в программировании и проектировании аппаратуры. Например, формула < п zi} = 2 xik*ykJi /,/=1,..„я, (1.15) k= l которая определяет произведение матриц порядка я, может рассматриваться как определение структурной функции z = х * у над структурами данных, расположенными на двумерной решетке Z2 и принимающими значение в кольце Z), расширенном присоединением неопределенного элемента w и переопределенного элемента w. Операции сложения и умножения продолжаются стандартным образом. Заметим, что расширенная алгебра данных не является кольцом, поскольку, например, соотношение х - х = 0 уже не является тождеством (w - w = w), но все тождества кольца сохраняются на множестве D0 С D определенных элементов. Если определить сдвигиgknhk решеткиZ2 формулами £*0\/) = 0\*), Ы/,/) = (*,/)> то формулу (115) можно переписать в виде z(/,/) = 2 x(gk(!j))*y(hk(U))9 (/,/)€ [1: л,1:л] или в структурном виде: z = (xgl *yhl +...+**"+/*")/[1: л, 1: л] = = ( 2 х8к *ун*)1[1:п,1:п]. к= Г Если х и у — матрицы порядка л, т.е. структуры данных, области определения которых совпадают с квадратом [1: л, 1: л], то z — их произведение. Таким образом, умножение матриц заданного порядка можно рассматри- 9. Ю.В. Капитонова 12?
вать как элементарную структурную функцию, ограниченную на матрицы этого порядка. Пусть заданы две элементарные структурные функции F(xl9 ..., хп) и F'(xi,..., хп). Как узнать, равны ли они, т.е. является ли равенство F(xl9 ...,xn) = F'(xl9 ...,хп) тождеством? Приведем каждое из выражений, определяющих функции F и F\ к канонической форме: F(pcl9...9xn)= U Fifty, 1=1 F'Qcl9...,xm)~ U Fi/Hi /=i Если некоторое Я/ не пересекается ни с одним из множеств Я/, то должно быть Fi/Hf = w, в противном случае функции не равны. Если указанное равенство имеет место, соответствующий член можно отбросить. Аналогично для множеств Я/. После отбрасывания лишних членов выполним следующие преобразования. Если Я/ П Hj Ф ф9 то заменим Я,- объединением Я,- П Hj U Я,- П Hj и разложим соответствующий член с помощью соотношения (1.9) в наложение вырезок по множествам Я,- HHJ и HtnHj , т.е. применим соотношение х/Н = х/НПН' Ц x/HnlF9 которое вытекает из (1.9). Это соотношение будем называть разложением вырезки х/Н по множеству Н'. Применяя взаимные разложения вырезок двух канонических форм до тех пор, пока возможно, и переставляя слагаемые, в конце концов придем к тому, что к станет равным / и Я,- = Я/. Теперь для равенства функций F и F' необходимо и достаточно выполнения равенств F{/H, = Fi/Ht. Таким образом, задача свелась к распознаванию равенств вида F(z*", ...,z*«)/tf = F'(zf', ...,г^)/Я, (1.16) где F и F' — базовые термы; zl9...9zm £{*!, ...,*„} — переменные структуры данных. Предположим, что в Я найдется такой элемент с, что все сдвиги cgl9 ..., cgm определены, и если zf- = z,-, то cgt Ф cgj. Поскольку э этом случае все скалярные переменные Zi(cgt)9 ...9zm(cgm) могут принимать любые значения в алгебре D независимо друг от друга, равенство (1.16) имеет место тогда и только тогда, когда в алгебре D9 а следовательно, и в Г(С, D) выполняется тождество F(z1,...,zw) = F'(z1,...,zw). Вырезка базового терма F(z\l, ..., z^w) называется свободной, если существует с Е Я такое, что все cgi, .'.., cgm определены и из zt = z7- следует cgi Ф cgj. Каноническая форма (1.9) называется строгой, если все ее вырезки свободны. 130
Рассмотрим вопрос о том, как получить строгую каноническую форму. Для произвольных сдвигов g, gi и g2 определим множества H0(g) и #i(£i >£г) > полагая Но (g) = {с | gc определено}, Hl(gl9g2) = ic\cgi = cg2). Предположим, что для допустимых сдвигов оба множества допустимы. Тогда имеют место следующие соотношения: F(x8)IHo~QO = F(w)/HMJ9 (1.17) F(xg^x^)IHl(gl9g2)^F(x^9x^)IH1(Slfg2)9 (1.18) где F(xg) и F(xgl, х8г) — базовые термы. Теперь строгая каноническая форма может быть получена путем разложения членов канонической формы (1.10) по множествам Н0 и #i и применением соотношений (1.17) и (1.18). Действительно, если вырезка F(zf», ..., z^m)/H не свободна, то для любого с либо cgf не определено, либо для некоторой пары / и / имеет место z,- = z; и eg; = cgr Если для некоторых си/ имеет место первый случай, то разложим вырезку по H0(gt)\ если для некоторого с и пары (/, /) имеет место второй, разложим ее по Нх (git gj). После некоторого числа таких разложений,,применения соотношений (1.17) и (1.18), а также отбрасывания одного из двух повторяющихся аргументов после (1.18), рассматриваемая вырезка превратится в наложение свободных. Заметим, что при рассмотрении равенств вида (1.16) для того, чтобы формально в левой и правой частях иметь одинаковые аргументы zf *, ..., z^w, возможно, приходится добавлять такие, от которых вырезка зависит фиктивно. В этом случае свойство свободы может нарушиться, и необходимо сделать еще несколько шагов для одновременного приведения частей равенства (1.16) к свободному виду, сохраняя одинаковые аргументы. Теорема 1.1. Соотношения (1.1) - (1.9), (1.10) - (1.13), (1.17) - (1.18) вместе с тождествами базовой алгебры данных образуют полную 'систему тождеств для алгебры структур данных, в которой множества H0(g) и Нх (gi, g2) допустимы для любых допустимых сдвигов g, gx и g2. Действительно, для приведения двух равных выражений в алгебре структур данных к общей строгой канонической форме достаточно применения тождеств, указанных в формулировке теоремы. Упражнения 1. Доказать тождества (1.1) - (1.9) и (1.16) - (1.18). 2. Построить алгоритм распознавания тождественного равенства выражений алгебры структур данных, расположенных на Zw, если известен алгоритм распознавания тождеств базовой алгебры данных; полугруппа сдвигов состоит из параллельных переносов {eg = с + с'), а допустимые множества порождаются параллелепипедами [аг: Ъх ,...,*„: Ъп\. 3. Обобщить результат предыдущего упражнения на случай, когда полугруппа сдвигов состоит из произвольных аффинных преобразований модуля Zn над кольцом целых чисел. 9* 131
§ 2. Периодически определенные функции Рассмотрим систему уравнений У\ = Ft(y,x\ ' = 1,..., w, (2.1) в алгебре структур данных Г (С, D), расположенных на С и принимающих значения в D. Здесь у = (^i, ••> ут) — неизвестные структуры данных, х = (*!, ..., х„) - произвольные фиксированные структуры данных (параметры), Ff(y9x) — элементарные структурные функции. Отношение аппроксимации, определенное на D, переносится на множество Г (С, D) и превращает его в индуктивное, частично упорядоченное множество с нулем (нигде не определенная структура данных w). Отношение хС у означает, что для всех с G С имеет место х(с) С у (с), a U хп для воз- Л=1 растающей цепочки хх L.x2 С... структур данных есть такая структура дан- оо ных у, что для всех с G С имеет место ^ (с) = U х„(с). Нетрудно показать, что все операции алгебры структур данных, а следовательно, и элементарные функции непрерывны. Поэтому система (2.1) имеет наименьшее решение, которое определяется формулами: (*) Уг = U у% , к = О у. = vv, ^-^ Уг = F%iy\ ,->Ут >*)• Структуры данных yt являются функциями, зависящими от параметров xi> ..., хп. Систему (2Л) можно рассматривать также как каноническую систему функциональных уравнений специального вида: У((х) =F((y(x),x). Ее решение также определяется соотношениями (2.2) и является непрерывным по всем своим аргументам х\, ...,*„. Структурные функции, которые могут быть определены системами уравнений вида (2.1), называются периодически определенными структурными функциями. Основное свойство периодически определенных функций состоит в том, что, как и элементарные функции, они допускают скалярное представление. Для того чтобы получить это представление, приведем правые части уравнений (2.1) к канонической форме: к{ Яч ЯН- у{ = U ац^\...,2щ1)1Нф i=l,...f m. (2.3) Переходя к скалярным переменным, получим Уг(с) = Qfj(zn (cgn),..., гщ{сЕщ)\ с е Щ, (2.4) / = 1,...,/я, / = 1,...,£,-. 132
Здесь zn, ..., гП( G {xl9 ..., xn, y.t, ..., ym). В отличие от элементарных функций скалярное представление периодически определенных функций представляет собой систему уравнений, где неизвестными являются скалярные переменные yt(c) (с £ С). Рассмотрим несколько примеров. 1. Пусть С = Z = { ..., — 1,0,1,2,...}. Допустимые сдвиги - это прибавление целочисленной константы. Допустимые множества - конечные или дополнения конечных множеств. Алгебра D — двухэлементная булева алгебра, стандартным образом расширенная и продолженная. Рассмотрим систему соотношений *(/) = *(/)+Я0+Р(0, * > 0> p(l)^x(i-l)^y(i~\)^fx(i-l)^p(i-l)yy(i-l)^p(i-ll i > 0, Р(0)=0. Здесь + обозначает сложение по модулю 2. Очевидно, что если последовательности х(п)х(п — 1) ... jc(0) и у(п)у(п — 1) ... >>(0) представляют два целых числа, записанных в двоичной системе, то z (n)z (n — 1) ... z (0) представляет собой их сумму, если она меньше чем 2W+1, p(i) - перенос в /-и разряд (/ < л), р(п + 1) — признак переполнения. Для того чтобы указанные соотношения согласовывались с общим видом скалярного представления периодически определенной функции z (x, у), нужно только последнее равенство переписать в виде p(i) = 0, i = 0. Алгебраическое представление рассматриваемой функции имеет вид 2= (* + У + p)IHQ, р= (xgл у8у х8 лр* чу8 npg)lHx, где Н0 ={0,1,...}, ^={1,2,...}, с$ = с-\. 2. Соотношение п xt = (bt - 2 atjxf)lattt t = 1,...,и, / = t + l выражает решение х системы линейных алгебраических уравнений порядка п с верхней треугольной матрицей коэффициентов а и вектором свободных членов Ь. Особенность этого соотношения состоит в том, что в нем участвуют структуры данных, имеющие различные области расположения — векторы и матрицы. Для того чтобы ликвидировать это различие, будем рассматривать переменные с одним индексом как переменные с двумя индексами, у которых один из индексов фиксирован, например, xr = xt0, bt = b^. Введем в рассмотрение еще одну переменную sav , полагая V Suv = 2j aujxj- /= и + l 133
Теперь имеем: *to = (*>*о - stn)/attt t = 1,..., n, sUv =5MU-i +auvxv0, и = 1,..., /i, v = w+ 1,..., w, Связь со скалярным представлением периодически определенной функции х = </? (д, Ь) над структурами данных, расположенных на двумерной решетке Z2, очевидна. 3. Пусть С есть множество вершин ориентированного графа, из каждой вершины которого выходит ровно т дуг. Если с Е С, то eg i,..., c£w - все вершины, в которые ведут дуги, выходящие из с. Алгебра D состоит из целых чисел. Рассмотрим скалярное представление функции у = у? (хх,..., хт): у(с) = О, с€Я0, j>(c) = min(><>£!)+*!<>), ...,.y<>Sm) + *m<>)), с еНг. Пусть л:/(с) определяет стоимость перехода из с в eg/. Тогда, если граф С не имеет циклов и Hxgt <£нх U Н0 (/ = 1,..., т), то >>(с) — минимальная стоимость пути из с в #о • Рассмотрим способы вычисления периодически определенных функций. Будем предполагать, что алгебра данных D является стандартным расширением алгебры определенных элементов D0 со стандартным продолжением операций (D = D0 U {w, w}, <о(..., w,...) = w, oj(..., w,...) =w). Систему соотношений (2.4) можно переписать в виде yi(c) = если с € Нп то Qa иначе если с е #/2 то Q/2 иначе и рассматривать как систему рекурсивных определений функций у{ из С в D, К этой системе можно применить общие методы вычисления алгебраических функций над двухосновной алгеброй (С, D) при стандартном расширении области С и добавлении предикатов, распознающих принадлежность множествам Я/;-. Однако интерес представляют специальные методы вычислений периодически определенных функций, учитывающие их специфику и в особенности приспособленность для описания параллельных вычислений. Рассмотрим систему периодически определенных функций yi(x), ... •••» Ут(х)> заданных системой (2.1), и предположим, что нужно вычислить значения структур данных yx{x)IHi, ..., ут{х)\Нт (некоторые из множеств #i, ..., Нт могут быть пустыми). Предположим, что система (2.1) приведена к канонической форме (2.3). Основным методом вычисления является метод, основанный на формулах (2.2), который будем называть методом синхронного вычисления структурных функций. Обозначим через 134
Eik С С область определения структуры данных yi , т.е. множество таких (к) точек с G С, что>>> (с) ФЖ Пусть Сне = Eik\Eik_i (к> 1, / = 1,..., m). Вычисления выполняются по шагам. На к-м шаге одновременно вычисляются значения всех структур данных ух, ..., ут во всех точках областей Cik, ..., Стк соответственно, а также в тех точках множеств Е{к , где значение структуры у{ может стать переопределенным. Если известно, что структуры данных xl9 ...,х„ нигде не переопределены, то в силу стандартности продолжения yt может стать переопределенным лишь тогда, когда в выражениях Qtj используется операция наложения. Поэтому если внутренних наложений нет, то вычисление производятся только в точках областей Cik. Вычисления выполняют ся до тех пор, пока последовательность значений структур данных ух /Hi, ..., ут/Нт не стабилизируется. Разумеется, реально такие вычисления можно провести, лишь если множества /// и С{к конечны, хотя теоретическую модель можно рассматривать и с бесконечными множествами. Конструктивность рассмотренного метода вычислений определяется конструктивностью операций базовой алгебры данных, задания множеств Hif Нij и сдвигов. Для того чтобы изучить структуру множеств Eik и С\к, рассмотрим ориентированный граф (S, R) информационных зависимостей. Множество S вершин этого графа состоит из. всех скалярных переменных У\ (с), • •> Ут (с), Хх (с), ..., хп(с) (сЕ С). Отношение R С S2 связывает вершину z(c9) с вершиной >>/(с) тогда и только тогда, когда с Е Hif-, с' = c8ip> z = zip Д*1* некоторого / = 1, ..., kt. Для упрощения рассуждений, связанных с операцией наложения, предположим, что эта операция встречается только внутри выражений Qtj , имеющих вид zx U ... u zki где zl5 ..., zk — скалярные переменные. Такое предположение не ограничивает общности, поскольку к указанному виду всегда можно перейти, вводя дополнительные переменные. Вершина У{(с) графа S называется дизъюнктивной, если с Е Нц и Qij есть наложение сдвигов скалярных переменных. Граф S позволяет легко определить множества Eik, исходя из условия стандартного продолжения операций. Если вершина yi(c) не является дизъюнктивной, то значение переменной у ({с) на k-м шаге вычислений определено тогда и только тогда, когда на к—1-м шаге определены значения всех переменных z(c') G R~l О/(с)), что вытекает из определения отношения Й информационной зависимости. Если же вершина У{(с) дазъюнктивна, то yt(c) на к-м шаге определено тогда и только тогда, когда значение хотя бы одной из переменных z(c' ) €R~l (>>/(с)) определено на к— 1-м шаге. Определим множества Sk С 5, полагая s GS0 <==>5 = = Xj (с) для некоторого / = 1 п и X/ (с) определено. Для к > 0 полагаем s G Sk *=> s G Sk^.i или s = yi{c) для некоторого i = 1, ..., m и R~l (s) С Sk-i для недизъюнктивной вершины и R~l (s) ПЗ^-^ф для дизъюнктивной вершины. Таким образом, значение переменной s на к-м шаге синхронных вычислений определено <=►$ G Ski и, следовательно, ceEik*=>yt(c) esk. 135
Множество Sfc \£*_1 (к > 1) называется к-м фронтом волны вычислений. Оно состоит из тех переменных, значения которых вычисляются на к-м шаге. Cik — фронт волны вычислений переменной У{ состоит из всех точек с таких, что У((с) G Sk \Sk-\ - Синхронные вычисления по рассмотренной схеме обладают некоторой избыточностью. Они не учитывают того, что заданы множества Hi9 ...,Hm , на которых следует вычислять ух,..., ут. На самом деле вычисления yg(с) нужно проводить не во всех точках области расположения, а только в точках, связанных информационными зависимостями с точками областей Hi9 ..., Нт . Пусть Р{ ={ У{(с) | с Е Hif i = 1,..., т). Рассмотрим множе- т ство переменных ГС S, полагая Т = U (R"1)*(Pi) ((Л"1)*- транзитив- / = 1 но-рефлексивное замыкание отношения R'1). Очевидно, что для вычисления значений переменных из множеств S,- достаточно вычислять только значения переменных из Т. Рассмотрение синхронных вычислений равносильно рассмотрению детерминированной дискретной динамической системы В = Ds (память скалярных переменных), функция переходов 5 которой определяется так, что 6(Z>) = b', где b\s) вычисляется по формулам (2.2) для всех переменных s £ Т. Начальные состояния системы В — это состояния Ь, для которых b(s) может быть отличным от w лишь для переменных s вида */(с). Процесс вычислений в точке s завершается, если через конечное число шагов значения переменных стабилизируются во всех точках множества (R~l)*(s). Процесс завершается на множестве Т, если он завершается во всех точках этого множества и число шагов стабилизации для всех точек этого множества ограничено. Элемент sG5 назовем конечным, если все пути, которые оканчиваются в s, имеют конечную длину. Из этого определения, в частности, следует, что никакой из конечных элементов не лежит на цикле. Если существует п такое, что все пути, которые оканчиваются в s, имеют длину не больше, чем п, то наименьшее из таких п называется высотой элемента s. Лемма 2.1. Все конечные элементы имеют конечную высоту. Действительно, если пути, которые оканчиваются в s, имеют неограниченную длину, то существует и бесконечный путь, оканчивающийся в s. Действительно, если s не имеет конечной высоты, то среди элементов множества R"1 (s) также существует элемент, который не имеет конечной высоты. Пусть это будет элемент S\; для него также найдется неконечный элемент s2 и т.д. Теорема 2.1. Если граф информационных зависимостей не имеет дизъюнктивных вершин, то процесс синхронных вычислений в любой точке s всегда завершается через конечное число шагов. Если элемент не является конечным, то скажем, что он имеет бесконечную высоту. Из леммы 2.1 следует, что значения элементов бесконечной высоты всегда не определены (стандартное расширение операций), а значение элемента s высоты п, если определено, то не, позже, чем через п шагов. Действительно, все элементы множества Sk имеют высоту к. Теорема доказана. 136
Обозначим через X множество всех скалярных переменных вида xt(c). Каждая переменная s = yj (с) конечной высоты является элементарной D-функцией от переменных из множества Xs = (R~l)*(s) П X. Поэтому для того, чтобы значение s было определено, необходимо и достаточно, чтобы все значения переменных из Xs были определены. Если в графе есть дизъюнктивные вершины, то утверждение теоремы 2.1 может не быть верным. Пусть, например, yt = xi+i и zt (i = 0, 1, 2, ...), где Z/ = Xj, если / = 2п (п = 1, 2, ...), и z{ = yi+l для остальных /. Значение yi определено, если хотя бы одна из переменных х п определена и принимает определенное значение, и все определенные значения х п равны. Если не все определенные значения х „ равны, то у0 переопределено. Очевидно, что процесс вычислений в точке Уо завершается, лишь если это значение не определено или переопределено. Аналогичные трудности возникают при отказе от стандартного продолжения операций и стандартного расширения области D. Отсутствие априорных оценок или признаков завершения процессов вычислений оставляет только возможность удовлетворяться приближенными значениями. С другой стороны, нестандартные расширения могут более адекватным образом описывать реальные процессы. В примере 1 при стандартном расширении процесс вычисления переноса p(i)является чисто последовательным. Но если считать, что 0 л х = О, 1vjc = x при любых х (включая х = w), то этот процесс становится параллельным, что и происходит в реальных арифметических устройствах и может быть использовано для ускорения их работы. В случае конечных областей Нц при стандартном расширении заверши- мость процесса вычислений гарантирована. Число элементов множества С^ называется шириной фронта волны вычислений и характеризует возможность их параллельного выполнения, а максимальная высота элеменгов множества переменных вида .У/(с), cGHi9 характеризует время вычислений. Другие способы вычисления периодически определенных функций, отличные от синхронных вычислений, получаются добавлением других возможных переходов к дискретной системе В = Ds'. Максимально асинхронная система получается, если допустить все переходы вида Ь -+Ь', где Ъf получается из Ъ вычислением значений каких-либо переменных из множества Т (не обязательно всех, которые могут быть вычислены). Все другие способы вычислений, включая последовательные, получаются как подсистемы максимально асинхронной. Модели, в которых учитывается время вычисления по формулам (2.4) при асинхронном выполнении, могут дать лучший результат, чем при синхронном. Упражнение Построить фронт волны вычислений для примеров, рассмотренных в параграфе. . 137
§ 3. Многоосновные алгебры структур данных Алгебры структур данных, рассмотренные в § 1, являются одноосновными. Основным множеством каждой такой алгебры является подмножество множества Г (С, D), замкнутое относительно операций алгебры структур данных, определенных с помощью полугруппы G допустимых сдвигов и множества (R допустимых множеств. Понятие допустимости формулируется в терминах операций, определенных на G и (R, и поэтому естественно рассматривать эти множества наряду с множеством структур данных как компоненты многоосновной алгебры структур данных. В качестве основных компонент к такой алгебре добавляются также множества С и D со своими операциями. Таким образом получается пятиосновная алгебра структур данцых (S, С, П9 G, (R). Операции алгебры S уже рассматривались, D является базовой Л-алгеброй, G — полугруппой, a fi — булевой алгеброй с операциями умножения и деления на сдвиги. Соотношения (1.1)- (1.9), рассмотренные в § 1, фактически являются соотношениями в многоосновной алгебре. Кроме рассмотренных, могут быть определены смешанные операции на С и D. Например, если С = Zn и Z С Z), то на D может быть определена операция с = {г х, ..., zn), которая по набору чисел z г,..., zn дает точку области расположения. Эта операция, вообще говоря, частичная, и для ее полноправного рассмотрения область С целесообразно расширить добавлением неопределенных элементов. Другой путь состоит в рассмотрении алгебры D как многоосновной. Материал этой алгебры может использоваться также для построения полугруппы сдвигов. В общем случае, если у?: Dn -+С есть взаимно однозначное отображение Dn в С, то в качестве сдвигов можно взять все преобразования, порожденные элементарными />-функциями. Именно, если a/(zi, ..., zn) (i = 1,..., n) — набор элементарных функций, то ему соответствует сдвиг g такой, что g(c) = ¥?(М*1> .... *л), .«> Mzi> •••> zn)); где (zl9 ..., zn) = = (^-1 (с), если этот вектор определен. При переходе к многосновной базовой алгебре/)= (D%) естественно и S сделать многоосновной, рассматривая семейство S% = Г (С, £>|), а базовые операции определять как смешанные операции многоосновной алгебры. Один из возможных путей расширения набора базовых операций, отражающий практические ситуации, состоит в рассмотрении операций cofo, ..., хп) над структурами данных хх, ..., хп таких, что co(x1? ...,х„)(с) =<л>{хх (с), ...,*„(с), с), где со - уже смешанная операция, использующая не только элементы D, но и элементы области расположения. Дальнейшее обогащение алгебры структур данных связано с переходом к рассмотрению структур данных, имеющих различные области расположения. Такие структуры данных часто встречаются на практике. Например, массивы могут иметь различную размерность, их области расположения — целочисленные решетки с разным числом измерений. Теоретически этот случай легко свести к рассмотрению одной области расположения (для массивов это достигается вложением в решетку максимальной размерности) . Однако вынужденное использование общей области расположения уменьшает наглядность представления преобразований информации в виде 138
выражений алгебры структур данных и скрывает иногда важные технические детали процесса проектирования программ. Рассмотрим класс 2 множеств, которые могут быть использованы в качестве областей расположения структур данных. Элементы класса 2 будем называть допустимыми областями расположения. Пусть С, С9 € 2. Частичное отображение g С С -+С9 называется сдвигом области С в С9. Пусть G — класс сдвигов, связывающих допустимые области. Предположим, что пара (2, G) удовлетворяет следующим условиям. Обозначим через Нот (С, С9) множество всех допустимых сдвигов из С в С9. Тогда: 1. Для любых g Е Нот (С, С9) и h G Нот( С', С") их композиция gh принадлежит Нот (С, С99). 2. Для произвольного С Е 2 в Нот (С, С) содержится тождественный сдвиг е. Эти условия означают, что пара (2, G) образует категорию с объектами из 2 и морфизмами из G. Для любого g Е Horn (С\ С) определим сдвиг х% структуры данных х Е Г (С, D) с помощью сдвига g, полагая для любого cGC' х8 (с) = если eg определено то x(cg) иначе н\ Таким образом, х8 Е Г (Cf, D), и операция сдвига имеет тип Г (С, D) X Нот (С1, С) -* -* Г (С#, />) (сдвиг структур данных, расположенных на С, в структуры данных, расположенные на С9). Сдвиг, определенный для одноосновной алгебры, получается как частный случай при g Е Horn (С, С). Если ЯССЕ 2, a g E Нот(С', С), то можно определить деление H/g области Я Hag, полагая Я/g = {сЕС'|с#ЕЯ}.С каждой допустимой областью С свяжем множество <R (С) допустимых множеств и будем предполагать замкнутость этого множества относительно булевых операций и операции деления на допустимые сдвиги. Для многоосновных алгебр структур данных сохраняются все тождества, рассмотренные в § 1, вернее, их обобщенные варианты. Многоосновные алгебры дают возможность введения новых типов операций, изменяющих области расположения и определяемых с помощью свертывающих операций типа суммирования элементов массивов. Пусть р€й - бинарная коммутативная и ассоциативная операция алгебры D с нейтральным элементом £, т.е. v (£, d) = v (d, £) = d. Примером могут служить операции сложения и умножения чисел. В первом случае нейтральным элементом служит 0, во втором — 1. Для произвольного множества Я С С и операции v определим функционал Фн,р' Г (C,D) ->/), полагая: О Ф*Л*) = fc 2) *{с).у(*) = х(с); 3) Фя1ия2,1;М = КФ/У1>)^я2,Д^)), НхЪН2=ф. Очевидно, что если множество Я конечно, то условия 1) -3) определяют функционал Фн,и однозначно. В некоторых случаях функционал Ф#, „ может быть определен и для бесконечных множеств. Например, если v — 139
конъюнкция' или дизъюнкция (кванторы) либо min, max для числовых значений, ограниченных в совокупности. При этом, однако, следует иметь в виду, что при переходе к бесконечным множествам может потеряться свойство непрерывности. Для специальных операций v применяются соответствующие обозначения. Например, если v есть сложение, то Ф#, р(х) = 2 х(с), с £i/ если v — конъюнкция, то Ф#, Л*) = Л х(с) = ( Vc G Н)х(с) и т.д. cGH Скалярные представления удобно употреблять и в общем случае, используя обозначение Ф#, Лх) = Фи х(с). с ея Например, равенство у(с) = ф„ х(с, с'\ с ее, нес', с'е н определяет структурную функцию у: Г(СХ СР, D) -+Г(С, D). Аргумент х этой функции расположен на С X С', а ее значение у = \р (х) — на С. Если Я можно линейно упорядочить с помощью сдвига g, т.е. H={co,c0g,... ...» c0gm] , то функционал Ф„ из последнего равенства можно элиминировать, полагая у(с) = z(c, с0), z(c, с') = *(*(*. с'*), *(с, с')), с'е Я, с' * c0gm, *(с, c0*w) = *(c,c0iTw), или в структурных обозначениях hi z = v(zh\x)IH1ux/H2i где Мс) = fo*o). h2(c,c') = (с,с^), #1 = С X Я\ {c0#w}, Я2 = = С X { c0gm } • Аддитивные функционалы допускают параллельное вычисление, поскольку Фн,и можно параллельно вычислять на непересекающихся подмножествах множества Я. Если множество Я и его. подмножества разбивать на примерно равные части, то общее время вычисления Ф##„ (х) будет иметь порядок О (log и), где п — число элементов множества Я. После элиминации функционал Ф^ будет вычисляться последовательно, однако если структура данных х сама определяется с помощью уравнения 140
x = ip(x), то изменение способа вычисления функционала может не дать' выигрыша. Например, замена первого из соотношений п Ух = 2 А'//, /= 1 хц = co(xi_lhzij\ *о/ = a на У! = "л, И/ = W/_! + X//, и0= О не ухудшит времени вычисления значений >»,- на интервале 1 < i <my которое при т > п и при любом распараллеливании будет иметь порядок не меньше, чем 0{п). Зафиксировав набор операций для многоосновной алгебры структур данных, быть может, расширив его путем добавления уже исследованных структурных функций, снова можно рассматривать элементарные структурные функции и системы уравнений вида У = Р(У, *)> где у, х — наборы структур данных, возможно, с различными областями расположения, a F — набор элементарных структурных функций. Применяя общую теорию рекурсивных определений, получим некоторый класс вычислимых алгебраических структурных функций, которые можно исследовать аналогично тому, как были исследованы периодически определенные функции. § 4. Рекурсивные структуры данных Функциональные структуры данных определяются таким образом, что для каждого класса (алгебры) структур данных фиксируется область (или несколько областей) расположения, а в процессе вычислений меняются только значения структур данных в различных точках области расположения и, возможно, изменяются в тех или иных пределах их области определения. Рекурсивные структуры данных, рассматриваемые в этом параграфе, более тесно связывают области расположения и элементарные значения. В таких структурах данных в процессе обработки могут изменяться не только элементарные значения, но также области расположения и связи между элементами этих областей. Далеким прототипом таких структур данных являются списочные структуры языка лисп, а также динамические структуры данных, определяемые с помощью указателей (ссылок, связей) в современных языках программирования. В качестве основного понятия рассматривается понятие составного объекта, частным случаем которого является нагруженное дерево. На мно- 141
жестве деревьев легко определить алгебру, которая оказывается изоморфной алгебре термов или свободной универсальной алгебре, если составные объекты рассматривать с точностью до изоморфизма. Для того чтобы распространить алгебраическую точку зрения на составные без циклов, необходимо ввести эквивалентность более слабую, чем изоморфизм, и рассмотрение произвольных структур данных приводит к каноническим системам уравнений и предельному переходу. Возникающие здесь конструкции могут быть распространены на произвольные алгебры с отношением аппроксимации. Перейдем к рассмотрению понятия составного. Составной объект, или просто составной, есть совокупность вершин и связей между ними. Каждой вершине поставлена в соответствие некоторая информация — отметка вершины и упорядоченное множество вершин, с которыми данная вершина непосредственно связана. Эти вершины называются также подчиненными данной вершине. Количество вершин, непосредственно подчиненных данной, однозначно определяется ее отметкой и называется арностью этой отметки, а следовательно, и вершины. Транзитивные замыкания отношений "непосредственно связана" и "непосредственно подчинена" дают отношения "связана" и "подчинена". Вместо термина "подчинена" используют также термин "достижима". Таким образом, вершина а связана с вершиной Ъ (или, что то же самое, Ь подчинена а) *=* существует путь от а к Ъ, т.е. последовательность вершин а = ах, а2, -,ап = Ъ такая, что а{ непосредственно связана с д/+1 (/ = 1, ..., п - 1, п > 1). Отношение достижимости не обязательно рефлексивно, т.е. связь вершины с самой собой может входить или не входить в составной объект. Среди вершин составного объекта выделена начальная вершина, связанная со всеми другими вершинами» этого составного объекта. Все сказанное можно формализовать следующим образом. Пусть £2 — сигнатура операций. Огграфом называется тройка (С, </?, ф), где </?: С-*£2, ф С С X N-+C, такая, что ф(с, /) определено <=> 1 < / <л, где п есть арность операции со = \р (с). Если Ф(с,г) = с', то говорят, что вершина с непосредственно связана с вершиной с' i-н связью, а с* непосредственно подчинена вершине с. Обозначается это записью с -+ с' или с -+ с'. Г2-граф С,. в котором выделена начальная вершина с0, т.е. четверка (С ¥?, ф,с0)9 назьюается составным объектом, если все его вершины, кроме, быть может, начальной, достижимы из с0. Каждая вершина составного объекта порождает новый составной объект. Начальной вершиной этого составного является данная вершина, и он состоит из данной и всех вершин, подчиненных ей, а также связей между ними. Отношения подчиненности и связанности так же, как и отметки вершин, переносятся с вершин на объекты, порождаемые этими вершинами. Объект, подчиненный данному объекту, назьюается его подовъектом. Объект, который не имеет непосредственно подчиненных, называется первичным составным объектом. Отметки вершин первичных имеют арность 0. Для л1обого составного объекта t однозначно определены отметка а его начальной вершины и объекты tx> ..., tn, непосредственно подчиненные объекту t. Если с0 — начальная вершина объекта t, то tx,..., tn порождают- 142
ся вершинами сх = ф(с0,1),..., сп = ф(со, п) соответственно. В этом случае пишут t -+<x(ti, ..., tn) и называют это выражение разложением объекта t. Первичные объекты имеют тривиальные разложения вида t -* а, где а - отметка единственной вершины первичного составного. Отношение t -+ct(tXi ..., f„), рассматриваемое как отношение арности п + 1 на множестве составных (при фиксированном а), не является функциональным по первому аргументу, т.е. из t -* a(tx, ..., tn) и t' -+a(tx, ..., tn) не следует, вообще говоря, что t - t\ Действительно, на рис.4.1 изображен составной объект Г. Его подобъекты t*и?" имеют разложения t' -+F(a,b) и t" ^F(at Ъ), но tn^t\ Здесь ди&- первичные объекты с отметками а и 0 соответственно. Рисунок 4.1 демонстрирует способ изображения составных объектов в виде ориентированных графов. При этом стрелки упорядочиваются слева направо или отмечаются своими номерами. Пусть tx = (С1э ф1, ^i,fli), t2 = (С2,\р2, #2»яа). Отображение у: Ci -+С2 назьюается гомоморфизмом объекта tx на t2, если tOii) = а2,к для любой вершины с € Сх ух (с) = ^2(7 (с)), r(^i fo О) = Фг(У (<0, О (1 <* <арность (с)). Гомоморфизм 7 называется изоморфизмом, если у взаимно однозначно. Составные объекты изоморфны, если существует изоморфизм одного из низ на другой. Гомоморфизм у естественным образом переносится с вершин на подобъекты. При этом, если t есть подобъект объекта tx и t -+а(их, ..., wm), то y(t) -+<х(у(их*)9 ..., у(ЦтУ)- Для изоморфизма оба разложения эквивалентны. Если составные tut' изоморфны, то изоморфизм между ними определяется однозначно. Составные объекты часто рассматриваются с точностью до изоморфизма, и в таких случаях изоморфные объекты отождествляются и считаются равными. Составные объекты, рассматриваемые с точностью до изоморфизма, называются также абстрактными составными объектами. Абстрактный составной объект можно отождествлять с классом всех объектов, изоморфных ему. Первичный объект с точностью до изоморфизма определяется отметкой своей вершины и, рассматриваемый как абстрактный, отождествляется с ней. Отношение t -+<x(tx,..., tn) переносится также на абстрактные объекты. Теперь уже объекты t' и f", изображенные на рис. 4.1, как абстрактные оказываются равными. Но в общем случае отношение подчиненности не Рис. 4.1 рис. 4.2 143
является функциональным, т.е. из t -+a(tl9 ..., t„) и t' -+a(ti9 ..., tn) не следует, что t и t' изоморфны. Пример показан на рис, 4.2. Очевидно, что t -+F(a9 t\) и f' -+F(a9t'.);HO t л t' не изоморфны. В этих формулах два разных первичных объекта рассматриваются как абстрактные и отождествляются с их отметкой а. Каждая отметка а арности п > О определяет w-арную операцию, действующую на абстрактных составных объектах. Результат применения этой операции к объектам (ti9 ..., tn) обозначается через a(tl9 !.., tn) и представляет собой абстрактный составной объект. Для того чтобы получить граф этого объекта, следует представить tl9 ..., tn графами без общих вершин, добавить новую вершину с отметкой а и связать ее с начальными вершинами объектов ti9 ..., tn. Если t = oc(tl9 ..., tn), то очевидно, что t -+a(t i,..., tn), но обратное, вообще говоря, не верно. Любое множество абстрактных составных объектов, замкнутое относительно операций," определенных отметками, образует алгебру составных, всякая алгебра составных является абсолютно свободной универсальной 12+-алгеброй, порожденной неразложимыми составными объектами, т.е. такими объектами, которые нельзя представить в виде t = a(/i, ..., tn) (п > 0)i Здесь 12+ состоит из всех операций сигнатуры £2 арности п > 0. Частным случаем алгебры составных является алгебра, порожденная первичными составными объектами. Эта алгебра называется алгеброй деревьев (точнее, 12-деревьев), а ее элементы называются деревьями. Если t —дерево, то t -+ a(ti9 ..., tn) *=* t = a(fi, ..., tn). Всякое дерево может быть представлено выражением в алгебре деревьев, т.е. выражением, построенным из символов, обозначающих первичные объекты и операции. Это представление единственно с точностью до синтаксических подробностей представления операций (включая правила старшинства, используемые для опускания скобок). Поэтому алгебра £2-деревьев изоморфна алгебре 12+-термов, порожденной первичными составными. Рассматривая алгебру составных, можно некоторые из первичных объектов рассматривать как 0-арные операции и включать их в сигнатуру. Тогда это будет 12'-алгебра, где 12 + С12 С С12. Что понимается под 12 , следует каждый раз оговаривать особо. Для абстрактных составных объектов понятие разложения допускает естественное обобщение. Если F(ti9 ..., tn) есть выражение в алгебре абстрактных составных объектов, построенное из (абстрактных) составных f 1> —9 tn, то разложение t ~+F(ti, ..., t„) означает, что составной { может быть построен из составных tl9 ..., tn следующим образом. Строим составной t' -" F(tl9 ..., tn). Если t отличен от t%, ..., t„9 то t = t9. Если же, например, t = Г/, то t получается из tf путем отождествления начальной вершины этого составного с'начальной вершиной его подобъекта tf. Любой конечный составной объект с точностью до изоморфизма может быть задан в виде совокупности разложений *i "* Fx(xu...,xn)y (4.1) *п -* Fn{xu..., xn)9 144
в которой выделено начальное разложение (например, первое). Здесь Х\, ..., хп — некоторые символы (параметры); Fi(xi,..., хп), ...9Рп(хг,... ..., Хп) — выражения в алгебре деревьев, которые, кроме первичных объектов, используют символы х\, ..., хп. Составной объект, заданный таким разложением, строится следующим образом. Сначала строим деревья, представленные выражениями Fj(jc), ..., Fn(x), рассматривая параметры как отметки первичных. Затем каждую вершину д/, отмеченную символом Xf, отождествляем с начальной вершиной объекта Ft (х), удаляя при этом отметку х/ и заменяя ее отметкой начальной вершины дерева Ft(x). В качестве начальной вершины полученного составного выбираем начальную вершину начального разложения. Если обозначить через f / составной, порожденный вершиной а;, то имеет место разложение jf -+Fj(ti, ..., tn). Система разложений (4.1) называется параметрической системой разложений. Если Ft(xi, ..., хп) = = а(х{ , ..., X(k) (a Е £1, k > 0), то параметрическая система разложений называется канонической. Каноническая система разложений определяется однозначно с точностью до переименования параметров и перестановки разложений. Рассмотрим примеры. Объект, изображенный на рис. 4.1, можно задать в виде разложений t-+F(F(x,y),F(x,y)), X-+OL, Объект, изображенный на рис. 4.2 — в виде разложений r->F(a,r'), t'-+F(a,t'). Разложение r-F(F(a,/J),F(tt,/J)) задает объект, изображенный на рис. 4.3. Он не изоморфен объекту рис. 4.1. Определение составного объекта не исключает случая, когда множество его вершин бесконечно. Бесконечные составные объекты можно получить, разворачивая циклы конечных составных. Формально операцию развертывания можно определить следующим_ образом. Пусть t = = (С, </?, ф, с0). Рассмотрим составной Г = (С, кр, ф ,ZF0) • С — это множество всех конечных инициальных путей с0 -> сх -> . .. -+ст составного t. Начальная вершина 1с 0 — это путь нулевой длины с0, кр (с0 -*...-* ст ) = = *(ст)> ф(с0 -*... -+cm,i)fc0 -►.,. ->ст -> i//(cm, 0, если i//(^^Оопре- делено и не определено в противном случае. Составной t называется развертыванием составного t. Он всегда является деревом (возможно, бесконечным) в том смысле, что для любой вершины существует единственный путь, соединяющий с ней начальную вершину. 10. Ю.В. Капитонова 145
Операция развертывания приводит к важному понятию строгой эквивалентности составных объектов. Составные t\ и f2 строго эквивалентны, если их развертывания 7i и7$ изоморфны. С каждым составным объектом t свяжем язык L(t), порождаемый этим объектом. Язык L(t) состоит из слов в алфавите^ С SIXN, N = = {0, 1,...} . Пара (cj, i) G Z «• арность (cj) = 0 и i = 0 или арность (со) = = п > 0 и 1 < i < п. Слово (а0, 0) (ах, i i) ... (am, /m) eZ<f) <=»существует •1 '2 W инициальный путь в t вида с0 -* Ci -+ ... -> cm такой, что а/ = <pfa) (i = = l,...,m). Теорема 4.1. Составные tut эквивалентны ^L(t) =L(t ). Действительно, соответствие между инициальными путями в составном и элементами порождаемого им языка взаимно однозначно, поэтому из равенства L(t) = L(t') следует изоморфизм развертьшаний составных Гиг'. Легко доказывается также следующее свойство развертываний: Т ер р е ма 4.2.Если t-+F(tu... 9tn),ToT = F(7i,... ,7п). В этой теореме F (ti,..., tn) — выражение в алгебре деревьев, 11,..., tn — составные. Теорема доказывается индукцией по числу операций в выра- жении^(г15...,Гп). Отношение строгой эквивалентности является отношением конгруэнтности в алгебре 3 конечных составных объектов, и можно рассматривать фактор-алгебру S по этому отношению. Элементами этой алгебры являются фактор-объекты, т.е. составные, рассматриваемые с точностью до строгой эквивалентности. Поскольку всякий такой объект однозначно определяется некоторым деревом (возможно, бесконечным), фактор- алгебра S изоморфна алгебре деревьев, которые получаются развертыванием составных из S. Дерево (вообще говоря, бесконечное), которое является развертыванием конечного составного объекта, называется регулярным. Алгебра конечных составных объектов, рассматриваемых с точностью до строгой эквивалентности, изоморфна, таким образом, алгебре регулярных деревьев. Если t' -+F(ti,..., f„), tn -^F(ti,..., *„), то составные tf и t" строго эквивалентны, поскольку_их развертывания в силу теоремы 4.2 изоморфны. Поэтому в алгебре S разложения превращаются в равенства, а системы параметрических разложений — в канонические системы уравнений в этой алгебре. _ Теорема 4.3. Каждая каноническая система уравнений в алгебре S имеет единственное решение. 146
Если xt = Fi(pci9...9x„)9 i= l,...,w, (4,2) есть каноническая система уравнений, то составные tx ,..., tn9 заданные параметрической системой разложений Xi-+Fi(pci9...9xn)9 i=l,...,л, и рассматриваемые с точностьюдо строгой эквивалентности, образуют решение этой системы в алгебре S . Соотношения (4.2) однозначно определяют также языки L(ti)9..., L(tn), откуда следует единственность решения. Алгебру S можно построить также другим путем, используя теорию аппроксимации. Для этого рассмотрим алгебру D = Т&(А) конечных П-деревьев, порожденную первичными составными, образующими множество А. Выделим в множестве А пустой (неопределенный) составной объект w и введем на D отношение частичного порядка ГГ. Будем считать, что t С tf о t1 получается из t подстановкой деревьев вместо некоторых вхождений пустого составного объекта. Иными словами, t* = g(tl9...9tn)9 t = g (w,..., w). Отношение С является отношением частичного порядка с наименьшим элементом w9 и его можно рассматривать как отношение аппроксимации. Множество D не является индуктивным. Бесконечная последовательность деревьев сходится в D о она стабилизируется через конечное число шагов. Однако D можно вложить в индуктивную алгебру с аппроксимацией, относительно которой операции оказываются непрерывными. Идея состоит в том, чтобы пределы последовательностей отождествить с самими последовательностями. Эта важная конструкция может быть применена к более широкому классу алгебру чем алгебры деревьев, и мы рассмотрим ее в общем виде. Итак, пусть теперь D — произвольная 12-алгебра с отношением аппроксимации (Г, наименьшим элементом w, монотонными и непрерывными операциями. Непрерывность монотонной функции /: D-+D означает здесь следующее: если возрастающая последовательность хх С х2 Е ... элемен- оо тов D сходится, т.е. имеет наименьшую верхнюю грань U xi9 то последо- оо оо вательность f(xx) Е f(x2) Е... также сходится и /( U */) = U /(*,). Рассмотрим множество D" всех функций натурального аргумента, принимающих значения вДи выделим из них множество M(D) монотонных функций, т.е. таких функций /, что /(л) С/(л + 1) для всех л = 0,1,.. Записывая аргументы в виде индексов, получим, что всякую функцию /Е М(р) можно отождествить с бесконечной возрастающей последовательностью /о Е fx Е Превратим множество М(D) в 12-алгебру, полагая для /™9..., /*т* € Л/ результат применения операции cj равным "(Г(1) /(т)) =/= («(Л>(,) ,-.. ,/о(т)), • • •, <о</„(1), • • • ,/„(т)),...)- Каждому элементу d Е D сопоставим последовательность d Е d Е .... Это сопоставление задает вложение алгебры D в M(D) в качестве подалгебры. Определим наЛ/ф) отношение Е, полагая/С/ о для каждого л Е N существует к > О такое, что /„ Е /^+*или f сходится к элементу d в Д а /„ Е d для всех л G N. В первом случае будем говорить, что /' мажорирует /, во втором - что предел последовательности f мажори- 10* 147
рует f. Таким образом, / С /' * / мажорируется последовательностью /' или ее пределом. Отношение С совпадает на D с отношением аппроксимации, а на M(D) является квазипорядком. Рассмотрим отношение эквивалентности е на множестве М(D), полагая / = /' (е) <► / С /' и/' Г/. На фактор-множестве М(D) /е отношение С будет частичным порядком. Покажем,, что е является конгруэнтностью. Пусть f'1) = g^ (е)*... ... ,/("0 =g(»0 (€). Нужно показать, что <о(/(1>,... ,/(w)) =cj(^(1> ,... • ••> £*тЪ(е)- Последнее сравнение, в свою очередь, требует доказательства двух включений. В силу симметрии достаточно доказать одно из них. Например, первое вытекает из следующей цепочки включений: cj(f^l\... ...,/*">) С eofrW ,/<*>,... ,/<">) C«fr<»>,*<3>,/<»,...)C ... . ..Coj^1*, ... ,g^m^). Докажем, например, первое в этой цепочке (остальное доказывается аналогично). По предположению f^ С g^ . Если g^) мажорирует/^), то соС/^1)...,/^)) С cofrj»*, /<?>*,... ); если же /**) мажорируется пределом Л = U gjf*, то со(/^ ,..., /^т*) С С <о(Л,/й<2>,... ,/„<">). Следовательно"^*0, •.. ,/(т)) Ссо(Л,/<2>,... ..., /(т*). Таким образом, M(D)/e есть 12-алгебра с отношением аппроксимации. Алгебра Z) по-прежнему вкладывается в M(D)/e, поскольку на D отношение е совпадает с равенством. Это вложение сохраняет отношение аппроксимации и все пределы. Кроме того, каждая возрастающая последовательность алгебры D имеет теперь предел в M(D)/et совпадающий с этой последовательностью, рассматриваемой с точностью до отношения эквивалентности е. Сохранение пределов вытекает из того, что если оо U dn = d, то последовательности d0 С dx С.. и d E d С ... е-эквива- лентны. Алгебра M(D)/e является максимальным расширением алгебры D, состоящим из пределов произвольных последовательностей элементов D. Точный смысл этого утверждения раскрывается следующей теоремой. Теорема 4.4. Пусть D' - алгебра с отношением аппроксимации и непрерывными операциями, a D вкладывается изоморфно в D1 с сохранением отношения аппроксимации и пределов. Тогда если каждый элемент алгебры D* является пределом возрастающей последовательности элементов из D, то существует гомоморфизм у: D" -►/>' некоторой подалгебры D" алгебры M(D) /e, содержащей D, на D*, причем диаграмма 2)" ^ -D' D в которой /i и i2 - соответствующие (изоморфные) вложения алгебры D, коммутативна. _ Если / G M(D), то через / обозначим класс всех последовательностей, е-эк в и валентных последовательности /. Если / имеет предел в D\ to обоз- 148
начимэтот предел U/. В качестве D" возьмем множество всех классов вида /, где / имеет предел в £>'. Если /(1),..., /(w) имеют пределы в £)', то в силу непрерывности операций <о(/(1),..., /(т)) также имеет предел Uoj(/(1>,...,/(w>) = co(Uf^ ,..., U/<w>). Поэтому оо(/(1>,... ... ,/(w))= а*/0>,...,/(w)) G Z)" вместе с /<*>,..., /<w>, т.е. Я" есть подалгебра алгебрыM(D) /е. Положим у (J) =^u/. Независимость этого рпределения от выбора представителя / класса / вытекает из того, что если / = /' (е) и / имеет предел в £>', то /' также имеет предел hU/=U/'. Докажем это. Пусть/ = /'(е) и U/ = d. Если /' имеет предел d! в £>, то U/' = df. Из е-эквивалентности / и /' вытекает, что d есть верхняя грань для/', a d' - верхняя грань для/. Поэтому d = df. Если же /' не имеет предела в D, то/' мажорирует/и, следовательно, любая верхняя грань последовательности /' является верхней / гранью для /. Поскольку d есть верхняя грань для /', то и, обратно, всякая верхняя грань для / есть верхняя грань для /' и, следовательно, d есть наименьшая верхняя граны U /' = d. Отображение у является гомоморфизмом. Действительно, y(oo(f(l\... ..., U/(m>) = cj(7(/(1) ,..,, 7(/(w))> To, что у есть гомоморфизм на, а диаграмма коммутативна, очевидно. Теорема доказана. С помощью алгебры M(D) /е можно строить различные расширения алгебры D, добавляя пределы тех или иных последовательностей. Важным частным случаем является минимальное расширение D* С M(D)/e, в котором каждая каноническая система уравнений имеет наименьшее решение. Оно строится следующим образом. Рассмотрим каноническую систему уравнений Xi = F;(xl9... ,xm), i = 1,... ,m, (4.3) в алгебре D. Она определяет т бесконечных последовательностей/*1*,... ...,/ w , определяемых рекурсивно: ffP=Ft(f!i%,...j£>i), «=1,2,... , /0(0 = w, /=l,...,m. Подалгебра D* состоит из всех последовательностей, порождаемых таким образом с помощью канонических систем уравнений (рассматриваемых с точностью до е-эквивалентности). Алгебра D* или любая изоморфная ей алгебра с изоморфным вложением в нее алгебры D называется регулярным расширением алгебры D. В алгебре D * каждая каноническая система уравнений вида (4.3) имеет^ наименьшее решение U/*1*,... ,U/(m'. Рассмотренная выше алгебра S конечных составных объектов, рассматриваемых с точностью до строгой эквивалентности, является, таким образом, регулярным расширением алгебры Т^(А) конечных деревьев, порож^ денных первичными А с выделенным пустым составным w и определенным выше отношением аппроксимации. Для этой алгебры примем обозначение Th (А) и будем называть ее элементы абсолютно свободными составными объектами, подчеркивая этим, что в основе их построения лежит абсолютно свободная алгебра. 149
В ряде приложений составные объекты рассматриваются с точностью до некоторой более слабой эквивалентности, чем строгая эквивалентность. Пусть D — некоторая 12-алгебра, А С D - ее подмножество. Тогда Гп (А) можно рассматривать как множество выражений в алгебре D. Два выражения D эквивалентны, если они представляют один и тот же элемент ал- . гебры £>. Множество Tq, (A), рассматриваемое с точностью до />-экви- валентности, является £2-алгеброй, изоморфной подалгебре алгебры D, порожденной множеством А. Эту алгебру будем обозначать Ta(A)/D или просто Tq, (А), если не возникает недоразумений. Пусть на D задано отношение аппроксимации. Оно переносится на Tq, (А) с сохранением непрерывности. Тогда можно построить регулярное замыкание T}i(A). Элементами его являются составные, рассматриваемые с точностью до /)-эквива- лентности, которые мы будем называть составными над алгеброй D. С помощью составных можно определить алгебру элементарных D- функций с константами из А. Для этой цели добавим к множеству А множество переменных X и рассмотрим алгебру Гп {A U X) выражений, которые кроме констант могут содержать переменные. Два выражения t\ (*i,..., хп) и t2 (xi,..., хп) называются /^-эквивалентными, если t\ {dx,..., dn) = t2 (di,..., dn) для любых dl9..., dn G D. Факторизуя T& (A U X) по отношению D-эквивалентности, получим алгебру, которую будем обозначать 7д (А, X, D). Если выражения tx и t2 /^-эквивалентны, то соотношение ti = t2 называется тождеством алгебры D. Алгебра Т& (A, Xf D) получается факторизацией алгебры Тп (A U X) с помощью соотношений, которые включают в себя соотношения подалгебры алгебры D, порожденной множеством Л, и все тождества алгебры D. Она изоморфна алгебре элементарных/^-функций с константами из А. Иногда удобно рассматривать не все, а только некоторые из тождеств алгебры D. Если факторизовать 7^ {A U X) с помощью соотношений из А и тождеств из множества ЗС, то получим алгебру, которую будем обозначать Гп (А, X, И). Если ЗС содержит все соотношения, то эта алгебра совпадает с 7д (А, X, D). Если D — алгебра с аппроксимацией, то отношение аппроксимации переносится и на Tq, (A, X, D), если положить, что tx (xi,..., хп) С t2 (хх,. .., хп), и если для любых d i,..., dn G D имеет место tt (dx,..., dn) С t2(di9...9 dn). При этом непрерывность операций сохраняется, и можно построить регулярное расширение Т^(А, X, D). В случае произвольной системы тождеств ЗС возможность перенесения отношения аппроксимации зависит от системы тождеств ЗС. Если такое перенесение сделано и построено регулярное расширение 7^ (А, X, 30, то его элементы будем называть составными ЗС-объектами над алгеброй D или составными над D, если ЗС совпадает с множеством всех тождеств алгебры D. Рассмотрим примеры. 1. Пусть £2 содержит единственную бинарную операцию х • у. Алгебра деревьев с этой операцией и множеством первичных А — это алгебра бесцикловых списочных структур. Списками обычно называют структуры вида хх • (х2 • (... (хп • w) ...)), где w - пустой список. Произвольные составные объекты над этой сигнатурой — списочные структуры с циклами. Абстрактные составные могут использоваться, например, для задания регулярных языков (см. упражнение 2). Если множество пер- 150
вичных состоит из чисел (целых или вещественных) и переменных, а сигнатура расширена введением соответствующих операций над числами, получаем структуры данных языка лисп. 2. Пусть снова сигнатура операций содержит единственную бинарную операцию х-у, которая объявляется ассоциативной. Множество Т&(А) в этом случае является свободной полугруппой. Элементами ее являются строки или слова в алфавите А. Я. Добавим к предыдущему примеру еще одну бинарную ассоциативную операцию v и тождества х ух =х,хм у =yvx, (xvy)z=xzvyz9z(xvy) = = zx v zy. Для неопределенного объекта w положим wvx = дс, wx' = xw = = w. Алгебра 7^ (А) в этом случае изоморфна алгебре конечных языков (конечных множеств слов в алфавите А). Элемент w играет роль пустого языка. Уместно добавить еще один первичный е (пустое слово) и соотношения хе = ex = jc. В качестве отношения аппроксимации естественно взять отношение теоретико-множественного включения. Известно, что элементами множества Т^(А) являются произвольные контекстно-свободные языки. Составные объекты в сигнатуре £2 используются в качестве способа задания порождающей грамматики для некоторого контекстно- свободного языка. Эквивалентность составных в этом случае означает совпадение порождаемых ими языков. 4. Алгебра отношений, алгебра алгоритмов, алгебра /^-функций и функционалов высших ступеней могут служить материалом для построения структур данных. Для каждой из этих алгебр могут быть построены полезные отношения эквивалентности, начиная от строгой и кончая равенством в соответствующих алгебрах. Упражнения 1. Доказать, что гомоморфизм составного t на г', если существует, то единствен. 2. Доказать, что язык L (Г), порожденный составным объектом Г, регулярен. 3. Продолжить рассмотрение п. 4 примеров, пользуясь материалом предыдущих глав. 4. Доказать, что алгебра Т^(ф, Xt D) изоморфна алгебре алгебраических D-функций. § 5. Теоретико-множественные структуры данных Функциональные структуры данных представляют собой частный случай более общего понятия теоретико-множественных структур данных, которое позволяет с единой точки зрения охватить различные типы структур данных, используемые в процессе алгоритмического проектирования систем преобразования информации. На начальном этапе проектирования алгоритма мы имеем дело с предметной областью задачи. Результат проектирования нужно выразить в терминах предметной области вычислительной системы, с помощью Которой должен быть реализован алгоритм. Алгебраическая точка зрения на процесс проектирования состоит в том, что в качестве модели предметной области задачи или системы используются многоосновная алгебра теоретико-множественных структур данных. Различные алгебры такого типа получаются с использованием стандартных теоретико-множественных конструкций, которые в общих чертах рассмотрены в этом параграфе. 151
Основой для построения модели предметной области является базовая алгебра данных. Ее компоненты называются базовыми типами данных. Предполагается, что базовая алгебра данных задана с точностью до изоморфизма, т.е. базовые типы являются абстрактными типами данных. Это значит, что все функции и предикаты, которые можно определить на базовых типах данных, должны выражаться через исходные операции и предикаты, уже определенные на них изначально. На некоторых из базовых типов данных определено отношение аппроксимации. В этом случае операции должны быть монотонными и непрерывными. При необходимости отношение аппроксимации может быть определено с помощью стандартного расширения. Над базовыми типами строится иерархия допустимых областей данных, из которых получаются структурные типы данных путем определения на этих областях операций и предикатов. Рассмотрим основные способы образования допустимых областей данных. 1. Декартово произведение Ах Х...Х Ап уже построенных областей Al9..., Ап. Напомним, что декартово произведение множеств рассматривается как л-арная операция над множествами. 2. Множество ВА всех отображений из А в В, где А и В — уже построенные области. Если А — бесконечное множество, то область ВА неконструктивна, и возникает вопрос, можно ли элементы этой области рассматривать как структуры данных. На самом деле при реализации в работе будут участвовать лишь те элементы области ВА, которые допускаются конструктивное задание. Однако на начальных этапах проектирования, может быть, еще не известны принципы выделения таких элементов. Кроме того, произвольное, даже не конструктивное отображение может быть аппроксимировано конструктивным. Как допустимый тип ВА может быть использовано для определения подтипов, т.е. множеств отображений, обладающих теми или иными свойствами. 3. Множество Г (А, В) всех непрерывных отображений из А и В, где А и В — уже построенные области с заданными на них отношениями аппроксимации. Если А - стандартное расширение области А0> то Г (А, В) может быть отождествлено с множеством частичных отображений изА0 в В. 4. Множество 2А всех подмножеств множества А. 5. Множество А* всех конечных последовательностей элементов области А. Это множество можно рассматривать и как множество всех слов в алфавите А, Множество А* включает в себя также и пустую последовательность (пустое слово). 6. Если А и В — допустимые области, то допустимой является область А U# Допускаются также бесконечные объединения допустимых областей. Если Alf А2, ... — последовательность допустимых областей, то область оо А = U At также является допустимой. Следующие конструкции требуют применения средств логического языка для определения предикатов на областях данных. В качестве такого языка используем язык многосортного исчисления предикатов, интерпретированный на совокупности допустимых областей. Атомарные формулы тако- 152
го языка строятся с помощью предикатов, заданных на допустимых областях, предиката равенства и отношения аппроксимации. Эти предикаты применяются к выражениям, построенным с помощью операций, заданных на областях данных, констант и переменных. К атомарным формулам можно применять пропозициональные связки и ограниченные кванторы по переменным, пробегающим допустимые области данных. Зафиксируем некоторый язык такого рода и будем называть его базовым логическим языком. 7. Пусть Р(х) — формула базового логического языка, содержащая единственную свободную переменную х, пробегающую допустимую область Л. Тогда можем построить новую допустимую область В ={х € А \Р(х)}. Эта область получается выделением из А элементов, обладающих свойством Р. В частности, если А есть подмножество декартова произведения, то В определяет допустимое отношение между элементами соответствующих множеств. 8. Пусть Р(х) - формула базового языка, х пробегает множество АС2В и существует единственный элемент С Е А такой, что Р(С). Тогда С есть допустимая область. 9. Пусть В С А2 — допустимое отношение, которое является отношением эквивалентности. Тогда фактор-множество А/В является допустимой областью. Если А есть 12-алгебра, а В — отношение конгруэнтности, то А/В также есть 12 -алгебра. 10. Пусть D — допустимая 12-алгебра (возможно, многоосновная), A CD — допустимое подмножество множества £>, К - совокупность тождеств алгебры D (не обязательно всех), X - допустимая область. Тогда допустимой является алгебра 7$} {А, X, Ж), и если на ней определено допустимое отношение аппроксимации, то допустимой является алгебра Т^(А,Х, К). 11. Пусть D — допустимая 12-алгебра. Тогда любая 12-алгебра, изоморфная алгебре Z), также допустима. Эта конструкция дает возможность вводить новые абстрактные типы данных. Для построения модели предметной области с помощью операций 1-11 строится некоторое конечное множество допустимых областей; на этих областях определяются операции и предикаты, которые превращают их в алгебры. Области базовой алгебригданных, а также те, которые получаются с помощью операций 1 - 6 и 10 - 11, называются основными. Ясно, что каждая допустимая область содержится в некоторой основной области. Операции, определенные на основных областях, переносятся на подобласти, если последние замкнуты относительно этих операций. Элементы допустимых областей называются допустимыми объектами. Поскольку, кроме абстрактных объектов, составляющих базовые области и области, полученные путем абстрагирования с помощью операции 11, среди допустимых объектов есть объекты,, имеющие конкретную природу (функции, множества и т.п.), для них определен ряд специальных операций и предикатов, которые можно использовать для превращения допустимых областей в алгебры. Рассмотрим некоторые из таких универсальных операций. Для декартова произведения областей определены проекции или селекторные операции. Если z = (z1?... ,zm) €:АХ X ... ХАт,то<р(г)~ zt есть проекция на *-ю координату. Возможны операции типа tf(z) = (z/f,..., z/fc). 153
Операция <p(zi, ...,zm) = z дает возможность "собирать" вектор из его компонент. Мы не рассматриваем конкретные обозначения для соответствующих операций, которые могут выбираться исходя из соображений удобства и стиля проектирования. Например, в языке паскаль наименование типа record (А :Г1э В: record (С: t2, D :Г3)) определяет область Мг X X (М2 X Л/3), где М\, М2, М* — множества значений типов rx, t2, h соответственно, и одновременно вводит обозначения для селекторных операций. Пусть A(zl9 (z2, z3)) = zi, AC((zi, (z2,z3)) = z2.Ecra4i, . ..,ЛЯ суть 12-алгебры, то на А\ X ... X Ап определены операции прямого произведения (покомпонентные). Для функциональных типов данных определена операция применения функции к аргументу: /(х), где / € Ав, х € В. Если / € ВА, g € Св, то /о g G С"4 есть суперпозиция функций fug. Предикат G определен для всех пар допустимых объектов. Значение выражения х <Е у есть истина тогда и только тогда, когда у — множество, ах - элемент этого множества. Аналогично определяется предикат С. Операции х Uy, x П у, х\у определены, если х и у множества и т.п. Если А есть 12 -алгебра, а В — отношение конгруэнтности, то А/В также есть 12-алгебра. Для множеств Т(А, X, Ж) и Т*(А, X, К) можно рассматривать операции, которые выражаются через подстановки элементов алгебры D вместо переменных. Наконец, новые операции могут быть определены средствами базового логического языка. Если, например, Р(х, у, z) - формула базового языка и утверждение VxG<4 V.y E53!zG CP(xf у, z)hcthhho(3! - существует единственный), то оо Р(х, у, z) определяет операцию типа А X В -> С. Область А = U Aj, где /=i Aj+i = A*t U>4/, есть область списочных структур. На ней определены операции, используемые в языке лисп: cons(x, у) — присоединение элементах к списку у\ саг(х) и cdr(x) - первый элемент и оставшаяся часть списка соответственно. Здесь не ставилась задача дать исчерпывающего описания всех математических конструкций, которые могут быть полезными при описании областей данных, на которых действуют функции, вычисляемые проектируемыми системами. Однако то, что здесь описано, покрывает большинство ситуаций, встречающихся на практике. Все описанные конструкции могут быть формализованы в рамках некоторого логического языка, в который помимо традиционных логических средств связок и кванторов входят развитые средства конструирования объектов. Такой язык может использоваться для автоматизации исследовательского этапа проектирования алгоритмов, который включает в себя дедуктивные построения, связанные с обоснованием корректности конструирования типов, выводом полезных свойств исследуемых объектов, доказательством существования решения рассматриваемых задач. Переход от моделей предметной области задачи к предметной области вычислительной системы сопровождается реализацией одних структур данных с помощью других. В общем случае реализация типа данных D с помощью типа/)' задается реализующим отображением у. D'-+D. Если такое отображение задано и y(df) = d, то говорят, что структура данных d' реализует, или представляет, структуру d. Если каждая структура данных 154
имеет реализацию, т.е. у является отображением D' на D, то реализация называется полной. Не требуется взаимной однозначности реализации. Более того, как правило, реализация многозначна. Например, естественные отображения множества составных в множество абстрактных составных, абстрактных составных в свободные и свободных в составные над алгеброй являются полезными примерами реализующих отображений, которые не являются взаимно однозначными. Если у: D' -+ D — реализующее отображение, a D является 12 -алгеброй, то желательно реализовать операции алгебры D на множестве D1. Говорят, что функция </?: (Df)n -*/)' реализует операцию со: /У-^Д если коммутативна диаграмма (ВТ * *D' Вп 2—* В Проще всего реализация получается, если D' также есть 12 -алгебра, а 7 - гомоморфизм. Если D' есть 12'-алгебра, то удобно реализовать операции алгебры D с помощью элементарных функций на D . Допускается также реализация с помощью алгебраических Z)'-функций, которые должны быть в свою очередь реализованы алгоритмами. Рассмотрим некоторые практически* важные способы реализации теоре- тикц-множественных структур данных. Представление множеств. Предположим, что задано некоторое множество А и речь идет о представлении некоторых подмножеств этого множества (не обязательно всех). Основные операции, которые следует реализовать, — это предикаты принадлежности, включения и сравнения, булевы операции U, П, \ (относительно взятий дополнения рассматриваемое множество подмножеств может быть не замкнуто). Полезно также иметь алгоритмы перечисления множеств, которые можно представлять в виде оператора цикла: дли всех xGM выполнить Q(x) кц. Рассмотрим следующие способы представления: списки, определения, алгоритмы распознавания и алгоритмы порождения. Списки используются для представления конечных множеств. Они могут быть также различных типов. Простой список можно рассматривать как элемент множества А*. Можно различать списки с повторениями и без повторений. Если допускаются списки с повторениями, то операция объединения выражается через конкатенацию; все же остальные операции реализуются алгоритмами. При этом только определение принадлежности выполняется за линейное время; остальные операции выполняются за время, пропорциональное произведению числа элементов двух множеств, участвующих в операции (при условии что сравнение двух элементов множества А вьшолняется за ограниченное время). При отсутствии повторений время построения объединения также пропорционально произведению. Для ускорения времени выполнения операций применяют различные приемы. Простейший из них — упорядочение. Если множество Л линейно упоря- 155
дочено некоторым отношением порядка, то элементы в списке можно считать упорядоченными по убыванию илк возрастанию. Все операции над упорядоченными списками выполняются за линейное время. Списки - это структуры данных с последовательным доступом. Их можно обрабатывать, двигаясь последовательно по элементам слева направо. Если списки задавать с помощью составных объектов, то можно организовать двухсторонние списки, по которым можно двигаться в одну и другую сторону, а также циклические списки. Возможно также использование списков с прямым доступом - одномерных массивов. Точнее, такой список задается парой, состоящей из числа элементов списка и одномерного массива, составленного из элементов множества А (функциональная структура данных, расположенная на множестве целых чисел). Упорядоченный список с прямым доступом из п элементов позволяет выполнить распознавание принадлежности за время порядка п log п. Следует также упомянуть представление множеств их характеристическими функциями, т.е. функциями, заданными на Л и принимающими значение 1 для элементов, принадлежащих данному множеству, и 0 для элементов, не принадлежащих ему. Булевские операции над такими функциями можно выполнять параллельно, и это потребует всего лишь ограниченного времени. Задание множеств с помощью определений позволяет работать с бесконечными множествами. Рассмотрим следующие типы определений: явные определения, порождающие схемы, рекурсивные и аксиоматические определения. Явные определения выражают определяемые множества через уже известные с помощью булевских операций, операций выделения подмножества с помощью условия, а также, возможно, других операций. Явные определения можно рассматривать как составные объекты над соответствующей алгеброй. Для того чтобы эффективно выполнять разпозна- вание принадлежности и включения, их следует преобразовывать, выполняя, если это возможно, упрощения, приводя к каноническим формам и т.п. Для алгоритмов порождения явное задание множества удобно привести к форме В П С, где В содержит возможно меньшее число элементов. Тогда при порождении следует перебирать только элементы множества В, проверяя их принадлежность множеству С. Порождающей схемой называется выражение t (xl9... ,хп) некоторой (вообще говоря, многоосновной) алгебры, принимающее значения в А и зависящее от параметров Xi, ... , хп. Для каждого из параметров задано множество допустимых значений. Схема порождает множество, состоящее из значений, которые принимает данное выражение при всевозможных допустимых подстановках параметров. Схемы удобно применять в случае, если требуется порождать элементы данного множества. Для распознавания принадлежности элемента множеству, заданному схемой, требуется решать уравнение t(xXi ..., хп) = а. Применение булевских операций приводит к смешанному способу задания множеств, использующему как средства явного определения, так и порождающие схемы. Одним из важных видов рекурсивных определений является использование порождающих схем вида г(х1?... ,хп, ylf... ,ут)9гцеуи.. . ,ут- параметры, пробегающие заданные множества, а параметры Х\, . .., хп 156
пробегают само порождаемое множество. Для рекурсивных определений должно быть задано некоторое начальное подмножество порождаемого множества. Иными словами, рекурсивное определение множества X состоит из нескольких условий вида В СХ их1у...,хп€X np(xl9...,xn,yi,..-уУт)** => t(xx,. .., х„, yl9..., ут) G Х> W Р - некоторое условие, t - выражение, принимающее значения в A, yi9 ..., ут — параметры, пробегающие заданные множества. С помощью рекурсивных определений, в частности, определяются подалгебры данной алгебры, порожденные заданными системами элементов. Рекурсивное задание множества может быть использовано для порождения его элементов. Что же касается алгоритмов распознавания принадлежности, то они могут быть сложными, и для их эффективной реализации потребуется дальнейшее исследование свойств заданного множества. Аксиоматическое определение множества состоит из некоторой совокупности условий - аксиом, которым удовлетворяет это множество. В отличие от предыдущих случаев аксиоматическое определение задает множество неоднозначно. Вопрос о принадлежности или непринадлежности некоторого элемента такому множеству решается положительно только в том случае, если соответствующее утверждение является логическим следствием из аксиом этого множества. Однако нельзя, например, говорить об алгоритме, который перечисляет элементы данного множества. Смысл распознающих и порождающих алгоритмов очевиден. Если эти алгоритмы представляются составными объектами, то необходим общий интерпретирующий алгоритм, который применяет алгоритм распознавания к конечным объектам и реализует порождение некоторых элементов множества в цикле. Представление бинарных отношений. Основные способы представления бинарных отношений подобны способам представления множеств. В частности, всякое бинарное отношение можно представлять как множество пар. К представлению с помощью списков добавляется представление двойным списком. Двойной список - это список пар. Первый член пары - элемент соответствующего множества. Второй член — список всех элементов, которые находятся в данном отношении с первым членом пары. Бинарное отношение на множестве А можно задавать также в виде ориентированного графа, вершинам которого сопоставлены элементы множества А, Такие графы можно задавать с помощью составных объектов. Для специальных типов бинарных отношений целесообразно применять специальные способы задания. Можно выделить следующие типы отноше? ний: транзитивные, квазипорядок, эквивалентности, частичные порядки, иерархии, функциональные отношения (функции). Рассмотрим некоторые полезные способы задания отношений. Вместо транзитивного отношения можно задавать любым из рассмотренных способов отношение такое, что заданное отношение является его транзитивным замыканием. Такое задание может значительно сэкономить память для конечных отношений и упростить задание в других случаях. Для транзитивных отношений полезно также задавать порождающее множество, т.е. множество таких элементов, для каждого из которых найдется элемент, находящийся с ним в заданном отношении. Следует обратить внимание, что при таком задании транзитивного отношения время распознавания принадлежности увеличивается. Например, при задании отношения графом рас- 157
сматривамое отношение превращается в отношение достижимости, которое имеет сложность распознавания, пропорциональную числу дуг в этом графе. Отношение квазипорядка (рефлексивное и транзитивное отношения) определяет эквивалентность х <у л у <л: и частичный порядок на множестве классов этой эквивалентности. Удобно поэтому квазипорядок задавать двумя отношениями - эквивалентностью и частичным порядком. При этом классы могут задаваться либо сами по себе, либо своими представлениями. Отношение эквивалентности удобно задавать как множество классов эквивалентности, определяемых этим отношением, или как функцию, которая каждому элементу области определения ставит в соответствие класс эквивалентности этого элемента. Частичные порядки задаются отношением непосредственного следования или непосредственного предшествования. Иерархия — это частичный порядок, в котором каждый элемент, кроме максимальных, непосредственно подчинен в точности одному элементу. Иерархии (объединения деревьев) представляются так же, как частичные порядки, но для их обработки применяются более простые алгоритмы, чем для произвольных транзитивных отношений или частичных порядков. Функциональные отношения кроме обычных способов можно задавать алгоритмами, вычисляющими значения. Их можно рассматривать также как функциональные структуры данных, расположенные на соответствующих областях, и использовать как массивы с прямым доступом. Многие множества удобно задавать через функции, например, в виде множества значений функции или полного прообраза некоторого значения или значений, удовлетворяющих определенным условиям. Многоместные предикаты и функции. Предикаты могут рассматриваться как бинарные отношения, составленные из пар, первый член которых принадлежит декартовому произведению. Аналогично многоместную функцию можно рассматривать как одноместную, определенную на декартовом произведении. Следует выделить способ задания п + 1 местного предиката (или л-арной функции) в виде такого списка пар, где первый элемент пары есть элемент х области определения первого аргумента, а второй - и-местное отношение (или функция арности п — 1, если п > 1), которое получается, если зафиксировать х в качестве первого элемента набора из п + 1 элементов, находящихся в данном отношении. Комментарии к главе 4 Теория функциональных структур данных, изложенная в § 1, была построена в работе [26]. Понятие периодически определенной функции введено В.М. Глушковым [16]. Соотношения в алгебре структур данных изучались В.П. Горшковым и СП. Гор- лачем [35, 36]. Результаты § § 2. 3 были опубликованы в [63, 64]. Изложение теооии рекурсивных структур данных следует работам [7,34,60]. Теоретико-множественные структуры данных использовались в языке сетл [92] и ^-программировании [33]. Другие направления в теории структур данных хорошо представлены в сборнике [38] и обзоре В.Е. Агафонова, заключающем этот сборник. Вопросы реализации теоретико-множественных структур данных рассматривались в [20]. В монографии [5 ] рассматриваются, в частности, вопросы использования структур данных для построения эффективных алгоритмов.
Часть II ПРОЕКТИРОВАНИЕ Глава 5 АРХИТЕКТУРА ЭВМ § 1. Структура неймановской ЭВМ Вычислительная машина (компьютер или ЭВМ, поскольку подавляющее большинство современных компьютеров пострено на основе электроники) представляет собой автоматическое устройство, предназначенное для обработки информации во взаимодействии с человеком по схеме, изображенной на рис. 5.1. Эта схема представляет собой трехкомпонентную дискретную систему, в которой две активные компоненты - человек и центральная часть ЭВМ — взаимодействуют, согласованно изменяя состояния общей части информационной среды, реализованной обычно с помощью устройств ввода-вывода и внешних запоминающих устройств. В традиционных структурах ЭВМ неймановского типа роль человека в процессе обработки информации сводится к минимуму. Его задача состоит лишь в установке или смене подготовленных заранее носителей информации (перфокарты, магнитная лента, диски и т.п.) и выдаче управляющих сигналов о запуске или прекращении работы ЭВМ. Более подробно структура неймановской ЭВМ представлена на рис. 5.2. Внешняя компонента информационной среды здесь разложена на две составляющие — совокупность устройств ввода-вывода (ВВ) и внешних запоминающих устройств (ВЗУ). Центральная часть ЭВМ состоит из основной оперативной памяти (ОЗУ) и процессора, который подразделяется на человек Внешняя компонента, инерормационнойсреды Центральная часть ЭВМ Рис. 5.1 Человек ВВ ОЗУ ^/Центральная часть ЭВМ Х/Процессор УУ Yr \АЛУ\ Рйс. 5.2 ВЗУ Человек 159
устройство управления (УУ) и арифметико-логическое обрабатывающее устройство (А Л У). Цель данного параграфа состоит в том, чтобы получить общий вид достаточно подробного алгоритмического описания ЭВМ традиционной архитектуры и обсудить некоторые вопросы алгоритмического и логического этапов проектирования таких ЭВМ. При этом будем двигаться сверху — вниз, начиная с самого общего описания, и последовательно его детализировать. В наиболее общем виде алгоритм функционирования центральной части ЭВМ может быть представлен следующим образом: ЦИКЛ Ждать ПУСК. Ввести начальную программу в ОЗУ. Выполнить программу. * КОНЕЦ ЦИКЛА. Сигнал ПУСК вводится человеком с пульта управления (одно из устройств ввода-вывода). Простейший способ ввода начальной программы состоит в обращении к определенному раз и навсегда фиксированному устройству ввода, стандартизации размера начальной программы и места ее расположения в ОЗУ. Дальнейшая детализация алгоритма функционирования ЭВМ требует уточнения характеристик ОЗУ и понятия программы. Для неймановской архитектуры типичным является использование в качестве ОЗУ однородной линейно адресуемой памяти. Логически такую память можно рассматривать как линейный массив М, составленный из машинных слов — двоичных кодов определенной длины. Элементы памяти называются ячейками. Содержимое ячейки — слово. Объем памяти, т.е. число ячеек, разрядность машинного слова и время выборки слова являются основными параметрами, характеризующими ОЗУ. Основная память обычно представляет собой память прямого доступа. Это означает, что время выборки практически не зависит от расположения олова, которое обычно выбирается за одно обращение к памяти. Неймановская машина имеет фиксированные форматы команд и данных. Каждое слово может рассматриваться либо как представление единицы данных, либо как команда. Данные — это числа: целые со знаком или без знака, вещественные с фиксированной или плавающей запятой, двоичные коды фиксированной разрядности или последовательности символов. Каждая команда изменяет состояние памяти или осуществляет операцию ввода-вывода, т.е. обмен информацией между устройствами ввода-вывода или ВЗУ и основной памятью. Кроме того, каждая команда определяет однозначно своего преемника - следующую команду - или завершает выполнение программы. Таким образом, неймановская машина на уровне команд представляет собой последовательную ЭВМ. В современных вариантах неймановской ЭВМ форматы команд и данных могут иметь различную длину, которая не обязательно совпадает с размером машинного слова. Так, например, в одном слове может быть записано больше одной команды или часть команды, а одна единица данных может занимать часть слова или несколько слов. Это приводит к тому, что адресуются не только слова, но и части слов, обычно байты - 8-битовые коды, а слово содержит целое число байтов. Поэтому адрес байта однозначно определяет и адрес слова, в котором этот байт находится. 160
Принципиальной особенностью неймановской ЭВМ является локальный характер изменения состояния памяти в процессе выполнения команд. Это изменение эквивалентно выполнению оператора присваивания у :=со(хь...,хт). Операция cj — это либо арифметическая операция над числами, либо операция над двоичными кодами (обычно поразрядные операции и сдвиги). Адреса операндов хх, ..., хт и результата^ либо явно указаны в команде, либо вычисляются некоторым простым способом с использованием дополнительных операндов zx, ..., zk. Числа тик обычно не превышают 2-3. Первоначально адреса задавались явно в команде, а их изменение производилось путем изменения (модификации) самих команд, которые ничем не отличаются от данных и могут служить операндами. Впоследствии, однако, идея использования индексных регистров и косвенной адресации полностью вытеснила необходимость изменять программу в процессе выполнения. Программы стали перемещаемыми. Выполнение операции происходит в АЛУ. Поэтому прежде, чем она начнет выполняться, операнды должны быть переданы в АЛУ. Первоначально, когда число регистров сводилось к минимуму, все операнды передавались из основной памяти, а результат отправлялся в нее. Исключение составлял накапливающий сумматор. В современных ЭВМ в состав АЛУ может входить некоторое число регистров общего назначения. Они также могут служить как источниками операндов, так и местами хранения результатов выполнения команд. Кроме основного результата команда может вырабатывать некоторые дополнительные результаты, например признаки такие, как знак результата или признак переполнения, младшие разряды произведения и т.п. Эти дополнительные результаты остаются в АЛУ и могут быть использованы в следующих командах. Выбор очередной команды обычно определяется естественным порядком их следования, т.е. адрес следующей команды получается прибавлением к адресу предыдущей некоторого числа, определяемого длиной прдыдущей команды (в простейшем случае 1). Этот порядок нарушается при вьшолнении команд условного или безусловного перехода. Адрес текущей команды хранится на регистре, который называется счетчиком команд (СК) и относится к устройству управления. К устройству управления относится также регистр команд (РК), в котором хранится выполняемая команда. Теперь можно алгоритм функционирования центральной части ЭВМ представить в следующем виде: ЦИКЛ Ждать ПУСК. Ввести начальную программу в ОЗУ. Установить начальное значение СК. ЦИКЛ Прочитать очередную команду в РК. ЕСЛИ РК есть команда остановки, ТО завершить выполнение программы; вывести информацию о завершении; выйти из ЦИКЛА 11. Ю.В. Капитонова 161
КОНЕЦ ЕСЛИ. Выполнить команду. ЕСЛИ аварийное завершение, ТО вывести анформацию об аварийном завершении; выйти из ЦИКЛА КОНЕЦ ЕСЛИ. КОНЕЦ ЦИКЛА. КОНЕЦ ЦИКЛА. Дальнейшая детализация алгоритма требует более полного описания системы команд и способов взаимодействия с внешней средой. В качестве примера рассмотрим простой вариант архитектуры, отражающий некоторые черты современных ЭВМ неймановского типа и достаточный для начального обсуждения общих вопросов проектирования .архитектуры ЭВМ. Рассматриваемую машину назовем ПНМ (простейшая неймановская машина). Предположим, что оперативная память состоит из слов разрядности 32 бита. Каждое слово состоит из двух полуслов по 16 бит, а полуслово - из двух байтов. Адресуются байты, т.е. память представляется, в виде массива М: массив (0:2W — 1) байтов. Число определяет разрядность полного адреса байта. Представляя адрес в виде двоичного кода, получим, что старшие т — 2 разрядов этого адреса указывают номер слова, а младшие — номер байта в слове. Таким образом, байты нумеруются с нуля (рис. 5.3). Разрядность машинного слова, т.е. единицы данных, которая выбирается за одно обращение к памяти, пока не фиксируется, она может быть равной одному, двум или четырем байтам. -байты Шво^У^/ \ О Полуслово Полуслово Рис. 5.3 \коп р ~ч\ \ноп р Ч Рис. 5.4 Кроме оперативной памяти машина имеет память общих регистров, которая состоит из 16 32-битовых слов, имеющих номера от 0 до 15. Регистровую память будем также рассматривать как массив R: массив (0:15) слов. Команды машинного языка имеют два формата. Короткие команды занимают 2 байта (полуслово), длинные - 4 байта (слово). Форматы команд представлены на рис. 5.4. Они являются аналогами форматов RR и RX системь; команд ЕС ЭВМ. Нулевой байт всегда содержит код операции. В первом байте записаны адреса (номера) двух регистров р и q, которые обычно используются для формирования операндов. Если команда длинная, то два последних байта содержат целое число d, называемое смещением и используемое для формирования адреса операнда, расположенного в оперативной памяти. Любая команда, за некоторыми исключениями, о которых будет сказано особо, работает с двумя операндами г и z. Первым операндом всегда яв- 162
ляется переменная г =R(p), значение которой хранится в регистре с номером р. Второй операнд z определяется одним из четырех способов: l)z = R(p); 2)z=M(R(q):R(q) + 3); 3) z = M(R(q) + d:R(q) + d + 3); 4)z=M(d:d + 3). Здесь M(a:b) обозначает двоичный код, составленный из байтов, расположенных последовательно в ОЗУ таким образом, что адрес первого равен д, адрес последнего — Ь. Способ определения второго операнда задается первыми двумя байтами кода операции:: 00 - первый, 01 — второй, 10 — третий, 11 — четвертый. Таким образом, получается, что первый бит определяет формат команды (0 - короткая, 1 — длинная). Все команды разделим на две группы: команды, выполняемые устройством управления, и команд i АЛУ. Команды АЛУ имеют один из двух видов: г := со (г, s) — бинарные операции иг := cj(z) — унарные операции. Не обсуждая в деталях конкретные операции, отметим лишь некоторый стандартный минимум. К нему относятся арифметические операции (сложение, вычитание, умножение и деление) чисел с фиксированной и плавающей запятой, сложение и умножение неотрицательных целых, логические поразрядные операции, сдвиги кодов (вправо, влево) на конкретное число разрядов и т.п. К унарным операциям относятся такие, например, как изменение знака, нормализация, поразрядное инвертирование и т.п. Будем предполагать, что в АЛУ имеется двухразрядный регистр ПР (признак результата), который принимает одно из четырех значений - 0, 1, 2, 3 - в зависимости от условий, которым удовлетворяет результат выполнения операции в АЛУ. Например, в случае арифметических операций значение регистра ПР может иметь следующий смысл: 0 — результат равен 0; 1 — результат больше 0; 2 — результат меньше 0; 3 — переполнение разрядности. Значение регистра ПР может быть использовано следующей командой условного перехода. Команды устройства управления разделим на следующие группы: - команды обмена между регистровой и оперативной памятью; - команды управления; - команды ввода-вывода. Команды обмена возможны двух типов: r:=z (ЗАГРУЗКА); z:=r (ПЕРЕСЫЛКА). Команды управления имеют вид ЕСЛИ а ТО НА z KE (ПЕРЕХОД). Условие перехода кодируется четырьмя битами, записанными в разрядах с номерами S - 11, т.е. там, где обычно записывается номер р регистра, в котором хранится первый операнд. Условие а есть дизъюнкция: а = а0 л 0О v с^ л 02 v а2 л 02 v а3 л /33, где af = 1 *=> ПР = /, 0о01020з - код, записанный на месте р. Таким образом, если например, 163
после вьшолнения арифметической операции требуется вьшолнить переход при результате, равном 0, следует взять р = 8(1000), если же следует перейти, когда результат больше или равен 0, то р = 12(1100). Следующая команда дает возможность организовать переход с возвратом, а также определить адрес команды, следующей за той, которая выполняется в текущий момент времени: г:=СК + и; HAz (ПЕРЕХОД С ВОЗВРАТОМ). Здесь и = 2, если выполняемая команда короткая, и и = 4, если длинная. Следующая команда позволяет вьшолнить команду, которая является значением операнда z: Выполнить команду z (ВЫПОЛНИТЬ). Команда ВЫПОЛНИТЬ может быть использована, например, для программирования отладочных программ. Следующая команда полезна при программировании циклов ДЛЯ /: = 1 ДО п ВЫП... г: = г- 1; ЕСЛИ г = 0 ТО НА z КБ (ПЕРЕХОД ПО СЧЕТЧИКУ). Выполнение команды остановки СТОП вызывает прекращение работы машины. Для описания команд ввода-вывода предположим, что ЭВМ оснащена следующими периферийными устройствами: - устройство ввода с перфокарт (ПК); - устройство вывода на бумагу (АЦПУ); - экранный пульт (ЭКР); - магнитный диск (МД); - магнитная лента (МЛ). Названия команд: ВВОД ПК; ВЫВОД АЦПУ; ВЫВОД ЭКР; ВВОД ЭКР; ВЫВОД МД; ВВОД МД; ВЫВОД МЛ; ВВОД МЛ; РАЗМЕТКА МД; РАЗМЕТКА МЛ; ПЕРЕМОТКА МЛ. Во всех этих командах предполагается, что значением операнда z является адрес в ОЗУ, с которого начинается область ввода-вывода, т.е. область, из которой берутся данные при выводе и куда помещаются данные при вводе. Длина этой области, а также все остальные данные, необходимые для выполнения операции ввода-вывода, определяются значением операнда г. 164
Название команды однозначно определяется 6-битовым кодом, который получается из кода операции отбрасыванием первых двух битов, характеризующих формат и способ образования второго операнда. В дальнейшем название команды будем отождествлять с соответствующим кодом. Теперь после предварительных замечаний о системе команд можно сделать следующий шаг в уточнении алгоритма функционирования центральной части ПНМ (уточняющие комментарии даны ниже). АЛГОРИТМ ПНМ: ЦИКЛ ЖДАТЬ ПУСК. ПРИНЯТЬ ВХОД ПК В М (0: 79); СК := 0; ЦИКЛ РК(0:15):=М(СК:СК+1); ЕСЛИ РК(0) = 1 ТОРК (16:31) :=М(СК +2:СК+3), СК:=СК + 4 ИНАЧЕ СК:=СК + 2КЕ. Анализ команды и подготовка операндов: ЕСЛИ КОП (2:7) =СТОП ТО вывести информацию о завершении, выйти из ЦИКЛА ИНАЧЕ ЕСЛИ КОП (2:7)= ПЕРЕСЫЛКА ТО ЕСЛИ КОП(0:1) =0 ТО R(q) : = R(p) ИНАЧЕ ЕСЛИ КОП(0:1) = 1 ТО M(R(q): R(q) + 3): = Я(р) ИНАЧЕ ЕСЛИ КОП(0:1)= 2 ТО M(R(q) + d : R(q) + d + 3) : = R(p) ИНАЧЕ M(d : d + 3): = R(p) KE, НА ЗАВЕРШЕНИЕ ИНАЧЕ ЕСЛИ КОП(0:1) =0 ТО г : = R(q) ИНАЧЕ ЕСЛИ КОП(0:1) = 1 ТО г := M(R(q): R(q) + 3) ИНАЧЕ ЕСЛИ КОП(0:1)=2 ТО г :=M(R(q) + d : R(q) + d + 3) ИНАЧЕ z:=M(d:d+3)KE КОНЕЦ ЕСЛИ. Выполнение команды: ВЕТВЛЕНИЕ ПО КОП (2:7): ЗАГРУЗКА -+R(p):=z; ПЕРЕХОД -+ ЕСЛИ ПР = 0 л РК(8) = 1 v ПР = 1 л РК(9) = 1 v ПР = 2 лРК(10) =1 v ПР = 3 лРК(П) =1 ТО CK: = zKE; ПЕРЕХОД С ВОЗВРАТОМ -* R(p) :=СК, СК : = z; ВЫПОЛНИТЬ -»• РК : = М (z: z + 3), НА анализ команды и подготовку операндов; ПЕРЕХОД ПО СЧЕТЧИКУ -*- НАЧАЛО R(p):-R(p)-1; ЕСЛИ R(p) = 0 TO CK : = z KE КОНЕЦ; ВВОД ПК-*ВЫПОЛНИТЬ R(p) РАЗ ПРИНЯТЬ ВХОД ПК В М(z : z + 79); z := z + 80; КОНЕЦ ЦИКЛА: 165
ВЫВОД АЦПУ»ВЫПОЛНИТЬ R(р) РАЗ ПЕРЕДАТЬ M(z) В ВЫХОД АЦПУ z : = z+ 1 КОНЕЦ ЦИКЛА; ВЫВОД ЭКР-*3KP(R(p)) : = M(z : z + 79); ВВОД ЭКР->М (z : z + 959) : = ЭКР; ВЫВОД МД-*МД(Я(р)(0), R(p)(l), R(p)(2)):=M(z:z+R(p) (3)-l); ВВОД Mfl»M(z:z+/*(p)(3)-lH=Mfl(/*teH0), /ф)(1),/ф)(2)); ВЫВОД МЛ -> ПРОЧИТАТЬ МЛ М (z : z + Л (р) (3) - 1); ВВОД МЛ -* ЗАПИСАТЬ МЛ М (z : z + R (p) (3) - 1); РАЗМЕТКА МД-* ...; РАЗМЕТКА МЛ-*...; ПЕРЕМОТКА МЛ->...; БИНО^/ф)-^/^),*),...,; БИН^ДОО-соЛВД^),... ; БИН 31 -+R(p) := <o3i(/?(p),z),... ; УН0-*Л(р):=6оС0,...; УН7-*Л(р):=57(2),...; КОНЕЦ ВЕТВЛЕНИЯ. Завершение: ЕСЛИ аварийное завершение ТО вывести информацию об аварийном завершении, выйти из ЦИКЛА КОНЕЦ ЕСЛИ. КОНЕЦ ЦИКЛА. КОНЕЦ ЦИКЛА. В этом описании центральная часть ПНМ рассматривается как алгоритмический модуль, связанный с внешним миром периферийными устройствами, которые на данном уровне описания рассматриваются как входные- выходные очереди и общая память. Устройство ввода с перфокарт рассматриваемся как входная очередь ВХОД ПК, элементами которой* являются 80-байтные двоичные последовательности. Каждая такая последовательность соответствует одной перфокарте с 80 колонками. Устройство вывода на бумагу рассматривается как выходная очередь, элементами которой являются байты. Каждый байт представляется некоторым символом, который при выводе печатается на бумаге. Некоторые байты играют роль управляющих сигналов для печатающего механизма - таких, как сигнал перехода на новую строку или пропуска строки. Экранный пульт — это общая память, имеющая структуру ЭКР: массив (1:12) массивов (1: 80) байтов. Магнитный диск также рассматривается как общая память, имеющая структуру МД: массив (1: тх, 1: т2, 1: т3) записей. Здесь тх — число цилиндров, т2 — число дорожек, т3 — число 166
записей на дорожке. Каждая запись есть последовательность байтов фиксированной длины. Структура МД может меняться. При фиксированном числе цилиндров и дорожек может меняться число записей на дорожке и длина записи. Это изменение происходит в результате выполнения команды РАЗМЕТКА МД. Наконец, магнитная лента представляется в виде двух взаимосвязанных очередей. Одна из этих очередей входная ВХОД МЛ, другая выходная ВЫХОД МЛ. Элементами обеих очередей являются записи постоянной длины, составленные из байтов. Обращение к МЛ выполняется с помощью операторов ПРОЧИТАТЬ МЛ X и ЗАПИСАТЬ МЛ X. Первый из этих операторов эквивалентен последовательности: ПРИНЯТЬ ВХОД МЛ В Х\ ПЕРЕДАТЬ X В ВЫХОД МЛ. Второй эквивалентен последовательности: ПЕРЕДАТЬ X В ВЫХОД МЛ; ПРИНЯТЬ ВХОД МЛ В У. Эквивалентность здесь имеется в виду только по результату. При этом переменная Y играет чисто формальную роль. Ее значение после выполнения оператора недоступно. Команда РАЗМЕТКА МЛ меняет размер записи на МЛ. Команда ПЕРЕМОТКА переписывает ВЫХОД МЛ на ВХОД МЛ. После ее выполнения выход становится пустым, и если перед выполнением ВЫХОД МЛ = хх ... хп, а ВХОД МЛ = хп+1... хт, то после выполнения ВХОД МЛ = х\...хт. Это сложное действие, разумеется, должно выполняться некоторым внешним модулем, связанным с МЛ. В алгоритме считается, что начальная программа всегда располагается на одной перфокарте и помещена в начале входной очереди устройства ввода с перфокарт в момент приема сигнала ПУСК, который рассматривается как входной сигнал без памяти. Символы р и q обозначают соответствующие части команды: р=РК(8:11), </=РК(12:15). Регистр команд РК рассматривается как последовательность битов. В других случаях слово рассматривается как последовательность из четырех байтов. В ряде случаев, ясных из контекста, последовательность битов рассматривается как представление целого неотрицательного числа. Поэтому к двоичным кодам могут применяться арифметические операции - сложение и вычитание (если результат остается неотрицательным). Оператор ВЕТВЛЕНИЕ ПО х: at -*PX\ ...\ат -+Рт КОНЕЦ ВЕТВЛЕНИЯ эквивалентен условном оператору: ЕСЛИх=д1 ТОЛ ИНАЧЕ ЕСЛИ х=ат ТО Рт КЕ. Выполнение команд разметки и перемотки ленты требует более подробного описания внешних запоминающих устройств. Поэтому соответствующие части алгоритма пропущены. Разрядность кода операции и способ использования его первых двух битов показывает, что язык ПНМ может иметь до 64 команд. Предполагается, что 32 из этих команд - команды выполнения бинарных операций и 8 команд — унарных операций. Эти команды названы здесь БИН О, БИН 1,..., УН О, УН 1,... . Каждая из команд АЛУ вырабатывает не только основной результат в 167
регистре R(p), но также и некоторые дополнительные результаты, в частности, значение регистра ПР. Это показано многоточиями в операторах выполнения команд АЛУ. Соответствующие уточнения должны быть сделаны на следующем уровне описания, когда будет точно определен набор операций, выполняемых в АЛУ. Алгоритм ПНМ является неполным также из-за того, что в нем отсутствует явное определение условий аварийного окончания выполнения команды. Кроме переполнения разрядной сетки или деления на 0 аварийные ситуации возникают, например, при выполнении операций ввода- вывода, если размер области обмена в ОЗУ не соответствует размерам записей на МД и МЛ. Соответствующие уточнения также должны быть сделаны на следующих уровнях описания. Упражнения 1. Дать точное описание того, как выполняется команда ВЫПОЛНИТЬ. 2. Рассмотреть какую-нибудь известную систему команд АЛУ и уточнить алгоритм ПНМ, включив в него алгоритмы выполнения этих команд. 3. Улучшить алгоритмический проект ПНМ, варьируя две основные характеристики: возможности системы команд и сложность алгоритма функционирования. 4. Написать алгоритм функционирования любой из известных вам ЭВМ, пользуясь информацией, представленной в документации. § 2. Логическое проектирование алгоритмических модулей На этапе логического проектирования аппаратных средств систем преобразования информации в качестве исходного материала выступает алгоритмическое описание системы в виде сети из алгоритмических модулей. Часть модулей этой сети представляет собой модели уже спроектированных компонент. К ним относятся, в частности, устройства ввода-вывода, запоминающие устройства, различного рода датчики и преобразователи сигналов для систем реального времени, элементы системы связи и т.п. Некоторые из модулей являются компонентами модели внешней среды, с которой взаимодействует разрабатываемая система, включая взаимодействие с человеком. Сеть может быть представлена как открытая система. В этом случае модель внешней среды может быть задана неявно в виде требований и ограничений, которым должны удовлетворять процессы изменения входных и выходных компонент. Результатом логического проектирования является синхронная или асинхронная сеть из автоматов, компоненты которой являются моделями элементов используемого базиса. В качестве промежуточного описания проектируемого устройства, не зависящего или слабо зависящего от элементного базиса и технологии изготовления интегральных схем, может использоваться сеть из алгоритмических модулей базовых типов. Будем различать три основных базовых типа модулей — функциональные, управляющие и операционные. Каждый из базовых типов модулей представляет собой автомат, входные и выходные переменные которого являются булевыми векторами. Различаются два типа входных и выходных переменных — управляющие и информационные. Управляющие переменные являются одноразрядными булевыми переменными с нейтральным значением 0, и при асинхронном 168
взаимодействии компонент их можно воспринимать только в состоянии ожидания. Информационные переменные могут быть переменными с памятью или без памяти. Переменные с памятью сохраняют свое значение между двумя очередными присваиваниями. Функциональные модули — это автоматы без памяти. Если хх,..., хп — входные, а ух,..., ут — выходные переменные функционального модуля, то его функционирование определяется системой соотношений Ут ~~ Jm V*i > • • • > *л/ > где fx,..., fm — векторные булевы функции. Разумеется, эту систему можно заменить системой обычных булевых функций, если перейти от булевых векторов к их двоичным компонентам. Выходные переменные функционального модуля являются переменными без памяти. При этом если все входные функционального модуля информационные, то и выходные также информационные. Если же среди входных есть хоть одна управляющая, то все выходные - тоже управляющие. Управляющие компоненты — это автоматы с задержкой, у которых все выходные сигналы (переменные) управляющие, а входные могут быть как управляющими, так и информационными. Управляющие компоненты не имеют внутренних переменных, и при описании их с помощью схем программ состояния схемы совпадают с , внутренними состояниями автомата. Операционные модули обладают внутренней (регистровой) памятью, состоящей из векторных булевых переменных zt, ,•... ,zm. Часть из этих переменных является одновременно выходными переменными с памятью. Операционный модуль имеет входные управляющие переменные хх,... ,хп и информационные переменные их,..., ик. Алгоритм функционирования операционного модуля имеет следующий вид: НАЧАЛО L: ЖДАТЬ хх,...9хпФ0: ЕСЛИ vx ТО Рх КЕ, ЕСЛИ v2 ТО Р2 КЕ, ЕСЛИ vt TOP/ КЕ, НА I. КОНЕЦ Здесь vx,. .., и/ - условия, зависящие только от входных переменных, Pi,...,^/ — операторы присваивания, использующие входные переменные и вырабатывающие внутренние переменные. Для каждого операционного модуля определены допустимые наборы значений управляющих сигналов, и если условия Vf и vj непротиворечивы, т.е. могут одновременно быть истинными, то операторы Р/ и Pj должны быть совместимыми. Таким образом, операционный модуль изменяет свое внутреннее состояние только в результате воздействия на него управляющих переменных. Это изменение происходит за один такт и состоит в выполнении операторов присваивания. Следует сказать, какие допускаются операции над значения- 169
ми внутренних переменных. Предполагается, что все внутренние переменные рассматриваются как структуры данных, расположенные на некоторых областях и принимающие значения в двухэлементной булевой алгеб ре, а каждая операция определяется как периодически определенная функция над соответствующей алгеброй структур данных. В качестве областей расположения обычно рассматриваются одномерные или двумерные целочисленные решетки, а сдвиги — это прибавление или вычитание констант. Сеть, составленная из модулей базовых типов, называется одноуровневой базовой сетью. Одноуровневая сеть может быть синхронной или асинхронной. Базовая сеть уровня п — это синхронная или асинхронная сеть, компонентами которой являются модули базовых типов или базовые сети уровня п — 1. Понятия базового типа и базовой сети допускают некоторые изменения, связанные с конкретной технологией проектирования и зависящие от элементной базы. Определяющим является то, что для базовых типов модулей должна быть стандартная методика технического проектирования, позволяющая реализовать эти модули с Помощью заданной элементной базы. Рассмотренные здесь базовые типы допускают реализацию как на схемах малой и средней интеграции, так и на больших и сверхбольших интегральных схемах. Для реализации управляющих компонент используются методы структурного синтеза конечных автоматов, аналогичные тому, который использован в § 7 гл. 1 первой части для доказательства теоремы о полноте. Кроме того, для реализации автоматов могут быть использованы различного типа пассивные запоминающие устройства. Код состояния, который хранится на регистре состояния управляющей компоненты, используется как адрес ячейки ПЗУ (пассивного ЗУ), а содержимое этой ячейки есть набор выходных сигналов и информация, которая требуется для определения следующего состояния. Такой способ реализации обычно называется микропрограммным. Он позволяет экономно реализовать управляющие модули с большим числом состояний и хорошо реализуется на БИС и СБИС. Использование ПЗУ применяется также при реализации сложных функциональных блоков. Операционный блок — это набор одномерных или двумерных регистров с функциональными схемами, реализующих периодически определенные преобразования и управляемых входными управляющими сигналами. Для того чтобы преобразовать алгоритмический модуль М в композицию модулей базовых типов, необходимо прежде всего закодировать (реализовать) структуры данных, представляемые его внутренними переменными, с помощью булевых векторов или матриц таким образом, чтобы операции над исходными структурами данных превратились в периодически определенные функции. В силу ограниченности размеров данных такое преобразование всегда возможно. Задача состоит в том, чтобы размеры областей однородности были как можно больше, поскольку от этого зависит сложность коммутации и технологии изготовления схем (особенно для технологии БИС и СБИС). Чем больше области однородности, тем лучше технологические характеристики. После приведения структур данных к булевым можно разделить модуль М на две компоненты - управляющую и операционную, пользуясь следующим общим приемом. 170
Рассмотрим все простые операторы присваивания, которые встречаются в алгоритме функционирования модуля. Пусть это будут операторы П := h,... ,rw := tm. Введем т управляющих переменных Wi,.. .,ит и операционный блок Q с алгоритмом функционирования* ЦИКЛ ЖДАТЬи!,...,^: ЕСЛИ их ТО Г! :=ГХ КЕ, ЕСЛИ ит ТО rm :=tm KE, КОНЕЦ ЦИКЛА. Теперь из алгоритма М удаляем все внутренние переменные, переносим их в модуль Q и заменяем каждый из операторов rf := ц оператором щ := 1. Переменные ui9.. ., ит будут выходными управляющими переменными преобразованного модуля М и входными переменными модуля Q. Кроме того, входными переменными модуля Q будут также все входные переменные М, от которых зависят правые части присваиваний. Операторыг выполняемые внутри операционного модуля, называются микрооператорами или иногда микрооперациями, а сигналы ui9.. . ,ит - сигналами соответствующих микрооператоров. Сложность реализации этих микрооператоров определяет сложность операционного модуля. Очевидно, рациональный выбор структуры микрооператоров может быть выполнен-пу- тем эквивалентных преобразований алгоритма функционирования модуля еще до выделения операционного блока. Стандартные модули - такие, как память или устройства ввода-вывода, - должны быть выделены еще раньше, а обращения к ним должны быть выражены через алгоритмы взаимодействия модуля М с этими устройствами через управляющие и информационные переменные в соответствии со структурой этих устройств. Реализация общей памяти и очередей зависит от природы запоминающих устройств, используемых для их реализации, и способов управления (разрешение конфликтов). При реализации общей памяти могут также использоваться характеристики алгоритмов, взаимодействующих через нее. В частности, если обращения к общей памяти синхронизованы внешним образом, т.е. любые одновременные обращения непротиворечивы, то такая память может быть реализована просто.как операционный модуль с операциями записи и чтения. Важной проблемой является обеспечение связей между регистрами внутри операционного модуля. Эти связи могут быть сделаны явными, если операционный модуль расщепить на несколько модулей, каждый из которых имеет только одну внутреннюю переменную. После такого расщепления каждый из модулей должен быть связан информационными входами с выходами тех модулей, от которых зависят правые части присваиваний, выполняемых внутри данного модуля. Тот факт, что при выполнении различных микрооператоров используются не все, а лишь некоторые из входных переменных, повзоляет уменьшить число входов в данный модуль путем введения специального коммутационного модуля, который подключает ко входам операционного модуля выходы других модулей, необходимые для выполнения данной операции. Поскольку коммутационный модуль требует собственного управления, введение его несколько замед- 171
ляет выполнение микрооператоров, но позволяет в ряде случаев экономить аппаратуру. Дальнейшее проектирование операционных модулей может быть проведено путем разделения регистров как наборов запоминающих элементов от функциональных схем, реализующих микрооперации- Однако это разделение зависит уже от структуры используемых стандартных типов запоминающих элементов, которые определяются не только типами используемых триггеров, но и логическими схемами, которые заранее привязаны к их входам. Бще один вопрос логического проектирования заслуживает внимания. Это проблема синхронизации работы управляющей и операционной компонент алгоритмического модуля. На уровне модели эти устройства работают синхронно, т.е. в едином дискретном времени. При реализации, естественно, требуется учитывать реальные задержки, которые происходят в функциональных схемах. В конечном счете достаточно выбрать частоту синхронизирующих сигналов, определяющих в свою очередь частоту переключения управляющей компоненты таким образом, чтобы за одно переключение — один рабочий такт — в операционных устройствах успела выполниться наиболее длинная микрооперация. Можно, конечно, управлять и более тонко, выбрав рабочую частоту по длине наиболее короткой микрооперации и учитывая длительности более длинных. В ряде случаев можно добиться ускорения работы модуля путем перекрытия по времени выполнения соседних микрооператоров. С проблемой синхронизации связаны также информационные зависимости в микрооператорах. Если правая часть присваивания г := t зависит от переменной г, то при выполнении присваивания за один такт есть риск, что правая часть изменится еще до окончания присваивания. Другая вредная зависимость, которая также может привести к недетерминированному переходу — это зависимость условия и от переменной г в условном операторе ЕСЛИ и ТО г := t,... ИНАЧЕ ... Попытка выполнить этот оператор за один такт может привести к тому, что условие и изменит свое значение еще до окончания выполнения данного оператора. Проблемы развязывания такого рода зависимостей могут быть решены путем эквивалентных преобразований алгоритма - разнесения по времени проверки условия и присваивания — или введением дополнительных пересылок для того, чтобы правая часть присваивания не зависела от левой. Проигрыш по времени может быть компенсирован перекрытием микроопераций при более надежном функционировании аппаратуры. Рассмотрим вопросы логического проектирования центральной части ПНМ, описанной в § 1. Прежде всего необходимо перейти к более точным моделям периферийных устройств и модели ОЗУ. Рассмотрим для примера устройство ввода с перфокарт УВПК. Грубая модель этого устройства — очередь перфокарт. Каждая перфокарта - это одномерный массив из 80 байтов, а каждый байт — последовательность из 8 битов. Более подробная модель этого устройства учитывает, что прием из очереди происходит последовательно по тактам. На каждом такте принимается параллельно по восьми каналам один байт. Начало приема перфокарты вызывается входным управляющим сигналом. Таким образом, УВПК можно рассматривать как алгоритмический модуль, внеш- 172
нее описание которого представлено на рис. 5.5. Здесь КПК есть входная очередь перфокарт (колода перфокарт), СМК — общая одноразрядная переменная {смена колоды). Перед добавлением новых перфокарт (передача в очередь) значение СМК должно быть установлено в 1. Выходные переменные ЗАКР (закрыто), ПУСТО и БАЙТ — переменные с памятью. Переменные ПРИЕМ и ГОТОВ — входная и выходная управляющие переменные. В скобках указаны разрядности соответствующих переменных. ["• ~7\^ *™| Эанр 11^ КЛН / 71 < 0 УВПК \ смнр) >1 liyCTOfiJX ^ ^ /7»тпЛ/У1 *— ^/ОТОО(7/ *\байт(6) Н^ Рис. 5.5 Переменные ПУСТО, БАЙТ и СМК являются входными переменными центральной части ПНМ, а ГОТОВ - ее выходная переменная. Алгоритм функционирования УВПК можно представить следующим образом: АЛГОРИТМ УВПК. НАЧАЛО ПУСТО :=0; ЦИКЛ ЖДАТЬ СМК = 0; ЕСЛИ КПК = е ТО ПУСТО := 1 ИНАЧЕ ПУСТО :=0 КЕ. ЦИКЛ. ЖДАТЬ ПРИЕМ = 1 v СМК = 1: ЕСЛИ СМК= 1 ТО ПУСТО :■ 1, ВЫЙТИ ИЗ ЦИКЛА КЕ; ПРОЧИТАТЬ КПК В К; ЕСЛИ КПК = е ТО ПУСТО := 1КЕ; ДЛЯ /:= 1 ДО 80 ВЫПОЛНИТЬ БАЙТ:=К(1); ГОТОВ := 1; ЗАДЕРЖКА КЦ КОНЕЦ ЦИКЛА КОНЕЦ ЦИКЛА КОНЕЦ. Оператор ЗАДЕРЖКА эквивалентен тождественному оператору, но выполняется за несколько тактов. Количественно величина задержки определяется реализацией. Логически она необходима для того, чтобы принимающее устройство успело обработать очередной байт. Технически время задержки определяется скоростью движения перфокарты во время считывания. 173
Рассмотрим теперь структуру ОЗУ. Проще всего представить память в виде операционного модуля, который представляет массив Ы. Внешнее описание такого модуля изображено на рис. 5.6. Его алгоритм функционирования представляется следующим циклом: АЛГОРИТМ ОЗУ : ЦИКЛ ЖДАТЬ ЗАП, ЧТН: ЕСЛИ ЗАП ТО ЯЧК:=Л/(АДР:АДР + Аг) КЕ, ЕСЛИ ЧТН ТО ЛГ(АДР:АДР + А;):=ЯЧК КЕ КОНЕЦ ЦИКЛА. Из этого описания видно, что ячейка памяти, т.е. единица обмена, имеет длину к байтов (к = 1, 2,4). Переменная ЯЧК является общей переменной, и обращение к памяти выполняется по алгоритму, зависящему от к и т. Предположим, например, что к = 4, а т = 32. Тогда оператор РК(0:15) : = М(СК:СК+1) может быть реализован следующей последовательностью операторов: АДР:=СК; ЧТН:=1; ЗАДЕРЖКА; РК(0:15) := ЯЧК(0:15). Заметим, что при к = 4 последовательность операторов команды может быть упрощена следующим образом: АДР: = СК; ЧТН:=1; ЗАДЕРЖКА; РК:=ЯЧК; ЕСЛИРК(О) = 1 ТО СК:=СК + 4 ИНАЧЕ СК: = СК+2КЕ. ОЗУ Н АДРМг- ЯЧК(вк) Рис. 5.6 Задержка необходима, если время обращения к памяти больше, чем длительность рабочего такта управляющего модуля ПНМ. Исходя из описанных моделей УВПК и ОЗУ, рассмотрим теперь реализацию оператора ПРИНЯТЬ ВХОД ПК В M(z:z + 79). Эта реализация может быть выполнена с помощью следующего алгоритма: НАЧАЛО ЦИКЛ ЖДАТЬ ПУСТО = 0; 174
\ ПРИЕМ :=1; ЖД^ТЬ ГОТОВ = 1 v ПУСТО = 1: ЕСЛИ ГОТОВ = 1 ТО ВЫЙТИ ИЗ ЦИКЛА КЕ КОНЕЦ №ИКЛА; ПОВТОРИТЬ 20 РАЗ ДЛЯ /:=0 ДО 3 ВЫПОЛНИТЬ ЯЧК(/* 8: (/+ 1) * 8 - 1) := БАЙТ; ЖДАТЬ ГОТОВ = 1 КЦ; ЗАП:=1; ЗАДЕРЖКА, z: = z + 4 КОНЕЦ ЦИКЛА. КОНЕЦ Аналогичным образом вводятся и используются модели других периферийных устройств. Следующий вопрос, который требует уточнения, — это выбор алгоритмов выполнения бинарных и унарных операций. Уточнение этих алгоритмов связано с решением одной из центральных проблем проектирования аппаратуры — с выбором системы микроопераций (микрооператоров). Самое прямое решение состоит в том, что одна операция машинного языка соответствует одной микрооперации и выполняется, следовательно, за один рабочий такт. Такое решение позволяет получить максимальное быстродействие, но связано с большими затратами аппаратуры. Поэтому обычно выбирают некоторое промежуточное решение, добиваясь в конечном счете разумного соотношения между производительностью и стоимостью аппаратуры. Поскольку основными операциями машины фон Неймана являются арифметические операции, то в качестве основных микроопераций обычно используют сложение целых чисел, сдвиги, поразрядные операции и некоторые другие микрооперации, связанные с обработкой частей слов. Через эти микрооперации можно выразить все операции языка команд ПНМ. Например, вычитание сводится к сложению дополнительных или обратных кодов, умножение и деление — к сложениям и сдвигам, операции над числами с плавающей запятой сводятся к арифметическим операциям над частями слов — мантиссой и порядком. Например, алгоритм умножения двух целых чисел в двоичной системе можно представить следующим образом: НАЧАЛО ?ъ :=0, «з -=Wi л w2, v :=0; ЦИКЛ ЕСЛИ г2(л)=1 ТО v*r3 : = гъ+гх КБ; ЕСЛИ v = 1 ТО ВЫЙТИ КЕ; СДВИНУТЬ г2 ВПРАВО; ЕСЛИ г2 =0 ТО ВЫЙТИ КЕ; ЕСЛИ Г!(1)= 1 ТО v := 1; ВЫЙТИ КЕ; СДВИНУТЬ гг ВЛЕВО 175
кц КОНЕЦ. / В этом алгоритме г\,г2,гъ - целые числа, представленное в прямЪм коде, разрядности п\ ulf и2, иъ—их знаки; v — признак Переполнения. Разряды нумеруются слева направо: младший имеет номер и, старший - 1. После того как выбран набор микроопераций и определены алгоритмы выполнения операций, следует решить, на каких регистрах будут выполняться соответствующие операции. Принципиально возможен такой вариант, который предусматривает выполнение на любом регистре любых микроопераций. В этом случае получается выигрыш по времени, поскольку отсутствуют дополнительные пересылки между регистрами, однако, стоимость аппаратуры получается наибольшая. Снова приходится искать компромисс. В классическом варианте все микрооперации реализуются на минимальном числе регистров, а дополнительные регистры используются лишь для промежуточного хранения величин или для развязывания информационных зависимостей внутри операторов присваивания. После выбора регистров, на которых выполняются микрооперации, алгоритм работы проектируемого модуля преобразуется в соответствии с принятыми решениями. Например, если операция cjt выполняется за один такт на регистре г, то оператор R (р) := со/(Л(р), z) в алгоритме ПНМ следует преобразовать в последовательность операторов: r:=<of(fl(p),z); Я(Р): = П а для уменьшения связей регистра г с другими регистрами, может быть, целесообразно использовать еще один промежуточный регистр s: s: = R(p); г := cj{(s, z)', R(p)-=r. Таким образом, три основные задачи логического проектирования центральной части ПНМ— выбор алгоритмов выполнения операций, выбор системы микроопераций и выбор распределения аппаратных средств между регистрами, включая связи между ними, — могут быть решены путем преобразования процедурного алгоритмического описания соответствующего алгоритмического модуля. При этом могут использоваться общие методы преобразования и оптимизации алгоритмов в процессе проектирования, которые рассматриваются в следующей главе. Упражнения 1. Рассмотреть ОЗУ, алгоритм которого работает в предположении, что АДР есть адрес слова (т.е. делится на 4) при к = 4. Как изменятся операторы обращения к памяти в алгоритме ПНМ? 2. Сформулировать условия и доказать корректность алгоритма умножения, приведенного в тексте. 3. Выбрать минимальный набор операций (скажем, сложение, вычитание, умножение, деление и сравнение чисел с плавающей и фиксированной запятой, поразрядные 176
\ конъюнкция, ^дизъюнкция, сложение по модулю 2 и инвертирование, сдвиги вправо и влево на заданное число разрядов) и провести логическое проектирование ПНМ на уровне алгоритмического описания по методике, рассмотренной в данном параграфе. 1 § 3. Развитие неймановской концепции Новые идеи в архитектуре и структуре вычислительных машин развивались на протяжении многих лет под влиянием трех основных проблем, вытекающих из практики их использования: — проблемы надежности; — повышения производительности; — удобства и эффективности использования ЭВМ в прикладных областях. Исследования, которые проводятся в поисках путей решения этих проблем, стимулируются постоянной неудовлетворенностью текущим положением дел, поскольку всякое продвижение открывает новые возможности, расширяет сферы применения средств вычислительной техники и в конце концов приводит к новым, повышенным требованиям в части надежности, производительности и эффективности применений. Продвижения в решении основных проблем поддерживаются также быстрым ростом технологии, позволившим за 40 лет на несколько порядков улучшить основные технические и экономические характеристики средств вычислительной техники — такие, как стоимость, быстродействие, габариты и т.п. Эти продвижения поддерживаются накоплением опыта и знаний, а также опережающим развитием программного обеспечения, позволяющим заглянуть также и в будущее технических решений. Следует отметить, что наряду с новыми решениями в архитектуре современных компьютеров элементы неймановской структуры продолжают играть важную роль, и современный микрокомпьютер по своей структуре ближе к исходной концепции фон Неймана, чем некоторые установки второго и третьего поколений. Хотя, конечно, принципиальное отличие современного неймановского компьютера, выполненного на нескольких кристаллах кремния,от классического варианта состоит в том, что он может служить не только центральной частью автономной вычислительной установки, но и элементом сложной системы, содержащей сотни и тысячи таких компьютеров. Рассмотрим коротко основные идеи, используемые в структурах современных ЭВМ, с точки зрения указанных трех основных проблем. Проблема технической надежности состоит в своевременном обнаружении сбоев и неисправностей в работе аппаратуры, устранении их влияния на состояние вычислений и в восстановлении работоспособности с минимальными затратами времени и средств. В этом плане рассмотренный проект ПНМ не является удовлетворительным, поскольку не предусматривает никаких средств, обеспечивающих реакцию на аварийные ситуации. Помимо аварийных ситуаций, вызванных неправильной работой аппаратуры, возможны также аварийные ситуации, вызванные ошибками в программах и данных. Некоторые из этих ошибок проявляются и могут быть обнаружены при вьшолнении команд ПНМ. К ним, в частности, относятся ошибки, приводящие к переполнению, делению на нуль, неправильные команды, неправильные адреса при обращении к ОЗУ и ВЗУ, обращение 12. Ю.В. Капитонова 177
к пустым устройствам ввода и неподготовленным устройствам вывода (это уже могут быть ошибки в обслуживании машины). / Другие ошибки принципиально не могут быть обнаружены аппаратно в силу слишком слабого понятия корректности программы и ее выполнения, заложенного в алгоритме функционирования машины. Более того, в духе концепции фон Неймана определять алгоритм функционирования, машины так, чтобы любая программа и любой процесс ее выполнения были допустимы. Так, при определении адреса можно отбрасывать лишние разряды, признак переполнения может проверяться самой программой, неправильную команду можно просто пропускать. Ситуация обостряется также тем, что ошибки в программах не только могут быть изначально, но появляются из-за сбоев в аппаратуре при хранении и передачах информации, а также при копировании программ, составляющих программное обеспечение вычислительной системы. Одним из наиболее распространенных средств аппаратного контроля является использование избыточного кодирования информации, позволяющего проверять правильность передачи информации при обменах между центральной частью ЭВМ, запоминающими и периферийными устройствами. Обычно эта избыточность реализуется добавлением к двоичному коду, составляющему единицу обмена, контрольных разрядов, которые проверяются при обменах. Реакция на аварийные ситуации, обнаруживаемые схемами контроля, определяется алгоритмом функционирования центральной части. Другие средства программно-аппаратного обнаружения аварийных ситуаций тесно связаны с общей проблемой эффективного использования ЭВМ и реализуются в комплексе со средствами, обеспечивающими решение этой проблемы. Такие общие методы повышения надежности, как дублирование аппаратуры на различных уровнях, применяются лишь в случаях использования машин в особо ответственных системах, где требуется высокая степень надежности и готовности. Основным свойством машины Неймана является ее универсальность. Действительно, достаточно одной только операции прибавления единицы, сравнения целого с нулем и условного перехода для того, чтобы вычислять любую частично рекурсивную функцию, правда, в предположении неограниченной разрядности слов. От этого ограничения можно избавиться, промоделировав арифметические операции над числами произвольной длины в оперативной памяти. Тогда начнет сказьюаться ограниченность ОЗУ. Но и это ограничение можно снять, используя внешнюю память со сменными носителями (диски, ленты). Осознание универсальности машины фон Неймана сыграло исторически важную роль, поскольку стимулировало поиски машинных алгоритмов решения задач невычислительного характера — комбинаторной оптимизации, управления сложными дискретными системами, поиска доказательств теорем, обработки текстов, файлов и т.п. Однако наиболее широкое практическое использование принципа универсальности обуславливалось тем, что с помощью машины фон Неймана оказалось возможным моделирование других структур, более удобных для использования и обладающих значительно более широкими возможностями. Машина фон Неймана, оснащенная соответствующим программным обеспечением, воспринимает программы, написанные как на процедурных, так и на непроцедурных языках высокого уровня (функциональных или 178
\ логических/ч и может их реализовать путем трансляции или интерпретации. С помощью языка управления заданиями машина может воспринимать и осуществлять сложные действия, в которых выполнение отдельной программы является элементарным актом. Программное обеспечение позволяет поддерживать не только автоматический режим выполнения программ, но и взаимодействие машины с человеком в процессе решения задач (интерактивный режим работы). В результате развития программного обеспечения ЭВМ постепенно формируется представление о том, что собой представляет идеальная машина и как с ней нужно работать. Важную роль в этом представлении играет различение основных путей использования ЭВМ: 1. Использование в качестве элемента производственной системы, функционирующей по законам определенной технологии, например системы управления реального времени (технологические процессы, движущиеся системы и т.п.), системы организационного управления, системы обслуживания запросов, вычислительного центра коллективного пользования и т.п. 2. Выполнение научно-исследовательских и проектно-конструкторских разработок, гибкие автоматизированные производства, учебный процесс и т.п. 3. Разработка, отладка и сопровождение новых программ и программных систем, модификация и перенесение на новую техническую базу разработанных ранее систем. Каждый из указанных путей использования ЭВМ предъявляет свои требования к внешним характеристикам систем, способам представления данных, алгоритмам и средствам взаимодействия с внешней средой. Для приложений первого типа характерным является высокий уровень специализации, работа по заранее определенным алгоритмам, жесткие временные характеристики, повышенные требования к надежности. В приложениях второго типа на первый план выдвигается универсальность на уровне крупных программных модулей, выполняющих определенные технологические операции по обработке данных, характерные для рассматриваемой предметной области, интерактивный режим работы, проблемная и профессиональная ориентация язьпсов взаимодействия с ЭВМ. Разработка новых систем требует: использования языков программирования различного уровня, приспособленных к используемым структурам технических средств; Доступа к информации о состоянии вычислительных процессов на различных уровнях; инструментальных систем, помогающих выполнять технологические операции процессов разработки и отладки программ с высокой степенью эффективности. Несмотря на алгоритмическую универсальность, машина Неймана не может удовлетворить требованиям всех путей использования ЭВМ, поскольку необходимое программное обеспечение оказывается очень сложным и не может обеспечить необходимой производительности в процессе своего функционирования. Абсолютное повышение скорости работы отдельных компонент, хотя и повышает производительность системы в целом, может не дать желаемого эффекта, поскольку в конечном счете производительность может определяться самым медленным устройством. Поскольку самыми медленными устройствами ЭВМ являются устройства ввода-вьюода и внешние запоминающие устройства, то первым ради- 12* 179
кальным усовершенствованием архитектуры машины Неймана стало совмещение работы центрального процессора с работой внешних устройств. При анализе функционирования ПНМ видно, что ко манды /ввода-вывода связаны с ожиданиями. При вводе с перфокарт процессор ожидает момента поступления очередного байта, при обращении к магнитному диску — момента установки головки на требуемую дорожку, момента начала поступления очередной записи и т.д. В периоды ожидания процессор простаивает. Поскольку скорости работы внешних устройств на несколько порядков отличаются от скорости работы центральной части, резерв повышения быстродействия оказывается значительным. Архитектура с использованием совмещения работы внешних устройств с работой процессора изображена на рис! 5.7. Устройство управления (УУ) работает над общей памятью с устройством обмена (УО). Получив команду ввода-вывода, УУ передает ее устройству обмена, а само переходит к выполнению следующей команды. Пока устройство обмена выполняет команду ввода-вывода, УУ может продвигаться дальше в выполнении программы. Это продвижение, однако, может выполняться лишь до тех пор, пока не понадобятся результаты вьшолнения команды ввода или не потребуется изменить память, используемую при выполнении команды вывода. Если к этому моменту команда ввода-вывода не завершится, возникает ожидание. Таким образом, для того чтобы эффективно использовать возможность совмещения, необходимо учитывать эту возможность в самой программе и помещать команды ввода-вывода в ней так, чтобы эти команды выполнять заранее — до того, как понадобятся результаты их выполнения. При этом следует иметь в виду, что не для любой программы это возможно. В частности, если время решения задачи внутри процессора меньше, чем время ввода-вывода, то совмещение не даст никакого эффекта. Внешние устройства АЛУ —я— УО УУ л ОЗУ Рис. 5.7 Существует, однако, другой подход, при котором от указанных ограничений в значительной степени можно освободиться. Это — режим многопрограммной работы (мультипрограммирование). Идея многопрограммной работы состоит в следующем. В машину первоначально вводится не одна программа, а пакет из нескольких программ. Затем эти программы выполняются одна за другой. Каждая программа выполняется до первой команды ввода-вывода. Как только процессор дойдет до такой команды, она передается устройству обмена, программа прерьюается и, пока выполняется команда ввода-вывода, процессор начинает выполнять новую программу или одну из программ, прерванных ранее. При удачном составлении 180
пакета — в частности, таком, в котором общее время работы процессора значительно больше, чем время работы устройства ввода-вывода, — возможно полное устранение периодов ожидания. Это означает, что вычислительная машина работает со скоростью ее наиболее быстродействующей центральной части. При многопрограммной работе возникает ряд дополнительных проблем. Важнейшими из этих проблем являются проблема управления разделением ресурсов и проблема защиты. Необходимость разделения ресурсов возникает из-за того, что разные программы могут пользоваться одними и теми же ресурсами: устройствами ввода-вывода, наборами данных*, областями в ОЗУ. Поэтому необходимо организовать очереди и обеспечивать их прохождение. Проблема защиты возникает из-за того, что в некоторых программах одного пакета могут быть ошибки. Программа, содержащая ошибку, может воздействовать на информацию, обрабатываемую другой программой, что приведет к получению неправильных результатов с помощью уже отлаженной программы. Таким образом, алгоритм управления многопрограммной работой получается достаточно сложным. Поэтому он, как правило, реализуется программами операционной системы и лишь некоторые наиболее ответственные его части реализуются на уровне аппаратуры устройства управления. Особенно выгоден режим многопрограммной работы в сочетании с интерактивной обработкой данных с использованием экранных пультов (дисплеев) при разделении времени процессора. Разделение времени процессора между несколькими пользователями состоит в том, что каждой из Начало \ Чтение команды и изменение СН <^^7ересылш^> Д\ ^^Хнет <^7]э^>^ \Нет | z:-*fa) * Запись б ОЗУ Чтение опера/Фа \ г Выполнение команды | Нет ^rst^T -чъ^и/сдушде*/ к чеза6ерш£шр>^ Выбод 1 UHlf щ ?мации\ Рис. 5.8
программ пользователей выделяется определенный квант времени (обычно доли секунды), процессор периодически опрашивает все программы и выполняет в течение выделенного кванта времени те из них, которые не находятся в состоянии ожидания. При этом для каждого пользователя создается иллюзия того, что он работает сам, владея полностью всеми ресурсами вычислительной системы. В больших машинах третьего поколения устройство обмена может быть реализовано в виде специализированного программно-управляемого процессора (канальный процессор), который позволяет обслуживать одновременно несколько групп устройств, работающих параллельно. Дальнейшие возможности ускорения работы вычислительной машины можно обнаружить, анализируя алгоритм функционирования ее центральной части. Представим для примера алгоритм ПНМ в виде схемы рис. 5.8. Анализируя эту схему, видим, что основной рабочий цикл алгоритма при отсутствии аварийных ситуаций складьшается из двух частей - обращения к памяти и выполнения команды. При этом, если текущая команда не является командой условного перехода, то адрес следующей уже определен, и обращение к ОЗУ для чтения очередной команды можно начинать прежде, чем закончится выполнение текущей команды. Для этого необходимо выделить из устройства управления модуль УВК (устройство выполнения команд), который реализует выполнение команды. Для того чтобы модуль УВК мог работать параллельно с УУ, необходимо продублировать регистр z, а также части КОП и р регистра РК. Теперь получим структуру центральной части, изображенную на рис. 5.9. Здесь R - регистровая память АЛУ, S - регистр, через который УУ передает информацию в УВК (z, КОП, р) и получает информацию об окончании выполнения команды. Устройства УУ и УВК работает с перекрытием. Если время обращения к памяти меньше, чем время выполнения команды, то выборка и запись происходят полностью на фоне работы устройства УВК и фактически не требуют времени. Быстродействие машины полностью Я L, „ _t JJ ( ^"~"' fcs ' & S <=> УВК 1 1 ОЗУ 1 Рис. 5.9 определяется скоростью выполнения операций. Единственный случай, когда устройства УУ и УВК работают последовательно, - это условный переход. Действительно, в этом случае выборка следующей команды не может начаться до тер пор, пока не будет выполнена предыдущая команда, которая должна выработать значение регистра ПР. Если УВК работает быстрее, чем У У, быстродействие определяется временем обращения к ОЗУ. Прямые методы повышения быстродействия ОЗУ связаны с ростом стоимости и сокращением объема. Логически можно получить выигрыш, 182
если разделить ОЗУ на несколько отдельных модулей, которые могут работать параллельно. В течение выполнения одной команды УУ может обращаться к ОЗУ до двух раз (выборка команды и выборка операнда или пересылка результата). Если команда и операнд расположены в разных модулях, то соответствующие обращения к памяти могут выполняться параллельно. Если времена выполнения команд различны и есть команды, которые по времени выполнения превосходят время обращения к памяти, Z "/ —( - *1 ■* М2 —i >— -♦ "А-, ——< \ >— -» < > я Рис. 5.10 то некоторый выигрыш можно получить, заменив регистр S двумя очередями (одна от УУ к УВК, другая от УВК к УУ). Выигрыш происходит за счет того, что во время выполнения длинных операций происходит подготовка команд и операндов, соответствующих коротким операциям. Реальный выигрыш зависит от объема буфера (очереди), соотношения времен выполнения различных команд и их взаимного расположения в программе. Ускорение работы УВК имеет смысл лишь при условии, что время обращения к ОЗУ меньше времени выполнения команд (по крайней мере некоторых). Основным методом ускорения выполнения команд является конвейеризация. Простейший вариант конвейерного выполнения команды состоит в следующем. Пусть команда выполняется по алгоритму, имеющему следующий вид: Р = (г:=Ш\... ; z:=/*(z); *(p):=z), где z — набор переменных (регистров), участвующих в выполнении команды, р - адрес регистровой или оперативной памяти Л, куда должен быть записан результат. Представим алгоритм Р в виде ^=(zi:=/i(z),pi:=p);(z2:=/2(zi),p2:=Pi); •• ;*0>*-i):=/*(z*-i). Теперь этот алгоритм можно реализовать с помощью сети из алгоритмических модулей, изображенной на рис. 5.10. Здесь а - управляющая входная переменная без памяти; z, Zi,... ,Zfc_j ,p, pl9 . . . , Pfc-i — входные (выходные) переменные с памятью; R —общая память. Алгоритм модуляMf для / = 1,..., к имеет вид (z0 = z, p0 = р) ЦИКЛ ЖДАТЬ а: Z/:=//(z*_i) КЦ. Модуль Мк: ЦИКЛ ЖДАТЬ а: *(Pi-i):=/*(z*_i) КЦ. 183
Устройство подобного типа называется ^-ступенчатым (линейным) конвейером. Переменная а — тактирующая переменная. Начав выполнение первой команды, устройство уже готово к выполнению следующей. Одновременно в устройстве могут выполняться к команд и, если на его вход данные подаются с частотой изменения тактирующей переменной а, на выходе будут с такой же частотой вырабатываться результаты. Замедление работы конвейера может получиться, если операндом одной из следующих команд является результат выполнения предыдущей. Тогда следующая команда не сможет начать выполняться, пока не закончится предыдущая. Конвейеризацию обычно применяют в сочетании с использованием нескольких устройств выполнения команд, которые могут работать параллельно. Как правило, это специализированные устройства, например устройство для арифметических операций с фиксированной или плавающей запятой, устройство для логических операций и т.п. Применение методов ускорения работы процессора дает хороший эффект лишь при сбалансированных временных характеристиках функционирования ОЗУ и УВК. Для того чтобы уменьшить влияние дисбаланса, возникающего в результате разброса характеристик отдельных команд и их распределения в потоке команд, определяемом выполняемой программой, применяют промежуточную память между ОЗУ и регистровой памятью. В ней хранятся команды и данные, которые были недавно в работе. Такая память называется иногда КЭШ-памятыо. Она обладает большим быстродействием, чем ОЗУ, но обычно меньшим объемом. После чтения очередной команды из ОЗУ она помещается в КЭШ и остается там, пока не будет вытеснена другими командами или данными. В каждой момент времени определено взаимно однозначное соответствие между адресами КЭШ-памяти и адресами ОЗУ. Если процессору требуется содержимое ячейки с заданным адресом, то нужно быстро определить, находится ли это содержимое в ОЗУ или в КЭШ-памяти, после чего, если надо, происходит обмен ОЗУ - КЭШ. Примером эффективного использования КЭШ-памяти может служить многократное выполнение коротких циклов. При первом выполнении команды такого цикла переносятся одна за другой в КЭШ. После этого до окончания работы цикла обращения к ОЗУ за командами вообще не будет. Другое направление в развитии архитектуры ЭВМ связано с развитием машинного языка. Основным недостатком языка машины Неймана является его низкий уровень и необходимость разбивать действия на большое число элементарных шагов. Причем значительная часть этих шагов связана с получением промежуточных результатов, их размещением в памяти и перемещением между ОЗУ и регистрами. При этом процессор в каждый момент времени видит лишь одну команду и не имеет никакой информации о том, в каком контексте эта команда выполняется, в частности в каких ячейках памяти расположены команды, в каких - данные, поскольку между ними нет никакого различия. Повышение уровня языка происходит несколькими путями. Первый путь состоит в укрупнении операций, выполняемых командами машины. Наиболее ясным путем такого укрупнения является включение в систему команд векторных и матричных операций. При вьшол нении таких команд особенно эффективно работают конвейерные устройства, поскольку процессор в этом случае обращается в ОЗУ только за данными, а при наличии 184
большой КЭШ-памяти и повторяющихся операций с длинными векторами или матрицами можно при разумном планировании действий достаточно плотно загрузить конвейер, разгоняя его до максимально возможных скоростей. Другой путь развития языка состоит в приближении его к алгоритмическим языкам высокого уровня. Первым шагом на этом пути является включение в язык средств представления арифметических выражений. Обычно при этом используется правая бесскобочная запись, которая облегчает реализацию вычисления значения такого выражения за один просмотр слева направо с запоминанием промежуточных значений в магазинной памяти. Эффективность повышается за счет сокращения длины программы. Вместо арифметических выражений иногда-в обычную систему команд включают команды для работы с магазином (запись, чтение, выполнение опраций над последними записанными значениями). Использование магазина имеет ряд преимуществ по сравнению с общими регистрами и широко применяется в системах команд микропроцессорных ЭВМ. Следующий шаг приближения к языкам программирования — включение типов данных и их машинное представление. В этом случае процессор может различать различные виды информации, расположенной в памяти, интерпретировать операции в соответствии с типами данных и структур данных, а также обнаруживать различного рода аварийные ситуации, вызванные ошибками в программе или сбоями оборудования. Таким образом, повышение уровня машинного языка позволяет существенно продвинуться в решении проблемы надежности. Ярким примером является проверка границ индексов при обращении к элементам массивов. В обычной системе команд эту проверку можно реализовать только за счет значительного увеличения времени работы. При встроенных описаниях типов массивов процессор имеет доступ к нужной информации и может осуществлять соответствующие проверки аппаратно без существенных потерь времени. Например, наиболее радикальным решением является прямая интерпретация языка высокого уровня. Это направление тесно связано с развитием внутреннего интеллекта ЭВМ. Действительно, в языке высокого уровня короткие программы выражают сложные действия, выполняя которые, процессор может целесообразно планировать использование оборудования. Сокращение объемов программ значительно расширяет возможности разработки сложных прикладных систем, а отсутствие барьера между программистом и ЭВМ в виде системы программирования облегчает отладку программ и значительно сокращает сроки разработки программных систем. Основным ограничением архитектуры машины Неймана является последовательный обмен командами и данными между процессором и основной памятью. Это ограничение часто называют "узким горлышком" машины Неймана. Каким бы образом ни ускорять выполнение операций в АЛУ, машина не может работать быстрее, чем происходит обмен У У и ОЗУ. Поэтому естественным шагом в развитии архитектуры ЭВМ является переход к многопроцессорным системам. Существующие в настоящее время многопроцессорные системы можно классифицировать в зависимости от того, как решаются три основные 185
проблемы, связанные с их организацией. Этими проблемами являются управление, память и связь. Проблема управления имеет два основных решения — централизованное и распределенное. При централизованном управлении многопроцессорная система представляет собой управляемую синхронизированную сеть из алгоритмических модулей, в которой управляющий модуль производит установку начального состояния всех процессоров в начале каждого сегмента синхронизации. Частным случаем централизованных систем являются такие, в которых все процессоры на одном этапе выполняют одну и ту же команду, но над разными данными. Такие системы называются системами типа ОКМД (одиночный поток команд, множественный поток данных) или системами типа SIMD (single instruction, multiple data) no классификации Флинна. Распределенное управление означает асинхронное функционирование процессоров, образующих одноуровневую сеть из алгоритмических модулей. Такие системы соответствуют системам типа МКМД (множественный поток команд, множественные данные), или системам типа MIMD (multiple instruction, multiple data) no классификации Флинна. Память может быть общей или распределенной. Речь идет, разумеется, об основной памяти, в которой находятся программы и данные во время их исполнения. При достаточно большом числе процессоров общая память обычно разбивается на модули так, чтобы разные процессоры могли обращаться к разным модулям памяти одновременно. Применение распределенной памяти означает, что каждый процессор имеет свою собственную память, объем которой достаточно велик для самостоятельного выполнения заданий. Связь между процессорами представляет собой наиболее сложную проблему и имеет много решений. Удобно различать универсальные и специальные системы связи. Универсальная система связи позволяет осуществлять любые попарные соединения между процессорами (каждый с каждым). Универсальная связь технически может быть реализована либо с помощью общей шины, либо с помощью коммутационной системы. В первом случае в каждый момент времени обмениваться могут только два процессора, во втором допустим одновременный обмен между многими процессорами. В специальных системах связи каждый процессор может непосредственно взаимодействовать лишь с ограниченным множеством других процессоров. Процессоры в таких системах образуют сеть, которая может иметь самые разнообразные топологические формы. Например, это может быть двумерная или трехмерная решетка, в которой допустимы соединения процессоров, расположенных в соседних точках. Применяются деревообразные сети, двоичные кубы, торы и т.п. В специальных системах связи часто реализуется возможность одновременной передачи от одного процессора ко всем или к нескольким другим процессорам. Границы между рассматриваемыми архитектурами не являются достаточно четкими. Например, jb системе с общей памятью каждый процессор может иметь КЭШ-память достаточно большого объема, и в некоторых случаях она может использоваться как основная память, что приводит к архитектуре систем с распределенной памятью. В системах со специальной системой связи могут быть реализованы аппаратные средства для осуществления транзитных обменов, и в этом случае связь становится универсаль- 186
ной. Возможны так$се смешанные варианты архитектуры многопроцессор* ных систем. Все они достаточно точно могут быть описаны в терминах, многоуровневых сетей из алгоритмических модулей с постоянной структурой. Применение многопроцессорных систем является в настоящее время основным резервом повышения производительности ЭВМ, поскольку возможности одного процессора близки к исчерпанию. В системах с распределенным управлением естественным образом реализуется режим многопрограммной работы, который дает возможность совмещать не только работу внешних устройств с одним процессором, но и нескольких процессоров, выполняющих различные программы, что открывает более широкие возможности. Системы с централизованным управлением требуют специальных языковых средств программирования и наиболее эффективно используются в качестве специализированных процессоров, предназначенных для выполнения, например, матричных или векторных операций. Системы с распределенным управлением дают возможность реализовать универсальные языки параллельного программирования высокого уровня. В настоящее время широко обсуждаются возможности аппаратной реализации непроцедурных языков программирования — логических и функциональных. Поскольку в таких языках имеет место широкий параллелизм, они должны хорошо реализоваться на многопроцессорных ЭВМ. Проблема, однако, здесь состоит не столько в разработке подходящей архитектуры, сколько в отыскании хороших алгоритмов интерпретации, позволяющих получить высокую эффективность на широком классе программ. Комментарии к главе 5 Развитие структур и практика создания ЭВМ довольно длительный период базировалась на концепции автоматического исполнения команды либо последовательности команд. ЭВМ этого вида получили в последствии название неймановских [13, 14, 15]. ЭВМ неймановской структуры могли развиваться лишь при наличии достаточно развитых средств автоматизации проектирования. При этом большое значение имели математические модели ЭВМ и формальные методы, отражающие реальные процессы проектирования. Одна из первых методик проектирования ЭВМ неймановской структуры базировалась на теории цифровых автоматов [15] и легла в основу известных экспериментальных систем ПРОЕКТ [19]. Развитие неймановских структур ' ЭВМ поддерживалось теорией проектирования ЭВМ. Следует заметить, что и в 60-70-е годы - период активного использования неймановской концепции - осуществлялись проекты ЭВМ структуры, отличной от неймановской (например, машины ГАММА-60, ИЛИАК-4, машины серии МИР, Б-5000 и др.), представление о которых можно составить по [6, 32]. В работе [18] были детально проанализированы достоинства и недостатки концепции неймановских ЭВМ и предложена новая концепция ЭВМ, отличная от неймановской. 187
Глава 6 ПРОЕКТИРОВАНИЕ ПОСЛЕДОВАТЕЛЬНЫХ ПРОГРАММ § 1. Основные этапы проектирования программ Процесс проектирования программы представляет собой построение последовательности моделей этой программы и ее частей, каждая из которых уточняет или дополняет модели, полученные ранее. Построенные модели используются для получения окончательного результата — текста объектной программы во входном языке вычислительной системы, используемой для ее выполнения. Программа должна вычислять некоторую функцию /: А -* В, определенную в терминах математической модели соответствующей предметной области, обладать определенными сложностными характеристиками и функционировать в заданной програмной среде. Каждый шаг проектирования, т.е. построение новой модели, связан с принятием некоторых решений относительно структур данных, алгоритмов выполнения тех или иных операций (операторов), взаимодействия частей проектируемой программы и т.п. В тех случаях, когда принятые решения не обеспечивают выполнение требований к результату, приходится возвращаться к начальным этапам проектирования программы и искать новое программное решение. Описание функции / часто называют спецификацией программы. Для того чтобы избежать путаницы с более специальными случаями употребления этого термина, будем называть это описание главной функциональной моделью проектируемой программы. Процесс проектирования может быть вырожденным в том случае, когда программа составляется сразу во входном языке системы по своей функциональной модели. Более того, уже построенная программа иногда может сама служить определением той функции, которую она вычисляет. Такой подход можно назвать прямым программированием. Он может быть использован при разработке простых программ, при высоком уровне входного языка и при слабых требованиях к характеристике проектируемой программы. В других случаях процесс проектирования требует более сложной организации в виде последовательности этапов, обеспечивающих движение сверху вниз и использующих принцип сведения задачи к подзадачам — основной метод преодоления сложности при проектировании больших систем. Можно выделить следующие основные этапы проектирования программ: 1. Построение главной функциональной модели. 2. Конструктивизация функциональных моделей. 3. Преобразование функциональных моделей. 4. Синтез процедурных представлений. 5. Преобразование процедурных представлений. Главная функциональная модель строится средствами математической модели предметной области (§ 5 гл. 4) как функция теоретико-множественных структур данных. Процесс построения главной функциональной модели может включать в себя построение модели предметной области, если последняя недостаточно формализована. В случае областей, использующих аппарат классической прикладной математики, таких, как физика или механика, основные объекты предметной области представляются числовыми функциональными пространствами различных типов, а функ- 188
циональные модели представляются системами уравнений в этих пространствах (дифференциальными, интегральными, алгебраическими). Но и здесь может потребоваться создание новых моделей, скажем при работе с объектами, имеющими сложную геометрию, различного рода комбинациями дискретных и непрерывных систем и т.п. Во многих случаях задача, которую требуется решать, сводится к поиску процессов в пространстве состояний некоторой дискретной системы. Так, например, обстоит дело в области искусственного интеллекта. Хорошо известно, что правильный выбор структуры пространства состояний, в частности определение функции переходов, играет решающую роль при поиске эффективных алгоритмов решения задач. В целом первый этап проектирования не формализован и существенным образом зависит от предметной области. Главная модель может быть построена с использованием вспомогательных моделей, которые будут реализованы с помощью подпрограмм объектной программы. Возможны различные способы представления функциональных моделей программ. Логическое представление описывает свойства функции у = f(x) средствами базового логического языка в виде предиката Р(х, у) такого, что Р(х, /(*)) истинно для любых х € А Такое описание может быть неоднозначным, а выбор для каждого х ^ А единственного значения у такого, что Р(х, у), предполагается осуществить на последующих этапах проектирования. В случае, когда требуется найти все значения^ такие, чтоР(х,у)> задача сводится к вычислению однозначной функции, принимающей значения в множестве подмножеств. Если логическое представление предполагает однозначное описание функции /: А ~+В, то должна быть доказана теорема о том, что для всякого х €l А существует единственное у € В такое, что Р{х, у). Если функция / может быть частично определенной, то достаточно доказать, что для каждого х £ А существует не более одного д> Е В такого, чтоР(х,у). Функция / может быть описана также с помощью предиката Р(/, х) = = Q (f 1,..., tn), в котором термы tx,..., tn зависят от х и могут использовать / в качестве функционального символа. Разумеется, не исключаются случаи, когда х = (xi,..., xm),f= (fx,..., fk), i.e. рассматривается спецификация системы функций многих переменных. Частным случаем такого описания является система функциональных уравнений^ (/,х) = G,- (/,х) (/ = 1,...,т) в алгебре структур данных. Такую систему можно рассматривать как алгебраическое представление функции/. Функциональная модель может быть задана также с помощью настроенной дискретной системы S, а функция / определена как функция fs, вычисляемая этой системой, либо выражена через fs и другие вспомогательные функции. Система S может быть недетерминированной, а функция fs — многозначной. В этом случае / может быть определена как любая из функций, содержащихся в fs. Такое представление так же, как и в случае логического представления, неоднозначно. Задача конструктивизации функциональной модели состоит в нахождении какого-либо алгоритма вычисления функции /. Обычно она решается путем построения новой модели, которая реализует заданную и для которой известен алгоритм вычисления соответствующей функции. В случае логического представления формулой Р(х, у) существование алгоритма оз- 189
начает перечислимость данного предиката. Если /: А -+В, а области А и В наделены отношением аппроксимации, то, вообще говоря, не требуется, чтобы алгоритм давал значение /(*), если оно не определено (Дх) = w). При нетривиальном отношении аппроксимации можно ограничиться и более слабыми требованиями. Например, вместо / вычислять другую функцию /':Л0 ~>В0, где А о и В0 — всюду плотные конструктивные подмножества множеств А и В соответственно, т.е. всякий элемент х Е А есть предел оо U х/ возрастающей цепи элементов множества А0 (аналогично для В). Функция /' должна удовлетворять условию / = 1 / = 1 Задача конструктивизации решается обычно в предположении конструктивности операций и отношений базовой алгебры данных. Из этого предположения следует, что всякая бескванторная формула Р(х, у) задает перечислимый предикат. Формулы с кванторами, ограниченными конечными множествами конструктивно заданных элементов алгебры данных, т.е. кванторами вида VxEA P(x,y) иЗх€ А Р(х,у),гд,еА - конечное множество, также задают перечислимые предикаты. Конструктивными будут также рекурсивные определения функций над конструктивными алгебрами с аппроксимацией или функции, заданные с помощью конструктивных дискретных систем. Конструктивность операций над структурами данных требует специальных исследований в каждом конкретном случае. Коструктивизация модели, заданной системой уравнений, можег состоять в преобразовании ее к такому виду, для которого существует общий алгоритм решения, например определение отношения аппроксимации и приведение к канонической форме. Конструктивизация главной функциональной модели означает существование алгоритма ее вычисления. Например, если эта модель задана бескванторной формулой Р(х,у), то такой алгоритм может быть определен циклом: Для всехz ЕВ выполнить Если Р(х, z) то у := z, выйти КЕ КЦ Реализация цикла требует использования алгоритма перечисления всех элементов множества В. Существование такого алгоритма должно следовать из конструктивности этой области. Прямой алгоритм, реализующий главную модель, обычно неэффективен, и переход к другому представлению функциональной модели может дать более эффективную реализацию. Предварительные оценки эффективности для функциональных моделей могут выполняться путем подсчета числа операций базовой алгебры, с использованием предварительных оценок времени и памяти, которые требуются для их выполнения, и оценок пространства поиска в случае переборных алгоритмов. Построение удовлетворительных функциональных моделей выполняется путем их преобразований с использованием знаний о предметной области, т.е. ее математической теории. Переход к процедурной форме представления алгоритмов вычисления функций, составляющих главную функциональную модель, или синтез программы, осуществляется обычно 190
с помощью некоторого общего метода синтеза, рассчитанного на класс конструктивных функциональных моделей. Полученная программа подвергается затем последовательности преобразований, целью которых является переход к модели вычислительной системы. При этом возможны следующие основные виды преобразований: 1. Переход к новой базовой алгебре. 2. Реализация структур данных. 3. Переход к новой информационной среде. 4. Преобразование программы без изменения базиса. При переходе к новой базовой алгебре данных!)' от алгебры/) операции алгебры D должны быть реализованы операциями алгебры /)'. Если эта реализация определяется строгим гомоморфизмом /)' в /), то с помощью теоремы 3.1 гл. 2 для каждой схемы программы, интерпретированной на/), может быть построена ее полная гомоморфная реализация над/)'. В качестве /)' может быть использована базовая алгебра модели вычислительной системы, но в некоторых случаях целесообразно сделать это через промежуточную алгебру, рассматривая дополнительный уровень реализации. Реализация алгебры D может быть выполнена не только с помощью гомоморфизма, но и другими способами. Например, достаточно установить соответствие между элементами D и /)' так, чтобы каждую элементарную функцию на/) можно было отобразить на некоторую элементарную или алгебраическую функцию алгебры /)' с однозначным восстановлением исходной функции. Такая реализация может быть сведена к гомоморфной, если вместе с основными операциями в алгебре рассматривать все элементарные и алгебраические функции. Если алгоритм работает со структурами данных, то переход к новой базовой алгебре сохраняет способы образования структур. Реализация структур данных также предполагает переход к новой алгебре данных. Только это делается не на уровне базовых алгебр, а на уровне алгебр структур данных. Еще более общий способ реализации программы предполагается при переходе к новой информационной среде. В этом случае может быть использована не только гомоморфная, но и автоматная реализация дискретных систем. Обоснование перехода выполняется уже не на уровне операций базовой алгебры данных, а на уровне операторов и последовательностей операторов. Наконец, преобразования, сохраняющие информационную среду, - это произвольные преобразования, сохраняющие главную функциональную модель с учетом всех предыдущих этапов, определяющих последовательную композицию реализующих отображений. Такие преобразования могут иметь разную силу. Наиболее сильные преобразования не зависят от интерпретации схемы программы, более слабые используют ту или иную информацию о строении предметной области. Во всех случаях переходов к следующим этапам проектирования совокупность моделей программы должна оставаться реализацией главной функциональной модели. Проектирование последовательных программ, которые функционируют в среде многокомпонентных систем, скажем программы функционирования компоненты сети из алгоритмических модулей, хотя и обладает определенной спецификой, во многих случаях сводится к проектированию программ, реализующих функциональные модели* Главная функциональная модель описывает многозначную функцию переходов дискретной системы, 191
моделирующей сеть, в которую погружена проектируемая компонента. Состояниями системы являются наборы значений внешних компонент алгоритмических модулей, составляющих сеть, а также внешней компоненты сети. При асинхронном взаимодействии задача сводится к проектированию программы, вычисляющей нужные функции при переходах между двумя соседними моментами времени, в которые происходят взаимодействия с окружающей средой. Проектирование программ, предназначенных для выполнения на многопроцессорных ЭВМ, кроме функциональных и процедурных моделей, требует также использования структурных моделей. Более подробно эти вопросы будут рассмотрены в гл. 7. § 2. Вычисление элементарных функций Предположим, что главная функциональная модель определяет функцию /(xi,..., хп) = (ух,...,ут), которая может быть представлена в виде yi=Fi(xi,...,xn\ /=l,...,m, (2.1) где переменные xl9..., хп пробегают область A CDi X ... XDn,Dl9..., Dn — компоненты базовой многоосновной алгебры данных D, область А определяется бескванторной формулой a0(xi,..., хп), записанной в сигнатуре П предикатов базовой алгебры, т.е. (х\,..., хп) € A <=>a0(xi,..., хп), а функции Ft элементарны, т.е. представлены в виде суперпозиции алгебры D базовых функций. Функциональная модель, удовлетворяющая перечисленным условиям, называется элементарной. Ее представление в виде (2.1) является решением задачи конструктивизации и может быть положено в основу построения U- У-программы над памятью V со стандартным базисом, определенным сигнатурой {И, 11) базовой алгебры интерпретированной на этой алгебре. Простейшим решением задачи синтеза для функциональной модели (2.1) является программа, состоящая из единственного оператора присваивания: {yi^Fl{x),...,ym:=Fm{x)); ~ (2.2) символы Xi,..., хп и yi9..., уп включаются в множество V и называются основными (входными и выходными) переменными. Более надежная программа выполняет также проверку начального условия а0 и печатает в случае его нарушения сообщение о неправильных данных: еслиа0(х) то у :=F(x) иначе вывод ("ошибка в данных") ке. Преобразования процедурного представления могут иметь целью улучшение программы по времени, памяти и другим характеристикам. Время выполнения программы (2.2) определяется количеством операций, которые использованы в выражениях /^(х),..., Fm(x), с учетом времен выполнения каждой из этих операций. Изменение выполняемых операций и, следовательно, времени выполнения программы может быть сделано с помощью применения тождественных соотношений алгебры данных. Равенство t(zi,..., zn) = t'(zx9..., zn) называется тождеством, если оно истинно при любых значениях переменных zl9..., z„, взятых из соответствующих компонент алгебры данных. В выражениях t(z) и t\z) могут участвовать константы, которые в этом случае выступают как 0-арные операции. Если t = t1 192
есть тождество базовой алгебры данных, то операторы х := t их := t' эквивалентны и могут заменять друг друга. Другой вид экономии времени может быть сделан за счет выделения совпадающих подвыражений. Соответствующее преобразование состоит в замене оператора (*i :=Fi(Gi,—,Gm\~>xn '^FniPi,... ,Gm)) последовательностью НАЧАЛО ух :=Gi, ...,ym '=Gm