
- •Часть 1
- •1. Введение
- •2. Теоретические основы логического программирования.
- •2.1 Основные определения логики предикатов первого порядка
- •2.2 Стандартные формы представления формул исчисления предикатов.
- •3. Синтаксис языка программирования Пролог.
- •3.1. Основные элементы языка Пролог.
- •3.2. Представление клауз Хорна на языке Пролог. Факты. Правила. Вопросы.
- •3.2.1. Представление фактов в Пролог—программах.
- •3.2.2. Вопросы.
- •3.2.3. Правила.
- •3.2.4. Подстановки и примеры утверждений.
- •3.2.5. Пример Прологпрограммы.
- •4. Семантика языка программирования Пролог.
- •4.1 Декларативная и процедурная семантика программ на языке Пролог.
- •4.2. Вычислительная модель логической программы.
- •4.2.1. Унификация термов.
- •4.2.2. Общая схема согласования целевых утверждений.
- •4.2.3 Механизм поиска с возвратом.
- •5. Рекурсивное программирование на языке Пролог.
- •5.1 Рекурсивные правила.
- •5.2 Схема поиска решений в рекурсивных программах.
- •5.3. Списки и их представление на Прологе.
- •Основные определения.
- •Унификация списков.
- •Предикат list.
- •Типовые процедуры обработки списков на языке Пролог.
- •Предикат length.
- •5.4.2. Предикат member.
- •Предикат first.
- •Предикат last.
- •Предикат next.
- •Предикат append.
- •Предикат add.
- •Предикаты revers1 и revers2.
- •Предикат delete.
- •5.4.10. Предикат number_list.
- •5.4.11. Предикат sumlist.
- •5.4.12. Предикат delrepeat.
- •5.5 Множества и их представление на языке Пролог. Простые программы обработки множеств.
- •Основные определения.
- •Предикат unionset.
- •Пересечение множеств.
- •Разность множеств.
- •Определение подмножества.
- •5.5.6. Декартово произведение множеств.
- •Прологпрограммы сортировки списков.
- •Метод прямого выбора.
- •Метод вставки.
- •5.6.3. Метод перестановок.
- •6. Стандартные предикаты языка Пролог.
- •Арифметические предикаты.
- •6.2. Предикаты сравнения арифметических выражений и символьных термов.
- •6.3. Предикаты определения типов термов.
- •6.4. Примеры программ с использованием арифметических предикатов.
- •6.5. Предикаты вводавывода термов и символов.
- •6.5.1. Ввод/вывод термов.
- •6.5.2. Ввод/вывод символов.
- •6.6. Стандартные предикаты управления логическим выводом.
- •6.7. Стандартные предикаты обработки списков.
- •6.8. Стандартные предикаты обработки строк.
- •7. Система программирования Arity Prolog 5.0.
- •Описание среды программирования Arity Prolog 5.0.
- •Методические указания по лабораторным работам.
- •7.2.1. Лабораторная работа № 1. Простейшая программа на языке Пролог.
- •7.2.2. Лабораторная работа № 2. Использование арифметических операций и унификации арифметических выражений.
- •7.2.3. Лабораторная работа 3.1. Создание базы данных “Cессия” и запросов к этой базе данных на языке Пролог с использованием стандартного предиката fail.
- •Приложение 2. Варианты заданий по лабораторной работе 4.
- •Приложение 3. Варианты заданий по лабораторной работе 5.
- •Список литературы.
5.4.2. Предикат member.
Предикат member(X,Y) определяет, принадлежит ли терм Х списку Y. Схема отношения этого предиката имеет вид:
member(<терм>,<список>).
Декларативное описание предиката member формулируется следующим образом:
Любой терм X принадлежит списку Y, если терм Х является головой списка Y или Х принадлежит хвосту списка Y. В этих двух случаях значение предиката member(X,Y) будет истинным.
Процедура member(X,Y) состоит из двух правил:
member(X,[X|_]).
member(X,[_|T]): member(X,T).
Рассмотрим пример запроса к процедуре member.
? member(3,[1,2,3,4]).
ТР: member(3,[1,2,3,4]).
Шаг 1: ТЦ: member(3,[1,2,3,4]).
Пр1: member(3,[1|[2,3,4]]) неуспех (3 не сопоставимо с 1)
Пр2: member(3,[1|[2,3,4]]): member(3,[2,3,4]).
ТР: member(3,[2,3,4]).
Шаг 2: ТЦ: member(3,[2,3,4]).
Пр1: member(3,[2|[3,4]]) неуспех (3 не сопоставимо с 2)
Пр2: member(3,[2|[3,4]]): member(3,[3,4]).
ТР: member(3,[3,4]).
Шаг 3: ТЦ: member(3,[3,4]).
Пр1: member(3,[3|[4]]) успех (3 сопоставимо с 3)
Переход на шаг 2. Истинность ТЦ на шаге 3 влечет истинность цели на шаге 2 member(3,[2,3,4]).
Переход на шаг 1. Истинность ТЦ на шаге 2 влечет истинность цели на шаге 1 member(3,[1,2,3,4]).
ТР: успех.
Результат вычисления запроса member(3,[1,2,3,4]). успех.
Предикат first.
Предикат first(X,Y) определяет, является ли терм Х первым элементом списка Y. Схема отношения этого предиката имеет вид:
first(<терм>,<список>).
Декларативное описание предиката first формулируется следующим образом: Терм X является головой списка Y, если терм Х сопоставим с первым элементом списка Y.
Процедура first(X,Y) состоит из факта:
first(X,[X|_]).
Предикат last.
Предикат last(X,Y) определяет, является ли терм Х последним элементом списка Y. Схема отношения этого предиката имеет вид:
last(<терм>,<список>).
Декларативное описание предиката last формулируется следующим образом:
Если список Y включает только один элемент, и этот элемент сопоставим с термом X, то предикат last(X,Y) истинен. Если список Y можно разделить на голову и непустой хвост и терм Х является последним элементом хвоста списка Y, то предикат last(X,Y) истинен. Если терм Х отсутствует в списке Y, то значение предиката last(X,Y) ложь.
Процедура last(X,Y) состоит из двух правил:
last(X,[Y|[]]):X=Y.
last(X,[Z|T]):last(X,T).
Рассмотрим пример запроса к процедуре last.
? last(4,[1,2,3,4]).
ТР: last(4,[1,2,3,4]).
Шаг 1: ТЦ: last(4,[1,2,3,4]).
Пр1: last(4,[1|[2,3,4]]) неуспех ([2,3,4] не сопоставим с [])
Пр2: last(4,[1|[2,3,4]]): last(4,[2,3,4]).
ТР: last(4,[2,3,4]).
Шаг 2: ТЦ: last(4,[2,3,4]).
Пр1: last(4,[2|[3,4]]) неуспех ([3,4] не сопоставим с [])
Пр2: last(4,[2|[3,4]]): last(4,[3,4]).
ТР: last(4,[3,4]).
Шаг 3: ТЦ: last(4,[3,4]).
Пр1: last(4,[3|[4]]) неуспех ([4] сопоставим с [])
ТР: last(4,[4]).
Шаг 4: ТЦ: last(4,[4]).
Пр1: last(4,[4|[]]) успех ([] сопоставим с [])
Переход на шаг 3. Истинность ТЦ на шаге 4 влечет истинность цели на шаге 3 last(4,[3,4]).
Переход на шаг 2. Истинность ТЦ на шаге 3 влечет истинность цели на шаге 2 last(4,[2,3,4]).
Переход на шаг 1. Истинность ТЦ на шаге 2 влечет истинность цели на шаге 1 last(4,[1,2,3,4]).
ТР: .
Результат вычисления запроса last(4,[1,2,3,4]) успех.