
- •Часть 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.5 Множества и их представление на языке Пролог. Простые программы обработки множеств.
Основные определения.
Списки структуры данных, с помощью которых можно представлять множества и графы в программах на языке Пролог. Множества отличаются от списков тем, что в списках могут быть повторяющиеся элементы, а во множествах нет. С другой стороны, в списках порядок следования элементов имеет значения, а множества могут быть неупорядоченными. В следующих параграфах будут рассмотрены предикаты, выполняющие операции над множествами.
Предикат unionset.
Предикат unionset определяет операцию объединения двух множеств. Объединением двух множеств X и Y является множество Z, состоящее из элементов, которые принадлежат или множеству X, или множеству Y, или обоим множествам одновременно.
Предикат unionset(X,Y,Z) истинен, если множество Z является объединением множеств X и Y. Схема отношения этого предиката имеет вид:
unionset(<список>,<список>,<список>).
Декларативное описание предиката unionset(X,Y,Z)формулируется следующим образом:
Объединение пустого множества с непустым множеством Х есть множество Х.
Список, определяющий первое множество Х можно разделить на голову Н и хвост Xs. Если голова первого списка Н принадлежит второму списку Y, то рекурсивно вызывается процедура unionset с аргументами Xs и Y. При этом терм H в результирующий список не помещается.
Список, определяющий первое множество Х можно разделить на голову Н и хвост Xs. Если голова первого списка Н не принадлежит второму списку Y, то рекурсивно вызывается процедура unionset с аргументами Xs и Y. При этом терм H помещается в результирующий список.
Процедура unuonset(X,Y) состоит из трех правил:
unionset([],X,X). unionset([H|Xs],Y,Z):-member(H,Y),!,unionset(Xs,Y,Z).
unionset([H|Xs],Y,[H|Z]):-unionset(Xs,Y,Z).
Процедура unionset выполняется следующим образом:
? unionset([a,b,c],[d,a,b,f],Z).
ТР: unionset([a,b,c],[d,a,b,f],Z).
Шаг 1: ТЦ: unionset([a,b,c], [d,a,b,f] ,Z).
Пр1: [a,b,c] =[] неуспех (списки разной длины)
Пр2: unionset([a|[b,c]],[d,a,b,f],Z):-member(a,[d,a,b,f]),!,unionset([b,c], [d,a,b,f],Z).
ТР: member(a,[d,a,b,f]),!,unionset([b,c],[d,a,b,f],Z).
Шаг 2: ТЦ: member(a,[d,a,b,f]) успех3
ТР: unionset([b,c],[d,a,b,f],Z1).
Шаг 3: ТЦ: unionset([b,c],[d,a,b,f],Z).
Пр1: [b,c] =[] неуспех (списки разной длины)
Пр2: unionset([b|[c]],[d,b,a,f],Z):-member(b,[d,a,b,f]),!,unionset([c],[d,a,b,f],Z).
ТР: member(b,[d,a,b,f]),!,unionset([c],[d,b,a,f],Z).
Шаг 4: ТЦ: member(b,[d,a,b,f]) успех
ТР: unionset([c],[ d,a,b,f],Z).
Шаг 5: ТЦ: unionset([c],[ d,a,b,f ],Z).
Пр1: [c] =[] неуспех (списки разной длины)
Пр2: unionset([c|[]],[d,a,b,f],Z):-member(c,[d,a,b,f]),!,unionset([],[d,a,b,f],Z).
ТР: member(c,[d,a,b,f]),!,unionset([],[d,a,b,f ],Z).
Шаг 6: ТЦ: member(с,[d,a,b,f]) неуспех
Возврат.
Пр3: unionset([c|[]],[ d,a,b,f ],[c|Z1]):- unionset([],[d,a,b,f ],Z1).
Z=[c|Z1]
ТР: unionset([],[d,a,b,f ],Z1).
Шаг 7: ТЦ: unionset([],[d,a,b,f ] ,Z1).
Пр1: [] =[] успех при подстановке Z1=[d,a,b,f ].
Выход из рекурсии на шаг 6, получается подстановка Z=[c|Z1] или Z=[c,d,a,b,f].
Выход из рекурсии на шаг 5, Z=[c,d,a,b,f].
Выход из рекурсии на шаг 3, Z=[c,d,a,b,f].
Выход из рекурсии на шаг 1, Z=[c,d,a,b,f].
ТР: успех.
Результат вычисления запроса Z=[c,d,a,b,f]. успех.