- •Введение
- •Глава 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. Сознание машин. Алгоритмическое моделирование
§ 5. Натуральные алгоритмы
Кроме натуральных операций, вы, читатель, в рамках расширенной теории алгоритмов не знаете еще никаких операций. При знакомстве с интуитивным понятием алгоритма применялось и интуитивное понятие операции. В классических теориях (избранных) алгоритмов мы ознакомились с применяемыми в них операциями. Но сейчас, занявшись построением широкой теории алгоритмов, следует ко всем ранее известным операциям отнестись осторожно. Поэтому в § 1 дано общее определение операции, не связанное с интуитивными операциями, кроме натуральных.
Итак, пока, кроме натуральных операций не определены никакие операции. Все же уже можно построить некоторый класс первичных алгоритмов. Для этого нужно определить язык операндов и алгоритмический язык.
Язык операндов определим так. Выберем некоторый алфавит А; далее составим формулу Бекуса;
<буква> :: = [перечислены все однобуквенные слова в А, разделенные знаками «|» (или) «]»
В качестве второй формулы возьмем
<слово> ::= <пусто> | <буква> | <слово> <буква>
Эти две формулы Бекуса являются формальной грамматикой, определяющей очень простой язык. Любая цепочка букв в А является словом, а значит и предложением нашего языка.
Сами формулы Бекуса требуют только одноместной и двухместной операций соединения слов. Натуральные one рации позволяют нам построить такой язык.
С помощью тех же операций можно построить и первич ный алгоритмический язык. Будем считать, что алфавит последнего содержит все буквы алфавита А и еще символы для обозначения натуральных операций, меток и раздели телей.
Предположим, что для записей меток выбраны арабские цифры. Любая их строка будет меткой. Пусть разделитель-1 имеет вид « ) », разделитель-2 имеет вид: «, перейти к п.», разделителем-3 является знак « ; » (точка с запятой); раз-делителем-4 пусть будет «)Если», разделителем-5 — «, то перейти к », разделителем-6 — «, иначе перейти к ». Примем, что знак действия состоит из слова «выполнить» и следующего за ним в винительном падеже названия натуральной операции. Тогда знак действия может иметь вид «выполнить аннигиляцию» или «выполнить нахождение начала слова» и т. д. Знак условия пусть совпадает с фразой, состоящей из слова «справедливо» и названия натурального условия (см. § 2). Тогда знак условия может иметь вид «справедливо условие конца» или «справедливо условие «-тождественности» и т. д.
Предположим теперь для определенности, что алфа вит А — это алфавит латинских строчных букв. Приведем пример алгоритма из семейства построенных нами первичных алгоритмов. Представим себе, что задано некоторое слово в Л, и мы хотим все имеющиеся в нем буквы а заменить на i, а все имеющиеся буквы i заменить на а. Ясно, что если преобразуемое слово в А является пустым, алгоритм к нему должен быть неприменимым.
Искомый алгоритм можно записать в следующем виде.
1. Если справедливо условие непустоты, то перейти к п. 2, иначе перейти к п. 1.
2. Выполнить нахождение начала. Перейти к п. 3.
3. Если справедливо условие а-тождественности, то перейти к п. 4, иначе перейти к п. 5.
4. Выполнить i-замену. Перейти к п. 7.
5. Если справедливо условие i-тождественности, то перейти к п. 6, иначе перейти к п. 7.
6. Выполнить а-замену. Перейти к п. 7.
7. Если справедливо условие конца, то перейти к п. 9,
иначе перейти к п, 8.
8. Выполнить продвижение вправо. Перейти к п. 3.
9. Выполнить отключение, перейти к п. 100.
Такой алгоритм переработал бы слово в A «magistr» в другое слово «migastr».
Прочитав текст алгоритма, читатель может воскликнуть «Вот тебе и на! Трудились мы, трудились, и пришли к тому, с чего начали!» — к алгоритму на естественном языке. Позвольте вас успокоить. Мы пришли не к тому, с чего начали, а к такому новому широкому определению алго ритма, что многие алгоритмы, составленные на естественном языке, оказались частными случаями нашего широкого понятия алгоритма, а не алгоритмами в интуитивном смысле.
Очень легко выбрать другой первичный алгоритмический язык, и будет определен новый класс, алгоритмов. Мы это ниже и проделаем, но сперва воспользуемся перерывом для того, чтобы дать одно определение.
Первичные алгоритмы, в которых используются только натуральные операции, называются натуральными алгоритмами.
Теперь построим еще один класс натуральных алгоритмов. Пусть по-прежнему метка имеет вид последовательности цифр, разделитель-1 и разделитель-4 пусть состоят из единственного знака «:» (двоеточие), разделитель-2 и раз-делитель-5 пусть имеют вид «,», разделителем-3 пусть будет «;», а разделителем-6 знак «/» (косая черта).
В качестве знаков действия и знаков условия мы используем символы, которыми были обозначены натуральные операции в § 2, т. е.
<знак
действия> ::=
|
h
<α> |
*
| X
| →
|
← | !<α>|
↓ |
| l
| d
<знак
условия> ::= Δ
| н
| k
|
При
этом
<а> ::= <буква в А>
В новом классе натуральных алгоритмов построим в качестве упражнения алгоритм нахождения конца слова. Он может иметь следующий вид:
Это уже не похоже на русский язык, но все-таки абсолютно понятно (если заглянуть в правило выполнения первичного алгоритма). Первый приказ гласит: если преобразуемое слово непусто, то перейти к приказу 2, а иначе — снова к приказу 1. Значит, если слово пусто, то сдвинуться с приказа 1 не удается. Это значит, что наш натуральный алгоритм к пустому слову неприменим. Приказ 2 предписывает найти начало преобразуемого слова и перейти к приказу 3, приказ 3 — проверить, является ли рассматриваемая буква концом слова, и если да, перейти к приказу 100, которого нет. Это значит, что процесс окончен. Если же рассматриваемая буква еще не конец слова, то по приказу 4 нужно продвинуться вправо и снова вернуться к приказу 3 для проверки, не найден ли еще конец.
Наш алгоритм перерабатывает произвольные слова в квазислова, в которых выделена концевая буква. Составив такой алгоритм, мы можем объявить операцию нахождения конца слова. Обозначим ее **.
Теперь появилась возможность построить класс первичных алгоритмов, которые уже не являются натуральными. Для этого к набору допустимых операций следует присоединить операцию нахождения конца и соответствующим образом дополнить алгоритмический язык. Построим еще один натуральный алгоритм, который бы распознавал, является ли слово однобуквенным:
Этот алгоритм кончает свою работу по-разному в зависимости от того, является ли слово однобуквенным или нет. Получив его, мы можем объявить новую логическую операцию: проверку однобуквенности. Обозначая ее, например, «=1» и включая в набор допустимых операций с соответствующим расширением алгоритмического языка, получим еще одно семейство первичных, но не натуральных алгоритмов.
