- •Основы теории автоматов
- •1. Множества
- •1.1. Основные понятия теории множеств
- •1.2. Операции над множествами
- •2. Логика буля
- •2.1. Булевы функции
- •2.2. Постулаты и основные законы булевой алгебры
- •2.3. Формы представления булевых функций
- •2.4. Минимизация булевых функций
- •3. Формальная логика
- •3.1. Исчисление высказываний
- •3.2. Предикаты и кванторы
- •4. Графы
- •4.1. Происхождение графов
- •4.2. Основные определения
- •4.3. Методы представления графов в аналитической форме
- •4.4. Пути и контуры в графах
- •4.5. Деревья
- •5 . Конечные автоматы
- •5.1. Понятие автомата
- •5.2. Представление конечных автоматов
- •5.3. Типы конечных автоматов
- •5.4. Эквивалентность конечных автоматов: теорема Мура
- •5.5. Минимизация конечных автоматов
- •5.6. Минимизация неполных конечных автоматов
- •5.7. Примеры конечных автоматов
- •5.8. Моделирование автоматных систем сетями Петри
- •6. Алгоритмы и машины тьюринга
- •6.1. Понятие алгоритма
- •6.2. Основные требования к алгоритмам
- •6.3. Блок-схемы алгоритмов
- •6.4. Формализация понятия алгоритма
- •6.5. Машина Тьюринга
- •6.6. Примеры машин Тьюринга
- •Библиографический список
- •Оглавление
6.3. Блок-схемы алгоритмов
Связи между шагами в алгоритме можно изобразить в виде графа. Например, для алгоритма упорядочения чисел, рассмотренного выше, граф изображен на рис. 6.1.
Рис. 6.1
Такой граф, в котором вершинам соответствуют шаги, а ребрам – переходы между шагами, называется блок-схемой алгоритма. Его вершины могут быть двух видов: вершины, из которых выходит одно ребро (их называют операторами), и вершины, из которых выходят два ребра (их называют логическими условиями, или предикатами). Кроме того, имеется единственный оператор конца, из которого не выходит ни одного ребра, и единственный оператор начала. Важной особенностью блок-схемы является то, что связи, которые она описывает, не зависят от того, являются ли шаги элементарными или представляют собой самостоятельные алгоритмы – блоки. Возможность «разблочивать» алгоритм хорошо известна в программировании и широко там используется: большой алгоритм разбивается на блоки, которые можно раздать для программирования разным лицам. Для данного блока неважно, как устроены другие блоки; для программирования блока достаточно знать, где лежит вся исходная информация, какова форма ее представления, что должен делать блок и куда записать результат.
С помощью блок-схем можно, наоборот, несколько алгоритмов, рассматриваемых как блоки, связать в один большой алгоритм. В частности, если алгоритм А1, вычисляющий функцию f1(x), соединен с алгоритмом А2, вычисляющим функцию f2(x) (рис. 6.2), и при этом исходными данными для А2 служит результат A1, то полученная блок-схема задает алгоритм, вычисляющий f2(f1(x)), т. е. композицию f1 и f2. Такое соединение алгоритмов называется композицией алгоритмов.
Рис. 6.2
На блок-схеме хорошо видна разница между описанием алгоритма и процессом его реализации. Описание – это граф; процесс реализации – это путь в графе. Различные пути в одном и том же графе возникают при различных данных, которые создают разные логические условия в точках разветвления. Отсутствие сходимости означает, что в процессе вычисления не появляется условий, ведущих к концу, и процесс идет по бесконечному пути (зацикливается).
При всей наглядности языка блок-схем не следует однако переоценивать его возможности. Он достаточно груб и отражает связи лишь по управлению (что делать в следующий момент, т. е. какому блоку передать управление), а не по информации (где этому блоку брать исходные данные). Например, рис. 5.2 при сделанной оговорке относительно данных изображает вычисление f2(f1(x)), однако он же мог изображать последовательное вычисление двух независимых функций f1(5) и f2(100), порядок которых несуществен. Блок-схемы не содержат сведений ни о данных, ни о памяти, ни об используемом наборе элементарных шагов. В частности, надо иметь в виду, что если в блок-схеме нет циклов, это еще не значит, что нет циклов в алгоритме (они могут быть в каком-нибудь неэлементарном блоке). По существу блок-схемы – это не язык, а средство, правда, очень удобное, для одной цели – описания детерминизма алгоритма. Оно широко используется с одним видоизменением: условия, т. е. точки разветвления, могут быть не только двоичными, но и многозначными; важно лишь, чтобы верным был ровно один из возможных ответов. Примеры таких условий: а) х < О, х = 0, х > 0; б) х < 5, 5 < х < 20, х = 20, х < 20.