- •Функциональное и логическое программирование
- •Глава 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. Программирование на языке пролог
- •Общие сведения о языке Пролог. Язык Пролог как система, реализующая логический вывод в исчислении предикатов первого порядка.
- •Фразы Хорна как средство представления знаний.
- •Синтаксис языка Пролог.
- •Фразы, термы, факты, правила.
- •Константы:
- •Простейшая программа на Прологе
- •Выполнение запроса в Прологе.
- •Неудача запроса и возврат назад.
- •Декларативная и процедурная семантика Пролога.
- •Рекурсивные процедуры.
- •Списки.
- •Операторы.
- •Средства управления ходом выполнения программы. Предикат сократить (отсечение).
- •Отрицание как неудача запроса.
- •Встроенные предикаты.
- •Типы отношений.
- •Ограничения, обеспечивающие целостность отношений.
- •Свойства отношений.
- •Подходы к программированию на языке Пролог.
Функциональные языки
Лисп остаётся наиболее широко используемым функциональным языком. За долгую историю своего развития язык Лисп породил множество диалектов. Несмотря на то, что почти все из них носят названия вида "Some Lisp", разница между ними бывает значительной, не меньше, чем между Алголом и Паскалем или между C и C++. Так что правильнее считать их разными языками.
Предпринимались попытки стандартизировать язык. Наиболее известная из них - стандарт ANSI Common Lisp (см. также CLtL2). К сожалению, язык получился слишком сложным. Его описание содержит более 1000 страниц. Доступны как коммерческие ( Allegro, Harlequin, Corman), так и бесплатные ( GnuCL, CLISP, CMUCL) реализации.
• ISLISP - очень компактный диалект Лиспа, принятый в качестве международного стандарта (ISO). Доступны реализации OpenLisp , TISL, OKI ISLISP.
• EuLisp разрабатывается группой европейских пользователей Лиспа в надежде создать развитую систему программирования, но не такую громоздкую как Common Lisp. Язык всё ещё в стадии разработки, но уже существует несколько реализаций ( EuScheme, Feel, Youtoo) включающие TELOS (The Eulisp Object System - аналог CLOS) .
• Scheme - римейк Лиспа, более простой и даже элегантный язык. Активно используется в исследовательских работах и для обучения. Сторонники Scheme любят подчёркивать, что объем "сообщения о языке" ( R4RS, R5RS ~50 страниц) меньше чем объем указателя к описанию Common Lisp. Существует более 50 реализаций Scheme . Некоторые имеют интегрированные среды ( DrScheme, WinScheme48, 3DScheme и EdScheme). Есть довольно эффективные компиляторы ( Gambit, Bigloo). Для обучения и экспериментов подойдут Scheme48, WinScheme48, XLISP, MzScheme, DrScheme.
• Erlang - интересный язык, разработанный компанией Ericsson. Подобно Лиспу бестиповый, но имеет очень выразительный синтаксис, основанный на сопоставлении с образцом и несколько напоминающий Пролог. Это делает его более легким в освоении. Специфика языка - ориентация на параллельное программирование систем реального времени. Язык включает средства для описания взаимодействующих процессов. Реализация содержит богатую библиотеку и довольно активно развивается.
Два языка из семейства ML: Standard ML и CAML (Categorical Abstract Machine Language). Функциональные языки с "энергичной" стратегией вычислений. Развитая система типов и модулей. Есть и типично императивные средства: присваивания, циклы, обработка исключений. Различия между двумя диалектами в основном синтаксические.
Standard ML:
• Moscow ML - популярный компилятор, созданный на основе CAML Light. Благодаря ему SML стал широко доступным.
• Poly/ML также неплохой инструмент для экспериментов с SML. Предлагается библиотека графического интерфейса, но она пока недостаточно стабильна (по крайней мере Windows версия).
• SML/NJ (Standard ML of New Jersey) - классическая реализация SML. Хорошо оптимизирующий, но довольно громоздкий компилятор.
• MLton обладает примерно теми же достоинствами и недостатками, что и SML/NJ.
• MLj - компилятор в байт-код JavaVM. Реализует подмножество SML и не очень качественно.
• SML.NET – Microsoft SML.
CAML:
• Objective CAML содержит компилятор в байт-код и оптимизирующий компилятор для объектно-ориентированного расширения CAML.
• CAML Light - компилятор в байт-код. В связи с появлением OCAML может считаться устаревшим, но продолжает развиваться. Широко применяется в учебных заведениях, поскольку очень быстр и нетребователен к ресурсам.
• F# - ещё один диалект ML, созданный на основе CAML специально для .NET.
• Haskell - быстро набирающий популярность язык. Разрабатывается международным комитетом как чисто функциональный "индустриальный" язык программирования. Язык довольно строгий и выразительный, хотя и может показаться и сложным. Главные особенности: строгая функциональность (отсутствуют императивные операторы), ленивые вычисления, полиморфная система типов и классы типов - попытка ввести в функциональное программирование некоторые концепции ООП.
• Hugs - интерпетатор Haskell. Для обучения лучше всего выбрать именно его.
• GHC (Glasgow Haskell Compiler) - наиболее эффективный компилятор, но медленный и весьма требователен к ресурсам.
• nhc98 не столь эффективен как ghc, зато предьявляет гораздо меньшие требования к компьютеру.
• HBC похоже заброшен авторами. Включает компилятор с Lazy ML. Самая интересная особенность - библиотека декларативного программирования пользовательских интерфейсов Fudgets. Сейчас она переносится на ghc.
• Mondrian позволяет компилировать код Haskell в MSIL для .NET.
На www.haskell.org есть описание Haskell и учебные материалы. На основе Haskell создано уже немало языков. В основном это расширения языка параллельными (DFH, GPH, pH, Goffin, Eden) или императивными (Mondrian) средствами. Есть попытки добавить возможности ООП ( O'Haskell) или другими способами повысить выразительность системы типов (PolyP, Cayenne). Очень похожий на Haskell язык Clean разработан в Неймегенском университете. Эффективный компилятор и неплохая библиотека (в частности графического интерфейса) делают его вполне пригодным для решения реальных задач.
