- •Функциональное и логическое программирование
- •Глава 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. Программирование на языке пролог
- •Общие сведения о языке Пролог. Язык Пролог как система, реализующая логический вывод в исчислении предикатов первого порядка.
- •Фразы Хорна как средство представления знаний.
- •Синтаксис языка Пролог.
- •Фразы, термы, факты, правила.
- •Константы:
- •Простейшая программа на Прологе
- •Выполнение запроса в Прологе.
- •Неудача запроса и возврат назад.
- •Декларативная и процедурная семантика Пролога.
- •Рекурсивные процедуры.
- •Списки.
- •Операторы.
- •Средства управления ходом выполнения программы. Предикат сократить (отсечение).
- •Отрицание как неудача запроса.
- •Встроенные предикаты.
- •Типы отношений.
- •Ограничения, обеспечивающие целостность отношений.
- •Свойства отношений.
- •Подходы к программированию на языке Пролог.
Типы отношений.
Фразы программы применяются для представления отношений между термами. Термы применяются для представления сущностей, входящих в мир. Поэтому для повышения эффективности программы вначале целесообразно проанализировать отношения, встречающиеся в моделируемом мире, а затем принять решение о том, как представить каждый тип отношений при помощи фраз Пролога. Программист может дать директиву интерпретатору о необходимости принять во внимание свойства отношений, чтобы оптимизировать обработку запросов. Будем для простоты рассматривать бинарные отношения.
Ограничения, обеспечивающие целостность отношений.
Для аргументов X, Y бинарного отношения будет справедливо одно из следующих ограничений.
один- к- одному : для заданного значения X существует единственное значение Y, удовлетворяющее этому отношению, а для заданного значения Y существует единственное значение X, удовлетворяющее этому отношению. Например, отношение между человеком и номером его паспорта.
Ограничения, обеспечивающие целостность отношений, вступают в силу либо когда в программу вводятся новые конкретные случаи отношений (т.е. факты), либо когда в базе данных выполняется поиск конкретных случаев отношений.
один- ко- многим: для заданного значения X может существовать много значений Y, удовлетворяющих этому отношению, но для заданного значения Y существует только одно значение X, которое удовлетворяет отношению. Например, предикат «отец». У отца может быть несколько детей, но не наоборот.
многие- к- одному: для заданного значения X существует только одно значение Y, удовлетворяющее данному отношению, но для заданного значения Y может существовать много значений X, удовлетворяющих отношению. Например, предикат «уроженец». В какой-либо стране может родиться много людей, но один человек может быть уроженцем только одной страны.
многие- ко- многим: для заданного значения X может существовать много значений Y, удовлетворяющих этому отношению, и для заданного значения Y может существовать много значений X, удовлетворяющих отношению. Например, база данных типографской компании, содержащая сведения о сортах бумаги. Первый аргумент соответствует цвету бумаги, второй - ее виду. Разрешена любая комбинация цвета и вида бумаги:
бумага (красный, плотная).
бумага (белый, глянцевая).
бумага (кремовый, плотная).
бумага (белый, гладкая).
Если сказать, что отношение регулируется ограничением вида многие- ко- многим, обеспечивающим его целостность, то это эквивалентно тому, что отношение вообще не регулируется никакими ограничениями. По умолчанию интерпретатор выполняет действия с предикатами, считая, что он регулируются ограничением вида многие- ко- многим.
Свойства отношений.
Помимо этого, некоторые отношения можно характеризовать наличием или отсутствием следующих свойств.
1). Симметрия. Отношение между двумя сущностями будет симметричным, если роли, которые играют это сущности, взаимозаменяемы. Если предикат обладает свойством симметрии, то порядок следования аргументов в запросе к этому предикату не будет иметь значения. Например, отношение «брат_или_сестра»:
брат_или_сестра (маша, коля).
брат_или_сестра (миша, оля).
Если написать запрос к этой базе данных, в котором аргументы располагаются также, как и у фактов, входящих в базу, то запрос будет успешным. Но если поменять аргументы местами, то запрос потерпит неудачу. Это говорит о том, что эта база данных несимметрична.
Одним из способов придания симметрии предикату «брат_или_сестра» может служить составление двух правил, ссылающихся на явную базу данных. Пусть есть явная база данных «братсестра», тогда
братсестра (маша, коля).
братсестра (миша, оля).
брат_или_сестра (А, В):- (1)
братсестра (А, В).
брат_или_сестра (А, В):- (2)
братсестра (В, А).
Правило (1) передает аргументы подцели «братсестра» в том же порядке, как они заданы в заголовке, а правило (2) меняет порядок следования аргументов. Запрос
?- брат_или_сестра (миша, оля).
решается в соответствии с правилом (1), а запрос
?- брат_или_сестра (оля, миша).
решается в соответствии с правилом (2).
Таким образом предикат «брат_или_сестра» ведет себя как симметричное отношение.
Асимметрия. Отношение, не обладающее симметрией, называется ассиметричным. Например, отношение между отцом и сыном является асимметричным. Некоторые отношения не являются обязательно симметричными или асимметричными, например, любви одного лица к другому. По умолчанию интерпретатор считает все отношения асимметричными, как это имело место в приведенном ранее примере отношения «брат_или_сестра».
2) Рефлексивность и нерефлексивность. Отношение, которое соблюдается, когда оба аргумента одинаковы, называется рефлексивным. Например, отношения «равно» или «больше или равно». Отношение, которое нарушается, когда оба аргумента одинаковы, называется нерефлексивным. Например, отношение «выше». По умолчанию интерпретатор считает, что предикаты рефлексивны.
Пример.
сестра (А, В):-
родитель(С, А),
родитель(С, В),
женщина(А).
Здесь отсутствует условие, указывающее, что А должно отличаться от В, поэтому по умолчанию принимается, что правило рефлексивно, тем самым при помощи такого правила можно доказать, что некоторая женщина является сестрой самой себе. Это нецелесообразно, поэтому надо переписать правило так, чтобы оно стало нерефлексивным.
3) Транзитивность. Отношение между аргументами называется транзитивным, если оно сохраняется при переходе от прямого отношения к косвенному. «Равно» служит примером транзитивного отношения: если А равно В, а В равно С, то А должно быть равно С. «Выше» - еще один пример транзитивного отношения. В Прологе транзитивные отношения обычно реализуются рекурсивными процедурами, примером может служить процедура «предок».
