Лисп - язык манипулирования символами
Патрик Г. Уинстон
В отличие от большинства языков программирования Лисп ориентирован на обработку символьных, а не числовых данных. Чтобы пояснить это, рассмотрим примеры манипулирования символами, взятыми из программы Манипулятор, которая перемещает детские кубики, подобные изображенным на рис. 1.
Рис. 1. Так выглядит мир кубиков, в котором действует программа Манипулятор.
Специализированные процедуры решения задач, входящие в эту программу, позволяют ей устранять препятствия, возникающие в процессе перестановки кубиков в виде других кубиков. В этих процедурах хранится и используется информация о том, чтб лежит на каждом объекте. Так, кубик В3 служит опорой для кубиков В1 и В4.
Программа знает об этом, поскольку символы В1 и В4 содержатся в списке символов, получаемых применением к В3 команды get (получать) (В языке Лисп принято различать переменную и ее значение с помощью специального значка «цитирования». Так, если известно, что х=5, то употребление 'х означает «само х как таковое», а просто х означает 5):
(get 'В3 'поддерживаемые-предметы) → (Bl В4)
Теперь представим, что значением переменной «препятствия» является список предметов, лежащих на кубике В3. Стандартные функции Лиспа, работающие с символами, позволяют быстро находить ответы на основные вопросы:
Сколько всего препятствий, т. е. какова длина (length) этого списка?
(length препятствия) → 2
Что является первым (first) объектом этого списка?
(first нрепятствия)→В1
Входит (member) ли элемент В1 в число препятствий?
(member 'Bl препятствия)→t
Является ли В4 первым элементом списка?
(eq'В4 (first препятствия))→nil
Заметим, что символ t в Лиспе обозначает истину, а символ nil — ложь. Другие элементарные функции, используемые при работе с символами, служат для внесения изменений в список и проверки того, является ли список пустым:
Удалить (remove) В4 из списка
(setf препятствия (remove 'В4 препятствия)) →(В1)
Добавить В7 к списку
(serf препятствия (cons 'В7 препятствия)) → (В7 В1)
Является ли список объектов пустым?
(endp препятствия)→nil
Измененный список может быть снова связан с символом В3:
(setf (get 'В3 ' поддерживаемые-предметы) препятствия)
Все эти вопросы и изменения являются самыми элементарными примерами возможностей работы Лиспа с символами. Подобным образом манипулирование символами позволяет программе Манипулятор запоминать свои действия. Соответствующая подпрограмма содержит команды, которые исследуют и видоизменяют символьные выражения, описывающие сделанные перестановки. Эти выражения позволяют отвечать на вопросы типа следующих: Переставлял ли ты кубик В7? Каким образом ты переставил кубик В7? Зачем ты переставил кубик В7? Когда ты переставил кубик В7?
Используя операции над символами, программа Манипулятор может объяснять свои действия подобно тому, как это делает человек. Действия с символами имеют самое прямое отношение к искусственному интеллекту, и не удивительно, что Лисп стал основным языком для его приложений.