Введение в схемы, автоматы и алгоритмы

Введение в схемы, автоматы и алгоритмы

Автоматическое зарядное устройство для автомобиля


Автоматическое зарядное устройство для автомобильных свинцово-кислотных аккумуляторов.

Автоматическое зарядное устройство для автомобиля

Данная схема позволяет автоматически заряжать автомобильные аккумуляторы.
Зарядный ток через батарею в зависимости от напряжения на ней (прикладываемого к Б-Э переходу VT1), регулируется транзистором VT1, коллекторным напряжением которого управляется индикатор заряда на светодиоде (по мере зарядки ток заряда уменьшается и светодиод постепенно гаснет) и мощный составной транзистор, содержащий VT2, VT3, VT4.
Резистор R3 ограничивает максимальный зарядный ток, поэтому он должен быть достаточно мощным, не менее 10 Вт, наверное лучше проволочным.
Момент полного заряда батареи (и уменьшение зарядного тока до нуля) определяет необходимое напряжение на ней - обычно достаточно 12.5 В (!). Konstantin (RK1NA) утверждает (и ,похоже, меня он тоже убедил), что электро-химические потенциалы используемых материалов свинцовых аккумуляторов позволяют обеспечить ПОЛНУЮ зарядку батареи лишь при напряжении в 13.8 В (!).
Т.е. необходимо устанавливать порог заряда чуть больше 13.8 В, например 13.9 В, при котором обеспечивается зарядка "до отказа", на полную емкость батареи.
Этот порог устанавливается резистором R1, порог зависит от типа применяемых транзисторов


Булевы функции от 1-ой и 2-х переменных


Перечислим вначале все булевы функции от 1-ой переменной
Булевы функции от 1-ой и 2-х переменных
. Как мы знаем, их всего четыре.
  1. Булевы функции от 1-ой и 2-х переменных
    - константа 0;
  2. Булевы функции от 1-ой и 2-х переменных
    - константа 1;
  3. Булевы функции от 1-ой и 2-х переменных
    - тождественная функция;
  4. Булевы функции от 1-ой и 2-х переменных
    Эта функция называется отрицанием
    Булевы функции от 1-ой и 2-х переменных

    и обозначается
    Булевы функции от 1-ой и 2-х переменных
    (используется также обозначение
    Булевы функции от 1-ой и 2-х переменных
    , а в языках программирования эта функция часто обозначается как
    Булевы функции от 1-ой и 2-х переменных
    ).

В следующей таблице представлены наиболее используемые 12 (из 16) функций от 2-х переменных.

Таблица 1.2. Булевы функции от 2-х переменных
Булевы функции от 1-ой и 2-х переменных
  
Булевы функции от 1-ой и 2-х переменных
Булевы функции от 1-ой и 2-х переменных
Булевы функции от 1-ой и 2-х переменных
Булевы функции от 1-ой и 2-х переменных
Булевы функции от 1-ой и 2-х переменных
Булевы функции от 1-ой и 2-х переменных
Булевы функции от 1-ой и 2-х переменных
Булевы функции от 1-ой и 2-х переменных
Булевы функции от 1-ой и 2-х переменных
Булевы функции от 1-ой и 2-х переменных
Булевы функции от 1-ой и 2-х переменных
Булевы функции от 1-ой и 2-х переменных
Булевы функции от 1-ой и 2-х переменных

0  0
0  1
1  0
1  1

0
0
0
0

1
1
1
1

0
0
1
1

1
1
0
0

0
1
0
1

1
0
1
0

0
0
0
1

0
1
1
1

1
1
0
1

0
1
1
0

1
0
0
1

1
1
1
0

Многие из этих функций часто считаются "элементарными" и имеют собственные обозначения.
  • Булевы функции от 1-ой и 2-х переменных
    - константа 0;
  • Булевы функции от 1-ой и 2-х переменных
    - константа 1;
  • Булевы функции от 1-ой и 2-х переменных
    - функция, равная 1-му аргументу;
  • Булевы функции от 1-ой и 2-х переменных
    - отрицание
    Булевы функции от 1-ой и 2-х переменных
    ;
  • Булевы функции от 1-ой и 2-х переменных
    - функция, равная 2-му аргументу;
  • Булевы функции от 1-ой и 2-х переменных
    - отрицание
    Булевы функции от 1-ой и 2-х переменных
    ;
  • Булевы функции от 1-ой и 2-х переменных
    - конъюнкция, читается "
    Булевы функции от 1-ой и 2-х переменных
    и
    Булевы функции от 1-ой и 2-х переменных
    " (используются также обозначения
    Булевы функции от 1-ой и 2-х переменных
    ,
    Булевы функции от 1-ой и 2-х переменных
    ,
    Булевы функции от 1-ой и 2-х переменных
    и
    Булевы функции от 1-ой и 2-х переменных
    AND
    Булевы функции от 1-ой и 2-х переменных
    ));
  • Булевы функции от 1-ой и 2-х переменных
    - дизъюнкция, читается "
    Булевы функции от 1-ой и 2-х переменных
    или
    Булевы функции от 1-ой и 2-х переменных
    " (используются также обозначения
    Булевы функции от 1-ой и 2-х переменных
    ,
    Булевы функции от 1-ой и 2-х переменных
    и
    Булевы функции от 1-ой и 2-х переменных
    OR
    Булевы функции от 1-ой и 2-х переменных
    ));
  • Булевы функции от 1-ой и 2-х переменных
    - импликация, читается "
    Булевы функции от 1-ой и 2-х переменных
    влечет
    Булевы функции от 1-ой и 2-х переменных
    " или "из
    Булевы функции от 1-ой и 2-х переменных
    следует
    Булевы функции от 1-ой и 2-х переменных
    " (используются также обозначения
    Булевы функции от 1-ой и 2-х переменных
    , и ( IF
    Булевы функции от 1-ой и 2-х переменных
    THEN
    Булевы функции от 1-ой и 2-х переменных
    ));
  • Булевы функции от 1-ой и 2-х переменных
    - сложение по модулю 2, читается "
    Булевы функции от 1-ой и 2-х переменных
    плюс
    Булевы функции от 1-ой и 2-х переменных
    " (используется также обозначение
    Булевы функции от 1-ой и 2-х переменных
    );
  • Булевы функции от 1-ой и 2-х переменных
    - эквивалентность, читается "
    Булевы функции от 1-ой и 2-х переменных
    эквивалентно (равносильно)
    Булевы функции от 1-ой и 2-х переменных
    " (используется также обозначение
    Булевы функции от 1-ой и 2-х переменных
    );
  • Булевы функции от 1-ой и 2-х переменных
    - штрих Шеффера (антиконъюнкция), иногда читается как "не
    Булевы функции от 1-ой и 2-х переменных
    и
    Булевы функции от 1-ой и 2-х переменных
    ".

В качестве элементарных функций будем также рассматривать 0-местные функции-константы 0 и 1.
Отметим, что функции
Булевы функции от 1-ой и 2-х переменных
и
Булевы функции от 1-ой и 2-х переменных
фактически не зависят от значений обоих аргументов, функции
Булевы функции от 1-ой и 2-х переменных
и
Булевы функции от 1-ой и 2-х переменных
не зависят от значений аргумента
Булевы функции от 1-ой и 2-х переменных
, а функции
Булевы функции от 1-ой и 2-х переменных
и
Булевы функции от 1-ой и 2-х переменных
не зависят от значений аргумента
Булевы функции от 1-ой и 2-х переменных
.
Определение 1.1. Функция
Булевы функции от 1-ой и 2-х переменных
не зависит от аргумента
Булевы функции от 1-ой и 2-х переменных
, если для любого набора значений
Булевы функции от 1-ой и 2-х переменных

остальных аргументов
Булевы функции от 1-ой и 2-х переменных
имеет место равенство
Булевы функции от 1-ой и 2-х переменных
. Такой аргумент
Булевы функции от 1-ой и 2-х переменных
называется фиктивным. Аргументы, не являющиеся фиктивными, называются существенными.
Функции
Булевы функции от 1-ой и 2-х переменных
и
Булевы функции от 1-ой и 2-х переменных
называются равными, если функцию
Булевы функции от 1-ой и 2-х переменных
можно получить из функции
Булевы функции от 1-ой и 2-х переменных
путем добавления и удаления фиктивных аргументов.
Например, равными являются одноместная функция
Булевы функции от 1-ой и 2-х переменных
и двухместная функция
Булевы функции от 1-ой и 2-х переменных
, так как вторая получается из первой добавлением фиктивного аргумента
Булевы функции от 1-ой и 2-х переменных
. Мы не будем различать равные функции и, как правило, будем использовать для обозначения равных функций одно и то же имя функции. В частности, это позволяет считать, что во всяком конечном множестве функций все функции зависят от одного и того же множества переменных.


Булевы функции от n переменных


Булевы функции1) названы в честь английского математика ХIХ века Дж. Буля, который впервые применил алгебраические методы для решения логических задач. Они образуют самый простой нетривиальный класс дискретных функций - их аргументы и значения могут принимать всего два значения. С другой стороны, этот класс достаточно богат и его функции имеют много интересных свойств. Булевы функции находят применение в логике, электротехнике, многих разделах информатики.
Обозначим через
Булевы функции от n переменных
двухэлементное множество
Булевы функции от n переменных
. Тогда
Булевы функции от n переменных
- это множество всех двоичных последовательностей (наборов, векторов) длины
Булевы функции от n переменных
. Булевой функцией от
Булевы функции от n переменных

переменных (аргументов) называется любая функция
Булевы функции от n переменных
. Каждый из ее аргументов
Булевы функции от n переменных
может принимать одно из двух значений 0 или 1 и значением функции на любом наборе из
Булевы функции от n переменных
также может быть 0 или 1. Обозначим через
Булевы функции от n переменных
множество всех булевых функций от
Булевы функции от n переменных
переменных. Нетрудно подсчитать их число:
Булевы функции от n переменных

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


Деревья


Деревья являются одним из интереснейших классов графов, используемых для представления различного рода иерахических структур.
Определение 1.10. Граф
Деревья
называется деревом, если
  1. в нем есть одна вершина
    Деревья
    , в которую не входят ребра; она называется корнем дерева;
  2. в каждую из остальных вершин входит ровно по одному ребру;
  3. все вершины достижимы из корня.

На рисунке 2 показан пример дерева
Деревья

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

Рис. 1.2.  Дерево G1
Если из вершины
Деревья
ведет ребро в вершину
Деревья
, то
Деревья
называется отцом
Деревья
, а
Деревья
- сыном
Деревья
(в последнее время в ангоязычной литературе употребляется асексульная пара терминов: родитель - ребенок). Из определения дерева непосредственно следует, что у каждой вершины кроме корня имеется единственный отец. Если из вершины
Деревья
ведет путь в вершину
Деревья
, то
Деревья
называется предком
Деревья
, а
Деревья
- потомком
Деревья
. Вершины, у которых общий отец, называются братьями
или сестрами.
Пример 1.4. В дереве на рис. 1.2
вершина
Деревья
является корнем, вершины
Деревья
- листья. Путь
Деревья
- одна из ветвей дерева
Деревья
. Вершина
Деревья
является отцом (родителем) вершин
Деревья
и
Деревья
а каждая из этих вершин - ее сыном (ребенком). Между собой вершины
Деревья
и
Деревья
являются братьями (сестрами). Глубина
Деревья
равна 1, а высота - 2. Высота всего дерева
Деревья
равна 3.
Для деревьев часто удобно использовать следующее индуктивное определение.
Определение 1.11. Определим по индукции класс графов
Деревья
, называемых деревьями. Одновременно для каждого из них определим выделенную вершину - корень.
  1. Граф
    Деревья
    , с единственной вершиной
    Деревья
    и пустым множеством ребер
    Деревья
    является деревом (входит в
    Деревья
    ).
    Вершина
    Деревья
    называется корнем этого дерева.
  2. Пусть графы
    Деревья
    с корнями
    Деревья
    принадлежат
    Деревья
    , а
    Деревья
    - новая вершина, т.е.
    Деревья
    . Тогда классу
    Деревья
    принадлежит также следующий граф
    Деревья
    , где
    Деревья
    ,
    Деревья
    . Корнем этого дерева является вершина
    Деревья
    .
  3. Других графов в классе
    Деревья
    нет.


Рисунок 1.3 иллюстрирует это определение.

Деревья

Рис. 1.3.  Индуктивное определение ориентированных деревьев

Определения ориентированных деревьев 1.10 и 1.11 эквивалентны.

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

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

Бинарное дерево называется полным, если у каждой его внутренней вершины имеется два сына и все его ветви имеют одинаковую длину.


Дизъюнктивные и конъюнктивные нормальные формы


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

(
Дизъюнктивные и конъюнктивные нормальные формы
), в которой
Дизъюнктивные и конъюнктивные нормальные формы
и все переменные разные, т.е.
Дизъюнктивные и конъюнктивные нормальные формы
при
Дизъюнктивные и конъюнктивные нормальные формы
, называется элементарной конъюнкцией (элементарной дизъюнкцией).
Определение 1.4.Формула
Дизъюнктивные и конъюнктивные нормальные формы
называется дизъюнктивной нормальной формой (ДНФ), если она является дизъюнкцией элементарных конъюнкций, т.е. имеет вид
Дизъюнктивные и конъюнктивные нормальные формы

где каждая формула
Дизъюнктивные и конъюнктивные нормальные формы
- это элементарная конъюнкция.
Дизъюнктивные и конъюнктивные нормальные формы
называется совершенной ДНФ, если в каждую из ее конъюнкций
Дизъюнктивные и конъюнктивные нормальные формы
входят все
Дизъюнктивные и конъюнктивные нормальные формы
переменных из
Дизъюнктивные и конъюнктивные нормальные формы

Аналогично, формула
Дизъюнктивные и конъюнктивные нормальные формы
называется конъюнктивной нормальной формой (КНФ), если она является конъюнкцией элементарных дизъюнкций, т.е.
Дизъюнктивные и конъюнктивные нормальные формы

где каждая формула
Дизъюнктивные и конъюнктивные нормальные формы
- это элементарная дизъюнкция. Она является совершенной КНФ, если в каждую
Дизъюнктивные и конъюнктивные нормальные формы
входят все
Дизъюнктивные и конъюнктивные нормальные формы
переменных из
Дизъюнктивные и конъюнктивные нормальные формы

Рассмотрим произвольную булеву функцию
Дизъюнктивные и конъюнктивные нормальные формы
, зависящую от переменных из
Дизъюнктивные и конъюнктивные нормальные формы
. Oбозначим через
Дизъюнктивные и конъюнктивные нормальные формы

множество наборов значений переменных, на которых
Дизъюнктивные и конъюнктивные нормальные формы
принимает значение 1, а через
Дизъюнктивные и конъюнктивные нормальные формы

множество наборов, на которых
Дизъюнктивные и конъюнктивные нормальные формы
принимает значение 0, т.е.
Дизъюнктивные и конъюнктивные нормальные формы
и
Дизъюнктивные и конъюнктивные нормальные формы

Определим по этим множествам две формулы:
Дизъюнктивные и конъюнктивные нормальные формы

и
Дизъюнктивные и конъюнктивные нормальные формы

Теорема 1.1.
(1) Если функция
Дизъюнктивные и конъюнктивные нормальные формы
не равна тождественно 0, то формула
Дизъюнктивные и конъюнктивные нормальные формы
- это совершенная ДНФ, задающая функцию
Дизъюнктивные и конъюнктивные нормальные формы
.
(2) Если функция
Дизъюнктивные и конъюнктивные нормальные формы
не равна тождественно 1, то формула
Дизъюнктивные и конъюнктивные нормальные формы
- это совершенная КНФ, задающая функцию
Дизъюнктивные и конъюнктивные нормальные формы
.
Пример 1.2. Например, для функции
Дизъюнктивные и конъюнктивные нормальные формы
, представленной в таблице 1.1
совершенная ДНФ равна
Дизъюнктивные и конъюнктивные нормальные формы

Дизъюнктивные и конъюнктивные нормальные формы
, а ее совершенная КНФ:
Дизъюнктивные и конъюнктивные нормальные формы

Отметим, что совершенные ДНФ и КНФ часто являются чересчур сложными и длинными представлениями булевых функций. В нашем примере
Дизъюнктивные и конъюнктивные нормальные формы
может быть задана более простой ДНФ:
Дизъюнктивные и конъюнктивные нормальные формы
.


Формулы


Как мы видели, табличное представление булевых функций подходит лишь для функций с небольшим числом аргументов. Формулы позволяют удобно представлять многие функции от большего числа аргументов и оперировать различными представлениями одной и той же функции.
Мы будем рассматривать формулы, построенные над множеством элементарных функций
Формулы
. Все эти функции, кроме констант, называются логическими связками или логическими операциями. При этом для 2-местных функций из этого списка будем использовать инфиксную запись, в которой имя логической связки помещается между 1-ым и 2-ым аргументами.
Зафиксируем некоторое счетное множество переменных
Формулы
. Определим по индукции множество формул над
Формулы
с переменными из
Формулы
. Одновременно будем определять числовую характеристику
Формулы
формулы
Формулы
, называемую ее глубиной, и множество ее подформул.
Определение 1.2.
а) Базис индукции. 0, 1 и каждая переменная
Формулы
является формулой глубины 0, т.е.
Формулы
. Множество ее подформул состоит из нее самой.
б) Шаг индукции. Пусть
Формулы
и
Формулы
- формулы,
Формулы
. Тогда выражения
Формулы
и
Формулы

являются формулами. При этом
Формулы
, а
Формулы
. Множество подформул
Формулы
включает саму формулу
Формулы
и для
Формулы
все подформулы формулы
Формулы
, а для
Формулы
все подформулы формул
Формулы
и
Формулы

Каждой формуле
Формулы
сопоставим булеву функцию, которую эта формула задает, используя индукцию по глубине формулы.
Базис индукции. Пусть
Формулы
. Тогда
Формулы
или
Формулы

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

или
Формулы

для некоторой булевой связки
Формулы
. Так как
Формулы
то формулам
Формулы
и
Формулы
соответствующие функции
Формулы
и
Формулы
уже сопоставлены. Тогда формула
Формулы

задает функцию
Формулы
, а формула
Формулы

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

Таблица 1.3. Функция
Формулы
Формулы
 
Формулы
 
Формулы
Формулы
  
Формулы
  
Формулы
Формулы
  
Формулы
Формулы

Формулы
  
Формулы
  
Формулы
  
Формулы
  
Формулы
Формулы

0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1

 0  0  0 1  0
 0  0  0 1  0
 0  1  1 0  1
 0  1  1 0  1
 1  1  0 1  0
 1  1  0 1  0
 1  1  1 0  1
 1  1  1 0  1

1
1
0
1
1
0
0
1

0  0  0  0  1  0
1  1  0  0  1  0
0  0  0  0  0  1
1  1  0  0  0  1
0  1  1  1  1  0
1  0  1  1  1  0
0  0  1  0  0  1
1  1  1  0  0  1

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


Графы


Мы часто сталкиваемся с задачами, в условиях которых заданы некоторые объекты и между некоторыми их парами имеются определенные связи. Если объекты изобразить точками (вершинами), а связи - линиями (ребрами), соединяющими соответствующие пары точек, то получится рисунок, называемый графом. Приведем основные определения.
Граф (ориентированный) - это пара
Графы
, где
Графы
- конечное множество вершин (узлов, точек) графа, а
Графы
- некоторое множество пар вершин, т.е. подмножество множества
Графы
или бинарное отношение на
Графы
. Элементы
Графы
называют ребрами (дугами, стрелками, связями). Для ребра
Графы
вершина
Графы
называется началом
Графы
, а вершина
Графы
- концом
Графы
, говорят, что ребро
Графы
ведет из
Графы
в
Графы
.
В графе полустепень исхода вершины - это число исходящих из нее ребер, а полустепень захода - это число входящих в данную вершину ребер.
Заметим, что в графе может быть ребро вида
Графы
, называемое петлей.
Пример 1.3. На рис. 1.1 приведен пример графа
Графы
. Здесь
Графы
, В графе
Графы
ребро
Графы
является петлей, полустепень исхода вершины
Графы
равна 2, а полустепень захода для нее равна 1.
Графы

Рис. 1.1.  Граф G1
Во многих приложениях с вершинами и ребрами графов связывается некоторая дополнительная информация. Обычно она представляется с помощью функций разметки вершин и ребер.
Определение 1.6.
Размеченный граф - это граф
Графы
, снабженный одной или двумя функциями разметки вида:
Графы
и
Графы
, где
Графы
и
Графы
- множества меток вершин и ребер, соответственно.
Упорядоченный граф - это размеченный граф
Графы
, в котором ребра, выходящие из каждой вершины
Графы
, упорядочены, т.е. помечены номерами
Графы
, где
Графы
- полустепень исхода
Графы
, т.е.
Графы
.
Упорядоченный граф с полустепенью исхода вершин
Графы
называется бинарным.
В качестве множества меток ребер
Графы
часто выступают числа, задающие "веса", "длины", "стоимости" ребер. Графы с такой разметкой часто называют взвешенными.
Часто на одном множестве объектов определено несколько различных бинарных отношений. Для представления такой ситуации служат мультиграфы.
Определение 1.7. Мультиграф
Графы
состоит из конечного множества вершин
Графы
и мультимножества ребер
Графы
состоящего из пар вершин
Графы
в которое эти пары могут входить по нескольку раз.



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

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

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

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

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

Определение 1.9.

Путь в (мульти)графе - это последовательность ребер вида
Графы
. Этот путь ведет из начальной вершины
Графы
в конечную вершину
Графы
и имеет длину
Графы
. В этом случае будем говорить, что
Графы
достижима из
Графы
. Будем считать, что каждая вершина достижима сама из себя путем длины 0. Путь в графе (не мультиграфе!) можно также определять как соответствующую последовательность вершин:
Графы
где
Графы
при
Графы
.

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

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

Если в графе нет циклов, то он называется ациклическим.

Следующее утверждение непосредственно следует из определений.

Лемма 1.1.Если в графе
Графы
имеется путь из вершины
Графы
в вершину
Графы
, то в нем имеется и простой путь из
Графы
в
Графы
.


Эквивалентность булевых формул


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

равны.
Обозначение:
Эквивалентность булевых формул
. Эквивалентные формулы называют также тождественно равными, а выражения вида
Эквивалентность булевых формул
логическими тождествами.
Таким образом, эквивалентные формулы являются различными заданиями одной и той же булевой функции. Ниже мы приводим ряд пар эквивалентных формул (тождеств), отражающих существенные свойства логических операций и важные соотношения между различными операциями. Они часто позволяют находить для булевых функций по одним задающим их формулам более простые формулы. Большинство из приводимых тождеств имеют собственные имена. Часто их называют законами логики.
Пусть
Эквивалентность булевых формул
- это одна из функций
Эквивалентность булевых формул
. Для этих трех функций выполнены следующие две эквивалентности (законы ассоциативности и коммутативности).
(1) Ассоциативность:
Эквивалентность булевых формул

(2) Коммутативность:
Эквивалентность булевых формул

(3) Дистрибутивные законы:
Эквивалентность булевых формул
Эквивалентность булевых формул
Эквивалентность булевых формул

