конечные автоматы

advertisement
КОНЕЧНЫЕ АВТОМАТЫ
Конечный автомат можно представить как “черный ящик”, внутреннее устройство которого нам
неизвестно, но известно, что он может находиться в одном из некоторого конечного числа состояний
(неважно, что это означает с точки зрения устройства конечного автомата). Время от времени через
входные устройства происходит воздействие (подается входной сигнал) на конечный автомат. Число
этих воздействий тоже конечно. При воздействии автомат переходит (или не переходит) в новое
состояние и генерирует некоторый выходной сигнал, число которых также должно быть конечно.
Можно считать, что время в нашей модели дискретно, то есть “жизнь и поведение” автомата целиком
описываются последовательностями входных сигналов, состояний автомата и выходных сигналов.
Пример. Компьютер является конечным автоматом. Действительно, можно считать, что он состоит из
набора простейших (битовых элементов). Пусть N – число этих элементов. Каждый элемент может
находиться в двух состояниях (0 и 1), тогда, например, компьютер из двух элементов (таких, конечно,
на практике не бывает) может находиться в 4 состояниях, а компьютер из N элементов в 2N различных
состояниях. Заметим, что число это может быть очень большим.
Способы описания конечных автоматов
Так как структура конечного автомата нам неизвестна, то мы не можем ее описать. Можно описать
только, как он функционирует.
Все способы описания конечного автомата – это описание его функционирования.
Входные и выходные сигналы конечного автомата для удобства можно обозначать символами. В
связи с этим часто говорят о входном и выходном алфавите конечного автомата. То же можно сделать и
с состояниями. В простых случаях удобно использовать для их обозначения просто целые числа 0, 1, 2,
3 и т.д.
Задание конечного автомата таблицей
Любой конечный автомат можно описать таблицей. В ней для каждого входного символа и для
каждого состояния автомата указывается, в какое состояние автомат переходит и какой выходной
символ он генерирует.
Пример. Опишем функционирование автомата, который запоминает один символ (или осуществляет
задержку сигнала).
Состояние автомата до
входного сигнала
(то, что он «помнил»)
Входной
сигнал
Состояние автомата после
входного сигнала
(запоминает поступивший
сигнал)
Выходной сигнал
(автомат выдает
то, что он «помнил»
до входного сигнала)
0
0
0
0
0
1
1
0
1
0
0
1
1
1
1
1
1
Задание конечного автомата графом
Сопоставим каждому состоянию автомата точку или кружок на плоскости – вершину графа, а
каждому переходу автомата из одного состояния в другое – дугу, соединяющую эти вершины.
Направление дуги соответствует ходу «времени». Рядом с дугой напишем входной символ,
вызывающий такой переход, а в скобочках выходной символ, порождаемый автоматом.
Пример.
Для элементарного запоминающего автомата граф будет таким.
Задачи 1.
Опишите конечный автомат проверки на четность числа подающихся
единиц, если, как и в предыдущем примере, входной и выходной
состоят из 0 и 1, причем выходной сигнал 0 означает, что число всех
поступивших на вход 1 было четным, а 1- нечетным. Сколько состояний
придуманный конечный автомат. Является ли число состояний минимальным?
на
вход
алфавиты
имеет
Задачи 2.
Представьте придуманный автомат в виде таблицы и в виде графа.
Работа конечного автомата
Для описания работы конечного автомата нужно задать начальное состояние, после чего по входной
последовательности сигналов однозначно определяется последовательность состояний и выходных
сигналов.
Пример.
Рассмотрим протокол работы запоминающего автомата. Начальным его состоянием естественно
считать 0. Пусть автомат работает на следующей последовательности входных сигналов: 11001.
Заполним табличку протокола работы автомата:
Время
0
1
2
3
4
Входной сигнал
1
1
0
0
1
Состояние
0
1
1
0
0
Выходной сигнал
0
1
1
0
В начале выходной последовательности появился 0, который хранился в памяти автомата перед
началом его работы.
Обратите внимание на задержку сигнала автоматом и на потерю на выходе последней 1 (она
сохраняется в памяти автомата).
Задача 3.
В условиях предыдущего упражнения напишите протокол работы построенного конечного автомата
на последовательности 0101100111.
Это интересно.
Самообучающийся автомат Клода Шеннона для игры в чет-нечет
Случай, о котором будет рассказано, давно стал легендой, поэтому мы расскажем его, не претендуя
на точность деталей.
Произошел он в те времена, когда информатика называлась кибернетикой, а программисты
(кибернетики), вместо написания программ, строили исполнителей прямо в «железе».
Однажды кибернетики решили посоревноваться в искусстве программирования и договорились
сделать автоматы для игры в чет-нечет и устроить между ними турнир. Чей автомат выиграет, тот и
будет самым искусным кибернетиком.
2
В день турнира все соревнующиеся принесли большие автоматы, а Клод Шеннон принес маленький.
В современных терминах это означает, что его программа была небольшой и изящной. Началось
соревнование. Каждая партия протекала так: противники называли 0 или 1, если у обоих автоматов
цифры оказывались равными, выигрывал один из них (по предварительной договоренности их
создателей), если разные – другой. После этого ходы противников и результат партии (1– выиграл, 0 –
проиграл) вводились в автоматы. Это делалось для того, чтобы у автоматов была возможность анализа
сыгранных партий и учета полученных результатов в следующих партиях. Когда турнир закончился,
оказалось, что с завидным преимуществом выиграл автомат Клода Шеннона.
Кибернетикам не терпелось узнать, что же придумал Клод Шеннон. Оказалось, что его автомат имел
две стратегии: одна заключалась в том, что называлось число, совпадающее с ходом противника в
предыдущей партии, вторая – в том, что называлось противоположное число. Все обучение
заключалось в правиле переключения с одной стратегии на другую. Если в очередных трех партиях
автомат одерживал две или три победы, он сохранял стратегию, если нет – менял.
Проанализируем автомат Клода Шеннона. Если считать, что переключение стратегий делает не сам
автомат, а, например, его создатель, то автомат Клода Шеннона можно представить в виде двух
простых конечных автоматов. Один – просто осуществляет задержку сигнала, то есть передает входной
сигнал на выход в следующем такте работы, второй – инвертирует сигнал.
Если мы хотим описать автомат Клода Шеннона как единый конечный автомат, то число состояний
будет гораздо большим. Действительно, автомат имеет две стратегии, для каждой стратегии нужно
помнить сколько партий сыграно и сколько из них закончилось победой (это достигается переходами в
новые состояния). Кроме того, в начальный момент автомат должен сделать ход, не зная предыдущего
хода противника. Так набирается более десятка различных состояний.
Задача 4.
Опишите в терминах таблиц и графов автомат Клода Шеннона.
Задача 5.
Напишите программу для игры в чет-нечет, моделирующую автомат Клода Шеннона. Попробуйте
модернизировать его, меняя число стратегий (например, возможна стратегия «называть всегда 1») и
число партий, после которых осуществляется переключение стратегий. Устройте соревнование между
различными версиями программ и определите лучшую из них.
Занимательная деятельность.
Сыграем с автоматом в простую игру. Правила игры такие. На игровом столе лежит кучка предметов
(для простоты будем считать, что число предметов не больше 10). За один ход игрок может взять 1, 2
или 3 предмета. Проигрывает взявший последний предмет. Первый ход делаем мы. Ниже в виде
таблицы представлен конечный автомат для игры по этим правилам.
Состояние (число
предметов в кучке)
Взят 1 предмет
1
–
Взято 2 предмета
–
Взято 3 предмета
–
2
3
4
5
6
7
8
9
10
1
1
2
3
1
1
2
3
1
1
1
2
3
1
1
2
3
–
1
1
2
3
1
1
2
–
В таблице представлены только выходные сигналы – ходы автомата. Определить новое состояние
автомата несложно – нужно из текущего состояния вычесть числа, определяющие ходы противников
(то есть входной и выходной сигналы).
Задача 6.
Проследите за выигрышными путями в графе. Отметьте выигрышные состояния автомата, то есть
такие, попав в которые автомат обязательно выигрывает. Опишите стратегию поведения автомата в
невыигрышных ситуациях.
3
Двоичный последовательный сумматор
У конечного автомата число состояний, входной и выходной алфавиты конечны, но, несмотря на это,
он может оперировать и с бесконечными объектами. Например, на вход автомата можно подать сколь
угодно длинную непериодическую последовательность символов.
Опишем конечный автомат для сложения натуральных чисел сколь угодно большой длины.
Вводить цифры слагаемых будем поразрядно и попарно (одну цифру от одного числа, другую – от
другого), начиная с младших разрядов.
Рассмотрим для простоты слагаемые в двоичной записи, тогда входной алфавит будет максимально
простым. Он будет состоять из четырех символов: (00), (01), (10), (11), которые включают все
возможные комбинации складываемых цифр. Число состояний складывающего автомата будет равно
двум, независимо от того, в двоичном или десятичном преставлении вводятся числа. Одно из состояний
соответствует тому, что к складываемым единицам разряда надо добавить 1 (один в «уме»). Другое –
тому, что этого делать не нужно.
Ниже приведены табличное и графическое представления двоичного последовательного сумматора.
Складываемые
единицы
разряда
(00)
(10)
(01)
(11)
Результат сложения
(новое состояние)
Состояние
0 «в уме»
0 (0)
1 (0)
1 (0)
0 (1)
Состояние
1 «в уме»
1 (0)
0 (1)
0 (1)
1 (1)
Пример. Рассмотрим протокол сложения чисел 30 и 7.
В двоичной записи это числа 11110 и 111. Дополним двоичную запись меньшего числа нулями впереди
для того, чтобы они стали равной длины. Чтобы получить все цифры результата, нужно учесть
возможный перенос разряда и задержку во времени при выдаче цифр результата. Поэтому добавим еще
по паре нулей впереди обоих чисел.
Ниже представлен протокол работы автомата. Цифры чисел записаны в обратном порядке.
такты
вход
состояние
выход
0
(01)
0
–
1
(11)
0
1
2
(11)
1
0
3
(10)
1
1
4
(10)
1
0
5
(00)
1
0
6
(00)
0
1
Прочитаем результат сложения в последней строке справа налево. Получим 100101, или в
десятичной системе 37.
Задача 7.
Опишите конечный автомат для сложения натуральных чисел в обычной десятичной записи.
Сколько символов будет во входном алфавите этого автомата? Сколько в выходном?
4
Задача 8.
Разработайте и опишите автомат для вычитания двоичных чисел.
Границы возможностей конечного автомата
Конечный автомат является моделью и человеческого мозга и компьютера. Поэтому очень важно
понять, каковы же принципиальные ограничения возможностей конечных автоматов. Тогда мы можем
узнать принципиальные ограничения человеческих возможностей и возможностей компьютера.
Теорема1. Если на вход конечного автомата подается постоянный сигнал, то последовательность
выходных символов будет периодической.
Доказательство. Поскольку число состояний конечно, автомат в некоторый момент перейдет в одно
из уже пройденных ранее состояний. С этого момента начнется зацикливание, так как, по определению
конечного автомата, новое состояние и выходной символ определяются только текущим состоянием и
входным символом. Но входной символ не изменился, значит, автомат оказался в условиях, идентичных
уже имевшимся.
У этой теоремы есть образная формулировка – «предоставленный самому себе конечный автомат
зацикливается».
Рассуждение при доказательстве теоремы тоже имеет образную формулировку – «конечный автомат
не помнит своей предыстории».
Следствие 1. Не существует конечного автомата, который мог бы вычислить корень из 2 с любой
заданной точностью.
Доказательство. Известно, что корень из 2 – число иррациональное. Десятичное представление
иррационального числа – непериодическая дробь. На вход автомата, кроме числа 2, ничего не
поступает, следовательно, по теореме 1, конечный автомат не сможет породить бесконечную
непериодическую дробь.
Следствие 2. Если входной сигнал постоянен, то период выходной последовательности не
превышает числа состояний конечного автомата.
Справедливость этого утверждения следует непосредственно из доказательства теоремы.
Теорема 2. Не существует конечного автомата, перемножающего натуральные числа произвольной
длины.
Доказательство. Докажем теорему в предположении, что числа вводятся парами цифр, начиная с
младших разрядов. Предположим, что такой автомат построен и имеет N состояний. Перемножим,
например, два одинаковых числа вида 100..00, оканчивающихся N нулями. Тогда результат должен
иметь такой же вид, но с 2N нулями. После ввода N цифр произведения автомат должен проработать
еще, по крайней мере, N+1 такт, чтобы выдать произведение. При этом на его вход уже ничего не
подается (точнее, подается пустой символ). По теореме 1, автомат будет генерировать периодическую
последовательность с периодом не больше N. Поэтому, выдав следующие N нулей, он уже не сможет
выдать последнюю единицу.
МАШИНЫ ТЬЮРИНГА
Машина Тьюринга – это конечный автомат с подсоединенной к нему лентой бесконечной длины, на
которую он может записывать выходные сигналы и которая является в то же время источником
входящих сигналов.
Чтобы управлять процессом считывания и записи, машина может передвигать ленту влево, вправо,
либо оставлять на месте. Важная особенность нашей модели – дискретность. Лента считается
разделенной на клетки, в каждую из которых записывается только один символ.
5
Лента машины Тьюринга является ее важнейшим элементом, она моделирует всю внешнюю среду.
Конечно, внешняя среда на самом деле тоже имеет свои границы, хотя бы в силу ограниченности
Вселенной, но для наших целей это не слишком обременительное ограничение. Машина Тьюринга
гораздо лучше моделирует реальный компьютер, чем конечный автомат. Действительно, все внешние
устройства можно считать лентой конечной длины, которая может наращиваться (увеличение емкости
внешних устройств памяти) по мере необходимости.
Тезис Тьюринга
Если у задачи есть алгоритм решения, то можно построить такую машину Тьюринга, которая
решает эту задачу.
На первый взгляд этот тезис кажется теоремой, но доказать ее нельзя, так как у нас нет строгого
определения алгоритма.
Кому-то, наоборот, это может показаться очевидным, так как мы привыкли отождествлять алгоритм
с программой его реализации на компьютере. Но как раз последнее утверждение и надо доказывать.
Компьютер – это инженерное устройство, имеющее точное описание, машина Тьюринга – абстрактное
понятие, но тоже имеющее строгое математическое описание, и то, что обе машины – реальная (почти
реальная, так как память разрешается наращивать без ограничений) и теоретическая – имеют
одинаковые возможности, не совсем очевидно. Более того, на первый взгляд возможности компьютера
гораздо шире возможностей машины Тьюринга. И все же можно доказать, что эти устройства
равносильны, и все, что может сделать компьютер с неограниченной памятью, может выполнить
машина Тьюринга. Для теоретических целей она гораздо удобнее, так как ее чрезвычайно простое
устройство не затемняет основных свойств алгоритмов.
Идея машины Тьюринга появилась в 1936 году, когда не было еще электронной вычислительной
техники. Фактически, это и была первая попытка создать теоретический компьютер как способ
строгого определения алгоритма.
Описание машины Тьюринга
Машину Тьюринга можно описать с помощью таблицы (в таблице, кроме нового состояния и
выходного символа, нужно описать еще и результат сдвига ленты). Машину Тьюринга можно описать и
в виде графа, при этом результат сдвига ленты можно записывать в вершину графа (дуги,
соответствующие сохранению состояния и символа на ленте, когда входной символ, считывающийся с
ленты, совпадает с выходным символом, который пишется на ленту, можно опускать, чтобы не
перегружать схему).
Таблицу можно не рисовать, а лишь перечислить все ее элементы. Например, набор пятерок (Q1 a1
Q2 a2 T) описывает машину Тьюринга, где Q1 – исходное состояние машины, a1- просматриваемый
символ ленты (входной символ), Q2 – новое состояние машины, a2- символ, записываемый на ленту, T –
указатель сдвига ленты (Т=R-переход к просмотру правого символа, Т=L – левого, если, вместо Т,
стоит прочерк, то это означает, что сдвига ленты не происходит).
Пример.
Рассмотрим машину Тьюринга, которая осуществляет перевод записи натурального числа из
единичного кода в двоичный. Единичный код числа N – это N единиц, записанных подряд на ленте
(остальные клетки ленты пусты или заполнены нулями).
Замечание.
Конечного автомата для решения этой задачи не существует. Действительно, пусть такой автомат
существует и M – число его состояний. Переведем в двоичную запись число из 2 M единиц. Тогда на
выходе должна получиться единица с M нулями. Но на вход автомата подается постоянный символ
(единица), поэтому последовательность на выходе должна повторяться не более, чем через M (число
всех состояний автомата) символов. Следовательно, единица с M нулями на выходе появиться не
может.
Идея решения.
6
Идея решения связана с алгоритмом перевода числа в двоичную систему – делением его на 2 с
выделением частного и остатка. При этом остаток – есть очередная (с конца) цифра, а к частному
применяются те же операции. Работа заканчивается, когда частное равно нулю.
Деление на 2 моделируется в машине Тьюринга вычеркиванием единиц через одну (заменой их
другим символом, например, x), При встрече с очередной единицей происходит переход из состояния
Q0 (чет) в состояние Q1(нечет) или наоборот. Остаток определяется четностью-нечетностью числа
просмотренных единиц, то есть, если при встрече с нулем (предполагается, что все клетки ленты, кроме
единиц, изображающих число, заполнены нулями) текущим состоянием будет Q0, то остаток равен 0, и
состояние Q0 переходит в состояние Q2 (запоминается остаток 0), если при встрече с нулем текущим
состоянием будет Q1, то остаток равен 1, и состояние Q1 переходит в состояние Q3 (запоминается
остаток 1). Все эти действия совершаются при движении ленты в одну сторону. При обратном
(холостом) движении ленты ни количество оставшихся единиц, ни количество символов х
(вычеркнутых единиц) не меняется. После встречи нуля, ограничивающего число с другой стороны,
вместо него ставится один из двух знаков: а, если остаток равен нулю, или b, если остаток равен
единице. Это и есть очередная (с конца) цифра числа в двоичной записи. Теперь движение ленты
пойдет в обратном направлении, при этом состояние Q2 (или Q3) переходит в состояние Q4, которое
имеет смысл поиска начала текущего частного и остается неизменным при дальнейшем движении
ленты вправо до встречи с единицей или нулем.
Ниже представлены состояния ленты в моменты перехода в состояние Q4, то есть перед
очередным движением вправо. В первой строке представлено исходное состояние ленты.
b

