- •Функциональное и логическое программирование
- •Глава 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. Программирование на языке пролог
- •Общие сведения о языке Пролог. Язык Пролог как система, реализующая логический вывод в исчислении предикатов первого порядка.
- •Фразы Хорна как средство представления знаний.
- •Синтаксис языка Пролог.
- •Фразы, термы, факты, правила.
- •Константы:
- •Простейшая программа на Прологе
- •Выполнение запроса в Прологе.
- •Неудача запроса и возврат назад.
- •Декларативная и процедурная семантика Пролога.
- •Рекурсивные процедуры.
- •Списки.
- •Операторы.
- •Средства управления ходом выполнения программы. Предикат сократить (отсечение).
- •Отрицание как неудача запроса.
- •Встроенные предикаты.
- •Типы отношений.
- •Ограничения, обеспечивающие целостность отношений.
- •Свойства отношений.
- •Подходы к программированию на языке Пролог.
Наиболее общая функция, выделяющая n-й элемент списка (при этом индексация начинается с 0):
(NTH n список)
(NTH 2 ‘(A B C) ) => C
Функция last позволяет выделить последний элемент списка:
(LAST список)
(LAST ‘(1 2 3 4 5)) => 5
Функция list - создает список из элементов:
(LIST арг.1 арг.2 арг.3 …) => (арг.1 арг.2 арг.3 …)
Функция возвращает в качестве своего значения список из значений аргументов, количество аргументов произвольно:
(LIST ‘a ‘b ‘c) => (a b c)
(LIST ‘a ‘b (+ 1 2)) => (a b 3)
Построение списков на базовом уровне сводится к вложенным вызовам функции CONS. При этом вторым аргументом последнего вызова является пустой список NIL, на основе которого наращивается список:
(cons ‘a NIL) => (a) (list ‘a)
(cons 1 (cons 2 (cons 3 NIL) ) ) => (1 2 3) (list 1 2 3)
Имя и значение символа
Значением константы является сама константа.
Перед числами и символами T и NIL не нужно ставить апостроф.
Символ может обозначать произвольное выражение
Символы можно использовать как переменные. В этом случае они могут обозначать некоторые выражения. Изначально символы не имеют значений. Для присваивания символам значений существуют встроенные функции присваивания (связывания): SET, SETQ, SETF.
Функция SET вычисляет оба своих аргумента и связывает первый аргумент:
(SET символ значение) значение
Вычисляет и присваивает символу (связывает с ним) некоторое значение. Возвращает в качестве результата значение второго аргумента. После присваивания интерпретатор уже может вычислить значение символа. Установленная связь действительна до конца работы, если этому имени не будет присвоено новое значение.
(SET ‘a ‘(b c d)) => (b c d)
a =>(b c d)
(SET (CAR a) (CDR (o f g)) => (f g)
a => (b c d)
(CAR a) => b
b => (f g)
Значение символа вычисляется с помощью специальной функции Symbol-value, которая возвращает в качестве результата значение своего аргумента:
(Symbol-value (CAR a)) => (f g)
Проверить, связан ли атом, можно с помощью предиката BOUNDP, который истинен, если атом имеет какое-нибудь значение:
(BOUNDP ‘c) NIL
(BOUNDP ‘a) T
(BOUNDP ‘T) T
Функция setq – невычисляющее присваивание:
(SETQ символ значение) значение
Не вычисляет значение первого аргумента, связывает его со значением второго. Отличается от функции SET тем, что вычисляет только второй аргумент:
d => Error
(SETQ d ‘(l m n)) => (l m n)
d => (l m n)
Функция setf - обобщенная функция присваивания:
(SETF ячейка-памяти значение)
Функция используется для занесения значения в ячейку памяти. Переменная «ячейка» без апострофа указывает на ячейку памяти, куда помещается в качестве значения список (a b c):
(SETF ячейка ‘(a b c)) => (a b c)
ячейка => (a b c)
Функции, обладающие побочным эффектом, называются псевдофункциями.
В Лиспе любое действие считается функцией и имеет значение. Значение обязательно есть даже у таких действий, основное предназначение которых состоит в выработке побочного эффекта: присваивание, ввод-вывод и т.д. Рассмотренные функции присваивания (связывания) являются псевдофункциями. Вырабатываемое этими функциями значение - это значение, которое присваивается символу. Побочный эффект состоит непосредственно в присваивании, т.е. в образовании связи между символом и его значением.
С символом можно связать именованные свойства:
(имя1 значение1 имя2 значение2 ... имяN значениеN)
Свойства символа записываются в хранимый вместе с символом список свойств. Свойство имеет имя и значение. Список свойств может быть пуст, его можно изменять или удалять без ограничений.
