Назад | Содержание| Вперёд ПРЕДИСЛОВИЕ В средние века...

Назад | Содержание| Вперёд

ПРЕДИСЛОВИЕ

В средние века знание латинского и греческогоязыков являлось существенной частью образованиялюбого ученого. Ученый, владеющий только однимязыком, неизбежно чувствовал себя неполноценным,поскольку он был лишен той полноты восприятия,которая возникает благодаря возможностипосмотреть на мир сразу с двух точек зрения.Таким же неполноценным ощущает себя сегодняшнийисследователь в области искусственногоинтеллекта, если он не обладает основательнымзнакомством как с Лиспом, так и с Прологом - сэтими двумя основополагающими языкамиискусственного интеллекта, без знания которыхневозможен более широкий взгляд на предметисследования.

Сам я приверженец Лиспа, так как воспитывался вМассачусетском технологическом институте, гдеэтот язык был изобретен. Тем не менее, я никогдане забуду того волнения, которое я испытал,увидев в действии свою первую программу,написанную в прологовском стиле. Эта программабыла частью знаменитой системы Shrdlu ТерриВинограда. Решатель задач, встроенный в систему,работал в "мире кубиков" и заставлял рукуробота (точнее, ее модель) перемещать кубики наэкране дисплея, решая при этом хитроумные задачи,поставленные оператором.

Решатель задач Винограда был написан наМикропленнере, языке, который, как мы теперьпонимаем, был своего рода Прологом в миниатюре.Любой прологоподобный язык заставляетпрограммиста мыслить в терминах целей, поэтому,несмотря на все недостатки Микропленнера,достоинством этой программы было то, что в ееструктуре содержались многочисленные явныеуказания на те или иные цели. Процедуры-цели"схватить", "освободить","избавиться", "переместить","отпустить" и т.п. делали программу простой икомпактной, а поведение ее казалось поразительноразумным.

Решатель задач Винограда навсегда изменил моепрограммистское мышление. Я даже переписал егона Лиспе и привел в своем учебнике по Лиспу вкачестве примера - настолько эта программавсегда поражала меня мощью заложенной в нейфилософии "целевого" программирования, да исамо программирование в терминах целей всегдадоставляло мне удовольствие.

Однако учиться целевому программированию напримерах лисповских программ - это все равно, чточитать Шекспира на языке, отличном отанглийского. Какое-то впечатление вы получите, носила эстетического воздействия будет меньшей,чем при чтении оригинала. Аналогично этому,лучший способ научиться целевомупрограммированию - это читать и писать программына Прологе, поскольку сама сущность Пролога какраз и состоит в программировании в терминахцелей.

В самом широком смысле слова эволюция языковпрограммирования - это движение от языковнизкого уровня, пользуясь которыми, программистописывает, как что-либо следует делать, кязыкам высокого уровня, на которых простоуказывается, что необходимо сделать. Так,например, появление Фортрана освободилопрограммистов от необходимости разговаривать смашиной на прокрустовом языке адресов ирегистров. Теперь они уже могли говорить на своем(или почти на своем) языке, только изредка делаяуступки примитивному миру 80-колонных перфокарт.

Однако Фортран и почти все другие языкипрограммирования все еще остаются языками типа"как". И чемпионом среди этих языковявляется, пожалуй, современныймодернизированный Лисп. Так, скажем, Common Lisp, имеябогатейшие выразительные возможности, разрешаетпрограммисту описывать наиболее"выразительно" именно то, как что-либоследует делать. В то же время очевидно, что Прологпорывает с традициями языков типа "как",поскольку он определенным образом направляетпрограммистское мышление, заставляяпрограммиста давать определения ситуаций иформулировать задачи вместо того, чтобы во всехдеталях описывать способ решения этих задач.

Отсюда следует, насколько важен вводный курс поПрологу для всех студентов, изучающихвычислительную технику и программирование -просто не существует лучшего способа понять, чтоиз себя представляет программирование типа"что".

Многие страницы этой книги могут служитьхорошей иллюстрацией того различия, котороесуществует между этими двумя стилямипрограммистского мышления. Например, в первойглаве это различие иллюстрируется на задачах,относящихся к семейным отношениям. Прологовскийпрограммист дает простое и естественноеописание понятия "дедушка": дедушка -этоотец родителя. На Прологе это выглядит так:

        дедушка( X, Z) :- отец(X, Y), родитель( Y, Z).

