- •Функциональное и логическое программирование
- •Глава 1. Классификация языков и стилей программирования 3
- •Глава 2. Программирование на языКе лисп 16
- •Глава 3. Программирование на языке пролог 89
- •Глава 1. Классификация языков и стилей программирования
- •Основные парадигмы программирования
- •Процедурное (императивное, директивное) программирование.
- •Объектно-ориентированное программирование.
- •Декларативное программирование
- •Логическое программирование.
- •Функциональное программирование.
- •Классификация языков программирования
- •Функциональные языки
- •Логические языки
- •Глава 2. Программирование на языКе лисп
- •История создания языка Лисп
- •Диалекты языка Лисп
- •Лисп-машины
- •Область применения языка Лисп
- •Особенности языка Лисп Одинаковая форма данных и программ
- •Хранение данных, не зависящее от места
- •Автоматическое и динамическое управление памятью
- •Функциональная направленность
- •Динамическая проверка типов
- •Интерпретирующий и компилирующий режимы работы;
- •Пошаговое программирование
- •Единый системный и прикладной язык программирования
- •Основы языка Лисп
- •Понятие функции.
- •Quote блокирует вычисления
- •Базовые функции языка.
- •Функция car возвращает в качестве значения первый элемент списка.
- •Функция cdr - возвращает в качестве значения хвостовую часть списка, т. Е. Список, получаемый из исходного списка после удаления из него головного элемента:
- •Функция cons включает новый элемент в начало списка:
- •Предикат equal проверяет идентичность записей:
- •Предикат equalp проверяет наиболее общее логическое равенство:
- •Другие простейшие встроенные функции Лиспа. Функция null проверяет, является ли аргумент пустым списком:
- •Комбинации вызовов car и cdr позволяют получить любой элемент списка:
- •Наиболее общая функция, выделяющая n-й элемент списка (при этом индексация начинается с 0):
- •Функция last позволяет выделить последний элемент списка:
- •Функция list - создает список из элементов:
- •Функция setq – невычисляющее присваивание:
- •Функция setf - обобщенная функция присваивания:
- •Функции, обладающие побочным эффектом, называются псевдофункциями.
- •С символом можно связать именованные свойства:
- •Функция get - возвращает значение свойства, связанного с символом:
- •Псевдофункция remprop удаляет свойство и его значение:
- •Вызов интерпретатора eval вычисляет значение выражения.
- •Ввод и вывод.
- •Использование файлов.
- •Определение функций
- •Задание параметров в лямбда-списке.
- •Передача параметров и область их действия.
- •Вычисления в лисПе.
- •Предложение let создает локальную связь внутри формы:
- •Последовательные вычисления.
- •Разветвление вычислений.
- •Циклические вычисления.
- •Передача управления.
- •Другие циклические структуры.
- •Динамическое управление из другого контекста
- •Внутреннее представление списков
- •Функциональное программирование Рекурсия. Различные виды рекурсии.
- •Функции более высокого порядка.
- •Применяющие функционалы.
- •Отображающие функционалы.
- •Макросы
- •Типы данных
- •Основные типы данных:
- •Глава 3. Программирование на языке пролог
- •Общие сведения о языке Пролог. Язык Пролог как система, реализующая логический вывод в исчислении предикатов первого порядка.
- •Фразы Хорна как средство представления знаний.
- •Синтаксис языка Пролог.
- •Фразы, термы, факты, правила.
- •Константы:
- •Простейшая программа на Прологе
- •Выполнение запроса в Прологе.
- •Неудача запроса и возврат назад.
- •Декларативная и процедурная семантика Пролога.
- •Рекурсивные процедуры.
- •Списки.
- •Операторы.
- •Средства управления ходом выполнения программы. Предикат сократить (отсечение).
- •Отрицание как неудача запроса.
- •Встроенные предикаты.
- •Типы отношений.
- •Ограничения, обеспечивающие целостность отношений.
- •Свойства отношений.
- •Подходы к программированию на языке Пролог.
Логические языки
Пролог - практически единственный широко используемый логический язык. Имеется множество реализаций.
• Две коммерческие системы Quintus Prolog и SICStus Prolog сейчас развиваются и поддерживаются SICS (Swedish Institute of Computer Science). Среды разработки с большим набором инструментов и очень обширными библиотеками. Большинство разработчиков используют SICStus.
• Strawberry Prolog хорошо подходит для знакомства с Прологом и создания небольших программ для Windows, но обладает слишком низкой производительностью для серьезных задач.
• SWI Prolog - довольно популярная система, в основном благодаря удобной среде и переносимой библиотеке для создания графического интерфейса.
• B-Prolog - самая быстрая из реализаций, основанных на байт-коде. Включает некоторые расширения: ограничения на конечных доменах CLP(FD) и запоминание результатов (tabling) – техника известная в функциональном программировании как мемоизация (memoiazation).
• XSB - развитие некогда популярного Stony Brook Prolog. Также поддерживает tabling. Интересная особенность - возможность использования языка второго порядка HiLog.
• GNU Prolog - компилятор в двоичный код. По скорости совсем немного уступает SICStus.
• Visual Prolog - продукт датской фирмы Prolog Development Center. Ранее распространялся под названием Turbo Prolog (Borland) и PDC Prolog. Несмотря на своё название это - не реализация Пролога, а совершенно особенный язык со строгим контролем типов. К сожалению, отсутствие полиморфизма делает систему типов маловыразительной. В последних версиях появилась поддержка ООП.
• Mercury - довольно сложный язык, ориентированный на создание больших программных систем. Создан на основе Пролога, но некоторые недекларативные особенности удалены. Как альтернатива введены декларации видов, позволяющие компилятору генерировать более эффективный код. Развитая полиморфная система типов. Очень хороший компилятор. В целом, язык сложноват для первоначального обучения, но превосходен для промышленного программирования.
• Godel - экспериментальный логический язык со строгим контролем типов. Попытка создать декларативную альтернативу Прологу. Значительное внимание уделено средствам метапрограммирования. Замечательное средство для изучения логического программирования. К сожалению, поддержки для Windows нет и не планируется.
Глава 2. Программирование на языКе лисп
История создания языка Лисп
Язык Лисп, как и язык Фортан является одним из первых языков программировния. Однако до 80-х годов Лисп в основном использовался теоретиками программирования как формальный язык и был средством лабораторных исследований искусственного интеллекта. Лисп не является результатом коллективной деятельности, а прежде всего отражает личное видение сущности и возможностей программирования одного человека – Джона Маккарти. В 1958 г. Маккарти, будучи профессором Массачусетского технологического института, начал работу по созданию такого языка программирования, который бы хорошо подходил для программирования задач искусственного интеллекта. В задачах искусственного интеллекта основополагающую роль играет представление знаний. К этому времени был разработан язык обработки списков - язык IPL. Он не получил широкого распространения из-за своей близости к машинному языку. Но благодаря ему родилась идея хранения программ и данных в памяти в виде списков, т.е. в виде структур, связанных ссылками, независимыми от физического расположения структур в памяти машины. Таким образом, для списков не надо заранее резервировать в памяти некоторую область, их можно создавать, изменять и удалять динамически. Сначала у Маккарти была идея реализовать обработку списков IPL на Фортране, затем на Алголе, но, в конце концов, он пришел к идее создания собственного языка программирования.
Для символьных цепочек Маккарти придумал основанную на скобках форму представления, иерархическую списочную запись, точечную нотацию. Используя понятие пустого списка NIL, он определил основные алгебраические действия по обработке списков. Так родились примитивные функции и предикаты: CAR, CDR, CONS, ATOM, EQ, необходимые для анализа конструирования и сравнения списков. Для определения функций Маккарти заимствовал из лямбда-исчисления Черча понятие лямбда-выражения.
Важнейшей идеей Маккарти явилась идея единообразного представления программ и данных в виде символьных выражений (списков), в результате чего стала возможной работа с программой и ее интерпретация в качестве данных, так и интерпретация данных и работа с ними как с программой. Благодаря единообразному представлению программ и данных функции можно передавать в качестве параметров другим функциям (функционалам), также возможно преобразование, самоизменение и порождение новых программ во время их исполнения (обучение, адаптация).
Лисп является языком низкого уровня, его можно рассматривать как ассемблер, ориентированный на работу со списковыми структурами. Поэтому на протяжении всего существования языка было много попыток его усовершенствования за счет введения дополнительных базисных примитивов и управляющих структур. Но все эти изменения, как правило, не становились самостоятельными языками. В новых своих редакциях Лисп быстро усваивал все ценные изобретения своих конкурентов.