(4) Двойное отрицание:
Эквивалентность булевых формул

(5) Законы де Моргана (внесение отрицания внутрь скобок):
Эквивалентность булевых формул
Эквивалентность булевых формул

(6) Законы упрощения:
Эквивалентность булевых формул
Эквивалентность булевых формул
Эквивалентность булевых формул
Эквивалентность булевых формул

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

(7)

Эквивалентность булевых формул

(8)

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

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

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

может быть записана как
Эквивалентность булевых формул



Табличное представление


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

Таблица 1.1. Табличное представление функции
Табличное представление
Табличное представление
  .  .  .  
Табличное представление
  
Табличное представление
Табличное представление

Табличное представление
  .  .  .  
Табличное представление
  
Табличное представление

Табличное представление
  .  .  .  
Табличное представление
  
Табличное представление

Табличное представление
  .  .  .  
Табличное представление
  
Табличное представление

.  .  .  .  .  .
Табличное представление
  .  .  .  
Табличное представление
  
Табличное представление


Табличное представление

Табличное представление

Табличное представление

Табличное представление

Табличное представление


Наборы аргументов в строках обычно располагаются в лексикографическом порядке:
Табличное представление
существует такое
Табличное представление
, что при
Табличное представление
а
Табличное представление
. Если эти наборы рассматривать как записи чисел в двоичной системе счисления, то 1-ая строка представляет число 0, 2-ая - 1, 3-я - 2, ... , а последняя -
Табличное представление
.
При больших
Табличное представление
табличное представление становится громоздким, например, для функции от 10 переменных потребуется таблица с 1024 строками. Но для малых
Табличное представление

оно достаточно наглядно.


Введение в схемы, автоматы и алгоритмы

Логические схемы (схемы из функциональных элементов)


Многие элементы в современной электронике являются устройствами, преобразующими некоторые входные сигналы (данные) в выходные. Логические схемы, в отечественной литературе чаще называемые схемами из функциональных элементов, представляют собой математическую модель таких устройств, в которых временем выполнения преобразования входов в выходы можно пренебречь.
Чтобы не усложнять определение, зафиксируем конкретный базис B0={
Логические схемы (схемы из функциональных элементов)
,
Логические схемы (схемы из функциональных элементов)
, ¬} и определим схемы в этом базисе.
Определение 2.1. Логической схемой (схемой из функциональных элементов) в базисе B0 называется размеченный ориентированный граф без циклов S=(V,E), в котором
  1. вершины, в которые не входят ребра, называются входами схемы, и каждая из них помечена некоторой переменной (разным вершинам соответствуют разные переменные);
  2. в каждую из остальных вершин входит одно или два ребра; вершины, в которые входит одно ребро помечены функцией ¬, а вершины, в которые входят по два ребра, - одной из функций
    Логические схемы (схемы из функциональных элементов)
    или
    Логические схемы (схемы из функциональных элементов)
    . Такие вершины называются функциональными элементами.

Как и для деревьев, для ориентированных графов без циклов можно естественным образом ввести понятие глубины.
Определение 2.2. Глубина вершины v
Логические схемы (схемы из функциональных элементов)
V в схеме S=(V,E) - это максимальная длина пути из входов S в v .
Глубиной D(S) схемы S назовем максимальную из глубин ее вершин.
Пусть входы схемы S помечены переменными x1, … , xn. С каждой вершиной v
Логические схемы (схемы из функциональных элементов)
V схемы S свяжем булеву функцию fv(x1,… , xn), реализуемую в этой вершине. Определим fv индукцией по глубине v .
Определение 2.3.
Базис: v имеет глубину 0. Тогда это входная вершина, которая помечена некоторой переменной xi. Положим fv(x1,… , xn) = xi.
Шаг индукции. Пусть всем вершинам w глубины
Логические схемы (схемы из функциональных элементов)
k уже сопоставлены функции fw и пусть v - произвольная вершина глубины k+1. Тогда

  • если v помечена ¬ и в нее входит ребро (w,v) , то положим
    Логические схемы (схемы из функциональных элементов)

  • если v помечена
    Логические схемы (схемы из функциональных элементов)
    и в нее входят два ребра (w1,v) и (w2,v), то положим
    Логические схемы (схемы из функциональных элементов)

  • если v помечена
    Логические схемы (схемы из функциональных элементов)
    и в нее входят два ребра (w1,v) и (w2,v), то положим
    Логические схемы (схемы из функциональных элементов)

Нетрудно понять, что шаг индукции в этом определении корректен, так как, если в схеме S имеется ребро (w,v) и глубина вершины v равна k+1, то глубина вершины w не превосходит k и для нее fw уже определена по индукционному предположению.

Определение 2.4. Схема S реализует набор булевых функций g1, g2, … , gm, если для каждого i
Логические схемы (схемы из функциональных элементов)
[1,m] в схеме существует такая вершина vi, что
Логические схемы (схемы из функциональных элементов)
.

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

Определение 2.5. Сложность L(S) схемы S - это число функциональных элементов в S. Сложность L(f) булевой функции f(x1, …, xn) - это наименьшая из сложностей схем, реализующих эту функцию.

Отношения между булевыми функциями и схемами естественно приводят к двум следующим основным проблемам.

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

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

Пример 2.1. Рассмотрим схему S1

с тремя входными переменными x, y и z, изображенную на рис. 2.1 и решим для нее проблему анализа.

Логические схемы (схемы из функциональных элементов)

Рис. 2.1.  Схема S1

В соответствии с данным выше определением вершины схемы S1 реализуют следующие функции:

fa(x,y,z) = x
Логические схемы (схемы из функциональных элементов)
y, fb(x,y,z) = ¬ z, fc(x,y,z) = ¬ fa(x,y,z)=¬( x
Логические схемы (схемы из функциональных элементов)
y), fd(x,y,z) = fc(x,y,z)
Логические схемы (схемы из функциональных элементов)
z = ¬( x
Логические схемы (схемы из функциональных элементов)
y)
Логические схемы (схемы из функциональных элементов)
z, fe(x,y,z) =fa(x,y,z)
Логические схемы (схемы из функциональных элементов)
fb(x,y,z)= x
Логические схемы (схемы из функциональных элементов)
y
Логические схемы (схемы из функциональных элементов)
¬ z и, наконец, ff(x,y,z) =fd(x,y,z)
Логические схемы (схемы из функциональных элементов)
fe(x,y,z) = (¬( x
Логические схемы (схемы из функциональных элементов)
y)
Логические схемы (схемы из функциональных элементов)
z)
Логические схемы (схемы из функциональных элементов)
((x
Логические схемы (схемы из функциональных элементов)
y )
Логические схемы (схемы из функциональных элементов)
¬ z).

Глубина этой схемы D(S1)= 4, а ее сложность L(S1)=6. В то же время формула для результирующей функции ff содержит 7 функциональных знаков. За счет чего достигнута экономия? За счет того, что функция (x
Логические схемы (схемы из функциональных элементов)
y) в схеме S1 вычисляется один раз в вершине a, а в формуле приходится вычислять ее дважды.

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


Схемы и линейные программы


Указанное выше свойство характерно и для программ, в которых один раз вычисленное значение выражения можно использовать неоднократно. Рассмотрим один из простейших классов программ - линейные или неветвящиеся программы. Такие программы представляют последовательности присваиваний вида:
Схемы и линейные программы

где X, X1, … , Xk - переменные, F - имя k-местной базисной функции.
В случае нашего базиса B0={
Схемы и линейные программы
,
Схемы и линейные программы
, ¬} линейная программа состоит из присваиваний вида: Z = X
Схемы и линейные программы
Y, Z = X
Схемы и линейные программы
Y и Z = ¬ X.
Линейная программа P с выделенными входными переменными X1, … , Xn
порождает для каждого набора ?1, …, ?n значений входных переменных естественный процесс вычисления: вначале переменным X1, … , Xn присваиваются значения ?1, …, ?n, соответственно, а каждой из остальных переменных присваивается значение 0. Затем последовательно выполняются присваивания программы P, в результате чего каждая из переменных Z программы получит заключительное значение PZ(?1, …, ?n).
Определение 2.6.
Скажем, что программа P со входными переменными X1, … , Xn
вычисляет в выходной переменной Z функцию F(X1, …, Xn), если для любого набора значений входов ?1, …, ?n после завершения работы PZ(?1, …, ?n)=F(?1, …, ?n) .
Между схемами и линейными программами имеется тесная связь.
Теорема 2.1.
  1. По каждой логической схеме S со входами x1, … , xn и функциональными элементами v1, …, vm можно эффективно построить линейную программу PS со входными переменными x1, … , xn и рабочими переменными v1, …, vm, которая в любой переменной vi, i=1,…,m, вычисляет функцию
    Схемы и линейные программы
    .
  2. По каждой линейной программе P со входными переменными X1, … , Xn, вычисляющей в выходной переменной Z некоторую функцию F(X1, …, Xn) можно эффективно построить логическую схему SP со входами X1, … , Xn, в которой имеется вершина v такая, что fv((X1, …, Xn) = F(X1, …, Xn).

Доказательство. (1) Пусть S - схема со входами x1, … , xn и функциональными элементами v1, …, vm. Построим по ней линейную программу PS со входными переменными x1, … , xn следующим образом. Упорядочим все входные и функциональные вершины S по глубине (вершины одной глубины в любом порядке): u1, …, un+m.
Программа PS будет последовательностью m присваиваний.

  • Пусть вершина un+i помечена ¬ и в нее входит
  • ребро из uj. Тогда в качестве i-ой команды поместим в PS присваивание un+i= ¬ uj.
  • Пусть вершина un+i помечена \circ
    Схемы и линейные программы
    {
    Схемы и линейные программы
    ,
    Схемы и линейные программы
    } и в нее входят ребра из uj и uk. Тогда в качестве i-ой команды поместим в PS присваивание un+i= uj ? uk.


Упорядочение вершин по глубине гарантирует, что j Схемы и линейные программы
.

Доказательство пункта (2) проведите самостоятельно (см. задачу 2.1).

Пример 2.1.

Применим конструкцию теоремы к схеме S1, представленной на рис.2.1. Ее вершины можно упорядочить по глубине так: x, y, z, a, b, c, d, e, f. Порождая команды по описанным выше правилам, получим следующую линейную программу P_{S1}:

Схемы и линейные программы


Замечание. Число команд в линейной программе PS, т.е. время ее выполнения, совпадает со сложностью L(S) схемы S. Глубина схемы D(S) также имеет смысл с точки зрения времени вычисления. Именно, D(S) - это время выполнения PS на многопроцессорной системе. Действительно, все команды, соответствующие вершинам одинаковой глубины, можно выполнять параллельно на разных процессорах, так как результаты любой из них не используются в качестве аргументов другой.


Рассмотрим схему S+ на рис.


Рассмотрим схему S+ на рис. 2.2.

Рассмотрим схему S+ на рис.

Рис. 2.2.  Схема S+ для функции x+y

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

fa(x,y) = x
Рассмотрим схему S+ на рис.
y, fb(x,y) = x
Рассмотрим схему S+ на рис.
y, fc(x,y) = ¬ fa(x,y)=¬( x
Рассмотрим схему S+ на рис.
y), fd(x,y) = fc(x,y)
Рассмотрим схему S+ на рис.
fb(x,y) = ¬( x
Рассмотрим схему S+ на рис.
y)
Рассмотрим схему S+ на рис.
( x
Рассмотрим схему S+ на рис.
y) = x +y.

Таким образом, схема S+ реализует (в вершине d) функцию + сложения по модулю 2.

Из приведенного выше примера следует, что L(S+)=4 и L(+)
Рассмотрим схему S+ на рис.
4.

Используя схему S+, нетрудно построить схему Sodd для реализации линейной функции-суммы n аргументов по модулю 2 odd(X1,X2,…, Xn)= X1 +X2 +… + Xn (см. рис. 2.3).

Рассмотрим схему S+ на рис.

Рис. 2.3.  Схема Sodd

На этой схеме прямоугольники S+(1), S+(2), … ,S+(n) содержат копии схемы S+. При этом входами S+(1) являются переменные x1 и x2, а входами S+(i+1) являются выход схемы S+(i) и переменная xi+1. По индукции легко показать, что вершина d в S+(i) реализует функцию (x1 + x2 + … + xi+1). Таким образом, нами установлена

Теорема 2.2.

Существует схема Sodd, реализующая функцию odd(X1,X2,…, Xn)= X1 +X2 +… + Xn

со сложностью L(Sodd)= 4 (n-1).


Сумматор


Сумматором порядка n называют схему, вычисляющую результат сложения двух n-разрядных двоичных чисел
Сумматор
и
Сумматор
. Пусть
Сумматор

( здесь ai, bi, ci
Сумматор
{0, 1} - соответствующие двоичные разряды этих чисел).
Сумматор

Сумматор должен вычислять набор из (n+1)-ой результирующей функции:
Сумматор

задающих соответствующие разряды суммы c.
Обозначим через pi бит переноса из (i-1)-го разряда в i-ый. Тогда нетрудно видеть, что при i =0
c0 = a0 + b0 и p1 = a0
Сумматор
b0,
а при 1
Сумматор
i
Сумматор
n-1
ci= pi + ai + bi и pi+1 = (ai
Сумматор
bi)
Сумматор
(pi
Сумматор
ai)
Сумматор
(pi
Сумматор
bi).
Старший разряд c совпадает с последним переносом: cn=pn.
Рассмотрим теперь построенную выше схему S+ как схему, вычисляющую набор из двух функций: x
Сумматор
y (в вершине a) и x+y (в вершине d). Используя два экземпляра этой схемы S+(1) и S+(2), можно легко реализовать схему одноразрядного сумматора SUM1 (см. рис. 2.4) , которая имеет три входа ai, b_ i и pi (1
Сумматор
i
Сумматор
n-1) и вычисляет ci и pi+1.
Сумматор

Рис. 2.4.  Схема SUM1
Действительно, из построения следует, что в вершине p этой схемы вычисляется функция fp = (ai
Сумматор
bi)
Сумматор
((ai + bi)
Сумматор
pi) = (ai
Сумматор
bi)
Сумматор
(pi
Сумматор
ai)
Сумматор
(pi
Сумматор
bi) = pi+1. Из представленной схемы видно, что сложность одноразрядного сумматора L(SUM1)= 9.
Теперь из S+ и одноразрядных сумматоров SUM1 соберем схему SUMn для n-разрядного сумматора.
Сумматор

Рис. 2.5.  Схема cумматора SUMn
Таким образом мы установили следующее утверждение.
Теорема 2.3.
Для каждого n
Сумматор
1 cуществует схема SUM, реализующая операцию суммирования двух n-разрядных двоичных чисел и имеющая сложность L(SUMn)= 9n -5.
Замечание Логические схемы интенсивно исследовались 50-х-70-х годах прошлого столетия. В частности, К. Шеннон и О.Б. Лупанов установили оценки сложности схем для булевых функций от n аргументов. Оказалось, что любую такую функцию можно реализовать со сложностью не большей (по порядку) 2n/n и что "почти все" они имеют не меньшую сложность. При этом до сих пор не известна ни одна последовательность "конкретных" функций fn, сложность которых по порядку превосходила бы линейную функцию.


что минимальная схема для сложения


Задача 2.1. Докажите пункт (2) теоремы 2.1.
Задача 2.2. Докажите, что минимальная схема для сложения имеет сложность L(+) = 4.
Задача 2.3. Используя схему SUMn, постройте схему, реализующую операцию вычитания двух n-разрядных двоичных чисел: d =a - b (при условии, что a
что минимальная схема для сложения
b). Оцените сложность полученной схемы.
Задача 2.4. Определите глубину схем S+, Sodd, SUM1 и SUMn.
Задача 2.5. Два игрока независимо выбирают одно из четырех чисел от 0 до 3. Первый игрок выигрывает, если выбранные числа совпадают. Постройте схему, определяющую выигрыш 1-го игрока. Ее входы x1,x2 представляют число, выбранное 1-ым игроком, а y1,y2 - число, выбранное 2-ым игроком. Реализуемая функция F(x1,x2,y1,y2) равна 1 тогда и только тогда, когда x1=y1 и x2 =y2.
Задача 2.6. Постройте схему, определяющую результат голосования в комитете, состоящем из трех членов и председателя. В случае равенства голосов, голос председателя является решающим.
Задача 2.7. Пусть наборы аргументов булевой функции от трех аргументов упорядочены лексикографически, а ее значения задаются последовательностью 8 нулей и единиц. Постройте схемы, реализующие следующие функции.


Введение в схемы, автоматы и алгоритмы

Основные определения


Одним из предшественников УБДР являются бинарные деревья решений.
Определение 3.1.
Бинарное дерево решений (БДР) - это бинарное дерево T=(V,E), все внутренние вершины которого помечены переменными, а листья - значениями 0 или 1. Из каждой внутренней вершины v выходят 2 ребра, одно помечено 0, другое - 1; вершина w0, в которую ведет ребро, помеченное 0, называется 0-сыном v, а вершина w1, в которую ведет ребро, помеченное 1, называется 1-сыном v.
Такое дерево, вершины которого помечены переменными x1, …, xn реализует булеву функцию f(x1, …, xn), если для каждого набора значений переменных ?1, ?2, …, ?n ветвь в дереве, соответствующая этому набору (из вершины xi идем по ребру, помеченному ?i), завершается листом с меткой f(?1, ?2, …, ?n).
Пример 3.1. Например, рассмотрим изображенное ниже БДР T1 (на всех рисунках предполагается, что ребра направлены сверху вниз).
Основные определения

Рис. 3.1. 
По определению T1 реализует функцию f1(x,y,z), представленную в таблице 3.1.

Таблица 3.1. Функция f1(x, y,z), реализуемая БДР T1 на рис.3.1xyzf(x,y,z)
0000
0011
0101
0111
1000
1011
1100
11.10

Нетрудно построить ДНФ этой функции: f(x, y, z) = (¬ x
Основные определения
y)
Основные определения
(¬ y
Основные определения
z).
УБДР являются модификацией БДР, в которой все листья с одной меткой представлены одной вершиной, в каждую вершину может входить несколько ребер, возможен выбор порядка появления переменных на ветвях.
Определение 3.2. Пусть зафиксирован некоторый порядок n переменных
Основные определения
: x
Основные определения
(1), …, x
Основные определения
(n).
Упорядоченная бинарная диаграмма решений относительно порядка переменных
Основные определения
- это ориентированный граф без циклов с одним корнем, в котором
  1. существует лишь две вершины, из которых не выходят ребра; они помечены константами 0 и 1 и называются стоками;
  2. остальные (внутренние) вершины помечены переменными и из каждой из них выходят два ребра, одно помечено 0, другое - 1;
  3. порядок, в котором переменные встречаются на любом пути из корня в сток, совместим с
    Основные определения
    , т.е. если из вершины, помеченной x
    Основные определения
    (i), есть путь в вершину, помеченную x
    Основные определения
    (j), то i < j.


Как и в случае БДР, УБДР реализует булеву функцию f(x1, …, xn), если для каждого набора значений переменных ?1, ?2, …, ?n путь в диаграмме, начинающийся в корне и соответствующий этому набору (из вершины xi идем по ребру, помеченному ?i), завершается стоком с меткой f(?1, ?2, …, ?n).

Из этого определения непосредственно следует, что каждая внутренняя вершина диаграммы v, помеченная переменной x
Основные определения
(k), является корнем поддиаграммы, которая включает все вершины диаграммы, достижимые из v, и реализует некоторую функцию fv( x
Основные определения
(k),x
Основные определения
(k+1), …, x
Основные определения
(n)) от (n -k +1) переменных x
Основные определения
(k),x
Основные определения
(k+1), …, x
Основные определения
(n). При этом ее 0-сын w0 является корнем поддиаграммы, реализующей функцию fw0(x
Основные определения
(k+1), …, x
Основные определения
(n)) =fv( 0, x
Основные определения
(k+1), …, x
Основные определения
(n)), а 1-сын w1 - корень поддиаграммы, реализующей функцию fw1(x
Основные определения
(k+1), …, x
Основные определения
(n)) =fv( 1, x
Основные определения
(k+1), …, x
Основные определения
(n)). Пусть диаграмма реализует функцию f(x1, … , xn) = f'(x
Основные определения
(1), …, x
Основные определения
(n)) и ?
Основные определения
(1),… , ?
Основные определения
(k-1) - это набор значений переменных x
Основные определения
(1), …, x
Основные определения
(k-1), который соответствует пути из корня в вершину v (таких наборов может быть несколько). Тогда fv( x
Основные определения
(k), …, x
Основные определения
(n))= f'(?
Основные определения
(1),… , ?
Основные определения
(k-1),x
Основные определения
(k), …, x
Основные определения
(n)).

Пример 3.2. Реализуем с помощью УБДР функцию f1(x,y,z), представленную выше в примере 3.1, с помощью БДР T1 и таблицы 3.1.

Вначале зафиксируем порядок переменных: x < y < z. Объединив листья с одинаковыми метками и две z- вершины с одинаковыми потомками, получим УБДР D1, приведенную на рис.3.2.

Основные определения

Рис. 3.2. 

Ясно, что реализация функции f1(x,y,z) с помощью УБДР D1 намного компактнее, чем с помощью БДР T1.

Под сложностью L(D) УБДР D будем понимать число внутренних вершин в D. Например, L(D1)=4. Может ли сложность диаграммы для некоторой функции зависеть от порядка переменных? Да! Рассмотрим порядок переменных y < x < z. Как показывает следующий рисунок, относительно этого порядка функцию f(x,y,z) можно реализовать УБДР D2 со сложностью L(D2)=3.

Основные определения

Рис. 3.3. 


Построение сокращенных УБДР по формулам


Алгоритм СОКРАЩЕНИЕ-УБДР позволяет построить сокращенную УБДР для функции f, по любой другой ее УБДР. Но как построить УБДР, если f задана, например, с помощью формулы? Можно, конечно, попытаться построить полное бинарное дерево решений, объединить в нем все листья с меткой 0 в один сток, а листья с меткой 1 - в другой. Затем применить к получившейся УБДР алгоритм СОКРАЩЕНИЕ-УБДР. Но этот подход годится только для функций от небольшого числа переменных, так как полное БДР для f(x1, …, xn) будет содержать 2n листьев.
Другой подход связан с построением УБДР "сверху-вниз". Объясним его для естественного порядка переменных: x1< x2 < … < xn.
Начнем построение с корня, помеченного x1. Рассмотрим две остаточные функции: f0(x1, …, xn)=f(0, x2, …, xn) и f1(x2, …, xn)=f(1, x2, …, xn). Если они одинаковы, то f не зависит от x1 и тогда изменим метку у корня на x2. Если обе функции f0 и f1 существенно зависят от x2, то для каждой из них добавляем вершину, помеченную x2, и далее реализуем по индукции. Если fk (k
Построение сокращенных УБДР по формулам
{0, 1}) не зависит от переменных x2,… , xj, но зависит существенно от xj+1, то добавляем вершину, помеченную xj+1, и проводим в нее ребро с меткой k из вершины, соответствующей f . Пусть для некоторого i уже построены вершины для всех различных остаточных функций вида f?1 … ?i}(xi+1, … , xn)= f(?1… ?i, xi+1, … , xn), существенно зависящих от xi. Для каждой из них получим две остаточные функции f_{?1… ?i 0}( xi+2, … , xn)= f(?1… ?i, 0, xi+2, … , xn) и f_{?1… ?i 1}( xi+2, … , xn)= f(?1… ?i, 1, xi+2, … , xn). Затем выберем из множества этих функций разные, для каждой из них добавим в диаграмму вершину, помеченную xi+1, и проведем в них соответствующие ребра из вершин, помеченных x_{i}. Продолжая построение, дойдем до функций от 1-ой переменной xn и до констант, для которых минимальные реализации очевидны.
Пример 3.2. Рассмотрим, например, функцию f(x1, x2, x3, x4), заданную формулой (x1
Построение сокращенных УБДР по формулам
x2
Построение сокращенных УБДР по формулам
x4)
Построение сокращенных УБДР по формулам
(¬ x1
Построение сокращенных УБДР по формулам
x2
Построение сокращенных УБДР по формулам
¬ x4)
Построение сокращенных УБДР по формулам
(¬ x2
Построение сокращенных УБДР по формулам
x3)
Построение сокращенных УБДР по формулам
(¬ x2
Построение сокращенных УБДР по формулам
x4), и построим для нее УБДР относительно порядка x1 < x2 < x3
Вначале создадим корень, помеченный x1, и рассмотрим остаточные функции, получающиеся при x1=0 и x1 =1. Имеем

