Мне уже часто приходилось писать в своих статьях об искусственном интеллекте — области, в которой идет поиск методов программирования, позволяющих компьютерам демонстрировать такие качества, как гибкость, здравый смысл, элементы понимания и творчества, "самосознание" и чувство юмора. Искусственным интеллектом (ИИ) стали заниматься немногим более сорока лет назад, и с тех пор уже возникли многочисленные направления, так что теперь — это область активных и разносторонних исследований.
В США, вероятно, насчитывается около двух тысяч человек, профессионально занимающихся разработками, связанными с искусственным интеллектом, примерно столько же специалистов работают в этой области и в других странах. И хотя имеются значительные разногласия по поводу того, какой подход к ИИ следует считать наилучшим, в одном почти все единодушны — в выборе языка программирования. Большинство разработок ИИ было реализовано на языке, получившем название Лисп. Это название произошло от английских слов List Processing (Lisp) — обработка списков.
Почему большая часть исследований в области ИИ проводится на базе Лиспа? Для этого есть много причин в основном технического характера, однако одна из главных причин весьма проста и заключается в том, что Лисп имеет очень четко очерченную основу. Каждый язык программирования обладает какими-то произвольными свойствами, или конструкциями, и большинство языков в действительности даже перегружено ими. Лишь немногие языки, такие, как Лисп и Алгол, построены на основе некоторого ядра, кажущегося настолько же стройным и естественным, как одна из областей чистой математики.
Ядро Лиспа отличается кристальной чистотой, которая не только делает этот язык привлекательным с эстетической точки зрения, но и придает ему гораздо большую гибкость по сравнению с большинством других языков. Лисп — красивый язык, и он занимает центральное место в искусственном интеллекте — одной из важных областей современной науки. Поэтому я решил посвятить ему серию из нескольких статей, где будут представлены некоторые основные конструкции этого языка.
Посмотрим теперь, как в действительности работает Лисп. Одна из наиболее привлекательных особенностей Лиспа заключается в том, что он интерактивный, т. е. работает в режиме диалога, что отличает его от большинства других языков высокого уровня, не обладающих этим свойством.На практике это выглядит следующим образом. Пожелав воспользоваться Лиспом, вы садитесь за терминал, соединенный с ЭВМ, в памяти которой находится система Лиспа, и набираете на клавиатуре терминала слово lisp (или какое-то другое стартовое слово — это зависит от соглашений, принятых для конкретной системы). В ответ на экране терминала появится "сигнал ожидания", характерный символ; чаше всего в роли этого символа выступают стрелочка или звездочка.
Мне, например, нравится представлять себе этот сигнал как приветствие, которым встречает вас волшебный джин Лиспа. Низко кланяясь, он как бы говорит вам: "Я здесь, чтобы выполнять ваши желания. Что вам угодно?". Затем джин ждет, пока вы не напечатаете ему какую-нибудь команду. На самом деле эту систему называют, конечно, не джином, а интерпретатором. Он выполняет любую вашу команду, однако, формулируя свое желание, вы должны соблюдать осторожность. Даже небольшая неточность может привести к роковым ошибкам. Ниже показан сигнал ожидания системы Franz (один из диалектов Лиспа), он сообщает о том, что джин системы Franz готов выполнить ваше желание.
Теперь джин готов выполнить нашу следующую команду, или, выражаясь вежливее, наше следующее желание. Выполнение желания, сформулированного в виде оператора Лиспа, называется вычислением этого оператора. Приведенный выше короткий диалог между человеком и компьютером дает нам представление о действиях интерпретатора Лиспа: он читает оператор, вычисляет его, печатает полученное значение и сигнализирует о своей готовности прочесть новый оператор. Поэтому о последовательности действий интерпретатора говорят как о цикле "чтение — вычисление — печать". Лисп является интерактивным языком благодаря существованию джина Лиспа (интерпретатора).
Как только вы напечатали свое желание — в форме оператора языка, — немедленно устанавливается "обратная связь" с Лиспом. И чтобы все ваши желания были реализованы, нужно сначала напечатать одно желание, попросить джина выполнить его, напечатать другое, снова обратиться к джину и т. д. С другой стороны, при работе со многими другими языками высокого уровня (но не со всеми) вы должны написать целую программу, состоящую из большого количества "желаний", которые выполняются в строго установленном порядке. Еще хуже то, что последующие желания обычно очень сильно зависят от результата выполнения предыдущих, при этом вы, конечно, не можете следить за выполнением каждого отдельного желания — команды.