- •Функциональное и логическое программирование
- •Глава 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. Программирование на языке пролог
- •Общие сведения о языке Пролог. Язык Пролог как система, реализующая логический вывод в исчислении предикатов первого порядка.
- •Фразы Хорна как средство представления знаний.
- •Синтаксис языка Пролог.
- •Фразы, термы, факты, правила.
- •Константы:
- •Простейшая программа на Прологе
- •Выполнение запроса в Прологе.
- •Неудача запроса и возврат назад.
- •Декларативная и процедурная семантика Пролога.
- •Рекурсивные процедуры.
- •Списки.
- •Операторы.
- •Средства управления ходом выполнения программы. Предикат сократить (отсечение).
- •Отрицание как неудача запроса.
- •Встроенные предикаты.
- •Типы отношений.
- •Ограничения, обеспечивающие целостность отношений.
- •Свойства отношений.
- •Подходы к программированию на языке Пролог.
Отрицание как неудача запроса.
Информация о фактах, которые не являются истинными, или об отношениях, которые не соблюдаются, называется негативной. Негативная информация обычно не хранится в Пролог-программах в явной форме. Вместо этого считается, что вся информация, отсутствующая в текущем множестве фраз, является ложной. Система не различает отсутствующую в программе фразу и доказуемо неистинную фразу. По умолчанию Пролог-система всегда руководствуется правилом, которое называется предположением о замкнутости мира:
если фраза Р отсутствует в текущей программе, то это значит, что представлено отрицание Р.
При работе с неизвестной информацией часто руководствуются предположением об открытости мира:
если фраза Р отсутствует в текущей программе, то это значит, что Р ни истинна, ни ложна.
В этом случае различают три значения запроса – «истина», «ложь» и «неизвестно», - чтобы иметь возможность в случае отсутствия информации предпринять какие-то шаги, например, обратиться к альтернативному источнику информации. Чтобы поведение программы соответствовало предположению об открытости мира, это необходимо выражать явно при написании программы.
Отрицание в явной форме представляет собой встроенный предикат:
not (аргумент) ,
где аргумент – это запрос, значение которого после обработки заменяется на противоположное. Для определения этого предиката с помощью отсечения используются встроенные предикаты:
fail – цель, которая всегда ложна.
Этот встроенный предикат всегда приводит к неудаче. Когда он является частью составного запроса, то заставляет интерпретатор вернуться назад и попробовать найти новые конкретизации для переменных. Этот процесс будет продолжаться до тех пор, пока не исчерпаются соответствующие факты программы, после чего весь составной запрос потерпит неудачу:
true – цель, которая всегда истинна.
not (P):- P, ! , fail.
not (P):- true.
Пример 1. Определим сельского жителя как человека, не являющегося ни горожанином, ни жителем пригорода:
горожанин (иван).
житель_пригорода (софья).
сельский_житель (Х):- not ( горожанин ( Х ) ), not ( житель_пригорода ( Х ) ).
Встроенные предикаты.
Встроенные предикаты, предназначенные для ввода-вывода:
readln(Аргумент) - считывает данные, введенные пользователем, в виде строки и размещает их в Аргумент;
readint(Аргумент), readreal(Аргумент), readchar(Аргумент) - считывает соответственно целое, вещественное число, символ;
readterm(Тип_Аргумента, Аргумент) - считывает терм;
write([Арг1, … , Аргn]) - число аргументов любое, аргументы - термы (константы или переменные);
nl - переход на новую строку:
writef(Строка_форматов, Арг1, … , Аргn) - форматированный вывод;
в строке форматов могут присутствовать:
%d - целое число или символ;
%s - строка или атом;
%f - вещественное число;
\n - переход на новую строку;
\t - табуляция.
Передавать программы Пролог-системе можно при помощи двух встроенных предикатов.
consult («имя файла») - добавляет новые предложения в программу из файла. В результате все предложения программы, содержащейся в файле, будут использоваться системой при ответе на дальнейшие вопросы пользователя. Если позже в том же сеансе произойдет "консультация" с другим файлом, предложения нового файла будут добавлены в конец текущего множества предложений.
reconsult («имя файла») – действует так же, как и предыдущий предикат, но при этом переопределяет ранее введенные определения отношений, не затрагивая тех отношений, о которых в файле ничего не сказано.
Работа со строками:
frontchar(Строка, ПервыйСимвол, Остаток) - берет первый символ строки и возвращает оставшуюся часть строки;
frontstr(N, Строка, Начало, Конец), N - целое число, Строка - строка длиной не менее N символов; предикат возвращает первые N символов Строки через переменную Начало, а остальные символы через переменную Конец;
fronttoken(Строка, Признак, Остаток) - находит первое слово или число в Строке, возвращает его через переменную Признак, а остаток - через переменную Остаток;
str_len(Строка, Длина) - определяет число символов в Строке.
Преобразование типов:
str_char(Cтрока, Символ), str_int(Cтрока, Целое), str_real(Cтрока, Действительное) - преобразование значений от одного типа к другому;
char_int(Символ, КодСимвола) - получить код символа (или преобразовать код в символ);
upper_lower(ВерхнийРегистр, НижнийРегистр) - строка целиком переводится либо в заглавные, либо в строчные буквы;
