Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
progF_pos.doc
Скачиваний:
36
Добавлен:
11.05.2015
Размер:
1.51 Mб
Скачать

2.2. Примеры программ

; Определения и использования функций, символ ";" обозначает,

; что дальше до конца строки следует комментарий

; square - возведение в квадрат

(defun square (x) (* x x))

; (max x y) - наибольшее из двух чисел

(defun max (x y)

(if (> x y) x y)

)

; (max3 x y z) - наибольшее из трех чисел

(defun max3 (x y z) (max x (max y z)))

;(div m n) -целочисленное деление

(defun div (m n) (truncate (/ m n)))

; intDiv(m n) -> ( m div n, m mod n)

(defun intDiv (m n)

(list (div m n) (mod m n))

)

;"r -действительное число" (analyse r) -> список из трех элементов:

; 1) знак "-" или "+" в зависимости от того, меньше или больше

; число r числа 0;

; 2) значение истинности (T и NIL), показывающее,

; принадлежит ли данное число r диапазону |r| <= 1;

; 3) "ближайшее" целое число к данному

(defun analyse (r)

(list (if (< r 0) '- '+)

(<= (abs r) 1)

(round r)

)

)

; рекурсивная функция для вычисления суммы первых n целых чисел

(defun sum (n)

(if (= n 0) 0 (+ n (sum (- n 1))))

)

2.3. Символьная обработка

Традиционные машины (фон Неймана) и языки программирования первоначально разрабатывались для осуществления численных вычислений и обработки больших объемов данных и не подходят столь же хорошо для символьной обработки, которая имеет дело со сложными структурами данных и базами знаний, содержащими правила принятия решений и другие многообразные объекты. Символьная обработка позволяет эффективно работать с такими структурами, как предложения естественного языка, значения слов и предложений, нечеткие понятия и т. д., и на их основе принимать решения, проводить рассуждения и осуществлять другие, свойственные человеку способы обращения с данными.

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

Лисп является наиболее важным языком программирования, используемым в исследованиях по искусственному интеллекту и в математической лингвистике. Название языка “Лисп” происходит из “listing processing” (обработка списков).

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

2.4. Особенности Лиспа

Одинаковая форма данных и программы. И то, и другое представляется списочной структурой, имеющей одинаковую форму. Таким образом, программы могут обрабатывать и преобразовывать другие программы и даже самих себя. Можно введенное и сформированное в результате вычислений выражение данных проинтерпретировать в качестве программы и непосредственно выполнить (так называемое программирование, управляемое данными). Универсальный единообразный и простой лисповский синтаксис списка не зависит от применения, и с его помощью легко определять новые формы записи, представления и абстракции. Даже сама структура языка является, таким образом, расширяемой и может быть заново определена. В то же время достаточно просто написание интерпретаторов, компиляторов, преобразователей, редакторов и других средств.

Хранение данных, не зависящее от места. Списки, представляющие программы и данные, состоят из списочных ячеек, расположение и порядок которых в памяти не существенны. Структура списка определяется логически на основе имен символов и указателей.

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

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

Заблуждения и предрассудки. А. П. Ершов: “Чувство протеста - вы раз за разом будете ощущать себя как спортсмены, которым нужно играть в волейбол с одной рукой, привязанной к телу. Ощущение трудности и необычности составления функциональных программ вполне законно и естественно”. Мы - жертвы императивного программирования и машин фон Неймана. Естественно, используемые в программировании на Лиспе структуры данных и управляющие структуры часто сложны, поскольку проблемы искусственного интеллекта из-за своей сложности предполагают сложные структуры и программы. Иерархические списочные структуры и Лисп как раз и задумывались для работы со сложными проблемами. Искусственное упрощение структур означало бы пренебрежение действительной сложностью проблем. Новая парадигма - объектно-ориентируемое программирование в Лиспе.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]