Построение сокращенных УБДР по формулам


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

Построение сокращенных УБДР по формулам


Так как f00=f10, а f01 и f11 от x3 не зависят, то нам потребуется только одна вершина, помеченая x3. Она будет представлять функцию f00=f10=(x3
Построение сокращенных УБДР по формулам
x4). При x3=0 она превращается в x4, а при x3=1 равна константе 1. В результате получается УБДР Df, показанная на рис.3.6.

Построение сокращенных УБДР по формулам

Рис. 3.6. 


Сокращенные УБДР


Когда порядок переменных зафиксирован, то достаточно просто можно по произвольной УБДР для функции построить минимальную УБДР, реализующую данную функцию.
Определение 3.3. УБДР называется сокращенной, если
  1. из любой внутренней вершины v ее 0-сын и 1-сын не совпадают;
  2. нет такой пары внутренних вершин u и v, для которых поддиаграммы с корнями u и v являются изоморфными (т.е. взаимно однозначно отображаются друг на друга с сохранением всех меток).

Смысл этого определения понятен: если из некоторой вершины v оба ребра ведут в одну вершину, то такая вершина v не нужна, а если имеются две вершины с одинаковыми поддиаграммами, то их можно слить. Определим два типа эквивалентных преобразований УБДР.
Правило сокращения: если 0-сын и 1-сын вершины v совпадают и равны w, то удалить v, перенаправив все входящие в нее ребра в вершину w.
Правило слияния: если вершины v и w помечены одной переменной и имеют одинаковых 0-сыновей и 1-сыновей, то удалить вершину v, перенаправив все входящие в нее ребра в вершину w.
На следующем рисунке показаны преобразования по этим правилам.
Сокращенные УБДР

Рис. 3.4.  Правило сокращения Правило слияния
Следующая простая теорема показывает, что применимость этих двух правил является критерием несокращаемости УБДР.
Теорема 3.1.
УБДР D является сокращенной тогда и только тогда, когда к ней не применимо ни правило слияния, ни правило сокращения.
Доказательство.
Сокращенные УБДР
Если к D применимо правило сокращения, то не выполнено условие (1) из определения сокращенной УБДР, а если к D применимо правило слияния, то поддиаграммы с корнями v и w являются изоморфными и не выполнено условие (2).
? Пусть к УБДР D нельзя применить правило сокращения. Тогда в ней нет вершин с совпадающими 0- и 1-сыновьями и выполнено условие (1). Пусть к УБДР D нельзя применить правило слияния. Тогда из следующей леммы можно заключить, что в D нет пары вершин, поддиаграммы которых являются изоморфными, и следовательно, выполнено условие (2).
Лемма 3.2. Если в D есть такая пара вершин u и v, для которых поддиаграммы с корнями v и w являются изоморфными, то в D имеется и пара вершин v', w' с попарно одинаковыми 0- и 1-сыновьями и, следовательно, к D применимо правило слияния.

Доказательство леммы проведем индукцией по высоте h поддиаграмм Dv и Dw с корнями v и w, соответственно (так как Dv и Dw изоморфны, то их высоты, т.е. длины максимальных путей из корней до стоков, одинаковы).

Базис: h=1. В этом случае 0- и 1-сыновьями вершин v и w являются одинаковые стоки.

Шаг индукции. Предположим, что утверждение верно для h=k. Пусть Dv и Dw - поддиаграммы высоты h=k+1. Пусть v0 и w0 - это 0-сыновья вершин v и w, соответственно, а v1 и w1 - их 1-сыновья. Если v0=w0 и v1=w1, то в качестве v', w' подходят сами v и w. Если же для некоторого i
Сокращенные УБДР
{0,1} vi
Сокращенные УБДР
wi, то поддиаграммы
Сокращенные УБДР
и
Сокращенные УБДР
с корнями vi и wi являются изоморфными и имеют высоту k. Тогда по предположению индукции утверждение леммы выполнено.

Из теоремы 3.1 непосредственно следует, что, применяя к произвольной УБДР правила сокращения и слияния, мы, в конце концов, получим сокращенную УБДР. Чтобы эта процедура работала эффективо, нужно применять правила в порядке "снизу-вверх". Мы опишем этот алгоритм для "естественного" порядка переменных: x1, … , xn.

Алгоритм СОКРАЩЕНИЕ-УБДР

Вход: УБДР D для функции f(x1, … , xn).

Выход: сокращенная УБДР для
Сокращенные УБДР
.

