- •Функциональное и логическое программирование
- •Глава 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. Программирование на языке пролог
- •Общие сведения о языке Пролог. Язык Пролог как система, реализующая логический вывод в исчислении предикатов первого порядка.
- •Фразы Хорна как средство представления знаний.
- •Синтаксис языка Пролог.
- •Фразы, термы, факты, правила.
- •Константы:
- •Простейшая программа на Прологе
- •Выполнение запроса в Прологе.
- •Неудача запроса и возврат назад.
- •Декларативная и процедурная семантика Пролога.
- •Рекурсивные процедуры.
- •Списки.
- •Операторы.
- •Средства управления ходом выполнения программы. Предикат сократить (отсечение).
- •Отрицание как неудача запроса.
- •Встроенные предикаты.
- •Типы отношений.
- •Ограничения, обеспечивающие целостность отношений.
- •Свойства отношений.
- •Подходы к программированию на языке Пролог.
Фразы, термы, факты, правила.
Программа на Прологе состоит из множества фраз. В каждой фразе формулируется некоторое отношение между термами, т.е. программу можно рассматривать как сеть отношений между термами. Аргументами отношений являются термы. Каждый терм обозначает некоторую сущность, принадлежащую миру. Алфавит языка Пролог включает прописные и строчные буквы, цифры и специальные символы (+ - * / < > = : . _ & ~).
Существуют три типа термов:
Константы:
атомы (конкретные объекты)
числа.
Атомы можно создавать тремя способами:
а) из цепочки букв, цифр и символа подчеркивания, начиная цепочку со строчной буквы;
б) из специальных символов (осторожно);
в) из цепочки символов, заключенных в одинарные кавычки (‘Том’) (если мы хотим иметь атом, начинающийся с прописной буквы - так он будет отличен от переменной).
Числа:
целые(-16 383 до 16 383);
вещественные (например, 2.1), которые редко используются, так как Пролог предназначен для обработки символьной информации;
переменные - это цепочки, состоящие из букв, цифр и символа подчеркивания, начинающиеся с прописной буквы или с символа подчеркивания, а также сам символ "_".
Символ "_" обозначает анонимную переменную. Анонимная переменная используется, если имя переменной не имеет значения для логических выводов или не требуется получить ее значение, когда задается вопрос. Например, переменная встречается в предложении один раз, в этом случае нет необходимости давать ей имя:
имеет_ребенка (X):-
родитель(X, Y).
Можно использовать родитель (X, _) ,так как имя ребенка не имеет значения. Если в одном предложении встречаются несколько символов "_", то это каждый раз новая анонимная переменная:
некто_кто_имеет_ребенка:- родитель(_, _).
Если анонимная переменная встречается в вопросе, то ее значение не выводится при ответе системы:
?- родитель(X, _).
Диапазон переменной - одно предложение. Одно имя в двух предложениях обозначает разные переменные. Один и тот же атом обозначает один и тот же объект во всей программе.
Структуры - это составные термы. Записываются в виде:
имя (арг1, арг2, ..., аргn) ,
где арг1, ..., аргn сами являются термами (т.е. константами, переменными или структурами).
Структуры - это определяемые программистом объекты произвольной сложности. Имя структуры называется функтором, а аргументы в скобках - компонентами. Функтор объединяет компоненты в структуру.
Примеры:
дата(1, май, 1998).
Дата(День, Месяц, Год).
День, Месяц, Год являются переменными и им можно приписать значения на более поздних этапах вычислений.
Все структурные объекты можно представлять в виде деревьев, где функтор - корень дерева, а ветви - компоненты. Если некоторая компонента является структурой, то ей соответствует поддерево в дереве, изображающем весь структурный объект. Функтор, служащий корнем дерева, называется главным функтором терма.
Представим в виде структуры арифметическое выражение:
(a - b) * (3 + c) / d – 6
Используя функторы - , + , * , / можно записать
- ( / ( * ( - (a , b), + ( 3 , c ) ) , d ) ,6 )
Главный функтор терма здесь - .
Разные структуры могут иметь одинаковые функторы, если они различаются количеством компонентов, например:
точка(X , Y) - точка в двумерном пространстве;
точка (X , Y , Z) - точка в трехмерном пространстве.
В одной программе - это разные структуры.
В Прологе используются рекурсивные структуры, в которых один из аргументов каждой записи указывает на следующую запись. Например, рассмотрим структуру "клиент", содержащую информацию о клиенте, берущем автомашину напрокат: фамилию, суточный тариф и количество дней, на которые взята машина.
клиент ( петров , 29 , 4 ).
Представим записи о всех клиентах в виде рекурсивной структуры с именем «клиент». Для этого добавим в структуру «клиент» дополнительный аргумент, указывающий на следующую запись:
клиент ( петров, 29, 4, клиент ( иванов, 40, 5, клиент ( сидоров, 13, 1, end) ) ).
end означает, что записей больше нет. Рекурсивные структуры аналогичны связным спискам языка СИ, но работать с ними легче, так как система осуществляет все действия по обработке указателей.
