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