Как только пролог-система узнала, что такоедедушка, ей можно задать вопрос, например: ктоявляется дедушкой Патрика? В обозначенияхПролога этот вопрос и типичный ответ имеют вид:

        ?-  дедушка( X,патрик).

        X  =  джеймс;

        X  =  карл.

Каким образом решать эту задачу, как"прочесывать" базу данных, в которойзаписаны все известные отношения "отец" и"родитель", - это уже забота самойпролог-системы. Программист только сообщаетсистеме то, что ему известно, и задает вопросы.Его в большей степени интересуют знания и вменьшей - алгоритмы, при помощи которых из этихзнаний извлекается нужная информация.

Поняв, что очень важно научиться Прологу,естественно задать себе следующий вопрос - какэто сделать. Я убежден, что изучение языкапрограммирования во многом сходно с изучениеместественного языка. Так, например, в первомслучае может пригодиться инструкция попрограммированию точно так же, как во втором -словарь. Но никто не изучает язык при помощисловаря, так как слова - это только часть знаний,необходимых для овладения языком. Изучающий языкдолжен кроме того узнать те соглашения, следуякоторым, можно получать осмысленные сочетанияслов, а затем научиться у мастеров словаискусству литературного стиля.

Точно так же, никто не изучает языкпрограммирования, пользуясь только инструкциейпо программированию, так как в инструкциях оченьмало или вообще ничего не говорится о том, какхорошие программисты используют элементарныеконструкции языка. Поэтому необходим учебник,причем лучшие учебники обычно предлагаютчитателю богатый набор примеров. Ведь в хорошихпримерах сконцентрирован опыт лучшихпрограммистов, а именно на опыте мы, в основном, иучимся.

В этой книге первый пример появляется уже напервой странице, а далее на читателя как из рогаизобилия обрушивается поток примеровпрологовских программ, написанныхпрограммистом-энтузиастом, горячим приверженцемпрологовской идеологии программирования. Послетщательного изучения этих примеров читатель нетолько узнает, как "работает" Пролог, но истанет обладателем личной коллекциипрограмм-прецедентов, готовых к употреблению: онможет разбирать эти программы на части,приспосабливать каждую часть к своей задаче, азатем снова собирать их вместе, получая при этомновые программы. Такое усвоение предшествующегоопыта можно считать первым шагом на пути отновичка к программисту-мастеру.

Изучение хороших программных примеров дает,как правило, один полезный побочный эффект: мыузнаем из них не только очень многое о самомпрограммировании, но и кое-что - о какой-нибудьинтересной научной области. В данной книге такойнаучной областью, стоящей за большинствомпримеров, является искусственный интеллект.Читатель узнает о таких идеях в областиавтоматического решения задач, как сведениезадач к подзадачам, прямое и обратное построениецепочки рассуждений, ответы на вопросы "как"и "почему", а также разнообразные методыпоиска.

Одним из замечательных свойств Прологаявляется то, что это достаточно простой язык, истуденты могли бы использовать егонепосредственно в процессе изучения вводногокурса по искусственному интеллекту. Я несомневаюсь, что многие преподаватели включат этукнигу в свои курсы искусственного интеллекта стем, чтобы студенты смогли увидеть, как припомощи Пролога абстрактные идеи приобретаютконкретные и действенные формы.

Полагаю, что среди учебников по Прологу этакнига окажется особенно популярной, и не толькоиз-за своих хороших примеров, но также из-зацелого ряда других своих привлекательных черт:

тщательно составленные резюме появляются на всем протяжении книги;

все вводимые понятия подкрепляются многочисленными упражнениями;

процедуры выборки элементов структур подводят нас к понятию абстракции данных;

обсуждение вопросов стиля и методологии программирования занимает целую главу;

автор не только показывает приятные свойства языка, но и со всей откровенностью обращает наше внимание на трудные проблемы, возникающие при программировании на Прологе.

Все это говорит о том, что перед нами прекраснонаписанная, увлекательная и полезная книга.

Патрик Г. Уинстон

Кеймбридж, Массачусетс

Январь 1986

Назад | Содержание| Вперёд









Главная | В избранное | Наш E-MAIL | Добавить материал | Нашёл ошибку | Наверх