Необходимость содержательной теории алгоритмов. Какой она должна быть
Мы уделили целую главу этой небольшой книги обсуждению ЭВМ потому, что хотели выяснить, какие требования предъявляет практика к теории алгоритмов. И обнаружили то, что и ожидали. Ни одна из традиционных теорий алгоритмов не может обслуживать такую область техники и науки как ЭВМ и программирование. Правда, знание традиционных теорий алгоритмов нам в определенной степени «открывает глаза», позволяет понимать, что программирование — это прикладная область теории алгоритмов.
Но с точки зрения традиционных теории алгоритмов программы для ЭВМ и алгоритмов на входных языках программирования являются только «алгоритмами в интуитивном смысле». Традиционные теории алгоритмов заставляют при решении проблем, возникающих в связи с программированием, погружаться в туман интуиции. Программисты начинают «принимать облик» художников, фантазеров, творцов программ, чуть ли не волшебников. Такое положение самих программистов не- устраивает.
Практика ставит задачу создания науки об алгоритмах, а не аппарата для обоснования математики и решения некоторых проблем математической логики. Мы с вами интересуемся не только практикой, но и теорией и логикой, уважаем логику, но хотим иметь свою теорию. Эта теория алгоритмов должна изучать алгоритмы как таковые. Она должна дать практически осуществимые методы построения алгоритмов. Конечно, убедиться, что та или иная задача не является алгоритмически неразрешимой проблемой, очень полезно. Но в большинстве случаев это сделать не очень трудно. Хотя бы потому, что наши массовые проблемы, как правило, содержат, может быть, и чрезвычайно большое, но конечное число одиночных проблем. Правда, и такие проблемы могут быть неразрешимыми (например, проблема оценки каталога всех каталогов библиотеки, состоящей из 1000 книг, см. § 4 гл. 3). Но все же иметь дело с конечной массовой проблемой куда легче, чем с бесконечной. Итак, не будем отказываться от традиционных теорий алгоритмов, но скажем: этого мало!
Мы требуем от теории алгоритмов, чтобы она была применима к самым различным видам алгоритмов и не отсылала в туман интуиции, чтобы эта теория учила способам оценки качества алгоритмов, способам эквивалентных преобразований алгоритмов, в результате которых, имея «плохой» или «неважный» алгоритм, можно получить алгоритм «лучший» или даже «наилучший».
Поскольку мы должны применять ЭВМ в самых различных областях науки и техники, то должны с помощью теории алгоритмов обнаруживать алгоритмы, действующие в этих областях, и уметь строить программы, реализующие их.
Мы хотим к различным алгоритмам применять математику так, как ее применяют в других областях науки и техники. Для этого прежде всего нужно иметь широкое формальное определение алгоритма. Его формальный характер позволит применять к нему математику, а его широта должна обеспечить возможность почти всегда иметь дело с алгоритмами, к которым применима наука.
Традиционные теории алгоритмов слишком суживают понятие алгоритма. Одно из простейших действий, постоянно совершаемое каждым из нас, с точки зрения традиционных теорий является неконструктивным, почти что невозможным — произвольный выбор.
Простейшая массовая проблема, посильная даже для любого ребенка (приведена ниже), оказывается неразрешимой проблемой. Если же применить к ней волшебное свойство человека совершать неконструктивные действия, то после этого уже не нужен никакой алгоритм. Она уже решена.
Вот эта «дьявольская» массовая проблема: найти общий метод определения количества символов, из которых образовано непустое буквенное «кольцо» (замкнутая цепочка букв) в алфавите, состоящем из одной буквы | (палочки).
Любой ребенок эту проблему решит мгновенно. Он скажет: нужно ткнуть в это буквенное кольцо пальцем и в том месте, куда попадет палец, его разорвать. После этого кольцо станет словом, являющимся записью искомого числа (мы уже встречались с этим способом записи чисел, когда строили машину Тьюринга для реализации функции λ(х)). Может быть ребенок не догадается, что после того, как он «ткнул пальцем», ответ уже получен, и станет считать число палочек. Но это уже не решение задачи, а перевод ее ответа из единичной системы счисления в десятичную.
Но здесь мы остановимся, читатель, и скажем: мы не пытаемся принизить традиционные теории алгоритмов, а доказываем необходимость содержательной теории алгоритмов (науки о разнообразных алгоритмах иг, в частности, о встречающихся в практике). Очевидно, построение такой теории требует расширения понятия языка и решения вопроса о том, что следует считать формальным языком.
С понятия формального языка, которое нам необходимо потому, что записи алгоритмов — это предложения таких языков, равно как и допустимые исходные данные и возможные результаты — предложения других формальных языков, мы и начнем.
Содержательная теория алгоритмов подготовлена усилиями многих программистов — практиков и теоретиков, но стала она возможной благодаря основополагающим работам математиков, создавших традиционные теории алгоритмов. Многие математики уже трудятся над проблемами содержательной теории алгоритмов. В добрый час!