В еще более сложных случаях наблюдают какой-либо процесс, протекающий в неживой природе, организме или в обществе, изучают влияние на него различных факторов; в конце концов может быть получен алгоритм управления этим процессом (который будет эффективным, если существует реальная возможность изменять определяющие процесс факторы). Алгоритмы, полученные таким образом (в том числе и имитирующие), принято называть эмпирическими. К их числу относятся приведенные в гл. 1 в виде примеров алгоритмы приготовления пищи, докорма щенят, приготовления лекарств.
Алгоритмы, приводящие к решению интересных для нас задач, иногда можно получить экспериментально, подбирая действия, приводящие к желаемому результату. Их мы не будем выделять в отдельную группу и условно отнесем к эмпирическим.
В качестве второго источника следует указать научную теорию, из основных положений и установленных фактов которой алгоритмы в некоторых случаях могут быть выведены. С такими алгоритмами мы еще встретимся в данной главе. Из числа приведенных в первой главе к этой группе относится алгоритм сложения положительных десятичных дробей.
Третьим источником новых алгоритмов может являться совокупность уже накопленных. Оказывается, с помощью специальных приемов из имеющихся алгоритмов можно получать новые.
Наконец, четвертым источником алгоритмов может быть изобретательность их разработчика. Алгоритмы кодирования и декодирования по заданному ключу происходят из этого источника.
Как бы ни был получен алгоритм, он должен быть обоснован; это означает, что если алгоритм создан для решения определенной задачи, то необходима уверенность в том, что для всех исходных данных, для которых эта задача может быть решена, алгоритм позволяет получить решение и ни для каких исходных данных не дает неправильного результата. Это называется корректностью алгоритма.
Корректность эмпирических алгоритмов обычно проверяют экспериментально. Какую-то уверенность в их корректности можно получить, если их многократное применение всегда приводит к необходимому результату. Однако одно только многократное экспериментальное подтверждение еще не вселяет полной уверенности.
Полная уверенность в корректности эмпирического алгоритма возникает лишь в том случае, когда полученные c его помощью результаты не только подтверждаются экспериментально, но и согласуются со всеми другими накопленными и объединенными в научную теорию фактами данной области науки или техники.
Если хотя бы один из даваемых алгоритмом результатов противоречит хотя бы одному из ранее установленных и получивших признание фактов, эмпирический алгоритм нельзя признать корректным (хотя после проверки может оказаться некорректным не алгоритм, а тот факт, которому он противоречит). Корректность теоретически обусловленных алгоритмов гарантируется наличием соответствующих доказательств.
Очень интересен вопрос об установлении корректности алгоритмов, полученных на основе других, ранее разработанных и заведомо корректных алгоритмов. Решение этого вопроса зависит от приема, который был применен для получения нового алгоритма.
Перечислим наиболее часто применяемые приемы.
1) Конструирование алгоритмов. Этот прием заключается в том, что новый алгоритм получают комбинированием уже известных алгоритмов как составных частей.
2) Эквивалентные преобразования алгоритмов. Два алгоритма называют эквивалентными, если: а) всякий вариант исходного данного, допустимый для одного из них, допустим и для другого; б) применимость одного алгоритма к какому-либо исходному данному гарантирует, что и другой алгоритм применим к этому исходному данному; в) результаты, даваемые этими алгоритмами для одного и того же исходного данного, между собой одинаковы. Замечу, что совершенно неправильно эквивалентные алгоритмы называть различными формами одного и того же алгоритма.
Всякое изменение алгоритма, в результате которого снова получается алгоритм (а не что-нибудь иное) и при этом эквивалентный исходному алгоритму, называется эквивалентным преобразованием алгоритма. Примером эквивалентного преобразования алгоритма является его перевод с одного языка на другой (если, конечно, он точен). Но известны и другие эквивалентные преобразования. С помощью эквивалентных преобразований можно существенно изменять алгоритмы. Конечно, разработчика алгоритмов интересуют такие эквивалентные преобразования, в результате которых можно получить алгоритм, который чем-то лучше исходного.
3) Сужающие преобразования. Они приводят к алгоритмам решения задач, являющихся частными случаями тех задач, для решения которых были предназначены исходные алгоритмы. Обычно вслед за таким сужением производят эквивалентное преобразование, при котором используют возникающие при сужении возможности улучшения алгоритма.
4) Применение формального метода к нематематической проблеме. Этот прием заключается в том, что нематематическую проблему (принадлежащую какой-либо технической, естественнонаучной или социально-экономической дисциплине) формулируют математически. При этом может оказаться, что известен алгоритм решения получившейся математической задачи. Этот алгоритм и принимается за искомый. Если готового алгоритма не окажется, то делают попытку его разработки, тем самым обращаясь ко второму из указанных выше источников для получения алгоритмов.
Корректность алгоритмов, полученных путем конструирования, не вызывает сомнений, если алгоритмы, использованные в качестве «строительного материала», дают точные результаты. Если же их результаты являются приближенными, как это часто бывает на практике, то обоснование корректности может требовать сложных исследований.
Доказательством корректности алгоритмов, полученных с помощью эквивалентных преобразований, является правильность преобразований. Мы не можем пока более определенно говорить об эквивалентных преобразованиях, потому что накопленные нами, читатель, знания об алгоритмах еще недостаточны.
Корректность алгоритмов, полученных путем сужающих преобразований, обеспечивается проверкой (доказательством) того, что каждый результат, получаемый суженным алгоритмом, тождествен с результатом, который для того же варианта исходного данного дает исходный алгоритм.
Наконец, корректность алгоритма, полученного в результате применения формального метода, выясняется либо так же, как для эмпирических алгоритмов, либо а) оценкой так называемой адекватности полученной математической задачи (т. е. возможности получения при ее решении результата, достаточно близкого к искомому результату) и б) доказательством корректности алгоритма решения математической задачи.
Алгоритмы, полученные в результате изобретательности разработчика, также требуют обоснования. Обычно с ними поступают либо как с эмпирическими, либо (уже после их получения) проделывают все действия, предусматриваемые формальным методом.
§ 3. Задачи на построение алгоритмов
Можно было бы продолжить изложение и обоснование различных алгоритмов, накопленных в математике. Взамен этого мы лишь перечислим некоторые из них, для того чтобы создать у читателя правильное впечатление об их разнообразии и многочисленности. Алгоритмами являются правила для решения систем алгебраических линейных уравнений (существует большое число таких правил), правила дифференцирования функций и правила интегрирования, изучаемые в курсе математического анализа, правило Штурма -- Лиувилля нахождения приближенного значения корня произвольного уравнения f(х)=0. Алгоритмами являются также и многие другие правила для решения различных задач с помощью циркуля и линейки, известные читателю из школьного курса. Если бы мы вздумали приводить здесь все эти алгоритмы и обосновывать их корректность, то, безусловно, не довели бы эту работу до конца из-за ее большого объема.
Читатель уже представляет себе, как появляются алгоритмы. Обычно алгоритм разрабатывают, имея в виду какую-нибудь задачу. Для ее решения и создают алгоритм. При этом перед математиком возникает задача, коренным образом отличающаяся от той, для решения которой должен быть создан алгоритм. Эту задачу можно сформулировать так: «Задан такой-то класс исходных данных и такая-то задача (проблема), для которой эти исходные данные допустимы. Требуется найти алгоритм, решающий указанную проблему», т. е. перед математиком возникает задача нахождения алгоритма.
Очень большое число таких задач на нахождение алгоритма математики успешно решили. Но целый ряд задач на построение алгоритмов упорно не поддавался решению. Приведем одну из них.
В 1742 г. математик X. Гольдбах, петербургский академик, в письме к Л. Эйлеру выдвинул проблему: доказать, что каждое целое число, которое больше или равно шести, может быть представлено в виде суммы трех простых чисел.
Этой проблеме можно придать следующий вид. Найти алгоритм, который позволил бы для любого целого числа, большего, чем 6, найти хотя бы одно разложение на три простых слагаемых. В ответном письме Л. Эйлер заметил, что для четных чисел эта проблема эквивалентна проблеме разложения числа на два простых слагаемых. В 1937 г. И. М. Виноградов доказал, что всякое достаточно большое нечетное число представляется суммой трех простых чисел; впоследствии была указана и нижняя граница, предполагаемая в доказательстве И. М. Виноградова, так что для нечетных чисел проблема Гольдбаха уже решена, но для четных чисел она не решена и до настоящего времени.
Заметим, что алгоритм ее решения был бы очень несложен: если задано четное N, нужно было бы (с помощью алгоритма Эратосфена) найти все не превосходящие его простые числа, далее последовательно отнимать каждое из них от заданного N и смотреть, не содержится ли разность среди уже полученных простых чисел. Беда в том, что до сих пор не удалось доказать корректность этого алгоритма, и потому нельзя его считать алгоритмом разложения любого четного числа на два простых слагаемых.
Интересно отметить, что некоторые задачи на нахождение алгоритма, долго не поддававшиеся решению, оказались неразрешимыми. К их числу, например, относятся той очень древние геометрические проблемы: задача о квадратуре круга, задача о трисекции угла и задача об удвоении куба.
Задача о квадратуре круга заключается в следующем: требуется найти метод (алгоритм) построения с помощью циркуля и линейки квадрата, равновеликого данному кругу. Эта задача является массовой, потому что исходным данным для нее может быть любой круг.
Задача трисекции угла гласит: требуется найти общий метод (алгоритм) деления произвольного угла с помощью циркуля и линейки на три равные части. Проблема тоже является массовой, потому что исходным данным может быть любой угол.
Наконец, задача удвоения куба гласит: требуется найти алгоритм, позволяющий по стороне любого куба с помощью циркуля и линейки построить сторону куба, объем которого вдвое больше объема заданного.
Невозможность решения этих задач была строго доказана. Неудача попыток решения некоторых проблем после того, как была доказана невозможность решения некоторых других проблем, породила определенную «подозрительность». Ученые стали опасаться, что затрачивая без успеха свои усилия на решение некоторых проблем, они стараются достигнуть невозможного. Возникло мнение о необходимости выявления неразрешимых проблем. Для задач на отыскание алгоритма это должно сводиться к разработке методов доказательства несуществования алгоритма.
Нужно подчеркнуть, что алгоритмы для квадратуры круга, трисекции угла и удвоения куба невозможны, если допускать только операции, выполнимые с помощью циркуля и линейки, причем линейка используется только для проведения прямых через пары точек и никак иначе. Уже Архимед предложил метод трисекции угла, в котором допускалась операция, состоящая из двух действий: 1) нанесения на линейке двух точек, копирующих две данные точки чертежа, 2) такого перемещения линейки, чтобы одна из отмеченных на ней точек скользила по прямой, а другая по окружности.
Это значит, что за счет расширения набора допустимых операций иногда можно часть проблем, для которых нет алгоритма, сделать разрешимыми. Конечно, если ничем не ограничиваться при определении допустимых операций, то многие проблемы станут разрешимыми (но все ли? об этом см. в § 1 гл. 5).
В конце второй главы мы снова пришли к вопросу о том, сколь сложны или, лучше, сколь просты должны быть операции, выполнение которых может быть рассматриваемо как отдельный шаг алгоритмического процесса. Во всяком случае, нельзя считать допустимой такую операцию, способ получения результата которой нам неизвестен. Иначе многие нерешенные проблемы мы стали бы ошибочно считать решенными.
§ 4. Антиномии
В то время, когда А. Пуанкаре провозгласил, что математика обрела, наконец, надежный фундамент, сама арифметика пошатнулась из-за того, что в теории множеств были обнаружены противоречия (парадоксы), вошедшие в историю математики под названием антиномий.
Парадокс Рассела (открыт в 1902 г.). Если парадокс Кантора возникает для множества, которое содержит себя в качестве своего элемента, то парадокс Рассела связан с множествами, не содержащими себя в качестве своих элементов. Для удобства будем множество, не содержащее себя в качестве элемента, называть обычным, а множество, содержащее себя в качестве элемента,-- необычным.
Парадоксальным является множество всех обычных и только обычных множеств. Чтобы в этом убедиться, проверим, является ли оно само обычным или необычным. Сперва предположим, что оно обычное. Но тогда, будучи множеством всех обычных множеств, оно содержит и себя. Стало быть, оно необычное. Предположив, что оно обычное, мы получили противоречие.
Но, может быть, оно необычное, и дело с концом? Проверим. Если оно необычное, то, будучи множеством только обычных, оно себя в качестве элемента не содержит, а значит, является обычным. Опять противоречие.
Интересно, что парадокс Рассела может возникнуть и для каталогов, которыми мы уже пользовались для построения парадокса Кантора.
Парадоксальным оказывается каталог всех несамоназыващихся и только несамоназывающихся каталогов. Он не может быть самоназывающимся (содержать сведения о самом себе), так как является каталогом только несамоназывающихся каталогов. Точно так же он не может быть и несамоназывающимся, так как при этом не содержал бы сведений о себе (несамоназывающемся), но должен был бы содержать.
Парадокс брадобрея. Парадокс Рассела можно сформулировать без привлечения понятия множества. Представим себе, что один из солдат оказался по профессии парикмахером. Узнав об этом, командир полка приказал ему брить всех тех и только тех, кто сам себя не бреет. Все было хорошо, пока не пришло время побрить самого себя. Оказалось, что побрить себя нельзя, так как приказано брить только тех, кто себя не бреет; не брить себя тоже нельзя, потому что приказано брить всех, кто себя не бреет.
Не кажется ли читателю, что положение брадобрея подобно положению юноши, решившего купить костюм, цена которого меньше 50 рублей (потому что это дешевый костюм) и больше 150 рублей (потому что это хороший костюм)? Разница лишь в том, что условия для покупки костюма всегда противоречивы (не зависят от объекта покупки), а условия, при которых следует брить, не всегда: их противоречивость или непротиворечивость зависит от объекта бритья.
§ 5. Выводы из антиномий
Открытие антиномий потрясло математику и математиков как землетрясение. Их наличие, и при этом в такой области, как теория множеств (и логика, потому что парадокс брадобрея имеет логический характер), заставило опасаться того, что многие результаты, полученные в математике, тоже противоречивы. Можно было ожидать, что в дальнейшем будут появляться еще новые парадоксы. Все в математике стало казаться неустойчивым, потому что самый ее фундамент дал трещину.
Нужно сказать, что математики реагировали на землетрясение по-разному. Одни стали во всем сомневаться. Известный математик Ю. Дедекинд после опубликования антиномии Рассела на некоторое время прекратил публикацию своих работ. Математик Г. Фреге кончал в это время издание своего большого труда, подготовке которого он посвятил десять лет жизни. В первой же фразе послесловия он говорит, что фундамент построенного им здания поколеблен парадоксом Рассела. А. Пуанкаре, о котором мы уже говорили, изменил свое отношение к теории множеств. Были, конечно, и такие математики, которые на открытие антиномий никак не реагировали и бездумно продолжали применять теорию множеств, правда, в той ее части, в которой не обнаружено антиномий. Этих математиков обычно называют последователями классицизма. Но многие математики стали искать пути устранения противоречий.
Некоторые полагали, что противоречия возникают благодаря дефектам самой логики и стали пересматривать именно ее.
Другие предполагали, что парадоксы возникают из-за некорректности понятия множества, и занялись поиском такого определения множества, которое было бы свободно от внутренних противоречий.
Третьи -- получившие название формалистов -- пришли к выводу, что математика должна быть аксиоматизирована, а затем все теоремы совершенно формально доказаны. При этом возник вопрос о формальном языке для математики, таком, чтобы с аксиомами, изложенными на нем, можно было поступать как с определенными комбинациями символов. Доказательство теорем при этом принимало вид переработки исходных аксиом с помощью правил вывода в новые комбинации символов -- теоремы. Эти математики разработали новую дисциплину -- теорию математического вывода, называемую метаматематикой .
Четвертые усмотрели причину кризиса математики в том, что ряд математических объектов и методов являются неконструктивными. Разъясним последнюю точку зрения.
В теории множеств допускаются «готовые» бесконечные множества, уже существующие, уже завершенные. Завершенное бесконечное множество называют актуально бесконечным. Расходуя ограниченное количество ресурсов на каждом шаге, имеющем фиксированную длительность, построить такое множество ни реально, ни потенциально нельзя. Проверить, обладают ли все элементы такого множества каким-либо свойством, тоже нельзя, так как никакая ограниченная скорость проверки не дает возможности охватить их все. Другое дело, потенциально бесконечное, или потенциально осуществимое множество. Такое множество в каждый момент конечно, но есть прием, позволяющий добавить к нему всегда еще несколько (а потом еще несколько, и еще несколько, и так далее и, значит, сколько угодно) элементов. Анализ элементов такого множества можно провести исследованием правила, которое позволяет получать все новые и новые элементы этого «конструктивного» множества.
Актуально бесконечное множество, будучи недоступно ни построению, ни проверке, обязывает нас слепо доверять тем правилам логики, с помощью которых мы определили свойства его элементов. Указанные правила логики не основываются ни на каких фактах, доступных проверке, во всяком случае в смысле их правильности для актуально бесконечных множеств. Значит, говорят математики, придерживающиеся этой четвертой точки зрения, всей части теории множеств, имеющей деле с актуальной бесконечностью, доверять нельзя.
Будучи едины в своем отношении к актуальной бесконечности и в своем требовании конструктивности, сторонники четвертой точки зрения неодинаково решают вопрос о том, что допустимо в качестве исходного материала для конструкций. Таким образом, эта точка зрения делится на две группы.
Математики первой группы считают, что главным основанием для выбора какого-либо математического объекта в качестве исходного для дальнейших построений является его интуитивная очевидность. Читатель, вероятно, согласится, что выбор, опирающийся на интуицию, не может не быть субъективным. То, что интуитивно ясно одному, совершенно неясно другому. Это течение в математике получило название интуиционизма.
Математики второй группы считают, что исходным материалом для построений могут быть лишь наиболее простые математические объекты, применение которых оправдано всей практикой человечества, причем количество их типов должно быть ограничено. В качестве основного средства получения новых математических объектов должны служить алгоритмы. Это направление получило название конструктивного.
Нужно признать, что ученые всех перечисленных направлений внесли большой вклад в сокровищницу математики, получили большое число очень интересных, глубоких и важных научных результатов. Нужно также подчеркнуть, что наше описание различных точек зрения, возникающих в результате обнаружения антиномий, является упрощенным и неточным. Но более подробно осветить этот вопрос автор не имеет возможности.
Из всех указанных направлений мы выделим последнее -- конструктивное, поскольку оно для обоснования математики приняло на вооружение алгоритмы, и его сторонники стали разрабатывать теорию алгоритмов.
Итак, мы ознакомились со второй причиной для разработки теории алгоритмов: необходимостью обоснования математики.
На этом автор хотел закончить главу, но вдруг понял, что любознательный читатель, узнав о том, что произошло в математическом мире в начале XX в., несомненно захочет узнать -- а как же дело обстоит сейчас? Рассыпалась ли математика, как карточный домик, или она устояла, преодолела свой кризис?
Конечно, появление антиномий потрясло математику. Верно и то, что кризис математики еще и до сих пор полностью не преодолен. Три четверти столетия -- слишком малый для этого срок.
Но в общем-то оснований для отчаяния нет. Хотя теория множеств и не в полном объеме проанализирована и соответствующим образом перестроена, но из нее выделена и переработана определенная часть, пока достаточная для обоснования всех остальных математических дисциплин. Математики могут пользоваться этой частью теории множеств, избегая, пока что, еще не «разминированных» областей. Сущность антиномий глубоко исследована. Современная математика впитала в себя положительные результаты, полученные сторонниками всех перечисленных направлений.
В дальнейшем изложении мы иногда будем пользоваться терминологией и понятиями теории множеств. Но, занимаясь алгоритмами, будем пребывать в мире конструктивных построений и термины теории множеств применять только для того, чтобы сделать язык более кратким и выразительным.
ЗАКЛЮЧЕНИЕ
§ 1. Может ли машина мыслить?
Может ли человек решить алгоритмически
неразрешимую проблему?
Заключение должно быть коротким. Поэтому очень сжато скажем о некоторых интересных вопросах, на первый взгляд имеющих отношение к теории алгоритмов.
Некоторые горячие головы утверждают, что машина, как и человек, может мыслить, хотя бы в потенции. При этом высказывают опасение, что со временем машины станут умнее людей и даже, чего доброго, поработят их. Читатель, наверное, хотел бы составить свое мнение по этому вопросу.
Известно, что мышление -- это высшая форма движения материи, протекающая в мозге человека. Некоторые «философы» делают отсюда вывод, что машины не могут мыслить. Ход их рассуждений можно проиллюстрировать следующей схемой: селедка -- рыба; акула -- не селедка; значит, она не рыба.
Действительно, они считают, что человек может мыслить, машина -- не человек; значит, она не может мыслить. Это неверное рассуждение. Оно не опровергает того, что машины могут мыслить. Прошу читателя не делать из этих слов вывода о том, будто автор считает, что машины могут мыслить.
Чтобы ответить на такой сложный вопрос, нужно прежде всего решить, по каким признакам можно распознать способность к мышлению. Даже среди людей есть индивидуумы, которые не могут мыслить.
Но всегда ли можно решить, является ли человек мыслящим или нет? Для решения таких вопросов назначают экспертные комиссии и не всегда получают ясный ответ. Еще сложнее дело в случае, когда вопрос ставится не о конкретной имеющейся машине, а о машинах вообще, о будущих машинах. Автор может только сказать: ни одна из известных машин не мыслит, а может ли вообще машина мыслить? Неизвестно. Но почему бы и нет?
Противники машин в области интеллекта говорят, что признаком мышления является способность решать алгоритмически неразрешимые проблемы. Алгоритмы, которые соответствовали бы таким проблемам, не существуют. Значит, нет и программ. Отсюда вытекает, что машина (из-за отсутствия программы) не может решать алгоритмически неразрешимые проблемы. А вот человек -- другое дело. Человек -- творец. Он даже алгоритмически неразрешимые проблемы может решать! Этой точки зрения придерживаются не только простые смертные, но даже некоторые специалисты в области кибернетики. Правы ли они? Конечно, нет! Мы помним, что некоторые неразрешимые проблемы заключаются в том, что предлагается построить несуществующий объект. Например, каталог всех несамоназывающихся и только несамоназывающихся каталогов, или каталог всех каталогов, цена каждого из которых на единицу больше максимальной из цен указанных в них книг. Хотелось бы посмотреть, как вышеназванные противники машин решили бы хоть одну из этих проблем. Правда, не все неразрешимые проблемы столь безнадежны, как названные. Некоторые неразрешимые проблемы содержат в себе разрешимые подпроблемы. Их может решать человек, но для их решения возможен и алгоритм. Другими словами, обращаясь к алгоритмически неразрешимым проблемам, мы не установим различия между «интеллектуальными» возможностями людей и машин.
§ 2. Детерминированность машин. Самообучение
Отмечают еще, что машины, являясь физическими моделями алгоритмов, действуют детерминирование Человек же в некоторых случаях может действовать, не ограничивая себя столь узкими рамками. Считают, что деятельность человеческого мозга подчинена законам теории вероятностей и является стохастической.
И здесь автор вынужден занять осторожную выжидательную позицию. Связано это с тем, что механизм переработки человеческим мозгом поступающей в него информации еще не изучен. Что же можно о нем сказать, если он нам еще не известен?
Наряду с этим известно, что в состав некоторых машин включают физические приборы, называемые датчиками случайных чисел. Такие машины могут получать в процессе выполнения программ некоторые случайные результаты. Истолкование случайного числа как команды и посылка его в регистр команд ничего хорошего не дает. Но разумное применение случайных чисел позволяет программно моделировать реальные процессы, протекающие в условиях помех, и получать близкие к реальному результаты.
Во всяком случае, стохастичность деятельности человеческого мозга и обязательная детерминированность машины -- это еще не доказанные утверждения. Верны они или нет -- покажет будущее.
Для человека характерна способность накапливать опыт и менять в соответствии с ним свое поведение. Говорят, что человек способен к самообучению. Оказывается, что при соответствующей операционной системе и машина становится самообучающейся. Уже составлено немало программ самообучения машины при решении ею той или иной задачи.
Возможности самообучения пока что малы, так как современная ЭВМ очень похожа на слепого и глухонемого человека. Она может ощупью читать информацию, нанесенную на перфоносители, и вслепую выдавать информацию. Безусловно, оснащение машины разнообразными и многочисленными устройствами ввода и устройствами выдачи информации повысит возможности самообучения машин. Но ведь каждый человек сперва обучается и начинает это делать с момента рождения. Лишь потом, имея уже огромные запасы информации, он начинает самообучаться.
В области самообучения машинам до людей еще далеко. Но машины будущего скорее всего будут обучающимися и самообучающимися. Варварский метод «начинки» машин огромным числом заранее составленных программ, безусловно, будет изжит, так как он слишком трудоемок и не позволит эффективно использовать машины будущего.
Если Вы, уважаемый читатель, дошли до этих строк, то автор может считать, что не зря трудился. Автор надеется, что ему удалось показать, какую роль в нашей жизни и науке играют алгоритмы. Мы их встречаем везде и всегда, даже в музыке (здесь ноты -- это алгоритмы).
Интерес к науке об алгоритмах вполне естествен. Их повсеместное распространение, их большое значение во всех областях нашей деятельности заставляют интересоваться этой наукой.
При первом знакомстве с алгоритмами мы обратили внимание на определенную связь между ними и протекающими вокруг нас процессами. Автор сразу предупредил, что связь не является абсолютной. Когда мы глубже вникли в существо понятия алгоритма, то обнаружили, что один и тот же алгоритм может вызывать различные процессы, ведущие к одинаковым результатам при одинаковых исходных данных.
Впоследствии мы применили алгоритмы для описания процессов. Это может быть методом алгоритмизации, если процесс для нас безразличен. Но это становится способом фиксации процессов в тех случаях, когда для нас важны процессы как таковые.
Нежесткая связь между процессами и алгоритмами дает возможность улучшения хода или содержания некоторых шагов процессов, автоматизации их, повышения эффективности.
Являясь математической дисциплиной, теория алгоритмов в отличие от некоторых дедуктивных, абстрактных разделов математики непосредственно изучает определенные явления реального мира. Ее следует отнести к так называемой прикладной математике.
На страницах этой книги неоднократно упоминался основной тезис теории алгоритмов. Обычно он связывался с традиционными теориями избранных алгоритмов. Как звучит этот тезис, если иметь в виду широкое формальное определение алгоритма, мы уже сказали, но все же повторим.
Основной тезис. Для любого алгоритма (в интуитивном смысле) над формальным языком L, если его запись можно рассматривать как конструкцию, существует эквивалентный ему алгоритм в широком формальном смысле, имеющий ту же запись.
Это означает, что современная теория алгоритмов охватывает все практически важные случаи. Ее дальнейшие обобщения связаны с обобщением понятия конструкции. Сегодняшние потребности теории ЭВМ и программирования она может обеспечить.
Кончая книгу, хочется заглянуть немного вперед, хотя бы в ближайшее будущее. Если наука эффективна, она должна позволять делать прогнозы.
Из широкого формального определения алгоритма вытекает, что алгоритм не только может, решая задачу, перерабатывать свою запись, но может перерабатывать и запись своего алгоритма выполнения. Для этого нужно более отчетливо вспомнить его «папу» (алгоритм выполнения), который тоже алгоритм и имеет своего «папу», приходящегося нашему алгоритму «дедушкой». Это значит, что, работая, алгоритм выполнения может перерабатывать и себя. Обозначая исходное данное через sitj, алгоритм-- через tt, а результат--через рг_}, можем составить формулу из которой указанная возможность и вытекает.
Применяя это соображение к ЭВМ, в 1977 г. (в 1-м издании данной книги) мы пришли к выводу о возможности машины, которая обладала бы «способностью» перестраиваться, если этого требует программа. Появление таких машин теперь -- свершившийся факт.
В § 1 данной главы мы почти допустили возможность мышления машин. Но наша книга посвящена не машинам, а алгоритмам. Сформулируем же упомянутую проблему в терминах теории алгоритмов. Очевидно, вопрос ставится не о том, чтобы любая машина мыслила, а о возможности создания такой машины, для которой можно составить программу мышления. Если отвлечься от ограниченности ресурсов времени и ЗУ, вопрос упрощается: достаточно, чтобы машина была универсальной (типа ЭВМ).
Мы знаем, что ЭВМ являются физическими моделями коллективов алгоритмов. Теперь представим себе условия, в которых обычно находится мыслящий человек. Он располагает некоторыми сведениями, хранящимися у него в мозге; оперируя ими, он по мере надобности обращается к внешним источникам -- книгам, справочникам, задает вопросы другим людям; кроме того, он, может быть, получает сведения путем экспериментов. В конце концов он создает некоторый результат своего мышления. Для упрощения можно считать, что мышление производится без привлечения экспериментов. Правда, с самого начала мы приняли еще одно упрощение: ограничились случаем, когда мышление протекает «в тиши кабинета», тогда как нередко человек мыслит, находясь во взаимодействии с изменяющимся реальным миром. Между мыслящим человеком и коллективом алгоритмов напрашивается чисто внешняя аналогия. То, что хранится у человека в мозге (его знания),-- подобно основному операнду; сведения, получаемые извне по мере надобности, подобны потокам частных операндов(см. конец § 10 гл. 8); действия, совершаемые мозгом, напоминают нам процесс выполнения открытого коллектива алгоритмов. Очень упрощая картину, можно предположить, что дополнительные сведения собраны заранее в некоторой информационной системе (см. § 2 гл. 10) без обновления, присоединяя которую к открытому коллективу алгоритмов, мы превращаем его в закрытый. В аналитической теории алгоритмов доказано, что каждый закрытый коллектив алгоритмов эквивалентен некоторому одиночному алгоритму.
Таким образом, в самом простом случае проблема возможности мышления машин сводится к вопросу возможности разработки алгоритма, эквивалентно моделирующего работу мозга. Мозг (и даже мозг всех людей) хранит конечный объем сведений и существует конечное время. Не будет грубой ошибкой, если мы посчитаем, что сведения хранятся в мозге в форме символьной конструкции (реализованной физически или, если хотите,-- биологически). Существует только конечное число символьных конструкций, которые могут быть размещены в ЗУ конечного размера (т. е. в мозге и в информационной системе). Таким образом, перед нами задача о построении алгоритма, входной язык операндов которого конечен. Такая задача алгоритмически разрешима, но только потенциально. Реально ее разрешить методом алгоритмизации нельзя из-за ее большой трудоемкости.
Но сделанные нами упрощения слишком велики. Алгоритм мышления, который мы получим, будет слишком примитивен. Он будет эквивалентен поиску ответа в некотором справочнике (хотя и в очень большом). Можно также сказать, что мы решим задачу алгоритмизации только уже осуществленного мышления, что не представляет интереса. Проблема станет тем интереснее, чем привлекаемая информационная система будет допускать обновление информации. Но даже и в этом случае она остается сильно «урезанной» из-за того, что набор дополнительных операндов фиксирован. Впрочем, алгоритм мышления, справляющийся со своей задачей, в последнем усложненном случае уже «умнее» каждого из породивших его людей, имевших в своем мозге те сведения, которые являются допустимым основным операндом. Остается открытым только один вопрос: возможен ли такой алгоритм?
Человеческий мозг может мыслить, несмотря на изменения, происходящие в мире (и, следовательно, в исходных данных для мышления), потому что он сам изменяется не только от поколения к поколению, но и в течение жизни отдельного индивидуума. Соответствующая алгоритмическая проблема состоит в вопросе о возможности открытого коллектива алгоритмов, который бы не только перерабатывал операнды, но и видоизменял сам себя.
С проблемой мышления связан вопрос о сознании. Имеется в виду не философское значение этого слова, позволяющее ставить такие кардинальные проблемы, как проблема значение - способность человека отделять себя от остального мира. По отношению к человеку мышление является частью сознания. О мышлении машин мы говорили вне связи с сознанием. Мы как бы предполагали, что мышление машины - это выполнение алгоритма, перерабатывающего информацию эквивалентно тому, как это делает мозг. При таком понимании мышления машин сознание оказывается формой мышления.
Действительно, можно себе представить, что основной операнд открытого коллектива алгоритмов состоит из двух частей, одна из которых является символьной моделью самой ЭВМ (или коллектива алгоритмов), а другая - символьной моделью той части реального мира, которая "известна" машине. Такая пара моделей чем-то похожа на сознание (в том узком смысле, в котором мы условились понимать сознание). Здесь в своих обсуждениях проблемы алгоритмического моделирования сознания мы остановимся, потому что эта проблема выходит за рамки нашей книги. Она очень интересна, но упомянута только для того, чтобы обратить внимание читателя на так называемое алгоритмическое (или программное) моделирование.
Поясним сущность понятия модели. Предположим, что имеется некоторый объект, подлежащий исследованию. Назовем его прототипом. Моделью прототипа называется любой объект, так соответствующий прототипу, что описание некоторых его свойств можно перевести в описание тех свойств прототипа, которые нас интересуют. Моделями пользуются тогда, когда исследование самого прототипа слишком сложно или почему-то невозможно. Как видно из этого описания, модель не является копией прототипа (хотя и это возможно), а в такой мере ему соответствует, что исследование некоторых свойств прототипа можно заменить исследование некоторых (вообще говоря, других) свойств модели. Первоначально модели применялись только в технике. Например, перед тем как строить какое-либо сооружение, сперва изготовляли его уменьшенную модель из удобного для этого материала. Модель испытывали и по результатам судили о свойствах будущего сооружения. Немного позже было замечено, что прототип и его модель допускают одно и то же математическое описание или их математические описания могут быть с помощью некоторого преобразования сведены одно к другому (требуется, чтобы описание модели можно было свести к описанию прототипа).
Наконец поняли, что самое математическое описание прототипа можно считать его моделью (математической). Эта простая мысль явилась результатом длительных исследований и размышлений. Сейчас ее справедливость не вызывает сомнений! Математическую теорию моделей можно найти в книгах по абстрактной алгебре и в книгах по математической логике. Абстрактная алгебра утверждает, что модель -- это множество, на котором задана некоторая совокупность отношений. Логика рассматривает модели систем аксиом -- множества, элементы которых таковы, что свойства этих элементов удовлетворяют указанным аксиомам и следствиям из них. Мы видим уже три различных определения математической модели. Два последних являются частными случаями первого. Повторим его: математической моделью прототипа называется некоторое его математическое описание. Это математическое описание может быть произведено различными математическими средствами. В частности, описание прототипа может быть алгоритмическим, а если оно рассчитано на применение ЭВМ, то -- программным.
При алгоритмическом моделировании модель имеет две компоненты: символьную конструкцию из класса некоторых символьных конструкций и алгоритм или коллектив алгоритмов. Программная модель обычно имеет еще некоторые компоненты: программу внесения изменений в символьную конструкцию (хранящуюся в запоминающих устройствах) и программу обработки результатов моделирования. При программном моделировании могут встретиться два вида моделей -- функциональные и имитационные.
Функциональные модели строят для моделирования одних алгоритмов в виде других. Например, можно одну ЭВМ, являющуюся, как уже известно, физической моделью алгоритма, моделировать на другой. При этом функциональной моделью первой ЭВМ будет программа второй. В более простом случае алгоритмическая модель эквивалентна прототипу. В более сложных случаях функциональная модель не эквивалентна, а, как говорят,-- равносильна прототипу. В первом случае исходные данные и результаты прототипа и модели соответственно одинаковы, во втором случае известен простой прием преобразования исходных данных прототипа в исходные данные моделирующего алгоритма и результатов моделирующего алгоритма в результате прототипа. Программное моделирование такого вида является одним из средств, используемых при разработке ЭВМ и сложных программных комплексов.
Имитационное моделирование применяется для исследования различных процессов путем их условного воспроизведения, при котором каждый шаг процесса-прототипа заменяется одним или несколькими шагами моделирующего алгоритма. Алгоритмическое описание процессов (см. § 3 гл. 10) является частным случаем имитационного моделирования. Большой интерес представляет так называемое статистическое моделирование, при котором имитация процесса сводится к вычислению какого-либо параметра или ряда параметров, изменяющихся при функционировании прототипа и записи получаемых значений. После того как произведено большое число имитаций при соответствующих изменениях имитации, полученные результаты подвергаются статистической обработке точно так же, как обычно обрабатывают результаты эксперимента. Статистическое имитационное моделирование иногда позволяет обойтись без дорогостоящих опытов. § 4. Последние замечания
В заключение данной книги скажем несколько слов о вопросах, относящихся к области мировоззрения и являющихся по отношению к аналитической теории алгоритмов предварительными. Эти вопросы уже были очень коротко затронуты в § 5 гл. 3 и в § 3 гл. 5. Там упоминалось, что теория алгоритмов является основой конструктивного направления в обосновании математики. Сразу отметим, что конструктивные идеи в математике не сводятся к теории алгоритмов, которая лишь наиболее последовательна в этом отношении. Ограничимся только теорией алгоритмов.. В теории алгоритмов основой для получения всевозможных конструктивных объектов являются некоторые первоначальные объекты. Математического обоснования их конструктивности нет. С таким же правом их можно считать и неконструктивными. Доматематическое их обоснование заключается в том, что их практическое существование или (если это операции) практическая возможность их выполнения ни у кого не вызывают сомнения. В логических теориях алгоритмов первоначальными являются буквы, слова и некоторые операции (например, в теории нормальных алгоритмов -- марковские подстановки); первоначальной является также способность преобразовывать любую символьную конструкцию в слово. Вопрос о том, откуда берутся слова-операнды ни явно, ни неявно не затрагивается. В аналитической теории алгоритмов первоначальными являются буквы, связи, и натуральные операции. Символьные конструкции из букв и связей получаются уже средствами теории (поэтому в состав теории алгоритмов входит раздел о формальных языках). Понятие актуальной бесконечности ни явно, ни неявно не привлекается. Разночтения символьных конструкций тоже нет. Доматематическим их обоснованием является признание существования реального мира, абстрактными образами объектов и процессов которого являются символьные конструкции и алгоритмы. Применяемые языки поэтому наделены смыслом. Способность преобразовывать любую символьную конструкцию в слово не считается первоначальной и обеспечивается возможностью ограниченного применения произвольного выбора из конечного числа элементов (в процессе произвольной нумерации с последующим получением результатов всех возможных нумераций и выбора из них одного, лексикографически не старше всех других).
Конечно, не запрещается математику изучать аналитическую теорию алгоритмов без того, чтобы задумываться о реальном мире, хотя это и нельзя одобрить. Точно так же не запрещается, изучая логическую теорию алгоритмов, считать, что слова являются описаниями реальных объектов. Но логическая теория алгоритмов даже не намекает на какой-нибудь способ описания объектов в виде слов, тогда как аналитическая теория такие намеки делает. Например, для описания объектов напрашивается применение приема, называемого структуризацией, который предусматривает расчленение объекта на составные части -- более простые объекты, к которым опять применяется тот же прием, и так до тех пор, пока не будет получена конструкция, построенная с помощью связей из таких простых объектов, какие мы уже умеем представлять в виде символьных конструкций. Точно так же сложные операции конструируются из натуральных путем построения алгоритмов.