- •Функциональное и логическое программирование
- •Глава 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. Программирование на языке пролог
- •Общие сведения о языке Пролог. Язык Пролог как система, реализующая логический вывод в исчислении предикатов первого порядка.
- •Фразы Хорна как средство представления знаний.
- •Синтаксис языка Пролог.
- •Фразы, термы, факты, правила.
- •Константы:
- •Простейшая программа на Прологе
- •Выполнение запроса в Прологе.
- •Неудача запроса и возврат назад.
- •Декларативная и процедурная семантика Пролога.
- •Рекурсивные процедуры.
- •Списки.
- •Операторы.
- •Средства управления ходом выполнения программы. Предикат сократить (отсечение).
- •Отрицание как неудача запроса.
- •Встроенные предикаты.
- •Типы отношений.
- •Ограничения, обеспечивающие целостность отношений.
- •Свойства отношений.
- •Подходы к программированию на языке Пролог.
Функции более высокого порядка.
До сих пор мы рассматривали функции, аргументы которых представляли собой выражения, являющиеся данными. Значения функций также представляли собой выражения, трактуемые как данные.
Основываясь на принятом в Лиспе едином представлении данных и программ, аргументами функций могут быть функции.
Аргумент, значением которого является функция, называют функциональным аргументом. Функцию, имеющую функциональный аргумент, называют функционалом.
Различие понятий «данные» и «функция» определяется не на основе их структуры, а в зависимости от их использования. Если аргумент используется в функции лишь как объект, участвующий в вычислениях, то это обыкновенный аргумент, представляющий собой данные. Если же аргумент используется как средство, определяющее вычисления, применяемые к другим аргументам, то это функциональный аргумент. Таким образом, одно и то же выражение может выступать и как обыкновенный аргумент, и как функциональный. Роль и интерпретация выражения зависят от его синтаксической позиции.
Примеры.
1). (car '(lambda (x) (list x))) => LAMBDA
2). ((lambda (x) (list x)) 'car) => (CAR)
В первом примере s-выражение (lambda (x) (list x)) является аргументом функции - обычным списком; во втором – выражением, задающим вычисления.
Функциональным объектом может быть:
1) символьное имя, представляющее определение функции (системной или определенной пользователем);
2) безымянное лямбда-выражение;
3) замыкание.
Фактический параметр для функционального аргумента задается в виде формы, значением которой будет объект, который можно интерпретировать как функцию:
‘(lambda (x) (list x))…
…(list ‘lambda ‘(x) (list ‘list ‘x))…
Функцию и функционал, результатом которых является функция, называются функцией или функционалом с функциональным значением. Вызов такого функционала возвращает в качестве результата новую функцию, в построении которой, возможно, используются функции, получаемые функционалом в качестве аргументов.
Получающий себя в качестве аргумента функционал называют автоаппликативной функцией. Функцию, возвращающую саму себя, называют авторепликативной.
Применяющие функционалы.
Функции, которые позволяют вызывать другие функции, т. е. применять функциональный аргумент к другим его аргументам называют применяющими функционалами. Они дают возможность интерпретировать и преобразовывать данные в программу и применять ее в вычислениях.
Рассмотрим применяющие функционалы APPLY и FUNCALL.
APPLY является функцией двух аргументов, из которых первый аргумент представляет собой функцию, которая применяется к элементам списка, составляющим второй аргумент функции APPLY:
(APPLY fn список).
Примеры.
(APPLY ‘+ ‘(4 5 6)) => 15
(apply 'car '((1 2 3))) => 1
(apply 'list '(1 2 3)) => (1 2 3)
(defun f (x)
(cond ((null x) 'end)
(t (print (apply (car x) '(2 3))) (f (cdr x))))) => F
(f '(+ - * /))
=> 5
=> -1
=> 6
=> 2/3
=> END
Использование APPLY дает большую гибкость по сравнению с прямым вызовом функции: в зависимости от функционального аргумента можно осуществлять различные вычисления.
Функционал FUNCALL по своему действию аналогичен APPLY, но аргументы для вызываемой функции он принимает не списком, а по отдельности:
(FUNCALL fn x1 x2 ... xn).
Пример.
(FUNCALL ‘+ 4 5 6) => 15
FUNCALL и APPLY позволяют задавать вычисления (функцию) произвольной формой, например, как в вызове функции, или символом, значением которого является функциональный объект. Таким образом, появляется возможность использовать синонимы имени функции. С другой стороны, имя функции можно использовать как обыкновенную переменную, например для хранения другой функции (имени или лямбда-выражения), и эти два смысла (значение и определение) не будут мешать друг другу:
(SETQ list ‘+) => +
(FUNCALL list 1 2) => 3
(LIST 1 2) => (1 2)