1. Занумеруем множество вершин D: V = {v1, v2, …, vm}; 2. ДЛЯ i = n, n-1, …, 1 ВЫПОЛНЯТЬ 3. { 4. V(i) = { v | v помечена переменной xi }; /* Применение правила сокращения: 5. ДЛЯ КАЖДОЙ v
Сокращенные УБДР
V(i) ВЫПОЛНЯТЬ 6. ЕСЛИ (0-сын v) = (1-сын v) = w ТО} 7. { удалить v из V(i); 8. перенаправить все ребра, входящие в v, в вершину w; 9. удалить v из D } 10. ИНАЧЕ key(v) = (j, k), где vj - это 0-сын v, а vk - 1-сын v; /* Применение правила слияния: 11. Отсортировать V(i) по ключу key(v): пусть в этом порядке V(i)={ u1, …, uki}; 12. тек_ключ=(0, 0); 13. ДЛЯ j = 1, …, ki ВЫПОЛНЯТЬ 14. ЕСЛИ тек_ключ=key(uj) ТО 15. { удалить uj из V(i); 16. перенаправить все ребра, входящие в uj, в тек_вершина; 17. удалить uj из D } 18. ИНАЧЕ} {тек_вершина= uj; тек_ключ=key(uj)} 19. }

Пример 3.1. Рассмотрим пример применения алгоритма СОКРАЩЕНИЕ-УБДР, показанный на следующем рисунке.



Сокращенные УБДР

Рис. 3.5.  Применение алгоритма СОКРАЩЕНИЕ-УБДР

На исходной УБДР слева все вершины уже занумерованы. Стрелки разделяют УБДР, получаемые после очередных итераций основного цикла в строках 2 - 19. При первом исполнении цикла i=3, V(3) = {v3}. Для вершины v3 условие в строке 6 выполнено (w= v6), поэтому применяется правило сокращения и эта вершина удаляется, а ее входы направляются в v6. При следующем исполнении цикла i=2, V(2) = {v2, v4}. После цикла в строках 5 - 10 key(v2)= {5, 6} и key(v4)= {5, 6}. После сортировки u1=v2, u2 = v4. В цикле в строках 13-18 для u2 выполнено условие в строке 14. Поэтому применяется правило слияния и вершина v4 удаляется, а ее вход передаeтся вершине v2. При третьем исполнении цикла i=1, V(1) = {v1}. Для вершины v1 условие в строке 6 выполнено (w= v2), поэтому применяется правило сокращения и эта вершина удаляется.

Оказывается, что построенная алгоритмом УБДР является единственной и минимальной для заданного порядка.

Теорема 3.2.

  1. Алгоритм СОКРАЩЕНИЕ-УБДР строит сокращенную УБДР, эквивалентную исходной УБДР D.
  2. Эта сокращенная УБДР является при данном порядке переменных единственной (с точностью до изоморфизма) и минимальной.


Доказательство первого пункта непосредственно следует из выполнения критерия теоремы 3.1, так как к результирующей диаграмме никакое правило сокращения или слияния неприменимо.

Доказательство второго пункта основано на следующем индуктивном утверждении:

Лемма 3.1.

После выполнения i-ой итерации алгоритма в полученной диаграмме для каждой подфункции f(?1, ?2, …, ?_{i-1},xi, …, xn) (?k
Сокращенные УБДР
{0, 1} при k=1,2,…, i-1), существенно зависящей от xi, имеется ровно одна вершина - корень поддиаграммы, реализующей эту подфункцию.

Напомним, что функция f(x1, x2, …, xi, …, xn) существенно зависит от переменной xi, если существуют такие два набора значений аргументов (?1, …, ?i-1, 0, ?i+1,…, ?n) и (?1, …, ?i-1, 1, ?i+1,…, ?n), различающиеся только значением xi, на которых f принимает разные значения: f(?1, …, ?i-1, 0,?i+1, …, ?n)
Сокращенные УБДР
f(?1, …, ?i-1, 1,?i+1, …, ?n) .

Доказательство этой леммы и вывод из нее утверждения 2 теоремы 3.2 оставляем в качестве задач 3.2 и 3.3.



Задача 3.1. Докажите, что совершенная, сокращенная и минимальная ДНФ функции odd(X1,X2,…, Xn) совпадают и состоят из 2n-1 элементарных конъюнкций длины n.
Задача 3.2. Докажите лемму 3.2 возвратной индукцией по i.
Задача 3.3. Используя лемму 3.2, докажите утверждение 2 теоремы 3.2.
Задача 3.4. Постройте минимальные УБДР для двуместных функций: x
<title>(.*)</title>
y, x
<title>(.*)</title>
y, x + y, x
<title>(.*)</title>
y, x|y.
Задача 3.5. Постройте минимальные УБДР для функции
<title>(.*)</title>

относительно двух упорядочений переменных:
  • x1 < x2 < x3 < x4 < x5 < x6 и
  • x1 < x3 < x5 < x2 < x4 < x6.

Задача 3.6. Пороговая функция Tnk от n переменных с порогом k выдает 1, если во входном наборе имеется не менее k единиц: Tnk(x1,x2, …, xn) = 1
<title>(.*)</title>
x1 + x2 + … + xn
<title>(.*)</title>
k.
  • Постройте минимальные УБДР для пороговых функций T32, T42, T53.
  • Зависит ли сложность минимальной УБДР для пороговых функций от порядка переменных?
  • Оцените сложность минимальной УБДР для пороговой функции Tnk.

Задача 3.7. Выберите подходящий порядок переменных и постройте для него минимальные УБДР, реализующие функции из задач 12.5 и 12.6.
Задача 3.8. Как мы видели, логические схемы естественным образом реализуются в виде неветвящихся программ. Наоборот, для деревьев решений и УБДР естественным программным представлением являются ветвящиеся программы, включающие лишь условные операторы вида if ... then ... else ... с тестами вида "x = 0?" и "x = 1?" (они соответствуют внутренним вершинам диаграмм) и операторы присвоения значения 0 или 1 результату (они соответствуют вершинам-стокам).
Напишите ветвящиеся программы, вычисляющие функции, представляемые УБДР D2 на рис. 3.3 и Df на рис.3.6.

Введение в схемы, автоматы и алгоритмы

Детерминированные конечные автоматы (ДКА) и автоматные языки


Пусть ?={a1, …, am} - это алфавит, который состоит из конечного множества элементов, называемых символами (буквами).
Слово в алфавите ? - это конечная последовательность символов этого алфавита: w =w1… wn, wi
Детерминированные конечные автоматы (ДКА) и автоматные языки
? при i=1, …, n. Число букв в этой последовательности называется длиной слова и обозначается |w|. Имеется одно специальное "пустое" слово длины 0. Будем обозначать его через ?. На словах определена операция приписывания одного слова после другого, называемая конкатенацией: если слово w =w1… wn, а слово v =v1… vm, то их конкатенация w ? v - это слово w1… wnv1… vm длины n+m. Обычно знак конкатенации ? будем опускать и писать просто w v (по аналогии со знаком умножения в алгебре). Пустое слово - это единственное слово такое, что для любого слова w справедливо равенство w ?= ? w = w. Операция конкатенации ассоциативна: для любых трех слов w, v и u, очевидно, имеет место равенство: (w v)u = w(v u). Поэтому скобки при записи конкатенации нескольких слов будем опускать. Для представления нескольких конкатенаций одного и того же слова используют сокращенную "степенную форму" записи: w0 = ?, w1= w,…, wi+1 = wiw. Например, a3b4c2 - это сокращенная запись слова aaabbbbcc.
Языком в алфавите ? называется произвольное множество слов этого алфавита . Язык, включающий все слова в алфавите ? ( в том числе и пустое слово ?), будем обозначать через ?*.
Конечные автоматы часто используются для определения тех или иных свойств слов, т.е. для распознавания языков: автомат, распознающий некоторый язык L должен по произвольному слову w ответить на вопрос " w
Детерминированные конечные автоматы (ДКА) и автоматные языки
L? ". Для решения такой задачи функция выходов может быть заменена на проверку того, в какое состояние переходит автомат после получения входного слова w - "принимающее" или "отвергающее".
Определение 4.3. Детерминированный конечный автомат (ДКА) - распознаватель - это система вида
Детерминированные конечные автоматы (ДКА) и автоматные языки

включающая следующие компоненты:
  • ? ={a1, … , am} (m
    Детерминированные конечные автоматы (ДКА) и автоматные языки
    1) - конечное множество - входной алфавит;
  • Q={q0, … , qn-1} (n
    Детерминированные конечные автоматы (ДКА) и автоматные языки
    1) - конечное множество - алфавит внутренних состояний;
  • q0
    Детерминированные конечные автоматы (ДКА) и автоматные языки
    Q - начальное состояние автомата;
  • F
    Детерминированные конечные автоматы (ДКА) и автоматные языки
    Q - множество принимающих (допускающих, заключительных) состояний;
  • ?: Q ? ?
    Детерминированные конечные автоматы (ДКА) и автоматные языки
    Q - функция переходов,
  • ?(q, a) - это состояние, в которое переходит автомат из состояния q, когда получает на вход символ a.


Функцию ? называют программой автомата A и задают как список из m n команд вида qiaj
Детерминированные конечные автоматы (ДКА) и автоматные языки
?(qi,aj) .

Удобно также задавать функцию ? с помощью описанной выше таблицы размера n ? m, строки которой соответствуют состояниям из Q, а столбцы - символам из входного алфавита ?, и в которой на пересечении строки qi и столбца aj стоит состояние ?(qi,aj).

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

Определение 4.4.

Диаграмма ДКА A = - это ориентированный (мульти)граф DA=(Q, E) с помеченными ребрами, в котором выделена вершина-начальное состояние q0 из каждой вершины q
Детерминированные конечные автоматы (ДКА) и автоматные языки
Q выходит |?X| ребер, помеченных символами a
Детерминированные конечные автоматы (ДКА) и автоматные языки
? так, что для каждой q
Детерминированные конечные автоматы (ДКА) и автоматные языки
Q и каждого символа a
Детерминированные конечные автоматы (ДКА) и автоматные языки
? имеется единственное ребро из q в вершину q' =?(q,a) с меткой a .

Скажем, что представленный последовательностью ребер путь p=e1e2 … et в диаграмме несет слово w=w1w2 … wt, если wi - это метка ребра ei (1
Детерминированные конечные автоматы (ДКА) и автоматные языки
i
Детерминированные конечные автоматы (ДКА) и автоматные языки
t). Если q - начальная вершина (состояние) этого пути, а q' - его заключительная вершина, то будем говорить, что слово w переводит q в q'.

Работа конечного автомата-распознавателя состоит в чтении входного слова и изменению состояний в зависимости от его символов.

Определение 4.5. Назовем конфигурацией ДКА A = произвольную пару вида (q, w), в которой q
Детерминированные конечные автоматы (ДКА) и автоматные языки
Q и w
Детерминированные конечные автоматы (ДКА) и автоматные языки
?*.

На множестве конфигураций введем отношение перехода за один шаг
Детерминированные конечные автоматы (ДКА) и автоматные языки
:

Детерминированные конечные автоматы (ДКА) и автоматные языки


Если w=?, то положим для каждого q
Детерминированные конечные автоматы (ДКА) и автоматные языки
Q: (q, ?)
Детерминированные конечные автоматы (ДКА) и автоматные языки
(q, ?).

Через
Детерминированные конечные автоматы (ДКА) и автоматные языки
обозначим рефлексивное и транзитивное замыкание
Детерминированные конечные автоматы (ДКА) и автоматные языки
.

Содержательно,
Детерминированные конечные автоматы (ДКА) и автоматные языки
означает, что автомат A, начав работу в состоянии q на слове w=w1 … wl, через некоторое конечное число шагов 0
Детерминированные конечные автоматы (ДКА) и автоматные языки
k
Детерминированные конечные автоматы (ДКА) и автоматные языки
l прочтет первые k символов слова w и перейдет в состояние q', а w' =wk+1 … wl - это непрочтенный остаток слова w.

Определение 4.6.

ДКА A распознает (допускает, принимает) слово w, если для некоторого q
Детерминированные конечные автоматы (ДКА) и автоматные языки
F

Детерминированные конечные автоматы (ДКА) и автоматные языки
, т.е. после обработки слова w автомат переходит в принимающее состояние.

Язык LA, распознаваемый (допускаемый, принимаемый) автоматом A, состоит из всех слов, распознаваемых этим автоматом:



Детерминированные конечные автоматы (ДКА) и автоматные языки


Язык называется конечно автоматным, если он распознается некоторым ДКА.

Из этого определения, в частности, следует, что ?
Детерминированные конечные автоматы (ДКА) и автоматные языки
LA
Детерминированные конечные автоматы (ДКА) и автоматные языки
q0
Детерминированные конечные автоматы (ДКА) и автоматные языки
F. Один и тот же язык может распознаваться разными автоматами.

Определение 4.7.

Автоматы A и B называются эквивалентными, если совпадают распознаваемые ими языки, т.е. LA = LB.

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

Лемма 4.3. Автомат A распознает (допускает, принимает) слово w, если для некоторого q
Детерминированные конечные автоматы (ДКА) и автоматные языки
F в диаграмме DA имеется путь из q0 в q, который несет слово w, т.е. w переводит q0 в заключительное состояние q.

Доказательство можно провести индукцией по длине слова w (см. задачу 4.3).

Tаким образом, язык LA, распознаваемый автоматом A, состоит из всех слов, которые переводят в его диаграмме DA начальное состояние q0 в заключительные состояния из F.

Наша цель теперь состоит в изучении класса конечно автоматных языков.

Во многих случаях удается доказать, что язык L конечно автоматный, непосредственно построив распознающий его автомат. Для этого нужно постараться разбить множество всех входных слов на конечное число классов "однородных", "эквивалентных" слов, т.е. слов, получение которых на входе одинаково влияет на возможность их продолжения до слов распознавемого языка. Затем для каждого такого класса создать состояние автомата и определить переходы между этими состояниями. Часто полезно бывает выделить одно состояние для представления "ошибочных" слов, для которых ни они сами, ни любые их продолжения не входят в язык.


Недетерминированные конечные автоматы и их детерминизация


Недетерминированные конечные автоматы, рассматриваемые в этом параграфе, являются обобщениями детерминированных: они при чтении очередного символа на входе могут выбрать в качестве следующего одно из нескольких состояний, а кроме того, могут изменить состояние без чтения входа. Основной результат, который мы установим, утверждает, что это обощение не существенно: недетерминированные и детерминированные конечные автоматы распознают одни и те же языки.
Определение 4.8. Недетерминированный конечный автомат (НКА) - распознаватель - это система вида
Недетерминированные конечные автоматы и их детерминизация

включающая следующие компоненты:
  • ? ={a1, … , am} (m
    Недетерминированные конечные автоматы и их детерминизация
    1) - конечное множество - входной алфавит;
  • Q={q0, … , qn-1} (n
    Недетерминированные конечные автоматы и их детерминизация
    1) - конечное множество - алфавит внутренних состояний;
  • q0
    Недетерминированные конечные автоматы и их детерминизация
    Q - начальное состояние автомата;
  • F
    Недетерминированные конечные автоматы и их детерминизация
    Q - множество принимающих (допускающих, заключительных) состояний;
  • ?: Q ? (?
    Недетерминированные конечные автоматы и их детерминизация
    {?})
    Недетерминированные конечные автоматы и их детерминизация
    2Q - функция переходов.

Для a
Недетерминированные конечные автоматы и их детерминизация
? значение ?(q, a) - это множество состояний в каждое из которых может перейти автомат из состояния q, когда получает на вход символ a. ?(q, ?) - это множество состояний в каждое из которых может перейти автомат из состояния q без чтения символа на входе.
Как и для детерминированных автоматов, функцию переходов можно представить с помощью набора команд-программы: для каждой пары q
Недетерминированные конечные автоматы и их детерминизация
Q и a
Недетерминированные конечные автоматы и их детерминизация
? и каждого состояния q'
Недетерминированные конечные автоматы и их детерминизация
?(q, a) в программу помещается команда q a
Недетерминированные конечные автоматы и их детерминизация
q', и для каждого состояния q'
Недетерминированные конечные автоматы и их детерминизация
?(q, ?) в программу помещается команда q
Недетерминированные конечные автоматы и их детерминизация
q'. Отличие от детерминированного случая состоит в том, что для одной пары q
Недетерминированные конечные автоматы и их детерминизация
Q и a
Недетерминированные конечные автоматы и их детерминизация
? в программе может быть несколько команд вида q a
Недетерминированные конечные автоматы и их детерминизация
q' или не быть ни одной такой команды. Кроме того, могут появиться ?-команды (пустые переходы) вида q
Недетерминированные конечные автоматы и их детерминизация
q', означающие возможность непосредственного перехода из q в q' без чтения символа на входе.
При табличном задании функции ? в таблице появляется (m+1)-ый столбец, соответствующий пустому символу ? и на пересечении строки q и столбца a
Недетерминированные конечные автоматы и их детерминизация
(?
Недетерминированные конечные автоматы и их детерминизация
{?}) стоит множество состояний ?(q,a).
Для недетерминированного автомата M = в диаграмме DM=(Q, E) с выделенной начальной вершиной q0 и множеством заключительных вершин F ребра взаимно-однозначно соответствуют командам: команде вида q a
Недетерминированные конечные автоматы и их детерминизация
q' (a
Недетерминированные конечные автоматы и их детерминизация
?) соответствует ребро (q,q'), с меткой a , а команде вида q
Недетерминированные конечные автоматы и их детерминизация
q' соответствует ребро (q,q'), с меткой ?.

Скажем, что заданный последовательностью ребер путь p=e1e2 … eT в диаграмме DM несет слово w=w1w2 … wt (t
Недетерминированные конечные автоматы и их детерминизация
T), если после удаления из него "пустых" ребер (т.е. ребер с метками ?) остается последовательность из t ребер
Недетерминированные конечные автоматы и их детерминизация
, метки которых образуют слово w , т.е. wi - это метка ребра
Недетерминированные конечные автоматы и их детерминизация
. Очевидно, это эквивалентно тому, что последовательность меток на ребрах пути p имеет вид
Недетерминированные конечные автоматы и их детерминизация
, где kj
Недетерминированные конечные автоматы и их детерминизация
0 (j=1,2, … , t+1) и
Недетерминированные конечные автоматы и их детерминизация
.

Слово w переводит q в q' в диаграмме DM, если в ней имеется путь из q в q' который несет w .

На недетерминированные автоматы естественным образом переносится определение конфигураций и отношения перехода между ними.

Определение 4.9. Назовем конфигурацией НКА M = произвольную пару вида (q, w), в которой q
Недетерминированные конечные автоматы и их детерминизация
Q и w
Недетерминированные конечные автоматы и их детерминизация
?*. Определим отношение
Недетерминированные конечные автоматы и их детерминизация
перехода из одной конфигурации в другую за один шаг:

Недетерминированные конечные автоматы и их детерминизация


или

Недетерминированные конечные автоматы и их детерминизация


Как и для ДКА, через
Недетерминированные конечные автоматы и их детерминизация
обозначим рефлексивное и транзитивное замыкание отношения
Недетерминированные конечные автоматы и их детерминизация
.

Внешне определение распознавания слов НКА совпадает с определением для ДКА.

Определение 4.10. НКА M распознает (допускает, принимает) слово w, если для некоторого
Недетерминированные конечные автоматы и их детерминизация
\
Недетерминированные конечные автоматы и их детерминизация
.

Язык LM, распознаваемый НКА M, состоит из всех слов, распознаваемых автоматом:

Недетерминированные конечные автоматы и их детерминизация


Отличие состоит в том, что у НКА может быть несколько различных способов работы (путей вычисления) на одном и том же входном слове w. Считаем, что НКА распознает (допускает, принимает) это слово, если хотя бы один из этих способов приводит в заключительное состояние из F.

Из определения диаграммы DM непосредственно следует, что НКА M распознает слово w, тогда и только тогда, когда существует такое заключительное состояние q
Недетерминированные конечные автоматы и их детерминизация
F, что в диаграмме DM слово w переводит q0 в q. Иными словами, в DM имеется путь из q0 в q, на ребрах которого написано слово w (с точностью до меток ?).

Пример 4.1. Рассмотрим НКА N1 = < {a, b}, {0,1,2,3, 4}, 0, {3}, ?>, где

?:Q\?Xab?
0{0,1}{0}
Недетерминированные конечные автоматы и их детерминизация
1
Недетерминированные конечные автоматы и их детерминизация
Недетерминированные конечные автоматы и их детерминизация
{4}
2{3}
Недетерминированные конечные автоматы и их детерминизация
Недетерминированные конечные автоматы и их детерминизация
3
Недетерминированные конечные автоматы и их детерминизация
Недетерминированные конечные автоматы и их детерминизация
{1}
4
Недетерминированные конечные автоматы и их детерминизация
{2}
Недетерминированные конечные автоматы и их детерминизация
Его диаграмма
Недетерминированные конечные автоматы и их детерминизация
представлена ниже на рис. 4.3.

Недетерминированные конечные автоматы и их детерминизация

Рис. 4.3.  Диаграмма автомата N1

Рассмотрим работу этого автомата на слове ababa:



Недетерминированные конечные автоматы и их детерминизация


Так как 3 - заключительное состояние, то ababa
Недетерминированные конечные автоматы и их детерминизация
LN1. Заметим, что у автомата N1 имеются и другие способы работы на этом слове, не ведущие к заключительному состоянию. Например, он может после чтения каждого символа оставаться в состоянии 0. Но чтобы слово допускалось, достаточно существовать хотя бы одному "хорошему" способу.

Очевидно, что детерминированные конечные автоматы являются частными случаями недетерминированных. Естественно спросить, распознают ли недетерминированные конечные автоматы больший класс языков чем детерминированные? Следующая теорема показывает, что классы языков, распознаваемых НКА и ДКА совпадают.

Теорема 4.2. (Детерминизация НКА)

Для каждого НКА M можно эффективно построить такой ДКА A, что LA = LM.

Доказательство Пусть M= - НКА. Процедура построения по нему эквивалентного ДКА состоит из двух этапов: на первом по M строится эквивалентный ему НКА M1, в программе которого отсутствуют переходы по ?, а на втором этапе по M1 строится эквивалентный ДКА A.


Переработка информации с помощью конечных автоматов


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

Автомат
На такие устройства в последовательные дискретные моменты времени 1,2, …, t, t+1,… поступают входные сигналы x(1),x(2), …, x(t),x(t+1),… и в ответ на них автомат A вырабатывает выходные сигналы y(1) y(2), …, y(t), y(t+1),…. Конечные автоматы характеризуются двумя особенностями.
  1. Отсутствие предвосхищения: выходной сигнал y(t), выдаваемый автоматом в момент t, зависит лишь от полученных к этому времени входов x(1),x(2), …, x(t), т.е. автомат не может предвосхитить будущие входы и заранее на них отреагировать. Таким образом, имеется некоторая функция выходов
    Переработка информации с помощью конечных автоматов
    (x(1),x(2), …, x(t))= y(t), определяющая очередной выход по предшествующему входу.
  2. Конечная память: в каждый момент t информация в автомате о полученном к этому моменту входе x(1),x(2), …, x(t) конечна. Это свойство удобно интерпретировать следующим образом: автомат имеет конечное множество состояний Q и в каждый момент находится в одном из этих состояний. При получении очередного входа состояние может измениться. Таким образом, состояние q
    Переработка информации с помощью конечных автоматов
    Q, в котором находится автомат после получения входной последовательности x(1),x(2), …, x(t), и представляет информацию об этой последовательности, используемую в дальнейшей работе автомата при определении следующего состояния и выхода.

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

включающая следующие компоненты:
  • ?X={a1, … , am} (m
    Переработка информации с помощью конечных автоматов
    1) - конечное множество - входной алфавит;
  • ?Y={b1, … , br} (r
    Переработка информации с помощью конечных автоматов
    1) - конечное множество - выходной алфавит;
  • Q={q0, … , qn-1} (n
    Переработка информации с помощью конечных автоматов
    1) - конечное множество - алфавит внутренних состояний;
  • q0
    Переработка информации с помощью конечных автоматов
    Q - начальное состояние автомата;
  • ?: Q ? ?X
    Переработка информации с помощью конечных автоматов
    Q - функция переходов, ?(q, a) - это состояние, в которое переходит автомат из состояния q, когда получает на вход символ a;
  • Переработка информации с помощью конечных автоматов
    : Q ? ?X
    Переработка информации с помощью конечных автоматов
    ?Y - функция выходов,
    Переработка информации с помощью конечных автоматов
    (q, a) - это символ из ?Y, который выдает на выход автомат в состоянии q, когда получает на вход символ a.


Иногда пару функций ?,
Переработка информации с помощью конечных автоматов
называют программой автомата A и задают как список из m n команд вида qiaj
Переработка информации с помощью конечных автоматов
?(qi,aj) /
Переработка информации с помощью конечных автоматов
(qi,aj).

Другой удобный способ задания функций ? и
Переработка информации с помощью конечных автоматов
- табличный. Каждая из них определяется таблицей (матрицей) размера n ? m, строки которой соответствуют состояниям из Q, а столбцы - символам из входного алфавита ?X. В первой из них на пересечении строки qi и столбца aj стоит состояние ?(qi,aj), а во второй - выходной символ
Переработка информации с помощью конечных автоматов
(qi,aj).

Еще один способ представления конечного автомата основан на использовании ориентированных размеченных графов.

Определение 4.2. Диаграмма автомата A = Переработка информации с помощью конечных автоматов
> - это ориентированный (мульти) граф DA=(Q, E) с помеченными ребрами, в котором выделена вершина-начальное состояние q0 и из каждой вершины q
Переработка информации с помощью конечных автоматов
Q выходит |?X| ребер, помеченных парами символов a / b (a
Переработка информации с помощью конечных автоматов
?X, b
Переработка информации с помощью конечных автоматов
?Y). Таким образом, для каждой q
Переработка информации с помощью конечных автоматов
Q и каждого символа a
Переработка информации с помощью конечных автоматов
?X имеется единственное ребро с меткой a /
Переработка информации с помощью конечных автоматов
(q,a) из q в вершину q' =?(q,a).

Как автомат A перерабатывает входное слово x1x2 … xt? Он начинает работу в состоянии q(0)=q0. Затем, получив (прочитав) входной символ x1, переходит в состояние q(1)= ?(q0,x1) и выдает символ y(1)=
Переработка информации с помощью конечных автоматов
(q0,x1). Далее, получив x2 A переходит в состояние q(2)= ?(q(1),x2) и выдает символ y(2)=
Переработка информации с помощью конечных автоматов
(q(1),x2) и т.д. Таким образом, работа автомата, характеризуется последовательностью проходимых им состояний q(0), q(1), … , q(t), … и последовательностью выходных символов y(1), … , y(t), … . Они определяются следующими реккурентными соотношениями:

Переработка информации с помощью конечных автоматов


Рассмотрим несколько примеров автоматов-преобразователей.

Пример 4.1. Сумматор последовательного действия

Мы уже строили схему из функциональных элементов SUMn, реализующую для фиксированного n суммирование двух n-разрядных двоичных чисел. Построим теперь конечный автомат SUM, который сможет складывать два двоичных числа произвольной разрядности. На вход этого автомата будут последовательно подаваться пары x(i)= (x1(i),x2(i)) соответствующих i-ых (1
Переработка информации с помощью конечных автоматов
i
Переработка информации с помощью конечных автоматов
r) разрядов двух двоичных чисел x1=x1(r) … x1(2) x1(1) и x2=x2(r) … x2(2) x2(1), а признаком завершения чисел будет служить символ x(r+1)= * (если одно из слагаемых короче другого, то будем считать, что недостающие разряды - нули).


Выходом автомата должна быть последовательность (r+1) двоичных разрядов суммы y = x1 + x2:

Переработка информации с помощью конечных автоматов


Таким образом, входной алфавит автомата: ?X ={ (00), (01), (10), (11), *}, а выходной алфавит: ?Y={ 0, 1}. Что нужно знать автомату SUM о первых i разрядах x1 и x2, чтобы получив их (i+1)-ые разряды (x1(i+1),x2(i+1)), верно определить выход y(i+1)? Ясно, что для этого достаточно знать, был ли перенос в i-ый разряд. Поэтому можно зафиксировать множество состояний Q = {q0, q1}, в котором q0 означает, что переноса не было, а q1 - что перенос был. Теперь легко построить таблицы, представляющие функции переходов и выходов автомата SUM.

?:Q\?X

(00)(01)(10)(11)*?:Q\?X(00)(01)(10)(11)*
q0q0q0q0q1q0
q1q0q1q1q1q0
q001100
q110011
Заметим, что после получения символа * автомат SUM переходит в начальное состояние q0 и готов выполнять сложение следующей пары чисел.

Переработка информации с помощью конечных автоматов

Рис. 4.1.  Диаграмма автомата SUM

На диаграмме автомата у вершины q0 четыре петли, а у вершины q1 - три, объединены в одну с четырьмя и тремя метками, соответственно. Точно так же слиты два ребра из q1 в q0. Стрелкой указано начальное состояние.


Произведение автоматов


Рассмотрим одну важную конструкцию конечного автомата по двум другим, называемую произведением автоматов, которая позволит установить замкнутость класса конечно автоматных языков относительно теоретико множественных операций.
Пусть M1 = и M2 = - два конечных автомата с общим входным алфавитом ?, распознающих языки L1 и L2, соответственно. Определим по ним автомат M= , называемый произведением M1 и M2 (M= M1 ? M2), следующим образом. Q= Q1 ? Q2 ={ (q, p) | q
Произведение автоматов
Q1, p
Произведение автоматов
Q2}, т.е. состояния нового автомата - это пары, первый элемент которых - состояние первого автомата, а второй - состояние второго автомата. Для каждой такой пары (q,p) и входного символа a
Произведение автоматов
? определим функцию переходов: ?((q,p), a) = (?1(q,a), ?2(p,a)). Начальным состоянием M является пара q0= (q01, q02), состоящая из начальных состояний автоматов-множителей. Что касается множества заключительных состояний, то оно определяется в зависимости от операции над языками L1 и L2, которую должен реализовать M.
Теорема 4.1.

Доказательство этой теоремы непосредственно выводится из следующего утверждения.
Лемма 4.2. Для любых двух состояний (q,p) и (q', p') автомата M и любого входного слова w слово w переводит (q,p) в (q', p') в автомате M тогда и только тогда, когда оно переводит q в q' в автомате M1 и p в p' в автомате M2.
Лемма устанавливается индукцией по длине слова w.
Следствие4.1.1. Класс конечно автоматных языков замкнут относительно теоретико множественных операций объединения, пересечения и разности.


Автомат по продаже кофе имеет


Задача 4.1. Автомат по продаже кофе имеет щель для получения монет, кнопку, нажатие которой после уплаты достаточной суммы приводит к получению кофе, и накопитель, через который он выдает сдачу покупателю. Автомат принимает монеты достоинством в 1, 2 и 5 рублей. Чашка кофе стоит 8 руб. Пока полученная сумма недостаточна, горит красная лампочка. Если сумма, полученная автоматом,
Автомат по продаже кофе имеет
8, то зажигается зеленая лампочка и после нажатия кнопки автомат наливает кофе и, если требуется, дает сдачу. Если автомат получает монету, когда горит зеленая лампочка, то он немедленно ее возвращает. Определите входной и выходной алфавиты конечного автомата, управляющего продажей кофе, и постройте его функции переходов и выходов.
Задача 4.2. Электронные часы имеют табло с указанием часов, минут и секунд и две управляющие кнопки. Одна кнопка переводит часы из нормального режима в режим настройки времени - вначале в настройку часов, затем - минут, затем - секунд, а затем возвращает в нормальный режим. Другая кнопка в нормальном режиме ничего не меняет, а в режиме настройки нажатие на нее увеличивает на единицу число настраеваемых часов, минут или секунд. Постройте автомат, который принимает на вход сигналы нажатия от двух кнопок, а на выходе выдает сигналы изменения режима и увеличения соответствующего числа.
Задача 4.3. Докажите лемму 4.1 индукцией по длине входного слова.
Задача 4.4. Постройте детерминированные конечные автоматы, которые распознают следующие языки в алфавите ?={a, b}:

Задача 4.5. Выше в примере 4.1 был построен автомат с выходом, выполняющий сложение двух двоичных чисел. Постройте автомат-распознаватель, который проверяет правильность сложения. На вход поступают последовательности троек нулей и единиц:
Автомат по продаже кофе имеет

Автомат должен допустить такую последовательность, если y = y(n) … y(2)y(1) - это первые n битов суммы двоичных чисел x1= x1(n)… x1(2)x1(1) и x2 = x2(n)… x2(2)x2(1).


Задача 4.7. Докажите лемму 4.2.
Задача 4.8. Докажите, что приведенный на рис. 4.5 автомат A распознает язык, состоящий из всех слов, заканчивающихся на 'aba'.
Задача 4.9. Используя процедуру детерминизации недетерминированных автоматов из теоремы 4.2, постройте ДКА, эквивалентный заданному НКА M.


Введение в схемы, автоматы и алгоритмы


Введение в схемы, автоматы и алгоритмы

Примеры неавтоматных языков


Рассмотрим несколько примеров применения теоремы о разрастании.
Пример 6.4. Покажем, что язык L1 ={ w =0i 1i | i
Примеры неавтоматных языков
1 } не является автоматным.
Предположим, что он автоматный. Тогда для него имеется n из утверждения теоремы 6.3. Рассмотрим следующее ("специальное" !) слово w = 0n 1n. Очевидно, что w
Примеры неавтоматных языков
L1. Предположим, что существует разбиение w = xyz, удовлетворяющего условиям (1) и (2) теоремы. Так как по условию (2) |xy|
Примеры неавтоматных языков
n, то y = 0i для некоторого i>0. Но тогда слово w0 = xz= 0n-i1n
Примеры неавтоматных языков
L1, что противоречит условию (3) теоремы. Следовательно язык L1 не автоматный.
Пример 6.5. Покажем, что язык СКОБ правильных скобочных последовательностей в алфавите { (, ) } не является автоматным.
Схема доказательства та же. В качестве специального слова выберем слово w = (n )n, оно, очевидно, принадлежит СКОБ. Тогда для всякого разбиения w = xyz такого, что |xy|
Примеры неавтоматных языков
n слово y = (i для некоторого i>0. И, как и в предыдущем примере, слово w0 = xz= (n-i)n
Примеры неавтоматных языков
СКОБ, что противоречит условию (3) теоремы. Следовательно, язык СКОБ не автоматный.
Пример 6.6.
Покажем, что язык L2 ={ w =0i 1j | i
Примеры неавтоматных языков
2j+1 } не является автоматным.
Здесь, предположив, что L2 автоматный язык и зафиксировав константу n из теоремы 6.3, рассмотрим слово w = 0{2n+1}1n
Примеры неавтоматных языков
L2. Для всякого разбиения w = xyz такого, что |xy|
Примеры неавтоматных языков
n слово y = 0i для некоторого i>0. Рассмотрим слово w2 = x y2 z = 0{2n+1+i}1n. Но
Примеры неавтоматных языков
. Следовательно, w2
Примеры неавтоматных языков
L2 и язык L2 не является автоматным.
Пример 6.7. Рассмотрим язык "квадратов" в унарном алфавите { | }:
Примеры неавтоматных языков

Здесь, предположив, что L3 автоматный язык и зафиксировав константу n из теоремы 6.3, рассмотрим слово w = |{n2}. Для всякого разбиения w = xyz такого, что |xy|
Примеры неавтоматных языков
n слово y = |i для некоторого 0 < i
Примеры неавтоматных языков
n. Тогда
Примеры неавтоматных языков
. Но n2 - i
Примеры неавтоматных языков
n2 -n > n2 -2n +1 =(n-1)2. Следовательно, n2 - i не является полным квадратом и w0
Примеры неавтоматных языков
L3, т.е. язык "квадратов" L3 не является автоматным.
Пример 6.8.
Рассмотрим язык "простых чисел" в унарном алфавите { | }:
Примеры неавтоматных языков

Предположим, что Lpr - автоматный язык и зафиксируем для него константу n из теоремы 6.3.
Выберем простое число p > n и рассмотрим слово w = |p. Пусть w = xyz - произвольное разбиение w такое, что |xy|
Примеры неавтоматных языков
n. Тогда для некоторого 0 < i
Примеры неавтоматных языков
n слово y = |i и xz = |p -i. Положим k = p - i и рассмотрим слово wk = x yk z. Его длина p' равна |x| +k|y| + |z|= (p-i)(i+1). Так как 1
Примеры неавтоматных языков
i < n+1
Примеры неавтоматных языков
p, то p' - составное число и wk
Примеры неавтоматных языков
Lpr. Следовательно, Lpr - не автоматный язык. Заметим, что в этом примере k выбирается для каждого n по-своему.
Еще один прием доказательства неавтоматности языка L состоит в том, чтобы вместо L рассмотреть некоторый язык L' = op(L,L1,… , Lk), полученный из L и автоматных языков L1,… , Lk
с помощью операций op, сохраняющих автоматность. Если доказать, что L' не является автоматным, то и исходный язык L не автоматен.
Пример 6.9. Рассмотрим язык L4 ={ 0i 1j | i
Примеры неавтоматных языков
j }.
Пусть L5= {0i1j | i
Примеры неавтоматных языков
1, j
Примеры неавтоматных языков
1}. Очевидно, что язык L5 автоматный. Нетрудно заметить, что его пересечение с дополнением L4 совпадает с языком L1
из примера 6.4, т.е. L1 = L5
Примеры неавтоматных языков
overline{L4}. Так как мы установили, что L1 не автоматный, то и L4 не является автоматным.
Являются ли условия теоремы 6.3 достаточными для того, чтобы язык оказался автоматным? Следующий пример показывает, что ответ на этот вопрос отрицателен.
Пример 6.10.Пусть L6 ={cr ai bi | r
Примеры неавтоматных языков
1 , i
Примеры неавтоматных языков
0 }, L7= { aibj | i
Примеры неавтоматных языков
0, j
Примеры неавтоматных языков
0}. Рассмотрим язык L8 = L6
Примеры неавтоматных языков
L7.
Для этого языка можно в качестве n выбрать 1. Каждое слово w из L8 принадлежит L6 или L7. Если слово w= cr ai bi
Примеры неавтоматных языков
L6 , то оно представимо в виде xyz, где x=?, y=c, z= cr-1 ai bi ( r
Примеры неавтоматных языков
1, i
Примеры неавтоматных языков
0 ). Тогда w0 = z= cr-1 ai bi ( r
Примеры неавтоматных языков
1, i
Примеры неавтоматных языков
1 ) и при r=1 слово w0 = ai bi
Примеры неавтоматных языков
L7, а при r > 1, очевидно, w0
Примеры неавтоматных языков
L6. При k
Примеры неавтоматных языков
1 имеем wk =cr+k-1 ai bi
Примеры неавтоматных языков
L6. Если слово w= ai bj
Примеры неавтоматных языков
L7 и i
Примеры неавтоматных языков
1, то его можно представить как в виде xyz, где x=?, y=a, z= ai-1 bj ( i
Примеры неавтоматных языков
1, j
Примеры неавтоматных языков
0 ) и для каждого k
Примеры неавтоматных языков
0 wk = aka i-1 bj
Примеры неавтоматных языков
L7. Если же i =0, то w= bj ( j
Примеры неавтоматных языков
1 ) и его можно разбить на части x=?, y=b, z= bj-1 ( j
Примеры неавтоматных языков
1 ). И в этом случае для каждого k
Примеры неавтоматных языков
0 wk =bk bj-1
Примеры неавтоматных языков
L7. Во всех случаях wk
Примеры неавтоматных языков
L8 и, следовательно язык L8 удовлетворяет условиям теоремы 6.3.


Но этот язык не автоматный. Действительно, пусть
Примеры неавтоматных языков
: {a, b, c}*
Примеры неавтоматных языков
{0, 1 }* - это гомоморфизм, заданный как
Примеры неавтоматных языков
(a)=0,
Примеры неавтоматных языков
(b) = 1,
Примеры неавтоматных языков
(c) =?. Тогда
Примеры неавтоматных языков
(L8 \ L7) =
Примеры неавтоматных языков
(L6) = L1 из примера 6.4. Так как язык L7 является автоматным, а L1 - нет, то и язык L8 не является автоматным.

Теорема о разрастании для автоматных языков


До сих пор мы встречались лишь с автоматными языками и накопили достаточно много средств для доказательства того, что некоторый язык является автоматным. Для этого, например, достаточно построить для него регулярное выражение или получить его с помощью различных рассмотренных выше операций из заведомо автоматных языков. В этом разделе мы установим некоторое необходимое условие, которому удовлетворяют все автоматные языки. После этого, проверив, что некоторый язык этому условию не удовлетворяет, можно заключить, что он не является автоматным.
Теорема 6.3. (о разрастании для автоматных языков)
Пусть L - бесконечный автоматный язык. Тогда существует такая константа n, что любое слово w
Теорема о разрастании для автоматных языков
L длины |w| > n можно разбить на три части x, y и z так, что w = xyz и
  1. |xy|
    Теорема о разрастании для автоматных языков
    n;
  2. |y| > 0;
  3. для любого m
    Теорема о разрастании для автоматных языков
    0 слово wm = x ym z принадлежит языку L.

(Здесь y0= ?, y1=y, yi+1 = yiy).
Доказательство Так как язык L автоматный, то существует ДКА A=, распознающий L. Пусть |Q|= n и слово w=w1w2 … wk
Теорема о разрастании для автоматных языков
L имеет длину k > n. Рассмотрим путь
Теорема о разрастании для автоматных языков

в диаграмме A, который несет слово w. Очевидно, что среди первых (n+1) состояний этого пути хотя бы одно встречается дважды. Выберем первое из таких состояний q
Теорема о разрастании для автоматных языков
Q. Тогда для некоторой пары чисел l < j
Теорема о разрастании для автоматных языков
n имеем
Теорема о разрастании для автоматных языков
. Пусть x=w1w2 … wl - это префикс w, который переводит q0 в
Теорема о разрастании для автоматных языков
,
Теорема о разрастании для автоматных языков
- это подслово w, которое переводит
Теорема о разрастании для автоматных языков
в
Теорема о разрастании для автоматных языков
, и
Теорема о разрастании для автоматных языков
- это суффикс w, который переводит
Теорема о разрастании для автоматных языков
в
Теорема о разрастании для автоматных языков
. x и z могут быть пусты, но |y| = j-l
Теорема о разрастании для автоматных языков
1. Длина |xy| = j
Теорема о разрастании для автоматных языков
n. Таким образом, условия (1) и (2) теоремы выполнены. Нетрудно убедиться и в выполнении условия (3). Действительно, выбросив из пути p цикл
Теорема о разрастании для автоматных языков
получим путь p0 из q0 в
Теорема о разрастании для автоматных языков
, который несет слово xz, а повторив этот цикл m раз, получим путь p0 из q0 в q{ik}
Теорема о разрастании для автоматных языков
F, который несет слово xym z. Следовательно, для любого m
Теорема о разрастании для автоматных языков
0 wm = x ym z
Теорема о разрастании для автоматных языков
L.
Содержательно, эта теорема утверждает, что у всякого достаточно длинного слова из автоматного языка имеется непустое подслово, которое можно вырезать или повторить сколько угодно раз, оставаясь внутри языка. Как, используя теорему ref{th-razr}, доказать, что некоторый язык L не является автоматным? Это можно сделать, используя схему доказательства "от противного":

  1. Предположим, что L автоматный язык. Тогда для него имеется константа n из утверждения теоремы ref{th-razr}.
  2. Определим по n некотрое "специальное" слово w из L длины > n и докажем, что для любого разбиения w = xyz, удовлетворяющего условиям (1) и (2) теоремы, найдется такое k
    Теорема о разрастании для автоматных языков
    0, что слово wk=xyk z не принадлежит L.
  3. На основании полученного противоречия делаем вывод, что L - не автоматный язык.


Разумеется, в этой схеме самым сложным является выбор "специального" слова w в пункте (2). Что касается, подбора такого k
Теорема о разрастании для автоматных языков
0, для которого wk
Теорема о разрастании для автоматных языков
L, то, как правило, достаточно рассмотреть k = 0 или k = 2.


Примените процедуру детерминизации из теоремы


Задача 6.1. Примените процедуру детерминизации из теоремы 4.2 и постройте ДКА, эквивалентный построенному выше в примере 6.2 НКА M.
Задача 6.2. Цилиндрификация - это операция, которая обратна проекции. Для любых алфавитов ? и ? таких, что ?
Примените процедуру детерминизации из теоремы
?, и любого языка L в алфавите ? определим его цилиндрификацию как язык CYL?(L) = {w
Примените процедуру детерминизации из теоремы
?* | при вычеркивании из w всех букв, не входящих в ?, получается слово u
Примените процедуру детерминизации из теоремы
L).
Показать, что для автоматного языка L язык CYL?(L) также является автоматным языком. Предложите процедуру перестройки автомата, распознающего L , в автомат, распознающий CYL?(L).
Задача 6.3.
Обращением слова w=w1w2 … wk (wi
Примените процедуру детерминизации из теоремы
?, i=1, … , k) называется слово w{-1}= wk … w2 w1. Показать, что для автоматного языка L его обращение - язык L{-1} ={ w{-1} | w
Примените процедуру детерминизации из теоремы
L} также является автоматным языком.
Задача 6.4.
Пусть L - автоматный язык в алфавите ?. Доказать, что автоматными являются и следующие языки:
  1. ПРЕФ(L) = {w | существует такое слово x
    Примените процедуру детерминизации из теоремы
    ?*, что wx
    Примените процедуру детерминизации из теоремы
    L}.
  2. СУФ(L) = {w | существует такое слово x
    Примените процедуру детерминизации из теоремы
    ?*, что xw
    Примените процедуру детерминизации из теоремы
    L}.
  3. КОР(L) = {w | существуют такие слова x, y
    Примените процедуру детерминизации из теоремы
    ?*, что xwy
    Примените процедуру детерминизации из теоремы
    L}.
  4. MAX(L) = {w | w
    Примените процедуру детерминизации из теоремы
    L и для всякого непустого x слово wx
    Примените процедуру детерминизации из теоремы
    L}.

Задача 6.5. Пусть L - автоматный язык в алфавите ?={a1,…, am}, а L1,…, Lm - это автоматные языки в алфавите ?. Доказать, что автоматным является и язык ЗАМ(L), полученный из слов L заменой каждой буквы ai на некоторое слово из Li, т.е. ЗАМ(L) = {w | textit{ существует такое слово }u=a{i1}a{i2}… a{in}
Примените процедуру детерминизации из теоремы
L и такие слова w1,w2,…, wn
Примените процедуру детерминизации из теоремы
?*, что w=w1w2… wn и wj
Примените процедуру детерминизации из теоремы
L{ij} для всех j=1,2,… n }.
Задача 6.6. Пусть L - автоматный язык в алфавите ?, k - целое положительное число и
Примените процедуру детерминизации из теоремы
- отображение ?k в ?. Доказать, что автоматным является язык L1 ={
Примените процедуру детерминизации из теоремы
(a1a2… ak) …
Примените процедуру детерминизации из теоремы
(a{(n-1)k+1}a(n-1)k+2 … ank) | a1a2… ank
Примените процедуру детерминизации из теоремы
L}.
Задача 6.7. Докажите, что теорема 6.3 о разрастании остается справедливой и при замене условия 1) |xy|
Примените процедуру детерминизации из теоремы
n на условие 1') |yz|
Примените процедуру детерминизации из теоремы
n, т.е. повторяющееся подслово y имеется и в суффиксе w длины
Примените процедуру детерминизации из теоремы
n.
Задача 6.8. Доказать, что следующие языки в алфавите ? ={a, b, c} не являются автоматными.

Задача 6.9. ?-выражение - это либо переменная x, или символ ?, за которым следует переменная, а далее либо ?-выражение, либо левая скобка, ?-выражение, еще одно ?-выражение и правая скобка. Например, ? x x, ? x(x x), ? x ? x (? x(x x) ? x(x x)) - это правильные ?-выражения, а (x x), ? x(? x) и ? x((x x) - неправильные. Докажите, что язык ?-выражений в алфавите { x, ?, (, ) } не является автоматным.
Задача 6.10. Выше в задаче строился автомат-распознаватель, который проверял правильность сложения двоичных чисел. Докажите, что для операции умножения двоичных чисел такого автомата не существует, т.е. что язык в алфавите троек битов U = {(x1(1),x2(1),y(1)) (x1(2),x2(2),y(2)) … (x1(n),x2(n),y(n)) | y = y(n) … y(2)y(1) - это первые n битов произведения двоичных чисел x1= x1(n)… x1(2)x1(1) и x2 = x2(n)… x2(2)x2(1)} не является автоматным.
Задача 6.11.
Доказать, что язык L = { w | число букв a в w
Примените процедуру детерминизации из теоремы
число букв b в w } в алфавите ? ={a, b} не является автоматным.

Замкнутость относительно гомоморфизмов и их обращений


Обратимся снова к свойствам замкнутости класса автоматных языков. Как мы уже установили с помощью конструкции произведения автоматов, этот класс замкнут относительно объединения, пересечения и разности (см. следствие 4.1.1). Из теоремы 5.1 непосредственно следует, что класс автоматных языков замкнут относительно операций конкатенации и итерации. Можно легко установить, что он также замкнут относительно дополнения.
Предложение 6.1. Пусть L - автоматный язык в алфавите ?. Тогда его дополнение - язык
Замкнутость относительно гомоморфизмов и их обращений
также является автоматным.
Действительно, достаточно заметить, что язык ?*, включающий все слова в алфавите ? является автоматным и что
Замкнутость относительно гомоморфизмов и их обращений
.
Определенная ниже операция гомоморфизма формализует идею посимвольного перевода слов одного алфавита в слова другого.
Определение 6.1. Пусть ? и Delta - два алфавита. Отображение
Замкнутость относительно гомоморфизмов и их обращений
: ?*
Замкнутость относительно гомоморфизмов и их обращений
Delta* слов первого из них в слова второго называется гомоморфизмом, если
  1. Замкнутость относительно гомоморфизмов и их обращений
    (?) = ?;
  2. для любых двух слов w1 и w2 в алфавите ? имеет место равенство
    Замкнутость относительно гомоморфизмов и их обращений
    (w1w2) =
    Замкнутость относительно гомоморфизмов и их обращений
    (w1)
    Замкнутость относительно гомоморфизмов и их обращений
    (w2).

Из этого определения непосредственно следует, что гомоморфизм однозначно определяется своими значениями на символах алфавита ?. Если w=w1w2 … wn, wi
Замкнутость относительно гомоморфизмов и их обращений
? (1
Замкнутость относительно гомоморфизмов и их обращений
i
Замкнутость относительно гомоморфизмов и их обращений
n), то
Замкнутость относительно гомоморфизмов и их обращений
(w) =
Замкнутость относительно гомоморфизмов и их обращений
(w1)
Замкнутость относительно гомоморфизмов и их обращений
(w2) …
Замкнутость относительно гомоморфизмов и их обращений
(wn).
Пример 6.1.Пусть ? ={a, b, c}, Delta ={ 0, 1}, а гомоморфизм
Замкнутость относительно гомоморфизмов и их обращений
определен на символах ? следующим образом:
Замкнутость относительно гомоморфизмов и их обращений
(a) =00,
Замкнутость относительно гомоморфизмов и их обращений
(b) =?,
Замкнутость относительно гомоморфизмов и их обращений
(c) =101.
Тогда
Замкнутость относительно гомоморфизмов и их обращений
(aca) = 0010100,
Замкнутость относительно гомоморфизмов и их обращений
(abcb) =00101,
Замкнутость относительно гомоморфизмов и их обращений
(bbb) = ?.
Определение 6.2.
Пусть
Замкнутость относительно гомоморфизмов и их обращений
: ?*
Замкнутость относительно гомоморфизмов и их обращений
Delta* - произвольный гомоморфизм и L - язык в алфавите ?. Образом
Замкнутость относительно гомоморфизмов и их обращений
(L) языка L при гомоморфизме
Замкнутость относительно гомоморфизмов и их обращений
называется язык
Замкнутость относительно гомоморфизмов и их обращений
(L)= {
Замкнутость относительно гомоморфизмов и их обращений
(w) | w
Замкнутость относительно гомоморфизмов и их обращений
L}, состоящий из образов всех слов языка L.
Пусть L - язык в алфавите ?. Прообразом этого языка при гомоморфизме
Замкнутость относительно гомоморфизмов и их обращений
называется язык
Замкнутость относительно гомоморфизмов и их обращений
-1(L)= { w
Замкнутость относительно гомоморфизмов и их обращений
?* |
Замкнутость относительно гомоморфизмов и их обращений
(w)
Замкнутость относительно гомоморфизмов и их обращений
L}, состоящий из всех таких слов в алфавите ?, чьи образы при гомоморфизме
Замкнутость относительно гомоморфизмов и их обращений
попадают в L.
Оказывается, что класс автоматных языков замкнут относительно операций гомоморфизма и обращения гомоморфизма (взятия прообраза)
Теорема 6.1. Пусть
Замкнутость относительно гомоморфизмов и их обращений
: ?*
Замкнутость относительно гомоморфизмов и их обращений
?* - произвольный гомоморфизм и L - автоматный язык в алфавите ?. Тогда и язык
Замкнутость относительно гомоморфизмов и их обращений
(L) вляется автоматным.

Доказательство Пусть A= - ДКА, распознающий язык L. Построим по нему НКА M =, распознающий язык
Замкнутость относительно гомоморфизмов и их обращений
(L). Идея этого построения проста: нужно каждый переход из состояния q в q' по букве a
Замкнутость относительно гомоморфизмов и их обращений
? в автомате A превратить в переход из q в q' по слову
Замкнутость относительно гомоморфизмов и их обращений
(a) в автомате M.

Пусть ? = {a1, … , am}, Q= {q0, q1, …, qn} и
Замкнутость относительно гомоморфизмов и их обращений
(ai)= d1id2i … d{ki}i, dli
Замкнутость относительно гомоморфизмов и их обращений
? (1
Замкнутость относительно гомоморфизмов и их обращений
l
Замкнутость относительно гомоморфизмов и их обращений
ki) (если
Замкнутость относительно гомоморфизмов и их обращений
(ai)
Замкнутость относительно гомоморфизмов и их обращений
?). Для каждого ai зафиксируем простой НКА Mi, распознающий язык {d1id2i … d{ki}i}, имеющий (ki +1) состояние p0i, p1i, …, p{ki}i и команды p{l-1}dli
Замкнутость относительно гомоморфизмов и их обращений
pl (1
Замкнутость относительно гомоморфизмов и их обращений
l
Замкнутость относительно гомоморфизмов и их обращений
ki). ( Если
Замкнутость относительно гомоморфизмов и их обращений
(ai) = ?, то у Mi будут два состояния, соединенные ?-переходом). Теперь для каждой команды qj ai
Замкнутость относительно гомоморфизмов и их обращений
qr поместим в M между qj и qr автомат Mi (цепочку состояний p0i, p1i, …, p{ki}i). Чтобы состояния различных цепочек не склеивались, придадим им верхний индекс j, т.е. у каждого qj будет своя копия каждого из автоматов Mi. Для этого положим QM = Q
Замкнутость относительно гомоморфизмов и их обращений
{ plji | 0
Замкнутость относительно гомоморфизмов и их обращений
j
Замкнутость относительно гомоморфизмов и их обращений
n, 1
Замкнутость относительно гомоморфизмов и их обращений
i
Замкнутость относительно гомоморфизмов и их обращений
m, 0
Замкнутость относительно гомоморфизмов и их обращений
l
Замкнутость относительно гомоморфизмов и их обращений
ki }. Таким образом, pl{ji} - это l-ое состояние на пути из qj по "старой" букве ai. Программа ?M автомата M строится по программе A следующим образом. Для каждой команды вида qj ai
Замкнутость относительно гомоморфизмов и их обращений
qr из ? поместим в ?M следующие команды:

Замкнутость относительно гомоморфизмов и их обращений


Таким образом, из qj автомат M по пустому переходу попадает в начальное состояние p0ji j-ой копии автомата Mi, затем проходит по слову
Замкнутость относительно гомоморфизмов и их обращений
(ai) и снова по пустому переходу попадает в qr.

Для завершения определения M положим q0M = q0 и FM = F.

Докажем теперь, что наше построение корректно, т.е., что
Замкнутость относительно гомоморфизмов и их обращений
(L)=
Замкнутость относительно гомоморфизмов и их обращений
( LA) = LM .



  1. Замкнутость относительно гомоморфизмов и их обращений
    (L)
    Замкнутость относительно гомоморфизмов и их обращений
    LM. Заметим вначале, что если ?
    Замкнутость относительно гомоморфизмов и их обращений
    L, то q0
    Замкнутость относительно гомоморфизмов и их обращений
    F и по определению q0
    Замкнутость относительно гомоморфизмов и их обращений
    FM, следовательно
    Замкнутость относительно гомоморфизмов и их обращений
    (?)=?
    Замкнутость относительно гомоморфизмов и их обращений
    LM.

    Пусть w=w1w2… wk
    Замкнутость относительно гомоморфизмов и их обращений
    L, ws
    Замкнутость относительно гомоморфизмов и их обращений
    ?. Тогда в диаграмме A имеется путь из q0 в некоторое заключительное состояние q'
    Замкнутость относительно гомоморфизмов и их обращений
    F, который несет слово w. Пусть это путь
    Замкнутость относительно гомоморфизмов и их обращений
    . Тогда для каждого 1
    Замкнутость относительно гомоморфизмов и их обращений
    x
    Замкнутость относительно гомоморфизмов и их обращений
    k в ? имеется команда
    Замкнутость относительно гомоморфизмов и их обращений
    . Но из определения ?M следует, что тогда в автомате M имеется путь из
    Замкнутость относительно гомоморфизмов и их обращений
    в
    Замкнутость относительно гомоморфизмов и их обращений
    , несущий слово
    Замкнутость относительно гомоморфизмов и их обращений
    (wx). Объединив все такие пути, получим путь из из q0 в q'
    Замкнутость относительно гомоморфизмов и их обращений
    FM, несущий слово
    Замкнутость относительно гомоморфизмов и их обращений
    (w). Следовательно,
    Замкнутость относительно гомоморфизмов и их обращений
    (w)
    Замкнутость относительно гомоморфизмов и их обращений
    LM.



  2. LM
    Замкнутость относительно гомоморфизмов и их обращений
    Замкнутость относительно гомоморфизмов и их обращений
    (L). Пусть слово u
    Замкнутость относительно гомоморфизмов и их обращений
    ?* принадлежит LM.


    Покажем, что тогда для некоторого w
    Замкнутость относительно гомоморфизмов и их обращений
    L u =
    Замкнутость относительно гомоморфизмов и их обращений
    (w). Рассмотрим для этого путь в диаграмме M из q0 в q'
    Замкнутость относительно гомоморфизмов и их обращений
    FM, несущий слово u . Выделим на этом пути все состояния из Q. Пусть это будут по порядку состояния q0=q{j0}, q{j1}, … q{jk}= q'. Тогда слово u разбивается на k подслов: u=u1u2 … uk таких, что ux переводит в M состояние
    Замкнутость относительно гомоморфизмов и их обращений
    в
    Замкнутость относительно гомоморфизмов и их обращений


    (1
    Замкнутость относительно гомоморфизмов и их обращений
    x
    Замкнутость относительно гомоморфизмов и их обращений
    k). Покажем, что для каждого такого ux существует символ wx
    Замкнутость относительно гомоморфизмов и их обращений
    ? такой, что ux =
    Замкнутость относительно гомоморфизмов и их обращений
    (wx) и в ? имеется команда
    Замкнутость относительно гомоморфизмов и их обращений
    . Действительно, любой путь из
    Замкнутость относительно гомоморфизмов и их обращений
    в M начинается ?-переходом в некоторое состояние вида
    Замкнутость относительно гомоморфизмов и их обращений
    . Пусть это будет состояние на пути, который несет ux в
    Замкнутость относительно гомоморфизмов и их обращений
    . Далее этот путь обязательно будет проходить по состояниям вида
    Замкнутость относительно гомоморфизмов и их обращений
    и завершится ?-переходом из
    Замкнутость относительно гомоморфизмов и их обращений
    в состояние
    Замкнутость относительно гомоморфизмов и их обращений
    . Тогда из определения M следует, что ux =
    Замкнутость относительно гомоморфизмов и их обращений
    (ai) и в ? имеется команда
    Замкнутость относительно гомоморфизмов и их обращений
    . Положив wx=ai, получим, что ux =
    Замкнутость относительно гомоморфизмов и их обращений
    (wx) и u=
    Замкнутость относительно гомоморфизмов и их обращений
    (w1)
    Замкнутость относительно гомоморфизмов и их обращений
    (w2) …
    Замкнутость относительно гомоморфизмов и их обращений
    (wk) =
    Замкнутость относительно гомоморфизмов и их обращений
    (w), для слова w=w1w2 … wk
    Замкнутость относительно гомоморфизмов и их обращений
    ?*. При этом каждый символ wx этого слова переводит в автомате A состояние
    Замкнутость относительно гомоморфизмов и их обращений
    в
    Замкнутость относительно гомоморфизмов и их обращений
    . Поэтому в A существует путь из q0 в q'
    Замкнутость относительно гомоморфизмов и их обращений
    F, несущий слово w и, следовательно w
    Замкнутость относительно гомоморфизмов и их обращений
    L .



Что такое алгоритм?


Первоначальной целью теории алгоритмов является классификация всех задач на алгоритмически разрешимые и неразрешимые, т.е. на те, для которых существуют решающие их алгоритмы, и те, для которых таких алгоритмов нет. Неформально под алгоритмом
Что такое алгоритм?
можно понимать выраженный в некотором языке набор правил (предписание, рецепт, способ), позволяющий применить к исходным (входным) данным x из некоторого множества допустимых данных X последовательность дискретных действий (операций, команд), приводящую к определенному результату - выходным данным
Что такое алгоритм?
из некоторого множества Y. В этом случае говорят, что алгоритм
Что такое алгоритм?
вычисляет функцию
Что такое алгоритм?
типа X
Что такое алгоритм?
Y. Это нестрогое определение вполне подходит в тех случаях, когда для некоторой функции нам предъявляется "объект", называемый алгоритмом ее вычисления (например, алгоритм Эвклида для вычисления наибольшего общего делителя двух целых чисел), и можно легко проверить, позволяет ли он действительно вычислить требуемую функцию. Однако оно совершенно не годится для доказательства того, что для заданной функции никакого алгоритма нет.
Начиная с тридцатых годов ХХ века, был предпринят ряд исследований для формализации понятия алгоритма. Перечислим некоторые из предложенных разными авторами в разное время формальных моделей: машины Тьюринга-Поста, частично-рекурсивные функции (Гедель, Клини), ?-исчисление (Черч, Клини), итеративные автоматы Неймана, нормальные алгорифмы Маркова, счетчиковые автоматы Минского, автоматы на графах Колмогорова-Барздиня и др. Заложенные в них идеи в значительной степени повлияли затем на архитектуру и языки программирования реальных компьютеров (например, на базе ?-исчисления построен широко применяемый в задачах искусственного интеллекта язык ЛИСП, а из нормальных алгорифмов Маркова произошел хорошо подходящий для текстовой обработки язык РЕФАЛ). Каждый из многочисленных языков программирования также задает некоторую формальную модель алгоритмов. Мы вначале рассмотрим один из простейших таких языков - простые структурированные программы.
А затем сравним их с двумя другими моделями алгоритмов: описаниями частично рекурсивных функций и машинами Тьюринга.

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

Напомним, что через N обозначается множество натуральных чисел, т.е. N={0,1,2,…}. Для частичной n- местной арифметической функции f: Nn
Что такое алгоритм?
N через ?f обозначим область ее определения. Чтобы указать, что f не определена на некотором наборе чисел a1,…, an будем писать f(a1,…, an)=?, а если f на этом наборе определена, то будем писать f(a1,…, an) < ?. Таким образом,
Что такое алгоритм?
f ={ (a1,…, an) | f(a1,…, an) < ? }.


Структурированные программы


В этом разделе рассмотрим в качестве средства описания алгоритмов структурированные программы. Они вычисляют функции, используя минимальные средства: элементарные присваивания, условные операторы и циклы.
Определим вначале синтаксис структурированных программ. Зафиксируем для этого некоторое счетное множество имен переменных Var, которые будут использоваться в программах. Как обычно, будем считать, что оно включает имена x, x1,x2,…, y, y1,..., z,z1,... и т.п. В последующих определениях x, y, z - это произвольные переменные из Var.
Определение 7.1. Оператор присваивания. Присваивание - это выражение одного из следующих трех видов:

Определение 7.2. Условия. Условие - это выражение одного из двух видов:
а) x = y или б) x < y.
Структурированные программы определяются индуктивно.
Определение 7.3.Структурированные программы.

Конструкция в п. (б) называется последовательным применением или композицией программ ?1 и ?2, конструкция в п. (в) называется условным оператором; конструкция в п. (г) - это оператор цикла, ? - условие цикла, а ?1 - тело цикла.
С помощью структурированных программ (далее называемых просто программами) вычисляются (частичные) функции от натуральных аргументов, принимающие натуральные значения. С каждой программой ? свяжем естественным образом множество входящих в нее переменных Var?
(определите это множество индукцией по построению программы). В процессе работы программа изменяет значения этих переменных. Операционная семантика задает правила такого изменения.
Определение 7.4. Состояние - это отображение ? из множества переменных Var во множество N.
Для x
Структурированные программы
Var через ?(x) обозначим значение переменной x в состоянии ?. Через S обозначим множество всех состояний.

Разумеется, при рассмотрении конкретной программы ? нас будут интересовать значения переменных из Var?.

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



Пусть ? - программа, Var? - множество ее переменных. Выделим среди эти переменных некоторое подмножество входных

переменных x1,…, xn и одну результирующую (выходную) переменную y (она может быть одной из входных). Переменные из Var? , не являющиеся входными, будем называть вспомогательными.


Из определений следует, что при


Задача 7.1.
Определите (по аналогии с п. (ж)) определения 7.5 семантику для программ вида
?= пока x < y делай ?1 все.
Задача 7.2.Построить структурированные программы, вычисляющие в z следующие функции, и доказать их корректность:

Задача 7.3.
Пусть ? - структурированная программа и |Var?| = m. Из определений следует, что при различной фиксации входных переменных и выходной переменной программа может вычислять различные функции.

Задача 7.4.Построить структурированные программы, вычисляющие в z следующие функции:

  1. Из определений следует, что при


  2. Из определений следует, что при


  3. Из определений следует, что при


  4. Из определений следует, что при


Задача 7.5.
Пусть структурированная программа ? вычисляет в переменной y некоторую всюду определенную взаимно однозначную функцию f(x), область значений которой совпадает с множеством всех натуральных чисел N. Пусть Var?={x, y, z1,… , zm}. Постройте структурированную программу, которая вычисляет обратную функцию f-1(x) = { z | f(z)=x}.
Задача 7.6. Пусть F(x) задана соотношениями F(0)=1, F(1)=1, F(x+2)= F(x)+F(x+1) (элементы последовательности F(x) называются числами Фибоначчи). Постройте структурированную программу, которая вычисляет функцию F(x).

Леммы о рекурсивных функциях


В этом параграфе мы установим примитивную (частичную) рекурсивность некоторых важных классов функций - таблиц и нумераций, и расширим возможности определения функций с помощью суммирования, произведения, разбора случаев и взаимной рекурсии.
Лемма 8.1. Рекурсивность табличных функций. Пусть всюду определенная функция f(x) на всех аргументах, кроме конечного числа, равна некоторой константе c (такую функцию назовем табличной). Тогда она является примитивно рекурсивной.
Доказательство Пусть для функции f из условия леммы nf= max{x | f(x)
Леммы о рекурсивных функциях
c}. Доказательство проведем индукцией по nf.
При nf=0 функция f является постоянной и поэтому примитивно рекурсивной (пример 8.1).
Предположим что все табличные функции g со значением ng
Леммы о рекурсивных функциях
k примитивно рекурсивны и пусть nf = k +1 и f(0)=a. Определим табличную функцию f'(x) = f(x+1). Ясно, что nf' = k, и по предположению индукции f' примитивно рекурсивна. Легко проверить, что тогда f задается следующей схемой:
Леммы о рекурсивных функциях

и, следовательно, также примитивно рекурсивна.
Покажем замкнутость класса ч.р.ф. (п.р.ф.) относительно операций суммирования и произведения.
Лемма 8.2. Суммирование и произведение. Пусть функция f(x1,…, xn, y) является частично (примитивно) рекурсивной. Тогда и функции Fn+1 и Gn+1, заданные следующими равенствами
Леммы о рекурсивных функциях
Леммы о рекурсивных функциях

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

Приведем примеры использования леммы 8.2.
Пример 8.10. max_deg_div(x,y) = максимальная степень x, на которую нацело делится y.
Пусть exp(x,y) - экспоненциальная функция: exp(x,y) = xy. Ее примитивную рекурсивность легко установить, используя функцию умножения (см. задачу 8.1 (а) ). Тогда нетрудно проверить, что искомая функция задается соотношением
Леммы о рекурсивных функциях

и, следовательно, является примитивно рекурсивной.
Пример 8.11. Ограниченная минимизация. Пусть примитивно рекурсивная функция g(x,y) такова, что для каждого x найдется y
Леммы о рекурсивных функциях
x, для которого g(x,y) =0. Положим F(x) = mu y [g(x,y) = 0].
Тогда, по определению, F(x) является частично рекурсивной функцией.
Покажем, что, на самом деле, она примитивно рекурсивна. Действительно, определим
Леммы о рекурсивных функциях
. По лемме 8.2 эта функция примитивно рекурсивна. Пусть для данного x y0 = ? y [g(x,y) = 0]. Тогда при i < y0 имеем h(x,i) = 1, а при i
Леммы о рекурсивных функциях
y0 h(x,i) =0. Поэтому искомая функция F задается равенством
Леммы о рекурсивных функциях
и также является примитивно рекурсивной.

Лемма 8.3. Кусочное задание или разбор случаев. Пусть h1(x1,…,xn), …, hk(x1,…,xn)- произвольные ч.р.ф., а всюду определенные ч.р.ф. f1(x1,…,xn), …, fk(x1,…,xn) таковы, что на любом наборе аргументов (a1, …, an) одна и только одна из этих функций равна 0. Тогда функция g(x1,…, xn), определенная соотношениями:

Леммы о рекурсивных функциях


является частично рекурсивной.

Доказательство Действительно, gn можно представить как сумму k произведений:

Леммы о рекурсивных функциях


Следующий класс функций, который нас будет интересовать, - это функции для однозначной нумерации пар и n-ок целых чисел и обратные им. Определим для любой пары чисел (x,y) ее номер c2(x,y)=2x(2y+1) - 1. Например, c2(0,0)=0, c2(1,0)=1, c2(0,1)=2, c2(1,1)=5, c2(2,1)= 19. Из единственности разложения чисел на простые множители следует, что функция c2: N2
Леммы о рекурсивных функциях
N взаимно однозначно нумерует пары целых чисел. Нетрудно понять, что если c2(x,y) = z, то двоичная запись числа (z+1) имеет следующий вид: (двоичная запись y) 10x. Из такого представления можно однозначно извлечь значение x и значение y. Эти значения определяются следующими обратными функциями:

Леммы о рекурсивных функциях


Из этих определений непосредственно следует, что для любого z выполнено равенство c2(c21(z), c22(z))=z.

Определим теперь по индукции функции cn нумерации n-ок чисел при n > 2 и обратные им координатные функции cni (1
Леммы о рекурсивных функциях
i
Леммы о рекурсивных функциях
n):

Леммы о рекурсивных функциях

Из этих определений также непосредственно следует, что для любого z имеет место равенство cn(cn1(z), cn2 (z),…, cnn (z))=z. (Проверьте это свойство индукцией по n.)

Лемма 8.4. Рекурсивность нумерационных функций. Для любых n
Леммы о рекурсивных функциях
2и 1
Леммы о рекурсивных функциях
i
Леммы о рекурсивных функциях
n все определенные выше функции cn и cni являются примитивно рекурсивными.

Доказательство Примитивная рекурсивность c2(x,y) устанавливается непосредственно (см.


задачу 8.1(а)). Функция c21(z) задается равенством c21(z)= max_deg_div(2,z+1) и является примитивно рекурсивной (это показано в примере 8.10). Для функции c22(z) справедливо определение c22(z) = div(2, div(2 c21(z)}, z+1) - 1) ( здесь мы используем примитивную рекурсивность функции целочисленного деления div(x,y) из задачи 8.1(e)). Примитивная рекурсивность остальных нумерационных функций следует по индукции из их определений (см. задачу 8.10).

В следующей лемме обобщается оператор примитивной рекурсии.

Лемма 8.5. (совместная рекурсия) Пpедположим, что фyнкции
Леммы о рекурсивных функциях
in(x1,…,xn) (1 le i le k) и фyнкции ?in+k+1(x1, …, xn, y, y1, …, yk) (1
Леммы о рекурсивных функциях
i
Леммы о рекурсивных функциях
k) пpимитивно pекypсивны. Тогда фyнкции f1n+1(x1, …, xn, y), …, fkn+1(x1, …, xn, y), опpеделяемые следyющей совместной pекypсией

Леммы о рекурсивных функциях


(1
Леммы о рекурсивных функциях
i
Леммы о рекурсивных функциях
k) также являются пpимитивно pекypсивными.

Доказательство Обозначим чеpез
Леммы о рекурсивных функциях
набоp пеpеменных x1,…,xn. Опpеделим следyющие пpимитивно pекypсивные фyнкции:
Леммы о рекурсивных функциях
и положим

Леммы о рекурсивных функциях


Фyнкция Fn+1 полyчена пpимитивной pекypсией из пpимитивно pекypсивных фyнкций и, следовательно, сама пpимитивно pекypсивна. Спpаведливость леммы тепеpь следyет из того, что для всякого
Леммы о рекурсивных функциях



Определение рекурсивных функций


Мы будем рассматривать частичные арифметические функции fn(x1, …, xn): Nn
Определение рекурсивных функций
N. Здесь верхний индекс n у имени функции f обозначает число ее аргументов ("арность"). Если арность ясна из контекста или несущественна, то этот индекс будем опускать. Определим вначале три оператора, позволяющих по одним функциям получать другие.
Определение 8.1. Суперпозиция. Пусть Fm и f1n,…, fmn
- арифметические функции. Скажем, что функция Gn получена из Fm , f1n, …, fmn с помощью оператора суперпозиции (обозначение: Gn=[Fm;f1n, …, fmn]), если для всех наборов аргументов (x1,…,xn)
Определение рекурсивных функций

При этом для каждого набора аргументов (a1, …, an) функция Gn(a1, …, an)< ? (т.е. определена), если определены все значения f1n (a1, …, an)=b1,…, fmn (a1, …, an)=bm
и Fm(b1,…, bm) < ?.
Определение 8.2. Примитивная рекурсия. Скажем, что функция Fn+1(x1,… ,xn,y) получена с помощью оператора рекурсии из функций gn(x1,…, xn) и hn+2(x1, …, xn, y, z), если она может быть задана схемой примитивной рекурсии
Определение рекурсивных функций

В этом случае будем писать Fn+1 = R(gn,hn+2).
При этом
Определение рекурсивных функций
и для каждого b
Определение рекурсивных функций
и
Определение рекурсивных функций

В случае, когда n=0, т.е. F зависит от одного аргумента y, а аргументов x1,…,xn нет, схема примитивной рекурсии принимает вид
Определение рекурсивных функций

где a
Определение рекурсивных функций
N.
Заметим, что если исходные функции в операторах суперпозиции и примитивной рекурсии всюду определены, то и результирующие функции также всюду определены. Следующий оператор позволяет задавать не всюду определенные, т.е. частичные, функции.
Определение 8.3. Минимизация. Скажем, что функция Fn(x1,… ,xn) получена с помощью оператора минимизации(?-оператора) из функции gn+1(x1,…, xn,y), если Fn(x1,…,xn) определена и равна y тогда и только тогда, когда все значения gn+1(x1,…, xn,0),…,gn+1(x1,…, xn,y-1) определены и не равны 0, а gn+1(x1,…, xn,y)=0. В этом случае будем писать
Определение рекурсивных функций

Определение 8.4. Простейшие функции. Функция называется простейшей, если она является одной из следующих функций:


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

Определение 8.5. Частично рекурсивные функции. Функция f называется частично рекурсивной функцией (ч.р.ф.), если она является одной из простейших функций или может получиться из них с помощью конечного числа применений операторов суперпозиции, примитивной рекурсии и минимизации, т.е. существует последовательность функций f1,f2,…, fn=f, каждая из которых является либо простейшей, либо получена из предыдуших с помощью одного из указанных операторов. Указанная последовательность функций называется частично рекурсивным описанием функции f.

Функция f называется общерекурсивной функцией (о.р.ф.), если она частично рекурсивна и всюду определена.

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

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


Приведем некоторые примеры частично рекурсивных


Приведем некоторые примеры частично рекурсивных функций.
Пример 8.1. Постоянные функции.
Пусть fn(x1,…,xn)=k для всех наборов аргументов (x1,…,xn) и числа k
Приведем некоторые примеры частично рекурсивных
N. Тогда
Приведем некоторые примеры частично рекурсивных

Пример 8.2. Сложение:+2(x,y)=x+y.
Функция сложения определяется следующей примитивной рекурсией.
Приведем некоторые примеры частично рекурсивных

Следовательно, +2 =R(I11,[s1;I33]).
Пример 8.3. Умножение: ?2(x,y)=x ? y.
Используя сложение, умножение можно задать следующей примитивной рекурсией:
Приведем некоторые примеры частично рекурсивных

Следовательно, ?2 =R(o1,[+;I33,I13]).
Пример 8.4. Минус 1:
Приведем некоторые примеры частично рекурсивных
.
Нетрудно проверить, что
Приведем некоторые примеры частично рекурсивных
.
Пример 8.5. Вычитание :
Приведем некоторые примеры частично рекурсивных
, если x
Приведем некоторые примеры частично рекурсивных
y и
Приведем некоторые примеры частично рекурсивных
если x < y.
Вычитание определяется следующей примитивно рекурсивной схемой:
Приведем некоторые примеры частично рекурсивных

Следовательно,
Приведем некоторые примеры частично рекурсивных
.
Пример 8.6. Предикаты равенства и неравенства нулю:
Приведем некоторые примеры частично рекурсивных

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

Пример 8.7. Модуль разности:
Приведем некоторые примеры частично рекурсивных
.
Пример 8.8.rm(x,y)= остаток от деления y на x (при x=0 положим rm(0,y)=y).
Заметим, что
Приведем некоторые примеры частично рекурсивных

Тогда функцию rm(x,y) можно задать примитивно рекурсивной схемой
Приведем некоторые примеры частично рекурсивных

Правую часть второго равенства легко представить как функцию g(x,y,rm(x,y)), полученную с помощью суперпозиции уже построенных примитивно рекурсивных функций.
Пример 8.9. Нигде не определенная функция ?(x).
Эта функция может быть задана, например, соотношением ?(x)= mu y[ s1(y)+x=0 ].
Отметим, что все функции в примерах 8.1 - 8.8 являются примитивно рекурсивными.

Программная вычислимость рекурсивных функций


В этом параграфе рассмотрим соотношение между программно вычислимыми и частично рекурсивными функциями. Справедлива следующая
Теорема 8.1. Каждая частично рекурсивная функция программно вычислима.
Доказательство индукцией по определению ч.р.ф.
Базис: программная вычислимость простейших функций была установлена в примерах 1.1, 1.2 и 1.4.
Индукционный шаг: покажем программную вычислимость операторов суперпозиции, примитивной рекурсии и минимизации.
Суперпозиция. Пусть Fm и f1n,…, fmn
- арифметические функции, вычислимые программами ?, ?1, … , ?m так, что ??, x1(x1,…, xm) = Fm(x1,…, xm), и ??i, x1(x1,…, xn) = fin(x1,…, xn) при i=1,…,n. Пусть переменные y1, …, ym, z1,…, zn
не используются в программах ?, ?1, … , ?m. Кроме того, пусть все вспомогательные переменные этих программ - это w1, … , wr. Рассмотрим следующую программу P:
Программная вычислимость рекурсивных функций

В качестве входных переменных зафиксируем x1, …, xn, а выходной - x1. Пусть в исходном состоянии x1=a1, …, xn = an. Тогда в первой строке эти значения сохраняются в переменных z1, …, zn, которые своих значений далее не меняют. Поэтому для каждого i=1,…,m-1 после выполнения фрагмента
Программная вычислимость рекурсивных функций

значением переменной yi является fin(a1,…, an), x1=a1, …, xn = an, а значения всех вспомогательных переменных равны 0. Тогда после выполнения
Программная вычислимость рекурсивных функций

значением каждого xi также является fin(a1,…, an), а после выполнения ? значение x1 равно ?P,x1(x1,…,xm)= Fm(f1n(a1,…, an), …, fmn(a1,…, an)). Таким образом, ?P, x1 = [F; f1, …, fn].
Примитивная рекурсия. Рассмотрим для простоты случай n=1. Пусть функция F2(x1,y) получена с помощью оператора примитивной рекурсии из функций g1(x1) и h3(x1, y, z), т.е. F2 =R(g1,h3). Предположим, что существуют программы ?1 и ?2, вычисляющие функции g1 и h3 так, что ??1,x1}(x1)=g1(x1) и ??2,x1(x1, y,z)=h3(x1,y,z). Пусть вспомогательные переменные ?2 - это z1,…, zm и они не встречаются в ?1, а переменные u1, y1 и v не используются в программах ?1 и ?2. Рассмотрим программу P: u1 :=x1; y1:=y; v:=0; ?1; пока v < y1 делай z:=x1; x1:=u1; y:=v; ?2; z1:=0; … ; zm:=0; v:= v+1 все В качестве входных переменных P возьмем x1 и y, а выходной - x1.

Рассмотрим работу P на исходном состоянии ?, в котором ?(x1)=a, ?(y)=b. При b=0 цикл не выполняется и в результирующем состоянии ?1=P(?) имеем ?1(x1)=?1(?)(x1) =g1(a)= F2(a, 0). При b > 0 цикл будет выполняться b раз, так как в его теле v всякий раз увеличивается на 1, а значение y1=b и не меняется. Перед первым выполнением ?2 все ее рабочие переменные zi равны 0, x1=a, y=0, z=F2(a, 0), а после ее выполнения x1=h3(a,0,F(a,0))=F(a,1). Предположим теперь по индукции, что перед (i+1)-ым выполнением ?2 все ее рабочие переменные zi равны 0, x1=a, y=i и z=F2(a, i). После этого выполнения x1=h3(a,i,z)=h3(a,i,F(a,i))=F(a,i+1). Тогда присваивания z1:=0; … ; zm:=0; v:= v+1 после ?2 и z:=x1; x1:=u1; y:=v; перед ее следующим выполнением установят значения переменных ?2 так, что все ее рабочие переменные zi равны 0, x1=a, y=i+1 и z=F2(a, i+1). Следовательно, после b-го выполнения тела цикла x1=h3(a,b-1,F(a,b-1))=F(a,b).

Минимизация. Предположим, что функция Fn(x1,… ,xn) получена с помощью оператора минимизации (mu-оператора) из функции gn+1(x1,…, xn,y), т.е.

Программная вычислимость рекурсивных функций


Пусть программа ?1 вычисляет gn+1, так что
Программная вычислимость рекурсивных функций
, и пусть рабочие переменные ?1 - это z1,…, zm. Зафиксируем переменные x1',… , xn', y';, u, z, не входяшие в
Программная вычислимость рекурсивных функций
. Рассмотрим следующую программу ?:

Программная вычислимость рекурсивных функций


Рассмотрим работу ? на входных значених xi = ai (i=1,…,n). В первой строке они сохраняются в переменных x'i, которые нигде в ? не изменяются, z получает значение 0, которое тоже не меняется по ходу вычисления, а u вначале получает значение 1. Поэтому условие цикла после первой строки истинно и он хотя бы один раз выполняется. Докажем, что для каждого i
Программная вычислимость рекурсивных функций
1, (i+1)-ая итерация цикла выполняется тогда и только тогда, когда g(a1, …, an,0)=b1 >0, …, g(a1, …, an, i-1)=bi-1 > 0, ? останавливается после (i+1)-ой итерации цикла с результатом x1=i тогда и только тогда, когда g(a1, …, an,i)=0. При этом перед выполнением ?1

входные переменные x1,…,xn,y имеют значения a1,…,an, i, соответственно, y'= i, а все рабочие переменные zj (j=1,…, m) равны 0.



Действительно, предположив это условие, получим, что после очередного выполнения фрагмента

Программная вычислимость рекурсивных функций


значение u = x1 = g(a1,…,an,i), а рабочие переменные восстанавливают нулевые значения. Если g(a1,…,an,i)=0, то u=z и в условном операторе x1 получает значение y'=i. После этого условие цикла нарушено и ? завершает работу с выходным значением x1=i =F(a1,…, an). Если же g(a1,…,an,i)> 0, то u>z и в условном операторе y' увеличивает значение до (i+1). Тогда условие цикла выполнено и перед (i+2)-ым выполнением ?1 ее входные переменные x1,…,xn,y имеют значения a1,…,an, i+1, соответственно, y'= i+1, а все рабочие переменные равны 0.

Из доказанного утверждения непосредственно следует, что

Программная вычислимость рекурсивных функций


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

Теорема 8.2. Каждая программно вычислимая функция является частично рекурсивной.


что следующие функции являются частично


Задача 8.1. Показать, что следующие функции являются частично (примитивно) рекурсивными.

Задача 8.2. Докажите, что если f(x1,…,xn) является ч.р.ф. (п.р.ф.), то и функция g(x1,…,xn)=f(x{i1},…,xin) является ч.р.ф. (п.р.ф.) для любой перестановки (i1, …, in) чисел 1,2,…,n.
Задача 8.3. Оператор сдвига. Пусть g(x1,…, xn) - частично (примитивно) рекурсивная функция, a и b >0 - числа из N. Тогда и функция
что следующие функции являются частично

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

Задача 8.5.
Пусть F(x) задана соотношениями F(0)=1, F(1)=1, F(x+2)= F(x)+F(x+1) ( элементы последовательности F(x) называются числами Фибоначчи). Покажите, что функция F(x) примитивно рекурсивна.
(Указание: покажите сначала, что функция g(x)= 2F(x) 3F(x+1) примитивно рекурсивна.)
Задача 8.6.
Докажите, что если значения общерекурсивной функции f(x) изменить на конечном множестве, то получившаяся функция f'(x) также будет общерекурсивной.
Задача 8.7.
Доказать, что из функции o(x)=0 и из функций выбора Imn(x1,...,xn)=xm с помощью суперпозиции и примитивной рекурсии нельзя получить функцию s(x)=x+1 и функцию d(x) =2*x.
Задача 8.8. Пусть g(x1,...,xn,y) - примитивно рекурсивна. Доказать, что функция
что следующие функции являются частично

примитивно рекурсивна.
Задача 8.9.
Доказать, что если функции f(x1,...,xn,y), g(x1,...,xn,y) и h(x1,..., xn,y) частично рекурсивны, то и функция

Односторонние машины Тьюринга


Машина Тьюринга
Односторонние машины Тьюринга
называется односторонней, если в процессе вычисления ее головка никогда не сдвигается левее начальной ячейки (т.е. всегда находится в ячейках с положительными номерами).
Лемма 9.2. Для всякой м.Т.
Односторонние машины Тьюринга
можно построить эквивалентную одностороннюю м.Т.
Односторонние машины Тьюринга
.
Доказательство. Пусть
Односторонние машины Тьюринга
Будем считать (используя лемму 1 ), что
Односторонние машины Тьюринга
завершает работу в стандартных конфигурациях. Требуемая м.Т.
Односторонние машины Тьюринга
будет моделировать работу
Односторонние машины Тьюринга
, используя "многоэтажную" ленту . Содержимое ячеек на 1-ом (нижнем) этаже будет на каждом такте совпадать с содержимым тех же ячеек
Односторонние машины Тьюринга
, на 2-ом этаже будет копироваться содержимое левой полуленты: на нем в i-ой ячейке
Односторонние машины Тьюринга

будет тот же символ, что и в -i-ой ячейке
Односторонние машины Тьюринга
. Кроме того, на 3-ем этаже в 1-ой ячейке будет стоять отмечающий ее символ #. Таким образом, ?' = ? ? ? ? {
Односторонние машины Тьюринга
, # }
Односторонние машины Тьюринга
?. Работа
Односторонние машины Тьюринга
будет происходить следующим образом.
  1. 1) На первом этапе отмечается 1-я ячейка и содержимое входа переписывается на 1-ый этаж трехэтажной ленты:
    Односторонние машины Тьюринга


  2. Затем
    Односторонние машины Тьюринга
    моделирует работу
    Односторонние машины Тьюринга
    , используя для работы на 2-ом этаже дубликаты состояний (со штрихами) и команды со сдвигами в обратном направлении. Для команды q ,a
    Односторонние машины Тьюринга
    r , b ,C из P и для всех c
    Односторонние машины Тьюринга
    ? в P' поместим команды:
    Односторонние машины Тьюринга

    Кроме того, для a =
    Односторонние машины Тьюринга
    сохраним и старые команды для работы на впервые посещаемых ячейках:
    Односторонние машины Тьюринга

    Сдвиги
    Односторонние машины Тьюринга
    из 1-ой ячейки налево в -1-ю и обратно моделируются переходом с одного этажа на другой в 1-ой ячейке
    Односторонние машины Тьюринга

    Односторонние машины Тьюринга


  3. После завершения моделирования
    Односторонние машины Тьюринга
    результат записан в начальных ячейках на 1-ом этаже.
    Односторонние машины Тьюринга
    переводит его в первоначальный алфавит ?.
    Односторонние машины Тьюринга

    Проверка правильности работы м.Т.
    Односторонние машины Тьюринга
    предоставляется читателю (см. задачу 9.4).



Основные определения


Рассматриваемая в этом разделе модель алгоритмов была предложена английским математиком Тьюрингом в 1937г. еще до создания современных компьютеров компьютеров1)
Он исходил из общей идеи моделирования работы вычислителя, оперирующего в соответствии с некоторым строгим предписанием. В машине Тьюринга расчленение процесса вычисления на элементарные шаги доведено в известном смысле до предела. Элементарным действием является замена одного символа в ячейке на другой и перемещение к соседней ячейке. При таком подходе процесс вычисления значительно удлиняется, но зато логическая структура процесса сильно упрощается и приобретает удобный для теоретического исследования вид.
Машина Тьюринга (м.Т.) состоит из неограниченной в обе стороны ленты, разбитой на ячейки, по которой передвигается головка машины. Такая "бесконечность" ленты является математической абстракцией, отражающей потенциальную неограниченность памяти вычислителя. Разумеется, в каждом завершающемся вычислении используется только конечная часть этой памяти - конечное число ячеек. В каждой ячейке ленты записан один символ из конечного внешнего алфавита машины ? = {a0, a1, … ,am }. Головка машины представляет конечный автомат, который в каждый момент времени находится в одном из внутренних состояний Q ={q0,q1,… , qn }. На каждом шаге головка в зависимости от своего внутреннего состояния и символа в ячейке, которую она наблюдает, изменяет свое внутреннее состояние и содержимое наблюдаемой ячейки и может сдвинуться на одну ячейку вправо или влево либо остаться на месте.
Дадим более формальное определение.
Определение 9.1. Машина Тьюринга - это система вида
Основные определения

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


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

Будем говорить, что некоторый символ стирается, если он заменяется на пустой. Два слова из ?* будем считать равными, если они совпадают после отбрасывания всех пустых символов слева и справа. Например,
Основные определения
Основные определения
ab
Основные определения
c
Основные определения
=
Основные определения
ab
Основные определения
c = ab
Основные определения
c, но ab
Основные определения
c
Основные определения
abc.

Как и для конечных автоматов, программу P можно задавать с помощью таблицы размера n ? m, строки которой соответствуют состояниям из Q, а столбцы - символам из входного алфавита ?, в которой на пересечении строки qi и столбца aj стоит тройка qk al C - правая часть команды qi aj
Основные определения
qk al C.

Определение 9.2. Назовем конфигурацией м.Т.
Основные определения
в некоторый момент времени слово K= wл qi aj wп, где wл
Основные определения
?* - слово на ленте левее текушего положения головки, qi - внутреннее состояние в данный момент, aj- символ, обозреваемый головкой, wп
Основные определения
?* - слово на ленте правее текушего положения головки.

Будем считать, что слово wл aj wп содержит все значащие символы на ленте. Поэтому, с точностью до описанного выше равенства слов, конфигурация определена однозначно. В частности, если wл=?, т.е. пусто, то левее положения головки все ячейки пусты, а если wп=?, то правее положения головки все ячейки пусты.

Начальная конфигурация - это конфигурация вида q0w, т.е. в начальный момент времени головка в состоянии q0 обозревает первый символ входного слова w. { it Заключительная } конфигурация - это конфигурация вида w1 qf w2, в которой машина находится в заключительном состоянии qf .

Определение 9.3. Скажем, что конфигурация K= w1 qi aj w2 м.Т.
Основные определения
за один шаг (такт) переходит в конфигурацию
Основные определения
если в программе имеется команда qi aj
Основные определения
qk al C и при этом,



Как обычно, через
Основные определения
обозначим рефлексивное и транзитивное замыкание отношения
Основные определения
а
Основные определения
будет означать, что конфигурация K за n шагов переходит в K'. (Если из контекста ясно, о какой машине идет речь, то индекс
Основные определения
будем опускать).


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


Используя возможность моделирования произвольной м.Т. на м.Т. со стандартными заключительными конфигурациями, легко установить справедливость следующей леммы о последовательной композиции машин Тьюринга.
Лемма 9.3.(Последовательная композиция) Пусть м.Т.
Последовательная и параллельная композиции машин Тьюринга
вычисляет функцию f(x), а м.Т.
Последовательная и параллельная композиции машин Тьюринга
- функцию g(x). Тогда существует м.Т.
Последовательная и параллельная композиции машин Тьюринга
вычисляющая функцию h(x) = f(g(x)).
Доказательство Действительно, пусть
Последовательная и параллельная композиции машин Тьюринга
а
Последовательная и параллельная композиции машин Тьюринга

Используя лемму 9.1, будем считать, что у
Последовательная и параллельная композиции машин Тьюринга
заключительные конфигурации стандартны. Тогда легко проверить, что функция h вычисляется следующей м.Т.
Последовательная и параллельная композиции машин Тьюринга
где P= P1
Последовательная и параллельная композиции машин Тьюринга
P2
Последовательная и параллельная композиции машин Тьюринга
{qf2 a
Последовательная и параллельная композиции машин Тьюринга
q01 aН | a
Последовательная и параллельная композиции машин Тьюринга
?2} .
Покажем, что работу двух м.Т. можно комбинировать так, чтобы в заключительной конфигурации содержались результаты работы каждой из них над независимыми входами.
Лемма 9.4. (Параллельная композиция) Пусть м.Т.
Последовательная и параллельная композиции машин Тьюринга
вычисляет функцию f(x), а м.Т.
Последовательная и параллельная композиции машин Тьюринга
- функцию g(x) и символ * не входит в алфавит м.Т.
Последовательная и параллельная композиции машин Тьюринга
. Тогда существует м.Т.
Последовательная и параллельная композиции машин Тьюринга
которая по любому входу вида x*y выдает результат f(x)*g(y), т.е. вычисляет функцию H(x*y) = f(x)*g(y).
Доказательство. Пусть
Последовательная и параллельная композиции машин Тьюринга
и
Последовательная и параллельная композиции машин Тьюринга
- м.Т. Не ограничивая общности, будем считать, что эти машины односторонние (по Лемме 2). Определим теперь м.Т.
Последовательная и параллельная композиции машин Тьюринга
которая работает следующим образом.
  1. Начав в конфигурации (p0x*y), находит 1-ый символ y
  2. и переходит в конфигурацию (x*q02y).
  3. Работая как
    Последовательная и параллельная композиции машин Тьюринга
    вычисляет g(y) и переходит при этом в конфигурацию (x*qf2g(y)).
  4. Переписывает *x после g(y) и переходит в конфигурацию g(y)*q01x).
  5. Работая как
    Последовательная и параллельная композиции машин Тьюринга
    вычисляет f(x) и переходит при этом в конфигурацию (g(y)*qf1f(x).
  6. Меняет
    Последовательная и параллельная композиции машин Тьюринга
    и
    Последовательная и параллельная композиции машин Тьюринга
    местами и останавливается.

Корректность этапов 2 и 4 следует из односторонности
Последовательная и параллельная композиции машин Тьюринга
и
Последовательная и параллельная композиции машин Тьюринга
а реализация этапов 1, 3 и 5 достаточно очевидна (см. задачу 9.6).
Построенную в этой лемме м.Т.
Последовательная и параллельная композиции машин Тьюринга
, полученную в результате параллельной композиции
Последовательная и параллельная композиции машин Тьюринга
и
Последовательная и параллельная композиции машин Тьюринга
, будем обозначать как
Последовательная и параллельная композиции машин Тьюринга
. Здесь индекс * указывает символ, которым отделяются аргументы
Последовательная и параллельная композиции машин Тьюринга
и
Последовательная и параллельная композиции машин Тьюринга

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

Конструкцию параллельной композиции можно обобщить на произвольное конечное число машин Тьюринга.

Следствие. Пусть
Последовательная и параллельная композиции машин Тьюринга
- машины Тьюринга, вычисляющие функции f1, … , fm, соответственно. Пусть символ * не входит в алфавиты этих машин. Тогда существует м.Т.
Последовательная и параллельная композиции машин Тьюринга
, перерабатывающая любой вход вида x1*x2* … *xm (xi
Последовательная и параллельная композиции машин Тьюринга
?i*, i=1,…, m) в выход f1(x1)*f2(x2)* … *fm(xm).

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


Повторение (цикл)


Используя конструкцию для ветвления легко реализовать в терминах машин Тьюринга и оператор цикла.
Лемма 9.6. Пусть ? - распознающая м.Т., а м.Т.
Повторение (цикл)
вычисляет функцию f(x). Тогда существует м.Т.
Повторение (цикл)
которая вычисляет функцию, задаваемую выражением:
Повторение (цикл)

Доказательство. Действительно, пусть м.Т.
Повторение (цикл)
- вычисляет тождественную функцию g(x)=x. Построим по м.Т.
Повторение (цикл)

м.Т.
Повторение (цикл)
реализующую ветвление как в лемме 9.5. Тогда искомая м.Т.
Повторение (цикл)
получается из
Повторение (цикл)
заменой команд qf1 a
Повторение (цикл)
qf a H (a
Повторение (цикл)
?) на соответствующие команды qf1 a
Повторение (цикл)
q0 a H (a
Повторение (цикл)
?), обеспечивающие зацикливание.
Реализованные выше операции над машинами Тьюринга и вычислимыми функциями позволяют получать программы новых м.Т., используя обычные конструкции языка программирования "высокого" уровня: последовательную и параллельную композицию, ветвление и цикл. Пусть M, M1, M2,… , Mm, ? - машины Тьюринга. Последовательную композицию M1 и M2 будем обозначать M1;M2, параллельную композицию M1, M2,… , Mm обозначаем как
Повторение (цикл)
(здесь b - это символ, разделяющий аргументы и результаты этих машин), ветвление -
Повторение (цикл)

цикл -
Повторение (цикл)

Пример 9.4. Рассмотрим в качестве примера задачу перевода чисел из унарной системы счисления в двоичную. Пусть fub(|n) = n(2) для всех n
Повторение (цикл)
N, где n(2) - двоичная запись числа n.
Пусть M1 - м.Т., которая начальную конфигурацию q0 ,|n переводит в конфигурацию q1 ,0*|n; M2 - м.Т., которая прибавляет 1 к двоичному числу-аргументу (см. пример ref{ex8-suc}); M3 - м.Т., которая вычитает 1 из унарного числа; ? - м.Т., которая на аргументе вида x*|y выдает 0, если число y > 0, и выдает 1 при y=0 (т.е. на аргументе x*
Повторение (цикл)
)); M4 - м.Т., которая стирает * в аргументе вида x* и останавливается. Реализация каждой из указанных м.Т. очевидна. Теперь требуемая м.Т. Mub, вычисляющая fub, получается как
Повторение (цикл)

Действительно, после работы M1 получаем конфигурацию q10*|n. Предположим теперь по индукции, что после i (i получаем конфигурацию q1(i+1)(2)*|n-i-1. Поэтому после n итераций получится конфигурация q1 n(2)*
Повторение (цикл)
. На ней ? выдаст 1, и цикл завершится с записью n(2)*
Повторение (цикл)
на ленте, из которой M4 сотрет * и оставит требуемый результат n(2).
Отметим, что из приведенного примера и из задачи \oldref{prb3-6}(a) следует, что класс вычислимых на м.Т. арифметических функций не зависит от выбора унарного или двоичного кодирования аргументов и результатов. Это же справедливо и для троичной, десятичной и других позиционных систем счисления ( почему ?).


Стандартная заключительная конфигурация


Назовем заключительную конфигурацию стандартной, если в ней головка наблюдает первый значащий символ результата, который находится в 1-ой ячейке (т.е. в той же ячейке, где начиналось входное слово).
Лемма 9.1.Для всякой м.Т.
Стандартная заключительная конфигурация
можно построить эквивалентную м.Т.
Стандартная заключительная конфигурация
у которой все заключительные конфигурации стандартны.
Доказательство. Пусть
Стандартная заключительная конфигурация
Определим по ней м.Т.
Стандартная заключительная конфигурация
, которая удовлетворяет требованиям леммы. Положим ?' = ?
Стандартная заключительная конфигурация
{ a' | a
Стандартная заключительная конфигурация
?}
Стандартная заключительная конфигурация
{ #}, где # - новый символ.
Стандартная заключительная конфигурация
работает следующим образом.
  1. Отмечает символ в первой ячейке штрихом и переходит в начальное состояние
    Стандартная заключительная конфигурация
  2. Далее работает как
    Стандартная заключительная конфигурация
    но сохраняет штрих в первой ячейке и вместо пустого символа
    Стандартная заключительная конфигурация
    записывает #. Для этого для каждой команды qiaj
    Стандартная заключительная конфигурация
    qk alC из P'
  3. в P' добавляется ее дубликат qiaj'
    Стандартная заключительная конфигурация
    qk al'C, в правых частях команд символ
    Стандартная заключительная конфигурация
    всюду заменяется на # и для каждой команды вида qi
    Стандартная заключительная конфигурация
    Стандартная заключительная конфигурация
    qk al C в P' добавляется команда qi #
    Стандартная заключительная конфигурация
    qk al C . После завершения этого этапа все посещенные в процессе работы головкой
    Стандартная заключительная конфигурация
    ячейки составляет непрерывный отрезок, не содержащий пустых символов.
  4. Далее
    Стандартная заключительная конфигурация
    стирает ненужные символы # слева и справа от блока ячеек, содержащего первую ячейку и все ячейки с символами результата, и переходит в одну из трех следующих конфигураций:
    Стандартная заключительная конфигурация
    где w - результат работы { cal M} (с заменой символов
    Стандартная заключительная конфигурация
    внутри w на #) и w1aw2 = w.
  5. Сдвигает в нужном направлении результат, совмещая его начало с ячейкой, помеченной штрихом, заменяет все # внутри w на
    Стандартная заключительная конфигурация
    , снимает штрих в 1-ой ячейке и останавливается. Например, для K1 это достигается с помощью следующих команд (мы предполагаем, что ни одно из используемых ниже состояний qл, q1, p, p1, p2, p3, pa, pa' (a
    Стандартная заключительная конфигурация
    ?
    Стандартная заключительная конфигурация
    { #}) не входит в Q):
    • поиск левого конца w: qл a
      Стандартная заключительная конфигурация
      qлaП (a
      Стандартная заключительная конфигурация
      {#', #}); qлa
      Стандартная заключительная конфигурация
      q1a'П (a
      Стандартная заключительная конфигурация
      ?) (отметили первый символ w), qл
      Стандартная заключительная конфигурация
      Стандартная заключительная конфигурация
      p3
      Стандартная заключительная конфигурация
      Л; (результат пуст);
    • поиск правого конца w: q1 a
      Стандартная заключительная конфигурация
      q1aП (a
      Стандартная заключительная конфигурация
      ?
      Стандартная заключительная конфигурация
      { #} ), q1
      Стандартная заключительная конфигурация
      Стандартная заключительная конфигурация
      p
      Стандартная заключительная конфигурация
      Л (в состоянии p наблюдает последний символ w);
    • сдвиг результата на 1 ячейку влево: pa
      Стандартная заключительная конфигурация
      pa
      Стандартная заключительная конфигурация
      Л; pa b
      Стандартная заключительная конфигурация
      pb aЛ; pa b'
      Стандартная заключительная конфигурация
      pb'aП; pb' #
      Стандартная заключительная конфигурация
      p1 b'П;
    • возврат к правому концу и переход к следующему сдвигу: p1 a
      Стандартная заключительная конфигурация
      p1aП (a
      Стандартная заключительная конфигурация
      Стандартная заключительная конфигурация
      ); p1
      Стандартная заключительная конфигурация
      Стандартная заключительная конфигурация
      p
      Стандартная заключительная конфигурация
      Л;
    • при сдвиге до 1-ой ячейки замена символов # на
      Стандартная заключительная конфигурация
      и удаление штриха:
      Стандартная заключительная конфигурация


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



Тьюрингово программирование


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

Рис. 9.2.  Нумерация ячеек ленты машины Тьюринга
Пример 9.2.Функция f(x)=x+1

Пример 9.2. Копирование.
Рассмотрим функцию копирования (дублирования) слов в алфавите ?: copy(x)= x*x (мы предполагаем, что *
Тьюрингово программирование
?).
Для ее реализации используем один из типичных приемов Тьюрингова программирования - { it расширение алфавита}.Пусть ?'= {a' | a
Тьюрингово программирование
? } и ?1=?
Тьюрингово программирование
?'. М.Т.
Тьюрингово программирование
копирующая вход, работает следующим образом:
  1. отмечает 1-ый символ входа, идет направо, ставит * после входа и возвращается в начало:
    Тьюрингово программирование
  2. в состоянии qa движется направо и записывает a в первую свободную ячейку:
    Тьюрингово программирование
  3. возвращается в отмеченную ячейку и передвигает метку ' на одну ячейку вправо, снова переходя в состояние q2:
    Тьюрингово программирование
  4. увидев символ * в состоянии q5, останавливается:
    Тьюрингово программирование

Из этого описания непосредственно следует, что
Тьюрингово программирование
для любого x
Тьюрингово программирование
{?}*.


Ветвление (условный оператор)


Машину Тьюринга ? будем называть распознающей, если для некоторого алфавита ? и каждого входа x
Ветвление (условный оператор)
?*, на котором ? останавливается, ее результат {?}(x)
Ветвление (условный оператор)
{0, 1}, т.е. ? вычисляет некоторую двузначную функцию (возможно частичную) на словах из ?.
Лемма 9.5. Пусть ? - распознающая м.Т., м.Т.
Ветвление (условный оператор)
вычисляет функцию f(x), а м.Т.
Ветвление (условный оператор)
- функцию g(x). Тогда существует м.Т.
Ветвление (условный оператор)
вычисляющая функцию
Ветвление (условный оператор)

Доказательство. Требуемая м.Т.
Ветвление (условный оператор)

вначале копирует вход x и получает на ленте слово x*x, затем вычисляет параллельную композицию функций ?(x) и тождественной функции e(x)=x и переходит в конфигурацию p{?}(x)*x. Выбор между f и g происходит по следующим командам:
Ветвление (условный оператор)

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

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



для функции копирования, не увеличивая


Задача 9.1. Постройте м.Т. для функции копирования, не увеличивая исходный алфавит ?.
Задача 9.2. Постройте программу м.Т., которая выполняла бы перенос непустого слова в заданное место ленты, т.е. для любого слова w
для функции копирования, не увеличивая
(? \ {
для функции копирования, не увеличивая
})* и n > 0 выполняла преобразование конфигураций:
для функции копирования, не увеличивая

Задача 9.3. Достройте программу м.Т.
для функции копирования, не увеличивая
из леммы 9.1 на этапах 3 и 4.
Задача 9.4. Докажите, что односторонняя м.Т.
для функции копирования, не увеличивая
построенная в лемме 9.2, корректно моделирует исходную м.Т.
для функции копирования, не увеличивая

Задача 9.5. Другой, по сравнению с конструкцией леммы 9.2, подход к моделированию двухсторонней ленты на односторонней заключается в том, чтобы содержимое правой полуленты
для функции копирования, не увеличивая
хранить в четных ячейках
для функции копирования, не увеличивая
а содержимое левой полуленты - в нечетных, поместив в 1-ю ячейку специальный маркер. Постройте программу, реализующую этот подход (ее достоинство - увеличение алфавита ленты всего на 1 символ).
Задача 9.6. Достройте программу м.Т.
для функции копирования, не увеличивая
из леммы 9.4 на этапах 1, 3 и 5.
Задача 9.7. Построить программы машин Тьюринга, вычисляющих следующие функции.

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

  1. для функции копирования, не увеличивая


  2. для функции копирования, не увеличивая


  3. для функции копирования, не увеличивая


  4. для функции копирования, не увеличивая


Задача 9.9. Докажите, что всякую арифметическую функцию f(x), вычислимую на некоторой м. Т. M = , можно также вычислить на м. Т. M',, алфавит ленты которой содержит лишь два символа
для функции копирования, не увеличивая
и |. (Указание: используйте для моделирования одного символа из ? блок из нескольких подряд идущих ячеек, содержащих его код в алфавите {
для функции копирования, не увеличивая
, , | }) и замените каждую команду M группой команд, обрабатывающих соответствующий блок ячеек).


Задача 9.10.
Построить машину Тьюринга, определяющую по слову x в алфавите {1, 2} симметрично ли оно, т. е. вычисляющую функцию:
для функции копирования, не увеличивая

Задача 9.11.
Построить машину Тьюринга, сравнивающую два слова x=x1x2… xn и y=y1y2… ym в алфавите {1, 2, 3} лексикографически:
для функции копирования, не увеличивая
или для некоторого непустого слова x' выполнено y = x x'. Эта машина Тьюринга должна вычислять функцию:
для функции копирования, не увеличивая


Частичная рекурсивность функций, вычислимых по Тьюрингу


В этом параграфе покажем, как можно промоделировать работу машины Тьюринга, используя частично рекурсивные определения.
Теорема 10.3. Всякая арифметическая функция, вычислимая на машинах Тьюринга, является частично рекурсивной функцией.
Доказательство этой теоремы - дополнительный материал, который можно при первом чтении опустить.
Доказательство Пусть м.Т.
Частичная рекурсивность функций, вычислимых по Тьюрингу
вычисляет функцию f(x1,…, xn). Пусть также Q ={q0,q1,… ,q k-1 }, qf=q1 и ? = {a0=
Частичная рекурсивность функций, вычислимых по Тьюрингу
, a1, … , a R-1= | }. Предположим также, не ограничивая общности, что
Частичная рекурсивность функций, вычислимых по Тьюрингу
никогда не пишет пустой символ
Частичная рекурсивность функций, вычислимых по Тьюрингу
(как перестроить программу произвольной м.Т., чтобы она удовлетворяла этому условию ?).
Определим кодирование элементов конфигураций
Частичная рекурсивность функций, вычислимых по Тьюрингу
целыми числами. Пусть конфигурация
Частичная рекурсивность функций, вычислимых по Тьюрингу
имеет вид K=(w1,qi,aj,w2), где
Частичная рекурсивность функций, вычислимых по Тьюрингу
- слово на ленте левее головки, qi - состояние м.Т., aj - наблюдаемый в данной конфигурации символ и w2= aj0aj1 … ajp} - слово на ленте правее головки. Кодом символа aj
Частичная рекурсивность функций, вычислимых по Тьюрингу
? будет число j, кодом состояния qi - число i. Слова w1 и w2 будем рассматривать как числа в R-ичной системе счисления, читаемые в противоположных направлениях (из наших предположений следует, что im
Частичная рекурсивность функций, вычислимых по Тьюрингу
0 при m >0 и jp
Частичная рекурсивность функций, вычислимых по Тьюрингу
0 при p>0) :
Частичная рекурсивность функций, вычислимых по Тьюрингу

Например, если ?= {
Частичная рекурсивность функций, вычислимых по Тьюрингу
, *, |}, то для конфигурации K=(|**,q3,|,* | |) имеем code1(w1)=30 1+31 1+ 32 2= [211]3=22 и code2(w2)=30 1+ 31 2 +32 2= [221]3=25. По программе P определим следующие табличные функции, кодирующие ее команды:
A(i,j) - код символа, который пишет
Частичная рекурсивность функций, вычислимых по Тьюрингу
когда она в состоянии qi видит символ aj;
Q(i,j) - код состояния, в которое переходит
Частичная рекурсивность функций, вычислимых по Тьюрингу
когда она в состоянии qi видит символ aj;
C(i,j) - код направления сдвига головки
Частичная рекурсивность функций, вычислимых по Тьюрингу
когда она в состоянии qi видит символ aj (0 - на месте, 1 - вправо, 2 - влево).
Пусть при i
Частичная рекурсивность функций, вычислимых по Тьюрингу
k или j
Частичная рекурсивность функций, вычислимых по Тьюрингу
R эти функции принимают какое-нибудь фиксированное значение (например, 0). Тогда по лемме 18.1 все они примитивно рекурсивны.
Определим функции, которые по кодам компонент одной конфигурации K=(w1,qi,aj,w2) вычисляют коды компонент следующей конфигурации K’=(w1’,qm,ap,w2’).
Частичная рекурсивность функций, вычислимых по Тьюрингу

Покажем, что все эти функции примитивно рекурсивны.
Для q это следует из того, что для любых i, j q(l,i,j,m)=Q(i,j). Определения остальных трех функций зависят от сдвига. При C(i,j)=0 имеем lf(l,i,j,r)=l, rt(l,i,j,r)= r, a(l,i,j,r)=A(i,j).

Если C(i,j)=2, то lf(l,i,j,r)=div(R, l), rt(l,i,j,r)= rR+A(i,j), a(l,i,j,r)=rm(R,l). Если же C(i,j)=1, то lf(l,i,j,r)=lR+A(i,j), rt(l,i,j,r)= div(R, r), a(l,i,j,r)=rm(R,r) Объединяя эти случаи получаем, что

Частичная рекурсивность функций, вычислимых по Тьюрингу


( здесь rm(x,y) - это функция, дающая остаток от деления y на x, а div(x,y) - функция целочисленного деления y на x).

Аналогичные представления справедливы и для функций rt(l,i,j,r) и a(l,i,j,r). Следовательно, все эти функции примитивно рекурсивны.

Пусть из данной конфигурации K через t тактов получается конфигурация Kt. Определим коды компонент Kt как функции от компонент K и t :

Частичная рекурсивность функций, вычислимых по Тьюрингу


Это определение задает функции A(4), Q(4), Lf(4), Rt(4) с помощью совместной рекурсии. Следовательно, по лемме 18.5 они примитивно рекурсивны.

Пусть м.Т.
Частичная рекурсивность функций, вычислимых по Тьюрингу
вычисляет функцию f(x), (т.е. n=1). Тогда для начальной конфигурации Kx=K0=(
Частичная рекурсивность функций, вычислимых по Тьюрингу
,q0,|,|x-1) code1(w1)=0, code(q0)=0, code(|)=R-1, code2( w2 ) = (R-1)Rx-2+(R-1)R x-3+ … +(R-1)R0=R x-1-1. Положим
Частичная рекурсивность функций, вычислимых по Тьюрингу
и
Частичная рекурсивность функций, вычислимых по Тьюрингу
Тогда функция
Частичная рекурсивность функций, вычислимых по Тьюрингу
задает число шагов до перехода
Частичная рекурсивность функций, вычислимых по Тьюрингу
в заключительное состояние на входе x. Эта функция, очевидно, частично рекурсивна. Тогда функция
Частичная рекурсивность функций, вычислимых по Тьюрингу
задает код правой части заключительной конфигурации, имеющий вид Rf(x)-1-1. Отсюда получаем, что

Частичная рекурсивность функций, вычислимых по Тьюрингу


и следовательно, функция f(x) частично рекурсивна.


Моделирование структурированных программ машинами Тьюринга


На первый взгляд могло показаться, что машины Тьюринга с их примитивными элементарными действиями являются более слабыми вычислительными моделями, чем структурированные программы. Но после того, как мы научились реализовывать с их помощью операторы "высокого уровня " - условия и циклы, уже не удивительно, что они позволяют вычислить не меньше, чем структурированные программы.
Теорема 10.2. Всякая арифметическая функция, вычислимая некоторой структурированной программой, может быть вычислена также некоторой машиной Тьюринга.
Доказательство Пусть структурированная программа ? вычисляет арифметическую функцию f(x1, …, xn). Не ограничивая общности, будем считать, что Var? ={x1, …, xn, xn+1, …, xm } и что результирующей переменной является x1.
М.Т. M? , моделирующая ?, будет иметь m-этажную ленту с алфавитом ? ={
Моделирование структурированных программ машинами Тьюринга
, |, *}
Моделирование структурированных программ машинами Тьюринга
{
Моделирование структурированных программ машинами Тьюринга
, |}m. Обозначим конфигурацию ленты M\Pi, в которой на i-ом этаже, начиная с 1-ой ячейки, записано слева направо ki символов '|' (i = 1, 2, …, m), а далее идут "пустышки "
Моделирование структурированных программ машинами Тьюринга
, как (k1, k2, …, km). Тогда состоянию ?: Var{?}
Моделирование структурированных программ машинами Тьюринга
N программы ? будет соответствовать конфигурация ленты M?: K? =(?(x1),?(x2),… , ?(xm)).
M? получается с помощью конструкций последовательной композиции, условного оператора и цикла из простых машин Тьюринга, реализующих элементарные присваивания и условия структурированных программ.
Команду xi := 0 (i=1,… , m) программы ? реализует м.Т. Mi0 , обнуляющая i-ый этаж M, т.е. переводящая любую конфигурацию (k1,…, ki-1,ki, k i+1 …, km) в конфигурацию (k1,…, k i-1, 0, ki+1, … , km). Команду xi := xi +1 (i=1,… , m) программы ? реализует м.Т. Mi+1 , добавляющая один символ '|' справа на i-ом этаже, т.е. переводящая любую конфигурацию (k1,…, k i-1, ki, ki+1 … , km) в конфигурацию (k1,…, k i-1, ki+1, ki+1, … , km). Команду xi := xj (i, j=1,… , m) программы ? реализует м.Т. Mij, переписывающая содержимое j-го этажа на i-ый, т.е. переводящая любую конфигурацию (k1,…, ki, …, kj, … , km) в конфигурацию (k1,…, kj, … , kj, … , km).

Условие xi = xj реализуется машиной ? =ij, которая, работая на конфигурации (k1, …, ki, …, kj, … , km) выдает 0, если ki=kj, и 1 - в противном случае.

Условие xi < xj реализуется машиной ?
Далее по индукции: пусть ?1 и ?2 - структурированные программы, для которых построены соответствующие машины Тьюринга
Моделирование структурированных программ машинами Тьюринга
и
Моделирование структурированных программ машинами Тьюринга
, а ? - некоторое условие, реализуемое м.Т. M?. Тогда программа ?= ?1 ; ?2 реализуется машиной
Моделирование структурированных программ машинами Тьюринга


программа ?= если ? то ?1 иначе ?2 конец

реализуется машиной M?= if M? then M?1 else M?2 endif, а программа ?= пока ? делай ?1 все реализуется машиной M?= while M? do M?1 enddo.

Используя доказанные выше свойства конструкций машин Тьюринга, нетрудно проверить по индукции следующее

Утверждение 1. Пусть м.Т. M? реализует в соответствии с приведенными определениями структурированную программу ?. Тогда для любого состояния ? программы ? ?(?) = ?1 тогда и только тогда, когда м.Т M?, начав работу в конфигурации K? завершит ее в конфигурации K?1.

Теперь для завершения доказательства теоремы достаточно взять в качестве результирующей следующую м.Т.: M = Mstart; M?; Mend, где м.Т. Mstart переводит одноэтажную начальную конфигурацию
Моделирование структурированных программ машинами Тьюринга
в m-этажную конфигурацию (x1, x2,…, xn, 0,…, 0), а м.Т. Mend заключительную m-этажную конфигурацию (x1, 0,…, 0) переводит в одноэтажную заключительную конфигурацию |x1.


Тезис Тьюринга-Черча и алгоритмически неразрешимые проблемы


Мы рассмотрели три математические модели для описания алгоритмов и вычисляемых ими функций, отражающие различные аспекты и представления о работе абстрактного вычислителя. Из теорем 8.1, 10.2 и 10.3 непосредственно получаем
Следствие. Классы функций, вычислимых с помощью структурированных программ, машин Тьюринга и частично рекурсивных описаний, совпадают.
Естественно, возникает вопрос о том, насколько общим является этот результат? Верно ли, что каждый алгоритм может быть задан одним из рассмотренных способов? На эти вопросы теория алгоритмов отвечает следующей гипотезой.
Тезис Тьюринга-Черча:
Всякий алгоритм может быть задан в виде соответствующей машины Тьюринга или частично рекурсивного определения, а класс вычислимых функций совпадает с классом частично рекурсивных функций и с классом функций, вычислимых на машинах Тьюринга.
Значение этого тезиса заключается в том, что он уточняет общее неформальное определения "всякого алгоритма" и "вычислимой функции" через точные формальные понятия машины Тьюринга, частично рекурсивного определения и соответствующих им классов функций. После этого можно осмысленно ставить вопрос о существовании или несуществовании алгоритма, решающего тот или иной класс задач. Теперь этот вопрос следует понимать как вопрос о существовании или несуществовании соответствующей машины Тьюринга, или (что эквивалентно) структурированной программы, или частично рекурсивного определения соответствующей функции.
Можно ли доказать этот тезис как теорему? Нет, поскольку в его формулировке речь идет о неточных понятиях "всякого алгоритма" и "вычислимой функции", которые не могут быть объектами математических рассуждений. На чем же тогда основана уверенность в справедливости тезиса Тьюринга-Черча? В первую очередь, на опыте. Все известные алгоритмы, придуманные за многие века математиками, могут быть заданы с помощью машин Тьюринга. Для всех многочисленных моделей алгоритмов, появившихся за последние 70 лет (некоторые из них мы упоминали в начале лекции), была доказана их равносильность машинам Тьюринга.
В качестве доводов в пользу тезиса Тьюринга- Черча можно также рассматривать замкнутость класса машин Тьюринга и ч.р.ф. относительно многочисленных естественных операций над алгоритмами и функциями. Отметим также, что тезис Тьюринга-Черча обращен и в будущее: он предполагает, что какие бы новые формальные определения алгоритмов ни были предложены (а таковыми, например, являются новые языки программирования), все они не выйдут из класса алгоритмов, задаваемых машинами Тьюринга.

Чтобы показать связь теории алгоритмов с "практическим" программированием, рассмотрим некоторые алгоритмичские проблемы, связанные со структурированными программами.

Зафиксируем конечный алфавит A={a0, a1,…, am-1}, включающий все символы латинского алфавита, цифры, знак пробела (пусть это будет a0), знаки ';', '=', '<', ':=' , а также знаки-ключевые слова если, то, конец, пока, делай и все. Тогда каждая структурированная программа ? представляет собой некоторое слово
Тезис Тьюринга-Черча и алгоритмически неразрешимые проблемы
в алфавите A. Не ограничивая общности, будем считать, что это слово начинается не с пробела, т.е. i1 >0. Тогда слово w? однозначно определяет натуральное число n?, m-ичной записью которого оно является, т.е.
Тезис Тьюринга-Черча и алгоритмически неразрешимые проблемы
Назовем это число номером программы ?. По тексту программы ? ее номер n? определяется однозначно. Рассмотрим теперь обратное соответствие. Конечно, не каждое число является номером некоторой структурированной программы. Поэтому сопоставим каждому числу n
Тезис Тьюринга-Черча и алгоритмически неразрешимые проблемы
N структурированную программу ?n следующим образом: если n=n? для некоторой программы ?, то ?n=?, иначе, т.е. когда n не является "естественным" номером никакой программы, сопоставим ему в качестве ?n

некоторую никогда не останавливающуюся программу P (например, программу ?5(1): x1 := x1; пока x1=x1 делай x1:=x1 все из примера 7.5).


Вычислимость частично рекурсивных функций по Тьюрингу


Теорема 10.1. Для всякой ч.р.ф. f существует м.Т.
Вычислимость частично рекурсивных функций по Тьюрингу
вычисляющая функцию f.
Доказательство. Доказательство проведем индукцией по определению частично рекурсивной функции f.
Базис. Вычислимость простейших функций машинами Тьюринга очевидна.
Индукционный шаг. Покажем, что операторы суперпозиции, примитивной рекурсии и минимизации сохраняют вычислимость по Тьюрингу. Все используемые м.Т. будем предполагать односторонними со стандартными заключительными конфигурациями.
Суперпозиция. Пусть Fm и fn1,…, fnm
- ч.р.ф., вычислимые на м.Т.
Вычислимость частично рекурсивных функций по Тьюрингу
соответственно. Пусть функция Gn получена из них с помощью суперпозиции: Gn=[Fm;fn1,…, fnm]. Тогда м.Т.
Вычислимость частично рекурсивных функций по Тьюрингу

вычисляющая G, работает следующим образом:
  1. m раз копирует вход
    Вычислимость частично рекурсивных функций по Тьюрингу
    отделяя одну копию от другой символом #;
  2. на полученном слове вида
    Вычислимость частично рекурсивных функций по Тьюрингу
  3. запускает параллельную композицию машин
    Вычислимость частично рекурсивных функций по Тьюрингу
    и получает конфигурацию вида
    Вычислимость частично рекурсивных функций по Тьюрингу
    где yi=fi(x1,…,xn) (i
    Вычислимость частично рекурсивных функций по Тьюрингу
    [1,m]).
  4. заменяет все символы 0023 на *;
  5. затем запускает программу м.Т.
    Вычислимость частично рекурсивных функций по Тьюрингу
    на получившемся после этапа 3) входе вида
    Вычислимость частично рекурсивных функций по Тьюрингу
    и вычисляет требуемое значение
    Вычислимость частично рекурсивных функций по Тьюрингу

Если обозначить м.Т., выполняющую копирование на этапе (1), через Копm, а м.Т., выполняющую замену # на * на этапе (3), через Зам*#, то требуемую для суперпозиции м.Т.
Вычислимость частично рекурсивных функций по Тьюрингу
можно представить как
Вычислимость частично рекурсивных функций по Тьюрингу

Примитивная рекурсия. Пусть функция Fn+1(x1,… ,xn,y) получена с помощью оператора примитивной рекурсии из функций gn(x1,…, xn) и fn+2(x1,… ,xn, y, z), которые вычислимы на м.Т.
Вычислимость частично рекурсивных функций по Тьюрингу
и
Вычислимость частично рекурсивных функций по Тьюрингу
. Определим вспомогательные м.Т.:
  • Вычислимость частично рекурсивных функций по Тьюрингу
    используя
    Вычислимость частично рекурсивных функций по Тьюрингу
    строит по входу вида
    Вычислимость частично рекурсивных функций по Тьюрингу
    конфигурацию на ленте
    Вычислимость частично рекурсивных функций по Тьюрингу
  • Вычислимость частично рекурсивных функций по Тьюрингу
    используя
    Вычислимость частично рекурсивных функций по Тьюрингу
    строит по входу вида
    Вычислимость частично рекурсивных функций по Тьюрингу
    конфигурацию
    Вычислимость частично рекурсивных функций по Тьюрингу
  • Вычислимость частично рекурсивных функций по Тьюрингу
    на входе вида
    Вычислимость частично рекурсивных функций по Тьюрингу
    выдает в качестве результата
    Вычислимость частично рекурсивных функций по Тьюрингу
  • ? на входе вида
    Вычислимость частично рекурсивных функций по Тьюрингу
    проверяет условие y
    Вычислимость частично рекурсивных функций по Тьюрингу
    u.

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

Вычислимость частично рекурсивных функций по Тьюрингу

Минимизация. Пусть fn(x1,…, xn) = ? y [ gn+1(x1,…, xn,y)=0] и м.Т.
Вычислимость частично рекурсивных функций по Тьюрингу
вычисляет функцию gn+1. Определим следующие вспомогательные м.Т.:
Вычислимость частично рекурсивных функций по Тьюрингу
приписывает аргумент 0 ко входу, т.е. вход вида
Вычислимость частично рекурсивных функций по Тьюрингу
переводит в конфигурацию на ленте
Вычислимость частично рекурсивных функций по Тьюрингу
(напомним, что при унарном кодировании 0 соответствует пустой символ).

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

Через E обозначим м.Т., которая ничего не делает.

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


в
Вычислимость частично рекурсивных функций по Тьюрингу
, где z= g(x1,… ,xn, y)

? на входе вида w # v проверяет непустоту v (т.е. условие v > 0).

Вычислимость частично рекурсивных функций по Тьюрингу


Таким образом, при v=g(x1,…,xn,y) машина ? проверяет условие g(x1,…,xn,y)
Вычислимость частично рекурсивных функций по Тьюрингу
0.

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


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

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


Вычислимость частично рекурсивных функций по Тьюрингу


Из этого определения непосредственно следует, что
Вычислимость частично рекурсивных функций по Тьюрингу
вычисляет функцию fn(x1,…, xn), заданную с помощью оператора минимизации.


и минимизации, действительно правильно реализуют


Задача 10.1. Докажите, что машины Тьюринга
и минимизации, действительно правильно реализуют
и
и минимизации, действительно правильно реализуют
определенные в доказательстве теоремы 10.1 для примитивной рекурсии и минимизации, действительно правильно реализуют указанные операторы.
Задача 10.2. Постройте машины Тьюринга Mi0 , Mi+1, Mij, ? ij =, ? ij<, Mstart и Mend, определенные в доказательстве теоремы 10.2.
Задача 10.3.
Докажите утверждение 1, сформулированное в доказательстве теоремы 10.2, используя индукцию по построению программы ? и соответствующей м.Т. M?.
Задача 10.4. В доказательстве теоремы 10.3 рассмотрен случай, когда м.Т.
и минимизации, действительно правильно реализуют
вычисляет функцию от одного аргумента f(x) . Покажите, что теорема верна и в общем случае для функций f(x1,…,xn) при любом n.
Задача 10.5.
Докажите, что отношение алгоритмической сводимости
и минимизации, действительно правильно реализуют
m является рефлексивным и транзитивным.
Задача 10.6.
Доказать алгоритмическую неразрешимость следующих проблем.
  • По произвольной программе ? определить, является ли вычисляемая ей функция ??,y(x) постоянной константой.
  • По произвольной программе ? и числам a и b проверить равенство ??,y(a)=b.
  • По произвольной программе ? определить, является ли множество значений вычисляемой ею функции ??,y(x) бесконечным.
  • По произвольной паре программ ? и ?' проверить, что для всех x имеет место неравенство ??,y(x) > ??',y(x).

Задача 10.7. Докажите, что
  • пересечение двух разрешимых множеств является разрешимым множеством.
  • объединение двух разрешимых множеств является разрешимым множеством.

Задача 10.8.
Докажите, что для двух разрешимых множеств A и B их "сумма" A+B={ x+y | x
и минимизации, действительно правильно реализуют
A, y
и минимизации, действительно правильно реализуют
B} также является разрешимым множеством.
Задача 10.9. Пусть A - разрешимое множество, а g(x) и h(x) являются о.р.ф. Докажите, что функция
и минимизации, действительно правильно реализуют

также является общерекурсивной.



    Учет: Делопроизводство - Автоматизация - Софт