
- •Введение
- •Глава 1
- •§ 1. «Алгоритмические джунгли»
- •§ 2. Исходные данные и результаты. Массовость алгоритма
- •§ 4. Понятность алгоритма
- •§ 5. Рекурсивные определения
- •§ 6. Определенность алгоритма
- •§ 7. Выводы
- •Глава 2 создание алгоритмов
- •§ 1. Роль алгоритмов в науке и технике
- •§ 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. Сознание машин. Алгоритмическое моделирование
§ 5. Нотация Бекуса. Тезаурусы
В 1958 г. на русский язык было переведено описание алгоритмического языка лгол-58, составленное с помощью особых синтаксических правил, получивших название формул Бекуса. Способ описания формального языка с помощью формул Бекуса называется нормальной формой или нотацией Бекуса.
Рассмотрим частный случай порождающей индуктивной грамматики, в котором применяемыми конструкциями являются слова, а операциями, имена которых присутствуют в синтаксических правилах, являются так называемые операции соединения слов. Обозначим эти операции временно символами S1(P), S2(P1, Р2), S3(P1, P2. P3), …, Si(P1, Р2, ..., Pi), где Р, P1, Р2, ... , Рi — произвольные слова. Сущность этих операций заключается в следующем. Операция S1(P) является тождественной операцией. Для нее справедливо равенство
.
Например S1(мама)=мама.
Для операции S2(P1, P2) справедливо условие
.
т. е. ее результатом является новое слово, получаемое путем приписывания елов Р2 к слову Р1. Например, S2 (экстра, алгоритм) = экстраалгоритм.
Вообще, для Si(P1, P2, …, Рi) справедливо условие
Si(P1, P2, …, Pi)=P1P2…Pi.
В описанном частном случае запись синтаксических правил индуктивной грамматики можно видоизменить (не изменяя их смысла) следующим образом.
1. Во всех синтаксических правилах знак «=», отделяющий левую часть от правой, заменим знаком «:: =», который читается как «по определению есть».
2. Во всех правилах имена морфем заменим самими морфемами. Это можно сделать, так как морфемы являются словами (пустыми, однобуквенными или многобуквенными).
3. Если имеется несколько формул, в левых частях которых стоят одинаковые групповые имена, то заменим эти несколько формул одной, имеющей такую же левую часть, а в правой части содержащей записи всех правых частей указанных формул, разделенные знаками «|». Эти знаки читаются как «или». Данное видоизменение синтаксических формул не обязательно. Новая формула рассматривается как сокращенная запись вошедших в нее старых формул.
4. Пользуясь тем, что результат выполнения операции Si соединения можно получить из ее записи путем отбрасывания функциональной буквы Si, скобок и разделяющих аргументы запятых, отбросим в правых частях синтаксических правил знаки Si, знаки «(», «)», «,».
5. Наконец, условимся об особом выборе символов, являющихся групповыми именами. В качестве таких символов будем брать фразу на естественном языке, заключенную в угловые скобки. Такая фраза в угловых скобках является одним целым и неизменяемым знаком — метасимволом.
Заметим, что в языке-объекте и в используемом естественном языке не должны применяться буквы «:: =», «|». «<«, «>» или сочетания букв, одинаковые с символом :: =,
Полученная нами совокупность синтаксических правил и составляет нотацию Бекуса, а каждое правило называется формулой Бекуса.
Приведем пример описания формального языка с помощью нотации Бекуса. Ставить внутри формул знаки переноса или после них знаки препинания нельзя!
Как известно, десятичная система счисления является формальным языком. Ее алфавит содержит десять букв, обычно называемых арабскими цифрами. Будем считать, что базу языка составляют десять морфем, каждая из которых является однобуквенным словом. Для обозначения группового имени «морфема» используем метасимвол «(цифра)». Итак, приводим формулы Бекуса:
<ненуль> ::= 1|2|3|4|5|6|7|8|9
<цифра> ::=0 | <ненуль>
<строка цифр> ::= <цифра> | <строка цифр> <цифра>
<неотрицательное целое число> ::= <цифра> | <ненуль>
<строка цифр>
Эти четыре формулы Бекуса дают полное описание десятичной системы счисления. Покажем, как с помощью этих формул можно порождать различные записи чисел. В силу первой и второй формул 1, 2, 7, 0 являются цифрами. В силу третьей формулы 001207 является строкой цифр, а в силу второй формулы 5 является ненулем. Наконец, в силу четвертой формулы 5001207 является неотрицательным целым числом.
Формулы Бекуса очень удобны для описания формальных языков. Но, к сожалению, они пригодны только для языков, предложениями которых являются конструкции, называемые словами. Кроме того, даже среди таких языков они пригодны далеко не для всяких.
Есть очень простые слова, которые невозможно описать с помощью формул Бекуса. Например, к их числу относятся «спаренные числа»; чтобы написать такое число, нужно сперва написать какое угодно число, а затем к нему приписать в точности такое же число. Спаренными числами являются 88, 9191, 235235 и т. п. К сожалению, формула Бекуса
<спаренное число> ::= <неотрицательное целое число> <неотрицательное целое число>
не является описанием спаренных чисел, так как наряду со спаренными числами дает и многие другие.
Несмотря на ограниченные возможности нотации Бекуса, она настолько удобна, что ею довольно часто пользуются. Мы с вами, читатель, тоже будем ее применять и потому постараемся ее запомнить. Вот еще пример описания с ее помощью несложного языка:
<цифра>::=0|1|2|3|4|5|6|7|8|9
<буква>::=А|В|C|D|E|F|G|Н|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z
<идентификатор> ::= <буква> | <идентификатор> <буква> | <идентификатор> <цифра>
С помощью указанных трех формул определена синтаксическая структура, называемая идентификатором. В ряде языков программирования такие конструкции применяются в качестве имен переменных величин и некоторых других элементов программ.
В конце предыдущего параграфа мы говорили о том, что конечное множество предложений естественного языка представляет собой, без учета семантики, формальный язык. Такой формальный язык можно описать с помощью формул Бекуса. Еще один вид его описания называют тезаурусом; его мы упоминали в предыдущем параграфе23. В простейшем случае тезаурус — это список упомянутых предложений. В более сложном случае тезаурус представляет собой перечень некоторых текстов, каждому из которых придана дополнительная, так называемая грамматическая информация. Эта структура тезауруса применяется в тех случаях, когда список предложений очень велик. Мы поясним его на небольшом списке, чтобы передать только самую суть этого способа описания формального языка.
Представим себе, что множество предложений естественного языка содержит такие фразы, как: текстильное производство, текстильная фабрика, текстильное изделие, текстиль, ткань, токарный станок, токарная работа и т. д. В тезаурус можно включить тексты, разбив их на группы и указав между ними связи (см. табл. 7).
Таблица 7
Чтобы получить предложения языка, нужно войти в тезаурус. Если мы остановимся на позиции 1, то прочитаем текст «изделие» и узнаем, что с ним связана позиция 10. В позиции 10 прочитаем текст «текстильн» и информацию* 21 —1,2, которая означает, что за «текстильн» следует содержимое позиции 21 и затем текст «изделие» (цифра 1 во второй части информации).
В итоге получаем предложение «текстильное изделие».
Знак
означает пробел. Знак * означает «данный
текст» (в этом примере «текстильн»).
Числа означают номера позиций. Если
два числа разделены запятой, то из них
должно быть выбрано то, которое является
номером позиции, от которой был
совершен переход к данной позиции. В
графе «смысловые связи» у нас указана
лишь подчиненность понятий. Запись
«2>3» значит, что понятие «производство»
старше понятия «работа».
Под номером 5 в тезаурусе стоят 2 термина «текстиль» и «ткань». Эти термины считаются синонимами (что, собственно, относится уже к смысловым связям).
Реально применяемые тезаурусы могут быть значительно сложнее того, который описан в качестве примера. В тезаурусе, кроме указанных сведений, нередко содержатся «отсылки» к массивам информации и программам, позволяющим получить «смысловую» информацию, связанную с текстами, включенными в тезаурус.
Логическая теория алгоритмов ограничивается языками, предложения которых, как символьные конструкции, являются словами. При этом можно учитывать только буквы, не упоминая о связях. Однако это ничего не упрощает, потому что предполагает у человека наличие способностей опознавания слов, расчленения их на буквы, что порождает опасность разночтения, и преобразования всевозможных символьных конструкций в слова (и обратно). Правда, иногда переход к словам не очень труден. Например, любой типографский текст превращается в слово, если к классу букв отнести все литеры, включая и пробелы.
Привлекая связи и допуская символьные конструкции большой сложности, аналитическая теория алгоритмов предъявляет меньшие требования к неформальным способностям человека, хотя и приводит к кажущемуся усложнению понятия формального языка.
Г л а в а 8
ЭЛЕМЕНТЫ АНАЛИТИЧЕСКОЙ ТЕОРИИ
АЛГОРИТМОВ