- •Введение
- •Глава 1
- •§ 1. «Алгоритмические джунгли»
- •§ 2. Исходные данные и результаты. Массовость алгоритма
- •§ 4. Понятность алгоритма
- •§ 5. Рекурсивные определения
- •§ 6. Определенность алгоритма
- •§ 1. Роль алгоритмов в науке и технике
- •§ 7. Выводы
- •Глава 2 создание алгоритмов
- •§ 2. Как возникают алгоритмы
- •§ 3. Алгоритмы в математике
- •§ 4. Алгоритм Евклида
- •§ 5. Решето Эрагосфена
- •§ 6. Алгоритм разложения на простые множители. Определение наименьшего кратного двух чисел
- •§ 7. Распознавание алгебраического тождества
- •§ 8. Задачи на построение алгоритмов
- •Глава 3 кризис математики в начале XX века
- •§ 1. Арифметизация математики
- •§ 2. Теория множеств
- •§ 3. Кардинальные числа
- •§ 4. Антиномии
- •§ 5. Выводы из антиномий
- •Глава 4 логические теории алгоритмов
- •§ 1. Рекурсивные функции
- •§ 2. Машины Тьюринга
- •§ 3. Нормальные алгоритмы Маркова
- •§ 4. Эквивалентность описанных теорий
- •Глава 5
- •§ 1. Массовые проблемы. Неразрешимость проблем
- •§ 2. Экстраалгоритм и три неразрешимые проблемы
- •§ 3, Некоторые замечания
- •Глава 6 электронные вычислительные машины и программирование
- •§ 1. Устройство эвм
- •§ 2. Процессоры эвм. Рабочий цикл
- •§ 3. Что такое программа
- •§ 4. Особенности современных эвм
- •§ 5. Входные языки программирования
- •§ 6. Необходимость содержательной теории алгоритмов. Какой она должна быть
- •Г л а в а 7 формальные языки
- •§ 1. Анализ естественного языка
- •§ 2. Искусственные языки. Формальные языки
- •§ 3. Буквы, связи, оболочки, конструкции
- •§ 4. Формальные грамматики
- •§ 5. Нотация Бекуса. Тезаурусы
- •§ 1. Что такое операция?
- •§ 2. Натуральные операции
- •§ 4. Первичные алгоритмы
- •§ 5. Натуральные алгоритмы
- •§ 6. Ограничения на структуру исходных данных сняты
- •§ 8. Соотношение с алгоритмами в интуитивном смысле
- •§ 10. Исследование тупиков (клинчей)
- •§ 11. Формальная семантика формального языка
- •Глава 9 математическое обеспечение эвм
- •§ 1. Анализ эвм и программ
- •§ 2. Что такое математическое обеспечение эвм
- •§ 3. Функциональная классификация программ математического обеспечения эвм
- •§ 4. Операционные системы
- •И автоматизация процессов
- •§ I. Использование эвм для управления
- •§ 2. Информационные системы
- •§ 3. Алгоритмизация процессов
- •§ 4. Язык алгоритмизации процессов
- •§ 5. Наука и искусство алгоритмизации
- •Заключение
- •§ 1. Может ли машина мыслить? Может ли человек решить алгоритмически неразрешимую проблему?
- •§ 2. Детерминированность машин. Самообучение
- •§ 3. Сознание машин. Алгоритмическое моделирование
§ 1. Что такое операция?
В предыдущей главе, при определении понятия формальной грамматики, было использовано понятие операции, а в параграфе, посвященном нотации Бекуса, применялись конкретные операции: операции соединения слов.
Понятие операции тесно связано с понятием алгоритма, и поэтому следует считать, что в гл. 7 мы «забежали» вперед. В этом нет беды. Можно считать, что мы пока условно определили понятие формальной грамматики (а значит, и порождаемого ею языка). После точного разъяснения смысла слова «операция» станет точным и строгим это «условное» определение.
Уже в самом начале гл. 1 было сказано о некоторых операциях, выполняемых в соответствии с требованиями алгоритма. Но тогда еще точный смысл этого слова был не нужен. Если никак не ограничить смысл слова «операция», то останется неясным и смысл слова «формальный язык»
и слова «алгоритм».
Итак, что же такое операция? Исходным данным для операции может быть либо отдельная конструкция (при этом говорят, что операция имеет первый ранг), либо набор, образованный из конструкций (в этом случае говорят, что операция имеет ранг г). Принято считать, что каждая операция имеет постоянный, всегда один и тот же ранг. Кроме того, положим, что операция однозначна. Каждому исходному данному она ставит в соответствие единственный
определенный результат.
Мы будем допускать два вида операций: простейшие, основные операции, определение которых не входит в компетенцию теории алгоритмов, и более сложные, «производные» операции, получаемые методами теории алгоритмов. Простейшие операции назовем натуральными. Каждая из них должна быть тщательно разъяснена. Понятие производной операции свяжем с расширенным понятием алгоритма.
Итак, операциями будем называть либо натуральные операции, либо объявленные операциями и получившие обозначения отображения исходных данных на искомые результаты, для реализации которых существуют (уже получены) алгоритмы.
Это определение требует, чтобы каждый раз, когда нужна новая операция, сначала был построен определяющий ее алгоритм, затем совершен акт ее объявления операцией и, наконец, в некотором формальном языке присвоено ей имя.
Объявление новой операции является абстрактным аналогом следующей конкретной ситуации. В реальной жизни очень часто, имея некоторую машину, разрабатывают для нее определенную программу. При эксплуатации этой программы убеждаются, что ее приходится очень часто применять. Тогда разрабатывают новую ЭВМ, в которой ранее полученная для старой ЭВМ программа реализована уже аппаратурно и новой машиной выполняется за один такт. Еще один убедительный пример объявления новой операции в реальной практической области приведем позже, когда познакомимся с математическим обеспечением ЭВМ.
§ 2. Натуральные операции
Прежде чем описывать конкретные натуральные операции, нужно поговорить о возможных исходных данных и результатах.
К первой группе отнесем натуральные операции, исходными данными для которых являются слова или наборы слов, а результатами — отдельные слова. Группу этих операций назовем группой слово-слово.
В эту группу войдут четыре следующие операции.
1.
Аннигиляция. Сущность аннигиляции
состоит в том, что если ее применить к
однобуквенному слову, то в качестве
результата будет получено пустое слово.
К многобуквенным словам эту операцию
применить нельзя. Для таких исходных
данных она не определена и никакого
результата не дает. Для обозначения
аннигиляции введем знак
.
2. Генерация противоположна аннигиляции. Эта операция применима к пустому слову и в качестве результата дает однобуквенное слово. Но различных однобуквенных слов столько же, сколько различных букв. Поэтому операций такого вида много. Если α некоторая буква, то ей отвечает так называемая α-генерация. Для такой операции введем обозначение hα. К непустым словам α-генерация неприменима и для них никакого результата не дает.
3. Одноместная операция соединения слов (описана в § 5 гл. 7). Будучи применена к произвольному слову, эта операция в качестве результата дает то же слово. Эту операцию будем обозначать S1(P), где P — слово.
4. Двухместная операция соединения слов (описана в § 5 гл. 7). Эта операция, будучи применена к упорядоченному набору из двух слов, в качестве результата дает слово, которое получится, если к первому слову (после его конца) приписать второе слово. Эту операцию обозначим S2(P1, Р2), где P1 и Р2 — слова.
Ко второй группе натуральных операций, называемой группой слово-квазислово, отнесем операции, для которых исходными данными являются слова, а результатами — квазислова (см. ниже), и операции, для которых исходными данными являются квазислова, а результатами — слова.
Квазисловом будем называть конструкцию, отличающуюся от слова тем, что одна из ее букв связана дополни тельной связью первого ранга, которая отличается как от начинающей, так и от заканчивающей связи следования и называется выделяющей связью. Поясним понятие квазислова примерами. Слово «мама» имеет структуру
Из этого слова можно получить четыре различных квазислова:
Таким образом, квазислово — это слово с одной выделенной в нем буквой. В обыденной жизни, имея слово и рассматривая в нем определенную его букву, мы фактически имеем дело с квазисловом.
В группу слово-квазислово входят следующие две операции.
5. Нахождение начала слова. Обозначим чту операцию символом * (звездочка). Она применима к любому непустому слову и преобразует его в квазислово, в котором выделена начальная буква. К пустому слову эта операция неприменима и для него не дает никакого результата. Если применить операцию нахождения начала к слову
то результатом будет квазислово
6. Отключение — операция, противоположная предыдущей. Она применима к любому квазислову и в качестве результата дает соответствующее ему слово. Иными словами, эта операция уничтожает в квазислове выделяющую связь и тем самым превращает его в обычное слово. Обозначим эту операцию знаком X. Эту операцию мы производим, когда в рассматриваемом слове перестаем особо рассматривать одну из его букв.
Третья группа операций называется квазислово-квазислово. В нее входит пять натуральных операций.
7. Операция продвижения вправо. Обозначим ее символом →. Заключается она в том, что от заданного квазислова она ведет к квазислову, в котором выделена буква, непосредственно следующая за той, которая была выделена в исходном данном. Например, применяя продвижение вправо к квазислову
получим квазислово
К квазислову, в котором выделена последняя буква (или, образно говоря, в котором рассматривается конец), эта операция неприменима и для него никакого результата не дает.
8. Операция продвижения влево; обратна предыдущей. Будучи примененной к некоторому квазислову, она преобразует его в другое квазислово, отличающееся от данного тем, что в нем выделена буква, которая в исходном данном непосредственно предшествовала выделенной букве. Например, если к квазислову
применить продвижение плево, получится квазислово
К квазисловам, в которых выделена начальная (первая, самая левая) буква, эта операция неприменима. Обозначим эту операцию ←.
9. Замена буквы. Фактически таких операций столько, сколько букв в алфавите. Поэтому если а — некоторая буква, то ей соответствует операция, называемая заменой буквы на а. Выполнение этой операции заключается в том, что в исходном квазислове выделенная буква заменяется буквой а, которая становится при этом выделенной.
Например, если исходным данным является квазислово
то с помощью замены буквы на «ш» мы получим квазислово
Описанную операцию обозначим !a.
10. Отсечение. Обозначим эту операцию значком ↓. Заключается она в том, что в исходном квазислове все буквы, следующие за выделенной, отбрасываются. Выделенной оказывается последняя (концевая) буква результата. Например, применяя операцию отсечения к квазислову
мы получим квазислово
Отсечение применимо к любому квазислову.
11. Приписывание буквы справа. Так как приписать в принципе можно любую букву, то таких операций столько, сколько букв в алфавите. Поэтому конкретная операция при заданной букве а называется (коротко) а-приписыванием. Эта операция применима только к квазисловам, в которых выделена последняя буква. К остальным квазисловам она неприменима. Ее результат отличается от исходного данного тем, что в квазислове после (справа от) выделенной появляется буква а. Выделенной останется прежняя буква. Например, применяя а-приписывание к квазислову
получим квазислово
Описанную
операцию обозначим
Четвертая группа натуральных операций называется конструкция-слово. В нее входят две операции: линеаризация и делинеаризация. В отличие от всех описанных выше операций эти операции довольно сложны. Подробное их описание мы приведем в следующем параграфе, а здесь лишь упомянем о них.
12. Линеаризация применима к любой конструкции. Если эта конструкция принадлежит классу (A, В, Σ), то линеаризация преобразует его в слово в алфавите Е=BACD, который получается объединением в одно слово четырех алфавитов (напоминаем, что алфавит — это слово, буквы которого попарно неодинаковы). При этом, кроме алфавитов A и B, в этот новый алфавит входят еще два алфавита, не пересекающиеся ни о алфавитами А и В, ни между собой.
К алфавиту С предъявляется, кроме вышесказанного, лишь одно требование. Число его букв должно равняться наибольшему жанру связей, указанных в алфавите В.
Алфавит D должен состоять из трех букв. Пусть для определенности это будут «|» (палочка), «(« (открывающая скобка) и »)» (закрывающая скобка). Выбрав так алфавит D, мы не уменьшим общности наших рассуждений потому, что если бы выбранные символы уже оказались занятыми в других алфавитах, мы взяли бы вместо них другие символы.
Слово, получаемое в результате линеаризации конструкции, называется образом этой конструкции в алфавите E (точнее, относится к числу таких образов; об этом будет речь в следующем параграфе).
13. Делинеаризацией называется операция, которая слова в E=BACD, если они удовлетворяют условиям в силу которых являются образами конструкций класса (А, B, Σ), преобразует в определенные конструкции указанного класса. К остальным словам делинеаризация неприменима, Остальные натуральные операции являются операциями проверки различных условий. Их всего четыре. Будем считать, что все они входят в одну группу, именно в группу натуральных предикатов. Термин «предикат» является математическим синонимом слова «условие». В результате применения предиката к какой-нибудь конструкции она никак не изменяется, но ей в соответствие ставится логическое значение, которое можно передать одним из слов «да» или «нет». Логические значения в принципе можно передавать и с помощью других символов и конструкций. Логическое значение не является составной частью конструкции, которая получилась после применения к ней предиката, а является определенным изменением состояния исполнителя операции24. Мы уже встречались с предикатами, когда изучали машины Тьюринга, но только не выделяли их в самостоятельные операции. Для машин Тьюринга было еще характерно применение многозначных предикатов (допускающих одно значение из многих), тогда как мы сейчас будем допускать только двузначные предикаты (дающие одно из двух логических значений). В машинах Тьюринга логическими значениями были возможные состояния логического блока.
Опишем натуральные предикаты (их четыре).
1. Условие непустоты. Можно считать, что оно гласит: «рассматриваемое слово непусто». Обозначим эту операцию знаком Δ (дельта). Условие непустоты применимо к любому слову и дает ответ «да», если слово непусто, и ответ «нет», если оно пусто.
2. Условие начала; оно гласит: «в рассматриваемом квазислове выделена начальная буква». Это условие к словам неприменимо. Обозначим его буквой н.
3. Условие конца. Обозначим его буквой k. Оно гласит: «в рассматриваемом квазислове выделена последняя буква». К словам эта операция неприменима.
4.
Условие тождественности выделенной
буквы заданной букве. Фактически таких
условий столько, сколько букв в алфавите.
Поэтому, если α — заданная буква, то
говорят об условии α-тождественности.
Условие
α-тождественности гласит: «выделенная
буква квазислова одинакова (тождественна)
с буквой α». Обозначим это условие
знаком
.
все элементы второго типа и т. д. Потом можно для каждого типа элементов получить все возможные результаты нумерации, применяя вышеописанный прием (для первого типа) к сходному объекту, а затем (для последующих типов) — ко всем имеющимся после этого объектам.
Процедуру получения всех результатов некоторой произвольной нумерации назовем факториализацией, а процедуру учета возможных результатов всех проведенных произвольных нумераций — полной факториализацией.
Перейдем теперь к описанию процесса линеаризации. Сущность этой операции заключается в том, что е помощью некоторых искусственных приемов произвольная конструкция, которую можно представлять себе пространственным трехмерным образованием, укладывается в стандартную форму строки. Делается это так.
1. Исходную конструкцию заключают в оболочку. Произвольным образом нумеруют все оболочки. Если в конструкции имеются связи, то производят их подготовку нижеописанным способом» после чего переходят к п. 2. Если связей нет, сразу переходят к п. 2. Подготовка связей осуществляется так.
Переходя в алфавите В от связи к связи (в порядке их записи в алфавите В), произвольно нумеруют связи каждого вида, присутствующие в конструкции, используя для этого (в качестве номеров) строки палочек |, || и т. д. сколько потребуется. После того как мы переберем весь алфавит В и проведем такую нумерацию, окажется, что любые две связи конструкции отличаются друг от друга либо своими именами, либо своими номерами.
Окончив нумерацию связей, помечают у всех связей ветви первого жанра — первой буквой алфавита С, ветви второго жанра — второй буквой алфавита С и т. д.
Наконец, для каждой связи ветви, имеющие одинаковый жанр, произвольным образом нумеруют, опять используя в качестве номеров строки палочек. Теперь именем каждой ветви связи β, ранга, помеченного буквой γ, считают строку букв β ||. . .| γ ||…|, в которой первая группа палочек — номер связи вида β, а вторая группа палочек — номер ветви среди ветвей, имеющих жанр, соответствующий букве γ.
Наш способ построения имен ветвей позволяет установить старшинство между этими именами (они все различны). Предположим, что мы имеем два имени ветвей
β1||…| γ1||…| и β2||…| γ2||…|.
Если β1 в алфавите В предшествует β2, то первое имя младше второго. Если β1 и β2 означают один и тот же символ, но число палочек между β1 и γ1 меньше числа палочек между β2 и γ2, то снова первое имя младше. Если и эти числа палочек равны, то рассматриваем буквы γ1 и γ2. Если γ1 в С предшествует γ2, то снова первое из имен младше. Если окажется, что и последнее не решает вопроса (γ1 и γ2 означают одну и ту же букву в С), то вопрос решают палочки, стоящие после γ1 и и после γ2. Если число палочек после γ1 меньше числа палочек после γ2 тo опять первое имя младше второго. Так как одинаковых имен нет, то случай, в котором первое имя не младше второго, является случаем, в котором второе младше первого.
2. Просматривая оболочки в порядке присвоенных им в п. 1 номеров, находят первую, внутри которой больше нет оболочек. Рассматривают заключенную в ней конструкцию. Переходят к п. 3.
3. Если рассматриваемая конструкция является пустой, то считают, что ей соответствует пустое слово, и переходят к п. 6. Иначе переходят к п. 4.
4. Если рассматриваемая конструкция состоит из единственной буквы, то считают, что ей соответствует однобуквенное слово, и переходят к п. 6. Иначе переходят к п. 5.
5. В произвольном порядке выписывают столбцом все буквы в Л, присутствующие в рассматриваемой конструкции, а перед каждой из них в порядке возрастания старшинства пишут имена ветвей связей, которые в составе конструкции их связывают. Теми же правами, что и буква в А, может пользоваться слово в Е, заключенное в скобки. Такое слово может появиться при повторных выполнениях данного пункта (см. п. 6).
Получают столбец строк, каждая из которых содержит несколько имен связей и заканчивается буквой в А. Такие строки будем называть фрагментами. Фрагменты в порядке номеров строк, которые их содержат, объединяют в слово. Это слово содержит в себе последствия большого числа актов произвола. Эти последствия нужно устранить. Для этого произведем полную факториализацию полученного слова. Теперь мы будем иметь длинный столбец слов, каждое из которых соответствует некоторому сочетанию возможных способов нумерации связей и их ветвей.
После факториализации в некоторых фрагментах некоторых слов нарушится порядок старшинства имен ветвей. Мы каждое из наших слов поправим, добиваясь того, чтобы в каждом фрагменте каждого слова имена ветвей были расположены по возрастанию их старшинства. Затем перерасположим в каждом слове фрагменты в порядке возрастания их алфавитного старшинства (а это старшинство определяется первым из.,имен ветвей, стоящим во фрагменте). Теперь остается совершить последний шаг: из веех имеющихся слов выбрать такое, которое в смысле алфавитного порядка (задаваемого алфавитом Е) не старше всех остальных слов. Мы говорим «не старше» вместо «младше», потому что среди построенных слов могут быть одинаковые и может оказаться, что «младших» слов несколько. Итак, получив единственное слово, переходим к п. 6.
6. Полученное слово заключают в скобки и вставляют в преобразуемую конструкцию вместо соответствующей ему оболочки и ее содержимого. Если конструкция не исчерпалась при этом, то переходят к п. 2. Если же конструкция исчерпалась, то отбрасывают только что примененные скобки. Получившееся слово и есть результат линеаризации. Как видит читатель, описанная операция очень сложна. Но она является универсальной и может быть применена к любой конструкции.
На практике для частных видов конструкций обычно пользуются более простыми способами линеаризации. Такие способы могут быть получены из универсального с помощью общего определения операции (см. § 1).
Две конструкции класса (А, В, Σ), которые при каких-либо алфавитах С и D дают один и тот же результат после линеаризации, называются одинаковыми конструкциями. Теперь опишем делинеаризацию. Эта операция некоторые слова в алфавите E=BACD преобразует в конструкции класса (А, В, Σ). Здесь D состоит из трех букв, играющих роль палочки, и двух сортов скобок (открывающей и закрывающей), а С имеет число букв, равное наибольшему жанру связей из В.
Делается это так. В заданном слове каждая пара друг другу соответствующих скобок заменяется оболочкой. Затем буквы в А или оболочки, перед которыми в преобразуемом слове стоят имена ветвей связей, фиксируются соответствующими ветвями соответствующих связей. Затем отбрасывают все имена связей и все связи следования букв, которые присутствовали в преобразованном слове. В результате таких действий исходное слово превращается в некоторую конструкцию класса (А, В, Σ).
Операция делинеаризации является обратной для линеаризации в следующем смысле. Если какую-либо конструкцию линеаризовать, а потом получившееся слово де линеаризовать, то новая конструкция окажется одинаковой с исходной. Это позволяет обе конструкции считать экземплярами одной и той же конструкции.
Нетрудно сообразить, какова должна быть структура исходного слова для того, чтобы оно могло быть исходным для линеаризации. Это слово должно расчленяться на фрагменты, состоящие из нескольких имен ветвей и замыкающей их буквы в А или слова, взятого в круглые скобки. В круглых скобках опять должны стоять слова, разложимые на фрагменты. И так далее. Но этого еще мало. Нужно также, чтобы имен ветвей каждой связи было столько, сколько ветвей имеет эта связь, и чтобы между именами ветвей и ветвями было необходимое соответствие. Кроме того, расположение имен ветвей должно обеспечивать получение после делинеаризации одной, а не нескольких конструкций. Подробнее останавливаться на операциях линеаризации и делинеаризации мы не будем.
