Так робок первый интерес.
Б. Пастернак
Способности электронных вычислительных машин известны нам лишь в небольшой степени. Быть может, такое утверждение покажется читателю странным. Раз машина существует, значит, можно ее испытать, выяснить и время разгона, и максимальную скорость, и тормозной путь, и многое другое. Это справедливо для разных машин, но, увы, не для ЭВМ.
Поведение и результаты действия компьютера определяются введенной в него программой; они меняются неузнаваемо вместе со сменой программы. А разнообразие программ для ЭВМ поразительно. Существуют, однако, границы программной многоликости: ЭВМ решает только те проблемы, которые могут быть описаны посредством алгоритмов.
Итак, познать возможности ЭВМ - это познать возможности алгоритмов. Если с помощью алгоритмов удастся описать разумные решения, то Искинт - реальное дело, а если алгоритмы имеют внутренние пороки, то Искинт останется лишь благим пожеланием.
Передо мной небольшая глиняная табличка, найденная при раскопках Древнего Вавилона. На табличке текст: древний писец выдавил эти знаки 3700 лет назад. Касаясь острым стилом сырой глины, писец решал задачу о разделе наследства: вычислял доли каждого из шести сыновей, положенные им по законам божественной династии Хаммурапи. Писец занимался конкретным случаем: и сумма наследства точно обозначена - вот оно, число, представленное в привычной для тогдашних жителей Вавилона шестидесятеричной системе счисления, - и ход расчета указан, и промежуточные результаты выписаны столбиком, и конечный результат обведен рамочкой. Писец решил задачу для одной семьи; по заказу ли мудрого отца семейства, или по желанию нетерпеливых сыновей, но только для этой семьи.
Тогда почему в тексте он не называет отца и сыновей по имени, а говорит о "начальном сокровище", "доле 1-го", "доле 2-го" и "прочих долях"? Отчего рядом с ясными числами приводит туманные для практического взгляда пояснения: "3 и 5, сумма накопленных денег и процента стоимости земли"? Кому советует: "составь число", "вычти", "прибавь", "не забудь"? Кого предупреждает в конце таблички: "Таков ход дела"?
Похоже, шесть бравых сыновей и их пожилой отец здесь ни при чем. Писец преодолевал не их домашние трудности. Он замахнулся на большее: он объяснял, как решать задачи о разделе наследства вообще, любые задачи, весь класс таких задач.
Отец и сыновья понадобились писцу лишь для примера. В табличке есть явное доказательство этого. Семья, о которой сообщает писец, имеет только сыновей. Тем не менее древний математик требует: "Найди долю дочери", и вычисляет дочернюю часть наследства: "0". Писец велит далее: "Умножь долю дочери на число дочерей", и аккуратно выдавливает "0X0=0".
Табличка окончена... Писец посылает ее на обжиг, а потом горячую, прямо с пылу с жару, просматривает - нет ли ошибок. Он озабочен лишь ходом дела, порядком решения. И порядок указан четко, детально, без упущений. А числа? Числа не так важны! Он отдает табличку ученику, не заметив ошибки в счете. Ученик берет глиняный алгоритм, указатель хода решения задачи.
Ученики древневавилонской школы, "Дома табличек", уже давно прорабатывают алгоритмы решения разных задач. Они изучали и про плотину, и про урожай пшеницы, и про овец. Теперешнее задание - алгоритм наследства...
Спустя почти 4 тысячи лет, когда мне пришлось учиться математике в школе и вузе, слово "алгоритм", не было модным. Модным было слово "формула". Вывести формулу, выучить формулу наизусть, забыть формулу, перепутать формулу - вот наши любимые занятия.
Сомневаюсь, знал ли я, что такое алгоритм, в середине 50-х годов, оканчивая политехнический институт. Но прошло 2-3 года, и слово это стало изредка появляться в наших инженерских разговорах. Оно никогда не являлось одно - всегда в паре с электронной вычислительной машиной. Алгоритм помещают в ЭВМ, называя его почему-то уже не алгоритмом, а программой, и там, в недрах машины, среди электронных ламп, происходит чудо мгновенного решения задач.
Я помню весенний Киев 1957 года и встречу со своим соучеником Валерием Куликом на бульваре Шевченко. Рассказывая о новой своей работе, он пылко призывал меня:
- Алгоритмировать надо, Алексей!
- Что алгоритмировать?
- Все, буквально все! - сопровождал он широким жестом свое утверждение.
Выходило, что надо алгоритмировать и манизеровский памятник поэту, и университет, и дом, в котором я жил; нужно алгоритмировать и строительство, и производство сахара, и движение облаков в весеннем небе.
- А как это делать? - рискнул спросить я у товарища.
В ответ понеслись непонятные слова: команда, цикл, счетчик, ветвление... Даже знакомое слово - результат - выглядело в этом перечне устрашающе. Не по-няч, как алгоритмировать, я решил зайти с другого фланга.
- А зачем все это делать?
Тут мой собеседник взорвался.
- Зачем - спрашиваешь? Чтобы одолеть незнание! ЭВМ считает со скоростью три тысячи сложений в секунду. Три тысячи, понимаешь? Ты и одного сложения не сделаешь, а она уже три тысячи. Все, все, все теперь можно сосчитать: и рост деревьев, и развитие животных, и наилучшие планы для заводов. Кончается работа на глазок, кончается на авось. Все будем теперь считать на машине, понимаешь?
- Вроде понимаю. Только как машина станет считать? Формула ей нужна? Или она сама, без формулы?
- Формулы забудь! Вместо них теперь алгоритмы. Алгоритмировать надо! - категорически заявил друг.
Первую часть его предложения выполнить было легко - большинство школьно-институтских формул я к тому времени прочно не помнил. А вот вторая часть, все эти команды, циклы, ветвления...
Я вернулся домой. Было бы неправдой сказать, что вернулся с твердым желанием научиться алгоритмировать. Скорее я вернулся с полезной тревогой в душе: где-то там рождается новый мир ЭВМ и алгоритмов, а я даже не понимаю, о чем идет речь.
Сегодня, двадцать лет спустя, перед моим мысленным взором проходит череда алгоритмов, с которыми удалось познакомиться за эти годы. Какой из них выписать здесь, для первого случая? Один строен и изящен, другой стремителен, хотя и мешковат, третий упорен и солиден, четвертый такой модный: кольца, идеалы и чуточка шейпов. Ладно, выбираю вот этот.
"Спинка. Набрать 86 петель, провязать 4 ряда "рябушкой" и затем перейти на чулочную вязку. На 43-м см от линии низа закрыть на пройму с обеих сторон по 6 петель, затем с каждой стороны провязать по 2 последние и 2 первые петли вместе и 1 раз - 2 последние вместе. На спицах должно остаться 62 петли - продолжать вязать их до плечевого скоса (17 см). Плечевой скос выполнять..."
Нужны ли обоснования моего выбора? Для вас, уважаемые читательницы-женщины, полагаю, нет. А для вас, читатели-мужчины?
Для мужчин, и только для них,, мои доводы: сегодня большинство программистов в нашей стране - женщины. На собственном опыте автор убедился, что девушки, которые хорошо вяжут, хорошо программируют. Это повелось изначала: первым в мире программистом была Ада Лавлейс; она была отличным программистом и, говорят, искусной вязальщицей.
А. Лавлейс, дочь великого английского поэта Джорджа Байрона, сотрудничала с кембриджским профессором Чарльзом Бэббеджем, который придумал в 40-х годах прошлого века вычислительную машину. Компьютер Ч. Бэббеджа по идее мало отличался от современных цифровых вычислительных машин, только состоял он из шестеренок и рычагов (до возникновения электроники оставалось еще 80 лет).
Натурально, механический компьютер оказался громоздким; полностью Ч. Бэббеджу так и не удалось его собрать. Скептические современники прозвали всю эту затею "чудачеством Бэббеджа". А. Лавлейс не относилась к скептикам, она была другом профессора Ч. Бэббеджа, болела душой за новое дело, помогала как могла.
А могла эта нервная, изящная, болезненная женщина многое. Она смогла понять величие и грандиозность идеи универсального компьютера. Она написала для "чудачества Бэббеджа" несколько великолепных программ. Она провидела принципы программирования - единые для любых вычислительных задач. Она открыла, что счетная машина не только счетная и даже не в первую голову счетная; компьютер способен решать нечисловые задачи.
Даже сегодня это "не", поставленное А. Лавлейс перед словом "числовые", даже сейчас это "не" кажется многим людям странным, сомнительным, неприличным.
Все мы так свыклись с названиями - цифровая вычислительная машина, электронная счетная машина. Они то и дело мелькают на страницах книг, журналов, газет. Вычислительная машина! Счетная машина! И перед мысленным взором возникают бухгалтерские счеты, но с электронными костяшками, счеты огромной производительности. Складывать числа, вычитать, умножать, делить, извлекать корни из чисел - одно слово, вычислительная машина, цифромолка, компьютер, числоглот ненасытный.
Если б вправду машина только и была способна перерабатывать числа, мало было б надежды вместить в нее искусственный разум. Ибо не числом единым жив Искинт.
В нашей обыденной жизни мы редко вычисляем. Рано утром по пути на работу я перехожу улицу. Мчатся, спешат встречные потоки автомобилей. И я спешу. Вот тут бы решить точно задачу о безопасном переходе, учесть направление и скорость движения транспорта, время открытия светофора. Ничего подобного я не делаю, а ориентируюсь на глазок, прикидываю без чисел, шагаю смело - и вот я на другой стороне улицы.
Так начинается день, и так он продолжается, и вся наша сознательная жизнь совсем не числовая, вовсе не вычислительная. Мы не по формуле находим, где благородство, а где предательство, не подсчитываем, кто нам враг, а кто друг. Наши решения, наши жизненные выборы чаще всего не количественные, а качественные: "лучше - хуже", "проще - сложнее", "деликатнее - грубее", "уродливее - красивее". Даже математики, эти жрецы меры и числа, нередко плохо умеют считать и часто создают свои тонкие теории, опираясь не на цифры, а на грубые оценки.
"Лишь мысли свет, не скованный числом, осветит тайны и достигнет правды", - утверждал Д. Байрон. Ада Лавлейс первой поняла, что не только людям, но и вычислительным машинам под силу нечисловые задачи. Работая над своими программами, молодая женщина увидела вдруг в "чудачестве Бэббеджа", в компьютере, мельницу, в которой могут перерабатываться не только наборы цифр - числа, но и наборы любых символов - "слова", на каком бы языке ни были сказаны эти слова. Чтобы осознать проницательную и необычную мысль А. Лавлейс, мы начнем с шуточной истории. Вспомните игру, которой, скуки ради, занимались гости в одном из рассказов Ильфа и Петрова. Хозяин дома предлагает:
- Ну, давайте грузить корабль. На какую букву? На "м" мы вчера грузили. Давайте сегодня на "л". Каждый говорит по очереди, только без остановок.
Друзья дома принимаются грузить.
- Ламбрекенами! - подхватывает первый гость.
- Лисицами!
- Лилипутами!
- Лобзиками!
- Локомотивами!
- Ликерами!
- Лапуасцами!
- Лихорадками!
- Лоханками!
Постепенно запас слов скудеет, и гости уже грузят корабль люмпен-пролетариями, лезгинками, ладаном... Вычислительная машина, в памяти которой хранится хороший словарь существительных, могла бы присоединиться к словоохотливым гостям.
В свой черед она извлекала бы из памяти свои слова, не уставая, не забывая, не повторяясь и не пропуская ничего. Уж она не стала бы от нехватки более подходящих товаров грузить корабль лихорадками или лезгинками: в компьютерном алгоритме четко оговорено, что подходят только вещи и существа.
Гость-машина вчистую обыграет гостей-людей, последнее слово почти наверняка останется за ней. Кстати, и обмануть машину нелегко: ходы она считает, каждое слово собеседников проверяет.
Может, подсунуть ей несуразную букву? На "л" она сильна, пусть грузит на "ы". Тоже не пройдет. Обнаружив "ь", "ъ", "ы" или "й", цифровая не дрогнет, и отпечатает: "Шутки в сторону. Вы не знаете больше товаров на "л", следовательно, вы проиграли, а я выиграла. Продолжаем грузить корабль. Предлагаю теперь грузить на "п". Я гружу корабль программистами. Следующий ход ваш, хозяин!"
Итак, цифровая вычислительная машина прекрасно решила не числовую, а словесную задачу. Она оказалась интеллектуальнее человека, даже не одного, а целой компании, всех гостей разом.
Вот это да! Похоже, путь к Искинту открыт, и недлинным и прямым выглядит этот путь.
Просто следует усложнять словесные задачи. Вместо "Погрузки корабля" возьмем студенческую головоломку: сделать из мухи слона.
Требуется получить из слова "муха" слово "слон", меняя каждый раз по одной букве, причем все промежуточные слова должны тоже быть полноценными русскими словами.
Попробуйте сделать из мухи слона. Это совсем непросто. Решение головоломки: муха - мура - тура - тара - кара - каре - кафе - кафр - каюр - каюк - крюк - крок - срок - сток - стон - слон. Машина с программой, мало отличающейся от "Погрузки корабля", успению выведет эту цепочку слов и добавит, что в заданном ей словаре эта цепочка наикратчайшая. Правда, впечатляет?
Теперь расширим круг доступных машине "слов". И опять воспользуемся не очень серьезным примером. Ну, скажем, однажды к компьютеру обратился некий молодой человек с просьбой помочь в розысках Спящей красавицы. Машина охотно согласилась, только попросила у юноши карту сказочной страны и вызвала для консультации вещую птицу. Вещая птица много знала, но говорила всего два слова - "да" и "нет".
Делать нечего, машина разделила территорию сказочного Царства пополам и присвоила половинкам имена. Одну из них назвала Баклуши, а другую - Балясы. Потом ткнула световым карандашом в Баклуши и спрашивает у вещей птицы:
- Красавица здесь?
- Нет, - отвечает осведомленная птица.
- Значит, она в Балясах, - соображает машина и теряет всякий интерес к пустой половине Царства. В фокусе машинного разума оказались Балясы, для компьютера именно они стали всей страной, и, естественно, машина присваивает им новое имя: были Балясы, а стало Царство.
Как и положено в сказке, полстраны обратились вдруг страной, зато машине ни о чем не нужно думать, она просто повторяет всю цепь своих действий: делит территорию Царства пополам, называет половинки (на самом-то деле они уже четвертинки) Баклушами и Балясами, указывает на новоявленные Баклуши и опять осведомляется у птицы:
- Красавица здесь?
- Нет, - говорит птица.
- Значит, в Балясах, - привычно решает компьютер, столь же привычно присваивает четвертушке страны имя Царство и делит это оскудевшее Царство снова пополам.
Так раз за разом машина дробит страну, отбрасывая части, где нет красавицы, до тех пор, пока вещая птица не скажет "да".
Найденная часть может оказаться и маленькой площадкой, и размером с полстраны - как повезет. Естественно, юноша, вошедший во вкус электронных поисков, вместо того, чтобы обшаривать леса и луга, преодолевать реки и горы, предпочтет усовершенствовать алгоритм.
"Есть же в последних по счету Баклушах единственное место, где расположена пещера с красавицей, - размышляет он. - Только как узнать доподлинно, где оно? Компьютер единственное, что умеет, - это половинить Царство да присваивать половинкам имена. Имена прежние, а площадь все меньше и меньше, глядишь, па остатке едва уместится пещера. Вся страна - пещера. Вот это мне и нужно! Значит, пусть машина сравнивает две площади: площадь пещеры и площадь своих Баклуш".
И спрашивает у вещей птицы:
- Баклуши еще велики?
- Да, - отвечает птица.
Компьютер опять делит их пополам, присваивает имена, спрашивает, снова делит, опять присваивает. И настает решающий миг:
- Красавица здесь?
- Да.
- Баклуши еще велики?
- Нет!
Дело сделано: кусочек сказочной страны, на который машина указала перстом, и есть пещера. Юноше можно теперь садиться на коня и скакать к невесте напрямую.
Юноша, скачущий к невесте
Машина нашла Спящую красавицу довольно необычным, на взгляд человека, манером: она использовала неизменный прием поиска - делила Царство пополам да присваивала половинкам имена. Произошло множество присваиваний, целая череда переименований. И выходит, что решение совсем не словесной, а лирической задачи состоит в переработке "слов", опять в переработке "слов".
Вычислительной машине безразлично, принадлежат ли "слова" русскому языку, языку логики или представ ляют собой набор диковинных символов. Машина справ ляется с любыми "словами": заменяет буквы, разрезает склеивает, сравнивает, дополняет, присваивает. Машин ный счет тоже хоровод "слов"; эти "слова" - числа а правила их переработки - арифметические законы Само собой, машина превращается в гигантский ариф мометр, в цифромолку, в числоглота ненасытного.
Машина обрабатывает любые "слова" по правилам, диктуемым алгоритмом. В алгоритм мы вольны включить и лингвистические, и логические, и геометрические, и арифметические, и всякие иные правила...
Мало-помалу, но и мы подошли к краю пропасти, в которую заглянула когда-то А. Лавлейс. Ее потрясла способность машины, шестереночного механизма, обрабатывать самый человеческий, самый интеллектуальный материал - слова. Людское слово вездесуще - и размышления наедине с самим собой, и дружеские беседы, и ученая переписка, и пламенные речи трибунов, - всюду слово.
И, принятое в множество голов,
Оно свое вершит упрямо дело.
Я знаю, люди состоят из слов,
Которые им внутрь вошли, и тела.
Аде Лавлейс, полагаю, пришлись бы по душе эти строки поэта Е. Винокурова, они созвучны с ее пониманием роли слова.
"Машина обрабатывает любые слова, - размышляла Ада. - Она производит над ними любые операции. Машина как бы воплощает в себе науку операций, в том числе над вещами, до того не разрешенными головой и руками человека... Но может ли машина создать что-то подлинно новое? Пожалуй, нет, ее жребий -строго следовать анализу".
"Анализом" А. Лавлейс называла алгоритм. Пора и нам, читатель, разобраться в устройстве алгоритма, пора оценить его возможности.
Понятие "алгоритм" появилось в средние века, когда Европа познакомилась с книгой арабского ученого Мухаммеда бен-Муса аль Хорезми. Книга именовалась "Китаб аль-Джебр валь-Мукабала", что примерно означает: "Книга об операциях джебр (восстановления) и кабала (приведения)". Труд Хорезми произвел на европейские умы настолько сильное впечатление, что во все наши языки вошло два новых слова: алгебра (из "аль-Джебр") и алгоритм (из "аль-Хорезми").
"Алгоритм" не очень похож на "аль-Хорезми": средневековые толмачи подравняли восточное слово под древнегреческий шаблон; его родственником незаконно стал "ритм". Впрочем, так ли уж незаконно? Хорошие алгоритмы, бесспорно, обладают внутренним ритмом.
Поначалу новорожденный алгоритм означал всего лишь нумерацию, правда, но непривычной для европейцев позиционной системе счисления, той самой, с которой мы так сжились теперь. Потом смысл слова изменился: алгоритмом стали именовать набор правил, по которым следует производить вычисления. Скажем, правила умножения двух чисел в столбик - алгоритм умножения.
Естественно, возникает ехидный вопрос: неужто такой элементарной вещи, как правила умножения в столбик, обязательно присваивать пышный титул алгоритма?
На ехидный вопрос - сокрушительный ответ: умножение сегодня стало элементарной вещью, а в средние века, когда пользовались римскими цифрами, за знание правил перемножения двух трехзначных чисел присваивали степень доктора наук. Хороший алгоритм сделал умножение элементарным и общедоступным. Равно как и извлечение корня из числа, и нахождение наибольшего общего делителя, и...
Нет, вавилонские ученые знали свое дело, когда заполняли тысячи глиняных табличек алгоритмами, когда создавали библиотеки алгоритмов.
У нас тоже стала накапливаться своя библиотека, в ней уже три алгоритма - "Спинка кофточки", "Погрузка корабля" и "Спящая красавица". Пусть не смущает вас, читатель, их несерьезный, потешный характер: потешные солдаты Петра Первого составили потом ядро его гвардии.
Со всем уважением присмотримся к алгоритмам нашей библиотеки. Каждый более всего похож на цепь, звеньями которой являются операции. Почти все операции - прямые команды, они начинаются глаголами в повелительном наклонении: "найти", "взять", "поделить", "вставить", "скопировать", "отбросить", "вязать".
Цепь операций-команд нигде не прерывается; добавляя к ней звено за звеном, мы можем изобразить во всех подробностях ход самой трудоемкой работы.
Весной 1616 года придворные французского короля Людовика XIII собрались на лужайке парка Фонтенеб-ло, чтобы познакомиться с диковинными автоматами. Автомат-мушкетер в плаще и в шляпе с пером невозмутимо шагал по лугу, останавливался, извлекая шпагу из ножен, салютовал ею придворным и четко, даже щегольски отправлял шпагу на место. Автомат-пастушка нежно улыбалась, двигалась плавно и женственно, закатывала глаза и произносила голосом, напоминавшим свирель: "Да здравствует король!" Автомат-утка по понятным причинам не приветствовала короля, зато крякала, переваливалась с боку на бок, входила в пруд и - смотрите! - плыла по глади вод, перебирая перепончатыми лапками.
- Люди и животные сделаны из железа, а ведут себя как живые! - удивлялись придворные.
Вместе с ними удивлялся и бретонский дворянин Рене Декарт, хрупкий юноша, способный не только удивляться, но и тщательно обдумывать удивительные вещи, пристально рассматривать их в естественном свете разума.
"Очаровательные игрушки, - думал Р. Декарт, - изысканные, остроумные создания механиков-часовщиков! В воле мастеров сделать автоматы посложнее, добавить несколько зубчатых колес. Тогда "мушкетер" подружится с "пастушкой", а "утка" станет повторять "Да здравствует любовь!". Нет запрета еще и еще совершенствовать автоматы. Скажем, изобрести автомат, который безошибочно владеет придворным этикетом, шаблонными светскими речами. Этот механический господин стоял бы среди нас и ничем бы от нас не отличался: точно так же улыбался бы, двигался, восхищался королевскими затеями, снисходительно хвалил бы другие автоматы, кровных своих братьев. Скрытая в теле автомата цепь обязательных действий может быть сколь угодно длинной и разматываться сколь угодно долго..."
Так размышлял юноша об алгоритмах работы автоматов вообще, и автомата-придворного, в частности. Сегодня мы полностью согласны с Р. Декартом. Сегодня место громоздких зубчаток заняла микроэлектроника, а алгоритмические цепи содержат сотни тысяч и миллионы, звеньев - команд... Но вернемся к размышлениям Р. Декарта.
"Цепь может разматываться сколь угодно долго, и все действия автомата будут выглядеть разумно, словно он обладает душой. Выходит, цепь команд заменяет душу?:
Юноша закусил губу и продолжал смотреть на королевские игрушки. Ему вдруг совсем по-детски захотелось подбежать к "мушкетеру" да потихоньку вытащить у него шпагу из ножен. Автомат не заметит, не поймет, не остановится, а по-прежнему будет механически извлекать отсутствующее оружие, салютовать ничем. Его поведение потеряет всякий смысл. Если сей воин даже встретит на своем пути стену, он не свернет, а продолжит свой марш напролом. Смешно и нелепо!
"Нелепости вполне можно избежать, - решил внезапно Р. Декарт, - только одно требуется для этого: чтобы автомат проверял самого себя. "Мушкетер", прежде чем обнажать шпагу, должен бы ответить на вопрос: "Шпага в ножнах?" Если да, действовать решительно, а если нет, обратиться, положим, к окружающим: верните, мол, мое оружие. И стена автомату не страшна. Время от времени он обязан проверять: "Дорога свободна?" Если да, не останавливаться, а если нет, поискать другого пути".
Итак, серьезный алгоритм наряду с повелительными предложениями должен содержать и предложения вопросительные. Заглянем в нашу библиотечку. Операции-вопросы, хоть их и немного, сразу бросаются в глаза: "Данное слово входит в словарь?", "Красавица здесь?"
Сразу бросается в глаза и особенность этих вопросов: они поставлены в такой плоскости, что допускают только два ответа - "да" и "нет". Слово или входит в словарь, или не входит в него; красавица или в этой части царства, или не в этой, а в другой, не в Баклушах, а в Балясах. И у "мушкетера" шпага либо в ножнах, либо ее мысленно извлек оттуда юный Р. Декарт.
Лет через десять после памятного осмотра автоматов Р. Декарт написал небольшую работу под названием "Правила для руководства ума". В этих правилах, адресованных людям, философ особое внимание уделял отчетливому пониманию того, что мы действительно хотим отыскать, задавая вопрос, и того, что лишь отдаленно связано с вопросом. "Человеческий ум подвержен двоякого рода заблуждению, - говорит Р. Декарт. - Или он захватывает больше, чем надо для определения какого-либо вопроса, или, наоборот, что-нибудь упускает".
Алгоритм п заблуждения несовместимы. Именно поэтому в алгоритм пропускаются лишь очень строгие и четкие вопросы. Здесь днем с огнем не сыщешь вопросов вроде "Что есть истина?", "Как быть дальше?" или "Можно ли побороть несправедливость?", Здесь не м&
сто ни темным, ни вечным, ни проклятым вопросам. Вопрос здесь прям, ясен и прозрачен. Он требует обязательного и недвусмысленного ответа: "да" или "нет".
Казалось бы, алгоритмист добровольно связал себе руки, выбрав из всего многоцветья возможных ответов только "да" или "нет". Попадется ему мудреная задача, а он, того и гляди, не сумеет придумать соответствующие проверки, поставить правильные вопросы. Теория алгоритмов утверждает: сумеет - этих "да" или "нет" достаточно для решения любой, обратите внимание, любой проблемы.
Многократно и искусно используя "да" или "нет", удается обойти любое препятствие, добраться до любой цели, где бы она ни пряталась. Помните, в поисках Спящей красавицы нам помогла вещая птица? Птица, видимо, знала толк в алгоритмировании - отвечала только "да" и "нет" и была уверена, что этого достаточно.
Алгоритм не простая цепь команд, а цепь с проверками и ветвлениями. Гибкость алгоритмов, их сила, их величие основаны на проверках и ветвлениях. После каждой проверки - два пути, которые могут навсегда разойтись или вновь пересечься спустя несколько шагов. Один путь, бывает, сразу приводит к цели, зато по другому еще шагать и шагать. Один прям как стрела, а другой вроде и не стремится вперед, наоборот, он изгибается, он возвращает нас к уже пройденным операциям, он похож на петлю. Двигаясь по такому пути, мы, кажется, совсем близки к решению, и вдруг - поворачивай оглобли, отправляйся назад, к истокам задачи. Зачем проторен попятный путь здесь, в целеустремленном алгоритме?..
Отдел кадров большого завода... Кадровики обращаются к вычислительной машине: отпечатай список всех наших мужчин в возрасте от 20 до 35 лет, которые не женаты. Машина, хранящая в своей памяти полный перечень рабочих и служащих завода, тотчас берет из него первую фамилию и придирчиво проверяет: мужчина? молодой? холост?
Если результат хотя бы одной проверки отрицательный, машина отвергает претендента; если же на все вопросы следует ответ "да", если претендент проходит по всем кондициям, машина заносит его фамилию в список.
И в любом случае возвращается к началу алгоритма: вновь извлекает очередную фамилию из списка, опять проверяет, снова то ли печатает ее, то ли пропускает - как проверка покажет. И опять упрямо поворачивает к истокам задачи.
Этот попятный путь, это повторение одних и тех же операций Ада Лавлейс назвала циклом.
Цикл работает методично, неумолимо, даже весело. Болконский Андрей. Мужчина? - Да. Молод? - Да. Холост? - Нет. Решение: Болконского Андрея в список не включать. Воробей Елизавет. Мужчина? - Нет. Молод? - Да. Холост? - Нет. Вывод: Воробья Елизавета не включать. Ленский Владимир: да, да, да - включить. Скотинин Митрофан: да, да, да - включить. Чацкий Александр: да, да, да - включить.
Цикл за циклом компьютер аккуратно проверяет весь перечень рабочих и служащих завода, добывая из него холостых. Последняя фамилия: Щукин Эрнест. Последние проверки. Мужчина? - Да. Молод? - Да. Холост? - Нет. Последнее решение: инженера Щукина в список не включать.
А дальше что? Машина не прекратит циклической работы, продолжит, как белка в колесе, свой уже ненужный бег. Как покинуть заколдованный круг, как выйти из цикла?
Опять с помощью проверки. Например, написать в конце перечня рабочих и служащих вслед за фамилией Щукин невероятную фамилию: Яяяяя. И включить в алгоритм последний вопрос: "Это фамилия, Яяяяя?" Если нет, продолжать циклическое действие, а если да, подвести черту под только что отпечатанным списком и остановиться.
Итак, цикл незаменим, когда предстоит монотонная, повторяющаяся работа. Редкий алгоритм обходится без монотонной работы, редкий алгоритм не содержит циклов. Циклами вооружены, например, все три образца нашей библиотечки алгоритмов.
Алгоритм "Спинка кофточки". Он буквально напичкан циклами: каждый ряд вязки описан циклически (выход из цикла - по числу петель); потом несколько рядов выполняются "рябушкой" (выход из цикла - число рядов достигло 4); потом предлагается чулочная вязка (выход из цикла - длина спинки равна 43 см)...
Алгоритм "Погрузка корабля". Здесь машина циклически проверяет допустимость товаров, которые протаскивают на корабль гости. Цикл, естественно, работает и тогда, когда компьютер сам загружает корабль: он извлекает слова из словаря точно так же, как машина отдела кадров добывала фамилии рабочих и служащих из перечня.
Алгоритм "Спящая красавица". Этот вообще состоит из одних циклов: два цикла в нем вложены друг в друга. Внутренний цикл делит Царство пополам: он прекращает работать, как только обнаруживает девушку в Баклушах. Тогда за дело берется внешний цикл н окончательно уточняет положение пещеры. Цикл помогает циклу - характерная для алгоритмов ситуация.
Цикл - чернорабочий алгоритма. Решение, которое он принимает за один раз, чаще всего не мудрено. Но, действуя раз за разом, систематично, кропотливо, неумолимо, цикл как бы разгоняет корабль мысли, преодолевает тяготение рутины и выводит корабль на интеллектуальную орбиту.
Понятие "цикл", конечно, не придумано алгоритми-стамп. Оно, видимо, установилось у наших предков, когда те наблюдали смену дня и ночи, чередование времен года, рост и увядание растений. Оно вошло в науку древности п средних веков. Ученые искали и находили скрытую повторяемость в движении планет (эпициклы Птолемея) и в ходе крови у животных (цикл кровообращения Гарвея).
Кажется, Р. Декарт первым осознал огромную важность циклов для человеческого ума. Если использовать точные и простые правила, строгое соблюдение которых всегда препятствует принятию ложного за истинное, если применять эти правила постепенно и многократно при зоркой интуиции каждого отдельного положения, то удастся выполнить умственную работу, которая с первого взгляда кажется необъятной. Ее удастся сделать без излишней затраты умственных сил, в короткое время, и тогда самый заурядный ум становится способным указывать воле выбор действий в житейских случайностях.
Насколько же такой методический и циклический путь лучше пути тех, кто, блуждая в пустом пространстве множества причин, ждет, не подвернется ли им под руку что-нибудь подходящее!
Так учил Р. Декарт в "Правилах для руководства ума". Алгоритмист полностью разделяет эти мысли. Составляя программы для вычислительной машины, многочисленные наши современники поняли, что циклы в них столь же необходимы, как жизненно важен цикл кровообращения для человека.
Разработка программ для вычислительных машин формирует у людей особый стиль мышления. Прежде всего алгоритмическое мышление является четким, ясным, определенным. Конечно, в требовании четкости, ясности, определенности нет ничего нового. Цену столь превосходным качествам ума знали еще первобытные охотники. Призывами к четкости, ясности, определенности идей наполнены труды древних писателей и ученых. Чем же отличаются от них сегодняшние алгоритмисты?
Мерой четкости. Степенью ясности. Полнотой определенности.
Предположим, вы хотите поручить некую умственную работу своему сотруднику. Станете ли вы разъяснять ему содержание работы до мельчайших подробностей, оговаривая каждый шаг, разжевывая каждую трудность?
Ваш ответ на этот вопрос зависит от того, кого именно вы представили себе сейчас на месте сотрудника. Ивану достаточно намека, а с Петром не стоит и связываться, легче все самому сделать, чем ему растолковать.
Американские специалисты по научной организации труда выделили четыре типа работников.
Человек первого типа - толковый, творческий, инициативный. Его достаточно навести на мысль, указать цель работы, а дорогу к ней он найдет сам.
Таких людей, честно говоря, немного. Чаще встречаются работники второго типа: сообразительные, но одной цели им мало. Требуется разъяснить сложные места в задаче, указать основные приемы, пригодные для ее решения. Однако слишком подробные разъяснения обижают этих работников, если чересчур разжевывать, они теряют интерес к задаче.
Третий тип работников умственного труда нуждается в более детальных инструкциях. Им нужно прямо сказать, что и в каком порядке делать, кроме мелочей; на мелочи не стоит упирать. И помягче объяснять, поделикатнее.
Четвертый тип людей, увы, не способен четко действовать без прямых приказов. Этим однозначно скажи, что, как и когда выполнять, изволь объяснить работу до последней стружки. Иначе беда: стал тесать Аверкий, да все исковеркал.
Часто, сравнивая возможности человека и вычислительной машины, полагают, будто все мы люди, все человеку все одинаковы, и забывают о том, насколько разнятся между собой эти самые человеки.
Если позволить себе некоторую смелость, если поставить вычислительную машину в ряд умственных работников - людей, то она окажется работником пятого типа. Инструкции для компьютера должны быть предельно четкими, ясными, определенными до мельчайшей мелочи. Любая неясность ведет к заминке, к сбою, к зацикливанию, к остановке компьютера. Машина драгоценнейшая наша не должна останавливаться, обязана непрерывно перемалывать "слова", продолжать свой ход, свой счет, свое стремительное движение к результату.
Алгоритмическое мышление зажато в тиски машинных требований, выковано в компьютерном горне, отличается твердостью, прямотой и предельной додуманностью.
Никаких "вроде бы так", никаких "и тому подобное", избави боже от "аналогично". Мысль алгоритмиста обязана прощупать все звенья без исключения, алгоритмист должен пройти все пути, одолеть все "нет" и все "да", учесть все развилки, ответить на все вопросы, найти выход из всех циклов.
О эти любители напускать туману под лозунгом "Проблема сложна! Мы привыкли работать с ней на ощупь...". Алгоритмическое мышление разрывает пелену тумана, дробит сложное на части, находит приемы решения частных задач, а потом вновь, как по ступенькам, восходит к проблеме в целом.
Алгоритмическое мышление не шапкозакидательство. Сложность в мире существует, ее нужно штурмовать, а не отрицать. Программист знает - свидетельством тому вся история человеческого разума, - что самое дерзкое и высокое творчество отстаивается в алгоритмах, превращается в крепкие приемы ремесла.
Программист - исследователь, но он не из породы исследователей, привыкших, по саркастическому замечанию Р. Декарта, заниматься разгадками спутанных вопросов со спутанным умом. "Такие исследователи, - писал Р. Декарт, - не менее глупы, чем тот мальчуган, который так старается угодить, что бросается бежать прежде, чем получит поручение, даже не зная, куда ему идти".
Программист - настойчивый, усердный и волевой работник. В его руках отличные инструменты: команды, присваивания, проверки, циклы. И он применяет свои инструменты со всем человеческим искусством. Он не желает оставаться в проблеме как в ловушке, а ищет дорогу к свету и правде.
Член-корреспондент АН СССР Андрей Петрович Ершов, один из зачинателей отечественного программирования, ярко и точно охарактеризовал особенности работы программиста: "Программист должен обладать способностью первоклассного математика к абстракции и логическому мышлению в сочетании с эдисоновским талантом сооружать все что угодно из нуля и единицы. Он должен сочетать аккуратность бухгалтера с проницательностью разведчика, фантазию автора детективных романов с трезвой практичностью экономиста".
Внешне мягкий и уступчивый, А. Ершов предъявляет весьма суровые требования к личности программиста (и, значит, прежде всего к самому себе). Программисты обязаны быть предельно добросовестными в контактах с машиной, но, что еще важнее, они должны выполнить свой моральный долг перед человечеством - добиться, чтобы программирование из искусства для избранных стало грамотностью для всех.
В последние годы А. Ершов с головой ушел в теорию программирования. Он раскрывает потаенные возможности алгоритмов и нащупывает границы алгоритмического подхода. Работу современных программистов - теоретиков и практиков - он сравнивает с деятельностью авторов и издателей книг после изобретения книгопечатания: программисты создают машинное отображение мира, наделяя людей небывалой властью над природой.
Мощная и динамичная страна алгоритмирования быстро расширяется, совершенствуется, крепнет, и пределов ей не видно, и границы алгоритмирования не просматриваются отчетливо.
Сегодня алгоритмирование идет победным маршем, захватывая все новые и новые области, привлекая под свои знамена все новых и новых людей. Токарь и врач, экономист и учитель, инженер и юрист становятся алгоритмистами. Я прервал свой перечень на юристе, хотя мог бы продолжать его еще и еще: в алгоритмирование втянуто около тысячи человеческих специальностей.
Й это только начало. Потому что в наш век алгоритмическим мышлением должен овладеть каждый сознательный работник.
Законы алгоритмирования уже сегодня столь же важны для нас, как основные законы физики. Чем больше работников будет владеть ими, тем больше ЭВМ окажется на производстве, тем активнее и плодотворнее станут контакты человека с машиной.
Нельзя откладывать знакомство со страной алгоритмирования на будущее. Обращаясь к комсомольцам, Л. И. Брежнев говорил:
"Нет пограничной черты, нет водораздела, глядя на который можно было бы сказать: вот это - настоящее, а вот это - будущее. Уже сегодня каждым днем своей трудовой жизни надо строить и утверждать это будущее, приближать его, делать явью".
Научно-техническую революцию делают не другие люди, ее совершаем мы сами, а алгоритмическое мышление служит нам острым оружием.
Осваивая профессиональные секреты и тонкости, одолевая рутину и недоверие, то в ладу, то в споре с вычислительными машинами идут алгоритмисты к новому пониманию природы, производства, школы, искусства, общества.
Сквозь тернии к алгоритмам!
В нашей библиотечке алгоритмов три образца: в библиотеке алгоритмов человечества сегодня их десятки тысяч, и каждый день на полки всемирного хранилища ложится тридцать новых алгоритмов.
Приглядитесь к прохожим любого города нашей страны, и вы в любой час и день увидите среди них девушек, в сумках которых пачки перфокарт и большие белые торчащие наружу ведомости, что ли. Это программистки, а ведомости - результат их только что окончившегося общения с вычислительной машиной. Девушки называют свои ведомости неуклюжим словом "распечатки" или уж совсем диким словом - "листинги".
Ладно, пусть листинги, не в жаргоне дело, а в быстром распространении алгоритмического мышления, в передаче вычислительной машине все новых и новых задач, которые раньше одолевал только человеческий интеллект. Если дело пойдет так и дальше, то в скором времени будет создан алгоритм, ничем не уступающий человеку. Если дело пойдет так и дальше, то по дорогам Марса покатит автомобиль, собранный из отдельных атомов...
Идея марсианского автомобиля принадлежит М. Бонгарду, талантливому советскому кибернетику, погибшему несколько лет назад в горах в результате несчастного случая. Вообразите себе, говорил М. Бонгард, что наука у марсиан развивается совсем иначе, чем на земле. Марсиане преуспели в теоретической физике, но ничего не знают о механике. У них нет никаких машин, единственный их способ передвижения - верхом на лошади.
И вдруг возникает идея заменить лошадь, это живое упрямое и болезненное существо, неким устройством. Перед марсианским КБ ставится задача: найти такое расположение атомов в пространстве, чтобы их ансамбль мог перевозить человека не хуже лошади. Задача эта принципиально осуществима, так как один такой ансамбль атомов уже бегает перед глазами каждого марсианина: имя ему - лошадь.
Марсианские ученые, однако, не могут снять копию с лошади: при всей своей теоретической проницательности они не знают точного расположения атомов в ее теле. И потому они решают создавать свой экипаж шаг за шагом, атом за атомом усложняя конструкцию до тех пор, пока она сама не начнет двигаться. Они ведут свои работы широким фронтом, большими силами, с огромным энтузиазмом.
Как, по-вашему, читатель, будет ли создан атомарный автомобиль?
Увы, нет. Нельзя изобрести машину, думая о ней только на уровне элементарных частиц.
Чтобы сделать автомобиль, марсианам пришлось бы сначала выработать понятия о больших группах атомов, именуемых на земле материалами (металлами, пластмассой, резиной); им понадобилось бы далее от взаимодействия элементарных частиц перейти к крупным технологическим процессам обработки материалов; им потребовалось бы подняться еще выше и запросто обращаться с такими гигантскими скоплениями атомов, как кузов, колеса или бензобак, объединяя их в конструкцию автомобиля.
Без многократного укрупнения, без крупноблочного подхода построить автомобиль нельзя.
История с марсианским автомобилем потребовалась М. Бонгарду только для того, чтобы ярко обозначить трудности алгоритмического подхода. Команды, проверки, присваивания, циклы - это элементарные частицы мира алгоритмов. В принципе из них можно собрать программу любой сложности так же, как из атомов в принципе можно сконструировать автомобиль.
Но только в принципе.
А на практике нужно сначала создать "интеллектуальные материалы", потом придумать технологию их переработки, потом изобрести блоки, узлы, агрегаты и общую конструкцию универсального алгоритма.
Создание интеллектуальных материалов
Огромная, беспримерная, полная коварных неожиданностей работа. Некоторые современные ученые считают, что она никогда не приведет к успеху, что алгоритмический путь к Искинту заказан. По их мнению, алгоритм четок и результативен, но лишен творческого начала, однообразен, как мелодия шарманки. "Разум и алгоритм, - утверждают они, - две вещи несовместные..."
Зато другие ученые свято верят в алгоритмический путь. Их доводы: с каждым годом крепнет алгоритмическое мышление, нам становится под силу то, на чти мы и не надеялись раньше. Мы разрабатываем все более общие, все более универсальные алгоритмы. Нам удастся отыскать единый ключ, универсальную отмычку, подходящую к любым задачам, вскрывающую любые проблемы. Мы сделаем Иекинт.
Спор между учеными носит столь принципиальный и ожесточенный характер, что один из крупных современных алгоритмистов написал в серьезном научном труде буквально следующее: "Если бы в средние века были вычислительные машины, то одни программисты сжигали бы на кострах других программистов за идею универсального алгоритма".
Р. Декарт жил во времена, когда костры инквизиции горели взаправду, а не для красного словца. Он верил в универсальную математику, в универсальный алгоритм. В "Правилах для руководства ума" он заложил фундамент такого алгоритма - нашел 18 принципов рационального мышления. И вот, в весенний день 1977 года мы спешим на свидание с Р. Декартом.
В Киевском музее западного и восточного искусства хранится портрет ученого кисти Франса Хальса. Р. Декарт сидит за столом, на который небрежно брошена шляпа. Будто он только что вернулся с прогулки по городу, где в толпе деятельного народа он чувствовал себя и свободно, и уверенно, и сосредоточенно.
Лицо его обращено к зрителю. Крупный нависающий нос, внимательные темно-серые глаза, усы и бородка в мушкетерском духе. Самое поразительное в этом лице - губы, слегка сжатые, скептические и умные губы философа. Он слегка, почти незаметно улыбается.
Улыбка Р. Декарта освещает наш вот уже трехсотлетний путь от "Правил для руководства ума" к искусственному разуму. Улыбка Р. Декарта очень кстати сегодня, в этот яркий, безоблачный весенний день.
Да, сегодня здесь, в Киеве, и там, в прекрасной стране Алгоритмии, весна, время таяния льдов, набухания почек. Мы узнаем в последующих главах, как из зерна под названием "алгоритм" прорастут иные растения - не жесткие и определенные, а нечеткие и эвристические алгоритмы. Вновь и вновь мы будем сличать сегодняшние взгляды на возможности искусственного мышления с декартовскими гипотезами о природе и действии ума.
Мы возьмем с собой в дорогу к Искинту веселые слова старого Декарта: "Если остерегаться принимать за истинное что-либо, что таковым не является, и всегда соблюдать порядок, в котором следует выводить одно из другого, то не может существовать истин столь отдаленных, чтобы они были непостижимыми, ни столь сокровенных, чтобы нельзя было их раскрыть".