- •Функциональное и логическое программирование
- •Глава 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. Программирование на языке пролог
- •Общие сведения о языке Пролог. Язык Пролог как система, реализующая логический вывод в исчислении предикатов первого порядка.
- •Фразы Хорна как средство представления знаний.
- •Синтаксис языка Пролог.
- •Фразы, термы, факты, правила.
- •Константы:
- •Простейшая программа на Прологе
- •Выполнение запроса в Прологе.
- •Неудача запроса и возврат назад.
- •Декларативная и процедурная семантика Пролога.
- •Рекурсивные процедуры.
- •Списки.
- •Операторы.
- •Средства управления ходом выполнения программы. Предикат сократить (отсечение).
- •Отрицание как неудача запроса.
- •Встроенные предикаты.
- •Типы отношений.
- •Ограничения, обеспечивающие целостность отношений.
- •Свойства отношений.
- •Подходы к программированию на языке Пролог.
Пошаговое программирование
Программирование и тестирование программы осуществляется функция за функцией, которые последовательно определяются и тестируются. Написание, тестирование и исправление программы осуществляются внутри Лисп-системы без промежуточного использования ОС.
Вспомогательные средства, такие например как, редактор, трассировщик, транслятор и другие образуют общую интегрированную среду, язык которой нельзя отличить от системных средств. Отдельные средства по своему принципу являются прозрачными, чтобы их могли использовать другие средства. Работа может производиться часто на различных уровнях или в различных рабочих окнах. Такой способ работы особенно хорошо подходит для исследовательского программирования и быстрого построения прототипов.
Единый системный и прикладной язык программирования
Лисп является одновременно как языком прикладного так и системного программирования. Он напоминает машинный язык тем, что как данные, так и программы представлены в одинаковой форме. Язык превосходно подходит для написания интерпретаторов и трансляторов как для него самого, так и для других языков. Наиболее короткий интерпретатор Пролога, написанный на Лиспе занимает несколько десятков строк.
Традиционно Лисп-системы в основной своей части написаны на Лиспе. Лисп можно в хорошем смысле считать языком машинного и системного программирования высокого уровня. И это особенно хорошо для Лисп-машин, которые вплоть до уровня аппаратуры спроектированы для Лиспа и системное программное обеспечение которых написано на Лиспе.
Основы языка Лисп
S-выражения
Основная структура данных в Лиспе - символьные или S-выражения, которые определяются как атомы или списки.
Атомы - это простейшие объекты Лиспа, из которых строятся остальные структуры. Атом представляется произвольной строкой алфавитных символов, за исключением:
отдельно стоящей точки,
отдельно стоящей левой или правой скобок или групп левых или правых скобок (за исключением открывающей и закрывающей скобки, стоящих подряд,)
отдельно стоящего пробела или группы пробелов,
отдельно стоящего апострофа или двойной кавычки.
Атомы могут быть двух типов - символы и числа. Символ не является идентификатором переменной, как в других языках. В Лиспе символы обозначают числа, другие символы или более сложные структуры, функции и другие Лисповские объекты.
Рисунок 2. Структуры данных в Лиспе
Пример: х, г-1997, символ, function – это символы.
Строка |
Что это? |
Abc |
Это обычный символ |
1Abc |
И это - тоже символ (хотя имя и начинается с цифры) |
Q$W |
И это - тоже символ (хотя имя и содержит знак доллара) |
123 |
Это атом - число |
-12.3 |
И это атом - число |
6.02E+23 |
И это атом - число |
A.A |
Это символ |
A A |
Это - не символ. Пробел в имени недопустим! |
A( |
И это - не символ. Скобки в имени недопустимы! |
A'B |
И это - не символ. Апостроф в имени недопустим! |
() |
Это - символ. |
"Проба пера" |
Это - символ-строка. Внутри строки пробелы вполне допустимы |
"Проба "пера"" |
Это - не символ. Кавычки, стоящие внутри строки, при записи должны удваиваться. |
"Проба ""пера""" |
Теперь верно. |
"Проба 'пера'" |
Можно и так. Апостроф внутри строки - обычный символ. |
В большинстве Лисп-систем прописные и строчные буквы отождествляются:
zzz ZZZ
Числа не являются символами, так как число не может представлять иные Лисповские объекты, кроме самого себя, или своего числового значения. В Лиспе используется большое количество различных типов чисел (целые, десятичные и т. д.) - 24, 35.6, 6.3, e5.
Символы T и NIL имеют в Лиспе специальное назначение:
T - обозначает логическое значение истина,
NIL - логическое значение ложь.
Символы T и NIL имеют всегда одно и тоже фиксированное встроенное значение. Их нельзя использовать в качестве имен других Лисповских объектов. Символ NIL обозначает также и пустой список.
Числа и логические значения T и NIL являются константами, остальные символы - переменными, которые используются для обозначения других Лисповских объектов.
Кроме того, существуют глобальные специальные переменные, имеющие встроенные значения: например, PI – значение числа .
Для превращения любого символа в константу используется директива
(DEFCONSTANT символ значение ).
Символ, определенный как константа, не может изменять предписанного ему таким определением значения.
Список - это упорядоченная последовательность, элементами которой являются атомы или списки (подсписки). Правила оформления списков:
- списки заключаются в круглые скобки, элементы списка разделяются пробелами;
- открывающие и закрывающие скобки находятся в строгом соответствии;
- список всегда начинается с открывающей и заканчивается закрывающей скобкой;
- список, в котором нет элементов, называют пустым и обозначают () или NIL. Пустой список - это атом.
Пример:
(а в (с о) р) - в списке 4 элемента;
(+ 3 6) – в списке 3 элемента.
В виде списка в Лиспе представляются как текст программы, так и данные.
Пример:
(+ 2 3) - интерпретируется как функция, результат 5;
‘ (+ 2 3) – интерпретируется как список из трех элементов, результат (+ 2 3).
