- •Часть 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.
- •Список литературы.
Прологпрограммы сортировки списков.
Метод прямого выбора.
Наиболее распространены три метода сортировки списков:
метод сортировки путем прямого выбора;
метод сортировки путем вставки;
метод сортировки с использованием перестановок элементов.
Алгоритм сортировки списка путем прямого выбора включает в себя следующие шаги:
В исходном списке S1 находится минимальный элемент Min и помещается в результирующий список S2.
Этот элемент удаляется из списка S1, и процедура поиска повторяется. С каждым шагом список S1 уменьшается.
Когда список S1 станет пустым, список S2 станет результирующим, упорядоченным по возрастанию списком.
Процедура sort_vibor использует следующие процедуры:
sort1(<исходный список>, <накапливающийся список>, <результирующий список>) процедура накопления списка;
delete(<терм>, <список>, <список > ) процедура удаления элемента из списка;
append(<список>, <список>, <список > ) процедура объединения списков;
minlist(<список>, <терм> ) процедура определения минимального элемента в списке;
min(<терм>, <терм>, <терм> ) процедура определения меньшего из двух термов.
В 5-й процедуре сравниваются числовые термы с помощью операций сравнения чисел >, <, >=, =< или символьные термы с помощью операций сравнения символов (@>, @<, @>=,@=<.
Предикат sort_vibor(L1,LS)истинен, если список LS получен из списка L1 путем упорядочения списка L1 по возрастанию методом прямого выбора. Списки L1 и LS являются списками числовых термов.
Процедура sort_vibor(L1,LS)состоит из следующих правил:
sort_vibor(L1,LS):sort1(L1,[],LS).
sort1(L1,L2,LS):minlist(L1,Min),append(L2,[Min],L3), delete(Min,L1,LL),sort1(LL,L3,LS).
sort1([],LS,LS).
delete(A,[A|B],B).
append([],|L,L).
append([X|L1],L2,[X|L3) : append(L1,L2,L3).
minlist([X],X).
minlist([X,Y|T],M) : minlist([Y|T],MinN),min(X,MinN,M).
min(X,Y,X) :X=<Y.
min(X,Y,Y) :X>Y.
Метод вставки.
Алгоритм сортировки списка путем вставки заключается в следующем: для того, чтобы упорядочить непустой список L = [X|T], необходимо:
упорядочить хвост списка, получив список OT;
вставить голову X списка L в упорядоченный список OT, поместив X в такое место списка OT, что список OT остался бы упорядоченным.
Процедура sort_insert использует процедуру insert, которая вставляет терм в упорядоченный список, не нарушая упорядочивания.
Предикат insert(X,L1,L2) истинен, если список L2 получается из упорядоченного списка L1 путем вставки терма X без нарушения порядка. Схема отношения этого предиката имеет вид:
insert(<терм>, <список>, <список>).
В процедуре insert сравниваются числовые термы с помощью операций сравнения чисел >, <, >=, =< или символьные термы с помощью операций сравнения символов (@>, @<, @>=,@=<.
Предикат sort_insert(L1,LS) истинен, если список LS получен из списка L1 путем упорядочения списка L1 по возрастанию методом вставки. Списки L1 и LS являются списками числовых термов.
Процедура sort_insert(L1,LS) состоит из следующих правил:
sort_insert([],[]).
sort_insert([X|T],OL):sort_insert(T,OT),insert(X,OT,OL).
insert(X,[],[X]).
insert(X,[Y|T],[X,Y|T]): X=<Y.
insert(X,[Y|T],[Y|T1]): X>Y,insert(X,T,T1).