a

a
b

b
b
0
1
1
1
1
1
1
1
1
1
1
0
a

a
x
1
x
1
x
1
x
1
x
1
0
x
x
x
1
x
x
x
1
x
x
0
a
x
x
x
x
x
x
x
1
x
x
0
a
x
x
x
x
x
x
x
x
x
x
0
Построим теперь граф машины Тьюринга, решающей эту задачу. Ее описание, как уже
упоминалось выше, можно представить наборами из пяти символов (считываемый символ, состояние,
записываемый символ, новое состояние, переход на просмотр соседнего символа).
В начальный момент лента установлена так, что обозревается самая левая единица числа.
Q0 1 Q1 x R {обозревается левая единица числа, она заменяется на x (вычеркивается), и
машина переходит к просмотру правого соседнего символа};
Q1 1 Q0 1 R (следующая «четная» единица сохраняется};
Q0 0 Q2 – L {если все единицы просмотрены (то есть очередной символ – ноль) и их число
четно (состояние Q0), запоминаем четность или, что то же самое, остаток 0
(переход в состояние Q2) и начинаем передвигать ленту в обратном
направлении без изменения ее содержания};
Q1 0 Q3– L {действие, аналогичное предыдущему, но с запоминанием нечетности
просмотренных единиц (состояние Q3)}.
7
Далее нужно перечислить все комбинации, описывающие движение ленты без изменения
содержания: если машина находится в состояниях Q2 или Q3, а на ленте находятся 1 или x, то
просматривается следующий слева символ. Таких пятерок 4, например,
Q3 x Q3 x L
Q3 1 Q3 1 L и то же самое с заменой Q3 на Q2 .
Наконец, когда лента доходит до нуля, вместо него пишется a или b, в зависимости от четности
просмотренных единиц (состоянию Q2 соответствует символ a, состоянию Q3 – символ b):
Q2 0 Q4 a R или
Q3 0 Q4 b R
Переходим к следующему движению ленты вправо, пропуская все цифры a и b двоичной записи
числа, которое постепенно формируется слева от единичной записи:
Q4 a Q4 a R
Q4 b Q4 b R
Далее пропускаем также все вычеркнутые единицы
Q4 x Q4 x R
Перевод числа в двоичную запись может закончиться либо продолжиться в зависимости от того, какой
символ при движении вправо будет встречен первым: ноль или единица. Если в состоянии Q4 машине
встречается ноль, то это означает, что все единицы вычеркнуты, и машина переходит в состояние Q5
(фактически, это означает остановку, так как в описании машины нет пятерок, имеющих в качестве
исходного состояние Q5):
Q4 0 Q5 - Если же очередной символ не ноль, а единица, то вычеркиваем ее и переходим в состояние Q1:
Q4 1 Q1 x R {переход к повторению процесса подсчета единиц}.
Единственные изменения, которые надо внести – пропуск символа x в состояниях Q0 и Q1:
Q1 x Q1 x R
Q0 x Q0 x R
Замечание.
Перечисление наборов можно воспринимать как описание машины Тьюринга, то есть как
описание алгоритма. Представленное описание действительно напоминает программу для компьютера,
только «команды» исполняются не обязательно в порядке их расположения в тексте. Очередная
«команда» определяется по текущему состоянию и обозреваемому символу. Неоднозначности при
описании машины Тьюринга быть не должно.
Сравним машину Тьюринга для получения двоичной записи натурального числа с привычным
описанием алгоритма, решающего ту же задачу.
D- пустая строка; M:=N
ЦИКЛ-ПОКА M0
НЦ M:=M mod 2;
ЕСЛИ M=0 ТО добавить к строке D символ a справа
ИНАЧЕ добавить к строке D символ b справа
КЦ
Мы видим, что алгоритм включает и оператор присваивания, и арифметическую операцию, и
условный оператор, и цикл, то есть основные стандартные конструкции алгоритмического языка. Это
подтверждает гипотезу о том, что машина Тьюринга может моделировать любую компьютерную
программу.
Задача 9.
Опишите машину Тьюринга для вычисления остатка при делении на три. Существует ли
конечный автомат для решения этой задачи? Если да, то постройте его.
Задача 10.
Опишите машину Тьюринга для перемножения чисел в единичном коде.
(Напомним, что конечного автомата для решения этой задачи не существует).
Замечания.
1. В машине Тьюринга можно использовать полубесконечную ленту, а число символов алфавита можно
уменьшить до двух за счет увеличения числа ее состояний (а можно и наоборот: использовать только
два состояния за счет расширения алфавита).
8
2. Развивая теорию машин Тьюринга, можно доказать, что существует универсальная машина
Тьюринга, которая может выполнить все то, что делает любая другая машина. Иными словами, эта
машина Тьюринга моделирует любую другую машину Тьюринга и, тем самым, выполняет любой
алгоритм. Универсальная машина Тьюринга, таким образом, является моделью алгоритмически
разрешимой задачи.
Мы не будем доказывать эту теорему. Отметим только механизм построения универсальной
машины:
“Половину” ленты универсальной машины Тьюринга занимают описания всех существующих
машин Тьюринга (а сделать это можно вследствие дискретности их описания), другая половина
оставляется как рабочая область. Универсальная машина является интерпретирующей машиной, то есть
по заданной метке она находит на ленте место с описанием нужной машины Тьюринга (нужного
алгоритма) и интерпретирует ее “команды” в рабочей области ленты.
Можно подумать, что универсальная машина Тьюринга обязательно должна иметь очень большой
алфавит или очень большое число состояний. Но М. Минский описал конструкцию универсальной
машины, которая имеет всего 4 символа и 7 состояний!
Границы возможности машин Тьюринга
Машина Тьюринга является строгим определением алгоритма.
Поэтому вопрос о возможностях машин Тьюринга равносилен вопросу о существовании алгоритмов
для решения задач.
Оказывается, есть задачи, для которых не существует алгоритма решения.
Теорема Успенского-Райса.
Нельзя написать программу, которая, получив на входе текст произвольной программы, смогла бы
определить, может зациклиться данная программа или нет.
Замечание
Эта теорема называется проблемой останова.
Доказательство.
Пусть такая программа существует. Обозначим ее S. На ее вход подается текст любой программы
T, результатом S(T) работы программы S является True, если T –текст «хорошей» программы, и False,
если T – текст “зацикливающейся” программы.
Теперь напишем программу P, текст T1 которой представлен ниже.
ЕСЛИ S(T) {Т –текст хорошей программы}
ТО ПОВТОРЯТЬ x:=x {искусственное зацикливание}
ИНАЧЕ STOP {останов работы программы}
Какой результат S(T1) даст программа S при вводе текста этой программы? Предположим, что
True, тогда это означает, что программа P останавливается при вводе любого текста. Следовательно, по
смыслу программы P, она будет зацикливаться при вводе текста T1, и это означает, что программа S
работает неправильно. Но выдать False она не может по тем же причинам, так как это означает, что
программа P может зациклиться, а тогда, по содержанию программы P, она должна, наоборот,
обязательно остановиться.
Замечание.
На первый взгляд, может показаться, что приведенное доказательство содержит замкнутый круг.
На самом деле это не так, хотя некоторая необычность в нем есть. Необычность состоит в том, что
“нехорошая” программа строится на основе программы распознавателя. То есть “противник” должен
знать текст программы-распознавателя, чтобы придумать нераспознаваемую программу.
Пример.
Рассмотрим пример построения нераспознаваемой программы в конкретном случае. Пусть
гипотетическая программа решения задачи останова выглядит так:
ПРОГРАММА S(T)
НАЧАЛО
9
ЕСЛИ в тексте T анализируемой программы содержится слово
«повторять»
ТО S(T):=False
ИНАЧЕ S(T):=True
КОНЕЦ
Тогда программа противника выглядит так:
ПРОГРАММА P(T)
НАЧАЛО
ЕСЛИ S(T)
ТО ПОВТОРЯТЬ x:=x {искусственное зацикливание}
ИНАЧЕ STOP {останов работы программы}
КОНЕЦ
ПОДПРОГРАММА S(T)
НАЧАЛО S
ЕСЛИ в тексте T анализируемой программы содержится
слово «повторять»
ТО S(T):=False
ИНАЧЕ S(T):=True
КОНЕЦ S
Текст T1 этой программы содержит слово “повторять”, поэтому, по нашей гипотезе, эта программа
должна зациклиться. Но она остановится, так как подпрограмма S обнаружит это слово и присвоит
S(T1) значение False. Но тогда в программе P выполнится команда STOP, и она остановится. Таким
образом, построена программа, которая будет останавливаться, хотя и содержит «недозволенное» слово
в своем тексте.
Замечание.
В приведенных рассуждениях мы не использовали модель машины Тьюринга. Но, как уже
говорилось, обычное описание алгоритма эквивалентно описанию его в форме машины Тьюринга.
Задача 11
Сформулируйте приведенную теорему в терминах машины Тьюринга.
Задача 12.
Сформулируйте то же в терминах универсальной машины Тьюринга.
применять бесконечное число символов, то среди них нашлись бы символы, отличающиеся друг от
друга в произвольно малой степени. Ограничение на число
ЯЗЫКОВАЯ СИСТЕМА ПОСТА
Моделирование вычислительных процессов посредством конечных автоматов и машин Тьюринга,
с которым мы только что познакомились, отражает только процедурную сторону проблемы. В то же
время компьютерная программа по названию известной книги создателя языка «Паскаль» Вирта есть
«алгоритм+структура данных». Поэтому моделировать можно не действия, которые производятся над
данными, а структуру самих данных. (Кстати, в объектно-ориентированном программировании акцент
делается именно на описании данных.)
Работу машины Тьюринга (а значит, и любой алгоритм) можно рассматривать как преобразование
в соответствии с некоторыми правилами исходного набора символов на ленте. Обратим внимание на
принципиальное отличие такого подхода к описанию алгоритмов. Мы описываем не операции, а
множество допустимых цепочек символов на ленте, которые могут получаться при работе машины
Тьюринга.
При изучении подхода Поста мы будем иметь дело с языковыми понятиями: языками,
грамматиками, грамматическими понятиями и правилами, алфавитами, правильными выражениями
языка. С такими терминами мы уже сталкивались при изучении русского или иностранного языка, а
также при изучении конкретного алгоритмического языка. В математике языковая терминология тоже
используется, только термины немного другие: математические символы – вместо алфавита, аксиомы и
правила логического вывода – вместо грамматических понятий и правил, теоремы – вместо правильных
предложений языка.
10
Каноническая система, представляющая собой множество таких правил вывода и некоторых
изначально установленных положений, вовсе не описывает процесса. Она лишь определяет объем
множества последовательностей путем (рекурсивного) описания того, как находить последовательности
из этого множества.
Пример.
Рассмотрим простое описание языка из нескольких слов с помощью грамматических правил.
<слово>::= <приставка><корень><суффикс><окончание>
<приставка>::=пона
<корень>::=ходсад
<суффикс>::=кочк
<окончание>::=аи
Описанный язык включает 16 различных слов: «походка», «насадочки» и пр.
Язык описан своей грамматикой.
Описание грамматики включает в себя: название наиболее общего понятия языка, которое называется
еще выделенным нетерминальным символом (в нашем примере это <слово>), набор грамматических
правил (у нас их 5), специальные символы для записи правил (символ «::=» читается как «это», символ
«» читается как «или», в угловые скобки берутся понятия языка или, как их еще называют,
нетерминальные символы, которые играют вспомогательную роль для генерации правильных
выражений языка), наконец, алфавит или множество терминальных символов (в нашем примере это
обычный русский алфавит).
Такой способ описания языков называется описанием в форме Бэкуса-Наура.
Все правильные выражения (в данном случае – слова) порождаются из выделенного
последовательными «расшифровками» нетерминальных символов. За один шаг один из
нетерминальных символов выражения заменяется одной из его возможных расшифровок по правилу, в
левой части которого стоит этот символ.
Вот как выглядит грамматический вывод слова «походка»:
<слово>
<приставка><корень><суффикс><окончание>
по<корень><суффикс><окончание>
поход<суффикс><окончание>
походк<окончание>
походка
Задача 13.
Ниже представлена грамматика для генерации предложений языка, определяющего родственные
связи.
<родственная связь>::=<начало цепочки><цепочка>
<начало цепочки>::=<сын><дочь><отец> <мать> <брат><сестра>
<цепочка>::=<цепочка><окончание цепочки>
<окончание цепочки>::=<сына><дочери><отца><матери> <брата><сестры>
Проведите грамматический разбор (это означает то же, что грамматический вывод) следующей
родственной связи:
«сын брата отца матери».
Замечание.
В третьем правиле этой грамматики используется значок , означающий, что цепочка предков
может быть пустой. Кроме того, в этом же правиле используется рекурсивное определение:
нетерминальный символ <цепочка> стоит в обоих частях определения.
Синтаксический анализ
11
Несмотря на то, что для общих систем Поста обеспечить алгоритмическое распознавание языка
невозможно, существуют языки, для которых эффективные процедуры распознавания не только
существуют, но и могут быть алгоритмически построены. К таким языкам относятся языки,
описываемые контекстно-свободными грамматиками с некоторыми дополнительными ограничениями.
Правая часть каждого правила контекстно-свободной грамматики состоит из одного нетерминального
символа. Дополнительное условие называется однозначностью ветвления по первому символу и будет
описано на примере.
Пример.
Рассмотрим технологию построения синтаксического анализатора для языка арифметических
выражений в полной скобочной записи (для краткости будем называть их формулами).
В этот язык должны входить выражения вида b, (a-f), ((h*c)/(d+g)), которые состоят из
переменных, обозначенных строчными латинскими буквами, знаков арифметических операций и
круглых скобок. Каждое арифметическое действие заключается в скобки. Таким образом, выражения
(2+a), (ab), c/d не войдут в наш язык: первое выражение содержит недозволенный символ «2», во втором
– отсутствует знак арифметической операции, третье – не заключено в скобки.
Грамматика, определяющая этот язык, устроена очень просто:
<формула>::=<переменная>(<формула><знак операции><формула>)
<переменная>::=abc…z
<знак операции>::=+–*/
Для построения синтаксического анализа сделаем преобразование грамматики из формы БэкусаНаура в форму графа. Такое представление грамматики называется синтаксической диаграммой.
Синтаксическая диаграмма строится по следующим правилам.
Правило 1.
Каждый терминальный символ t изображается кружочком (вершиной графа), помеченным самим
символом t.
t
Правило 2.
Каждый нетерминальный символ N изображается прямоугольником (вершиной графа),
помеченным этим же символом N.
N
Правило 3.
Последовательность терминальных и нетерминальных симоволов изображается соединением
соответствующих вершин дугами в порядке их следования. Например, изображение
последовательности N1 N2 синтаксической диаграммой имеет вид:
N1
N2
Правило 4.
Значку «» сопоставляется ветвление. Например, N1N2 на синтаксической диаграмме выглядит
так.
N1
N2
12
Синтаксическая диаграмма для языка полных арифметических скобочных записей, построенная на
основе этих правил, показана на рисунке.
a
a
b
a
+
a
–a
формула
(
)
aa
*a
a
a
aa
a/
aa
aa определяется однозначно очередным терминальным
Если каждое ветвление в диаграмме
символом (это условие в дальнейшем будемa называть условием однозначности ветвления), то на основе
следующих правил по этой диаграмме можно написать программу синтаксического анализа. Заметим,
a
что для нашей грамматики условие однозначности ветвления выполнено, так как единственное
a является ли очередной символ выражения открывающей
ветвление осуществляется на основе проверки,
скобкой или же латинской буквой.
a
z
a
формула
Правило 1.
Терминальному символу t синтаксической диаграммы в программе синтаксического анализа
сопоставляется элементарный оператор распознавания:
ЕСЛИ ch=t ТО read(ch) ИНАЧЕ error
Здесь переменная ch обозначает текущий символ записи выражения, процедура read(ch) считывает
следующий символ записи, процедура error обрабатывает ошибку (в простейшем варианте просто
прерывает дальнейший анализ выражения).
Правило 2.
Нетерминальному символу N синтаксической диаграммы сопоставляется процедура
распознавания этого символа (при выполнении программы анализа вызывается соответствующая
процедура).
Правило 3.
Последовательности терминальных или нетерминальных символов соответствует линейная
программа, в которой последовательно перечислены соответствующие символам операторы и
процедуры распознавания. Последовательность заключается в операторные скобки. Например, для
последовательности N1 N2 программа выглядит так:
НАЧАЛО
N1
N2
КОНЕЦ
Правило 4.
Ветвлению соответствует оператор условного перехода. Так, диаграмме с ветвлением N1N2
соответствует такая программа распознавания:
ЕСЛИ chL(N1) ТО N1 ИНАЧЕ
ЕСЛИ chL(N2) ТО N2 ИНАЧЕ error
Здесь L(N1) обозначает множество начальных символов, с которых может начинаться
«расшифровка» нетерминального символа N1. (Заметим, что множества начальных символов N1 и N2
13
не имеют общих элементов в силу однозначности ветвления. Если же это условие не выполняется,
строить синтаксический анализатор по предложенным правилам нельзя ).
После применения к диаграмме языка полных скобочных записей арифметических выражений
перечисленных правил, получается следующая программа синтаксического анализа этого языка.
ПРОГРАММА FORMULA
НАЧАЛО
ЕСЛИ ch[a..z] ТО
ЕСЛИ ch[a..z] ТО read(ch) ИНАЧЕ error
ИНАЧЕ
ЕСЛИ ch=`(` ТО
НАЧАЛО
ЕСЛИ ch=`(` ТО read(ch) ИНАЧЕ error
FORMULA
ЕСЛИ ch{`+`,`–`,`*`,`/`} ТО read(ch) ИНАЧЕ error
FORMULA
ЕСЛИ ch=`)` ТО read(ch) ИНАЧЕ error
КОНЕЦ
ИНАЧЕ error
КОНЕЦ
Замечание.
Простота построения алгоритма синтаксического анализа основана на использовании рекурсии (в
нашем примере программа обращается к себе дважды).
Алгоритм синтаксического анализа представлен в псевдокоде, который легко перевести на любой
алгоритмический язык, допускающий рекурсивный вызов процедур.
Нетрудно видеть, что программа иногда осуществляет лишние проверки и поэтому не является
идеальной. Однако такая запись в точности соответствует последовательному применению
перечисленных правил.
Пример описания алгоритма языком допустимых выражений
Как уже говорилось, посредством описания языка можно определять алгоритмы.
Построим грамматику, порождающую все правильные примеры сложения натуральных чисел
неограниченной длины в двоичной записи. Ранее мы построили конечный автомат, решающий эту
задачу.
Будем использовать привычную запись сложения «в столбик», например:
01100100
+0 0 1 0 1 1 0 1
–––––––––––
10010001
В качестве алфавита языка возьмем тройки цифр одного разряда. Различных троек будет восемь.
0
0
0
0
0
1
0
1
0
0
1
1
1
0
0
1
0
1
1
1
0
1
1
1
Проанализируем, как из этих троек можно составлять правильные примеры на сложение.
Во-первых, вторая, третья и пятая тройки не могут быть крайними правыми тройками в примере,
так как они могут быть правильными только в случаях, когда имеет место перенос единицы из
предыдущего разряда.
Первая, четвертая и шестая тройки, наоборот, могут быть крайними правыми тройками, причем в
этом случае переноса из последнего разряда не будет.
14
Седьмая и восьмая тройки тоже могут стоять в крайней правой позиции, но при этом будет иметь
место перенос единицы из последнего разряда.
Введем нетерминальные символы A и B, соответствующие понятиям <завершенный пример> и
<незавершенный пример>. Завершенным примером являются первая, четвертая и шестая тройки. Если к
завершенному примеру справа добавить одну из этих троек, он также останется завершенным. Эти
наблюдения можно записать в форме Бэкуса-Наура так:
A::=
0
0
0
0
1
1
1
0A
1
0
0
1
0A 1A 0
0
1
1
Если к законченному примеру добавить вторую тройку справа, пример станет незаконченным.
Рассмотрим другие возможности порождения незаконченного примера. Во-первых, вторая тройка сама
является незаконченным примером. Далее, если к незаконченному примеру добавить третью или пятую
тройку, пример останется незаконченным. Объединяя эти наблюдения, получаем второе правило
искомой грамматики:
B::=
0
0
0 A 0B
1
1
0
1
1B 0
0
0
Наконец, если к незаконченному примеру добавить седьмую или восьмую тройку, он станет
законченным. В первое правило добавим эти две возможности и получим:
A::=
0
0
0
0
1
1
1
0A
1
0
0
1
1
1
0  A 1  A 0  B 1 B 1
0
1
1
0
1
Искомая грамматика построена.
Замечание.
Построенная грамматика состоит из правил очень простого вида: это либо замена
нетерминального символа терминальным, либо дописывание справа терминального символа к
нетерминальному. Оказывается, такая структура правил характерна именно для тех языков, которые
распознаются конечными автоматами.
Языки, распознаваемые конечными автоматами, называются регулярными.
Конечно, не все языки являются регулярными. Рассмотрим несколько похожих языков.
Пример 1.
Первый из них – это множество цепочек двух символов «a» и «b», в которых сначала идут только
символы «a», а после них – только символы «b». Например, abb, a, aaa, bb, aaabbb и т.п. Обычно, такой
язык обозначают так:{anbm}.
Задача 14.
1) Постройте грамматику языка {anbm}.
2) Постройте конечный автомат, который распознает слова этого языка (это означает, что он
приходит в конечное состояние на словах этого языка и только на них).
Пример 2.
Теперь рассмотрим второй язык {anbn}. Этот язык является подмножеством первого языка и
состоит только из тех его слов, которые содержат одинаковое количество тех и других букв.
Оказывается, что нельзя построить конечный автомат, распознающий этот язык. Причина состоит в том,
что конечный автомат «не умеет считать», поэтому после ввода всех символов «a» он не сможет
определить, то ли количество символов «b» введено. Более строго доказать этот факт можно, опираясь
на теорему о поведении конечного автомата, работающего автономно (то есть когда на вход подается
постоянный символ).
Для этого языка можно построить грамматику, которая порождает нужные последовательности, не
«считая» числа символов:
15
S::=aSb
Грамматика состоит из одного правила. Значок  обозначает «пустой» символ, его вставка,
например, в выражение aSb, вместо S, порождает слово ab. Правило позволяет одновременно добавлять
по одному символу каждого вида слева и справа и, тем самым, снимает проблему подсчета числа
символов.
Задача 15.
Постройте синтаксический анализатор для этого языка.
Однако решить таким же способом проблему подсчета символов для следующего языка уже не
удастся.
Пример 3.
Рассмотрим язык {anbncn}. Оказывается, для его описания требуются новые грамматические
конструкции.
Моделирование вывода теорем
Система Поста создавалась как модель логического вывода в любой аксиоматической теории.
Логический вывод определяется так же, как грамматический вывод, только правила (которые у Поста
называются продукциями) сложнее: замене подвергаются не только нетерминальные символы, но и
цепочки терминальных и нетерминальных символов. Вместо выделенного нетерминального символа, с
которого начинается вывод, рассматривается одна или несколько аксиом – цепочек терминальных
символов. Далее, по правилам вывода осуществляются преобразования этих аксиом, и все полученные
при этом выражения называются теоремами.
Проиллюстрируем на примере осуществление логического вывода в системе Поста. Вернемся к
задаче, которая, как мы уже знаем, не допускает реализации конечным автоматом, но может быть
выполнена машиной Тьюринга, то есть имеет алгоритм решения. Это задача перемножения
натуральных чисел неограниченной длины. Для простоты (но, не умаляя общности) числа будем
рассматривать в единичной записи. Например, равенство 2x3=6 запишется как 11x111=111111.
Пример.
Грамматика умножения натуральных чисел в единичной записи.
Аксиома
1x1=1
Правила
AxB=C ::= A1xB=CB
AxB=C ::= BxA=C
Первое из этих правил определяет распределительный закон умножения (дистрибутивность),
который в более привычной форме записывается как (A+1)xB=AxB+B или, если произведение AxB
обозначить через C, как (A+1)xB=C+B. Прибавление 1 к числу в единичной записи осуществляется
простым приписыванием 1 к записи числа, поэтому знак «+» можно опустить, и мы получим равенство
в той форме, как оно дано в описании грамматики.
Второе правило – переместительный закон умножения (коммутативность). A и B – произвольные
числа в единичной записи. Грамматический вывод начинается с аксиомы. Каждый шаг вывода связан с
заменой очередного выражения по одному из двух правил.
Пример.
Приведем пример вывода равенства 11x111=111111 в построенной грамматике. Эту же задачу
можно сформулировать как грамматический разбор или распознавание данного предложения языка.
Разбор начнем с выделенной строки символов в левой части первого правила.
1x1=1 {аксиома}
11x1=11 {первое правило при A=1 B=1 C=1}
111x1=111 {первое правило при A=11 B=1 C=1)
1x111=111 {второе правило при A=111 B=1 C=111}
11x111=111111 (по первому правилу при A=1 B=111 C=111}
16
Задача 15.
Постройте грамматики описания следующих языков, используя единичную запись натуральных
чисел.
1)
язык четных чисел;
2)
язык сложения натуральных чисел.
Задача 16.
Объясните содержательно, какое множество натуральных чисел в единичной записи определяет
следующая грамматика:
1#1 – аксиома
A#B::=A1#BAA1 – правило генерации промежуточных слов
A#B::=B – получение из промежуточного слова окончательного
Замечание.
Появление в левой части правил вывода цепочек терминальных и нетерминальных символов
можно трактовать как использование в определении грамматических правил контекста. Большинство
правил естественного языка связано с контекстом. Даже в приведенном выше примере языка из 16 слов
любая попытка составить слово, используя не все его части, а, например, только приставку и корень,
требует использования контекста. Например, есть слово «поход», но нет слова «наход».
Расширим этот язык двумя правилами с контекстом.
по<корень><суффикс><окончание>::=по<корень>
<приставка>сад<суффикс><окончание>::=сад<суффикс>и
Первое правило добавляет слова «поход» и «посад», второе – «садки» и «садочки».
Задача 17.
Опишите язык {anbncn}, используя продукции Поста.
Описание математических теорий и процедуры нахождения доказательств
Пост показал, что, используя правила вида gA::=Ah, можно описать формально любую
математическую теорию. Все теоремы этой теории можно будет получить грамматическим выводом из
аксиом. При этом процесс проверки правильности доказательств можно автоматизировать. Можно
предложить следующий эффективный способ (алгоритм) проверки правильного доказательства.
Сначала проверяется начальное выражение цепочки грамматического вывода. Если оно не является
аксиомой, то доказательство ошибочно, иначе проверяется следующее в цепочке вывода выражение.
Оно должно быть либо аксиомой, либо получено из аксиомы применением одного из правил
грамматики. Поскольку число правил конечно, а применение правила, по определению, – эффективная
процедура, процесс проверки является также эффективным.
Можно представить и механизм проверки правильности теоремы, если ее вывод (доказательство)
отсутствует. Для этого нужно перебирать все возможные выводы, сравнивая результат с искомым. Если
такая теорема может быть выведена, то рано или поздно мы натолкнемся на ее доказательство. Если же
теорема не может быть выведена в данной теории, то ответ никогда не будет получен.
Таким образом, у нас есть процедура получения доказательств теорем, но нет процедуры
проверки, является ли данное выражение языка теоремой. В общем случае отыскание такой процедуры
невозможно. Теорема Геделя утверждает, что такой процедуры нет для арифметики. В то же время в
некоторых теориях, например, в алгебре высказываний (булевой алгебре), в евклидовой геометрии
такие процедуры есть.
17
Download