
- •Часть 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.
- •Список литературы.
Определение подмножества.
Предикат subset определяет, является ли множество подмножеством другого множества. Множество X является подмножеством множества Y, если все элементы X, принадлежат множеству Y.
Предикат subset(X,Y) истинен, если множество X является подмножеством Y. Схема отношения этого предиката имеет вид:
subset(<список>,<список>).
Декларативное описание предиката subset(X,Y)формулируется следующим образом.
Пустое множество является подмножеством любого множества.
Список, определяющий первое множество Х можно разделить на голову Н и хвост Xs. Множество X есть подмножество Y, если голова первого списка Н принадлежит второму списку Y и Xs есть подмножество множества Y.
Процедура subset(X,Y) состоит из двух правил:
subset([],Y). subset([H|Xs],Y):-member(H,Y),subset(Xs,Y).
Рассмотрим пример запроса к процедуре subset.
Процедура subset выполняется следующим образом:
? subset([a,b,c],[d,a,b,c,f]).
ТР: subset([a,b,c],[d,a,b,c,f]).
Шаг 1: ТЦ: subset([a,b,c], [d,a,b,c,f]).
Пр1: [a,b,c] =[] неуспех (списки разной длины)
Пр2: subset([a|[b,c]],[d,a,b,c,f]):-member(a,[d,a,b,f])subset([b,c], [d,a,b,c,f]).
ТР: member(a,[d,a,b,c,f])),subset([b,c],[d,a,b,c,f]).
Шаг 2: ТЦ: member(a,[d,a,b,c,f]) успех5
ТР: subset([b,c],[d,a,b,c,f]).
Шаг 3: ТЦ: subset([b,c],[d,a,b,c,f]).
Пр1: [b,c] =[] неуспех (списки разной длины)
Пр2: subset([b|[c]],[d,a,b,c,f]):-member(b,[d,a,b,c,f]))subset([c],[d,a,b,c,f]).
ТР: member(b,[d,a,b,c,f])),subset([c],[d,b,a,c,f]).
Шаг 4: ТЦ: member(b,[d,a,b,c,f]) успех
ТР: subset([c],[ d,a,b,f],Z).
Шаг 5: ТЦ: subset([c],[ d,a,b,c,f ]).
Пр1: [c] =[] неуспех (списки разной длины)
Пр2: subset([c|[]],[d,a,b,f],[c|Z1]):-member(c,[d,a,b,c,f])),subset([],[d,a,b,c,f]).
ТР: member(c,[d,a,b,c,f])),subset([],[d,a,b,c,f ]).
Шаг 6: ТЦ: member(с,[d,a,b,f,c]) успех
Шаг 7: ТЦ: subset([],[d,a,b,f ] ).
Пр1: [] =[] успех.
Выход из рекурсии на шаг 5.
Выход из рекурсии на шаг 3.
Выход из рекурсии на шаг 1.
ТР: успех.
Результат вычисления запроса успех.
5.5.6. Декартово произведение множеств.
Предикат dek определяет операцию декартова произведения двух множеств. Декартовым произведением двух множеств X={xi} и Y={yi} является множество Z, состоящее из пар элементов [xi, yi], где xi принадлежат множеству X, а yi принадлежат множеству Y.
Предикат dek(X,Y,Z) истинен, если множество Z является декартовым произведением множеств X и Y. Схема отношения того предиката имеет вид:
dek(<список>,<список>,<список>).
В процедуре dek используются дополнительные предикаты pro и append6. Предикат pro(X,Y,Z)истинен, если X есть терм, Y={Yi}множество термов, а Z является множество пар вида [X, Yi], где X есть заданный терм, а Yi соответствующий элемент множества Y. Схема отношения предиката pro имеет вид:
pro(<терм>,<список>,<список>).
Декларативное определение предиката pro(X,Y,Z) формулируется следующим образом.
Список Y состоит из одного элемента. Тогда список Z является списком пар вида [X, Yi].
Список, определяющий множество Y можно разделить на голову Н и хвост T. Тогда список Z=[[X,H]|T1], если список список T1 есть результат процедуры pro(X,T,T1].
Декларативное описание предиката dek(X,Y,Z) формулируется следующим образом:
Список X состоит из одного элемента. Тогда список Z является результатом процедуры pro(X,Y,Z1.
Список, определяющий первое множество Х можно разделить на голову X и хвост T1. Если pro(X,Y,T2) и dek(T1,Y,T3) и append(T2,T3,Z) истинны, то Z есть декартово произведение списков X и Y.
Процедура pro(X,Y,Z) состоит из двух правил:
pro(X,[Y],[[X,Y]|[]]). pro(X,[H|T], [[X,H]|T1]):-pro(X,T,T1).
Процедура dek(X,Y,Z) состоит из двух правил:
dek([X|[]],Y,Z):pro(X,Y,Z). dek([X|T1],Y,Z):-pro(X,Y,T2), dek(T1,Y,T3),
append(T2,T3,Z).
Пример запроса к процедуре pro.
? pro(4,[1,2,3],Z).
Z=[4,2],[4,3],[4,3]]
Yes
Пример запроса к процедуре dek.
? dek([4,2][3,5,8],Z).
Z=[[4,3],[4,5],[4,8], [2,3],[2,5],[2,8]]
Yes