- •Функциональное и логическое программирование
- •Глава 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. Программирование на языке пролог
- •Общие сведения о языке Пролог. Язык Пролог как система, реализующая логический вывод в исчислении предикатов первого порядка.
- •Фразы Хорна как средство представления знаний.
- •Синтаксис языка Пролог.
- •Фразы, термы, факты, правила.
- •Константы:
- •Простейшая программа на Прологе
- •Выполнение запроса в Прологе.
- •Неудача запроса и возврат назад.
- •Декларативная и процедурная семантика Пролога.
- •Рекурсивные процедуры.
- •Списки.
- •Операторы.
- •Средства управления ходом выполнения программы. Предикат сократить (отсечение).
- •Отрицание как неудача запроса.
- •Встроенные предикаты.
- •Типы отношений.
- •Ограничения, обеспечивающие целостность отношений.
- •Свойства отношений.
- •Подходы к программированию на языке Пролог.
Операторы.
В Прологе существует такое понятие как оператор. Эти операторы не являются операторами в том смысле, как мы привыкли понимать, например, в процедурных языках. Операторы в Прологе не обозначают каких либо операций над данными, а используются как функторы структур или имена предикатов.
Внешняя форма синтаксиса Пролога расширяема в том смысле, что предикат или структуру с одним или двумя аргументами можно объявить оператором. Это осуществляется для улучшения читабельности программы. Для этого строится обращение к встроенному предикату «ор»:
:- ор (приоритет, тип, имя).
Имя - это атом. Использование «ор» равносильно объявлению этого имени названием оператора. Приоритет - это число, используемое для того, чтобы избежать неопределенности в выражениях, в состав которых входит более одной операции. Конкретный диапазон приоритетов зависит от реализации. Для изменения порядка выполнения операторов, определяемого их старшинством, используются скобки.
В качестве типа используются спецификаторы типов:
инфиксные операторы: xfx, xfy, yfx;
префиксные операторы: fx, fy;
постфиксные операторы: xf, yf.
Обозначения x и y используются в следующих целях. Каждый аргумент обладает приоритетом, также как и оператор. Если аргумент заключен в скобки или не имеет структуры, т.е. является простым объектом, его приоритет равен 0. Если аргумент структурный, его приоритет равен приоритету его главного функтора. С помощью x обозначается аргумент, чей приоритет строго выше приоритета оператора (более высокий приоритет задается меньшим числом); с помощью у обозначается аргумент, чей приоритет выше или равен приоритету оператора.
:- ор(500, yfx, +).
Тип yfx означает, что оператор обладает свойством левой ассоциативности, т.е. одинаковые операторы выполняются в выражении слева направо. Например, операторы «+» и «-» обладают свойством левой ассоциативности. Выражение А+В+С+К , т.е. +( +( +(А , В) , С) , К) можно представить в виде дерева, растущего вниз и влево.
:- ор(1000, xfy, ,).
Тип xfy означает, что операция обладает свойством правой ассоциативности, т.е. одинаковые операторы выполняются в выражении справа налево. Например, оператор «,» обладает свойством правой ассоциативности. Выражение А, В, С, К ,т.е. ,(А , ,(В , ,(С , К))) можно представить в виде дерева, растущего вправо.
Тип xfx означает, что оператор не обладает ни правой, ни левой ассоциативностью. Например, оператор mod. Поэтому недопустимо выражение, в котором есть подвыражение с таким же оператором: 120 mod 50 mod 5.
Пример объявления оператора. Пусть есть часто используемый предикат «знает». Объявим его как инфиксный оператор:
:- ор(700, xfx, знает).
Теперь факты «знает» можно представить в программе в инфиксной форме:
маша знает паша.
коля знает оля.
Запросы к этой базе данных можно также записывать в инфиксной форме:
?- X знает оля.
X=коля.
Несколько операторов могут быть определены в одном предложении, если они имеют одинаковый приоритет и тип. Для этого их берут в скобки [ ].
Существует ряд операторов Пролога, уже определенных заранее. Это встроенные операторы или встроенные предикаты. За ними системой закреплены процедуры.
