
- •Часть 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.
- •Список литературы.
Предикат next.
Предикат next(X,Y,L) принимает значение “истина”, если терм Х непосредственно следует за термом Y в списке L. Схема отношения этого предиката имеет вид:
next(<терм>,<терм>,<список>).
Декларативное описание предиката next формулируется следующим образом:
Если в списке L первые два элемента X и Y, то предикат next(X,Y,L) истинен, иначе предикат next(X,Y,L) истинен, если термы Х и Y являются первыми элементами хвоста списка L.
Процедура next(X,Y,L) состоит из двух правил:
next(X,Y,[X,Y|L]).
next(X,Y,[U|L]):next(X,Y,L).
Рассмотрим пример запроса к процедуре next(X,Y,L).
? next(2,3,[1,2,3,4]).
ТР: next(2,3,[1,2,3,4]).
Шаг 1: ТЦ: next(2,3,[1,2,3,4]).
Пр1: next(2,3,[1,2|[3,4]]) неуспех (2 не сопоставимо с 1, 3 не сопоставимо с 2)
Пр2: next(2,3,[1|[2,3,4]): next(2,3,[2,3,4]).
ТР: next(2,3,[2,3,4]).
Шаг 2: ТЦ: next(2,3,[2,3|[3,4]).
Пр1: next(2,3,[2,3|L)(4,[2|[3,4]]) успех (2 сопоставимо с 2, 3 сопоставимо с 3)
ТР: .
Переход на шаг 1, Истинность ТЦ на шаге 2 влечет истинность цели на шаге 1 next(2,3,[1,2,3,4]).
Результат вычисления запроса: next(2,3,[1,2,3,4]). успех.
Предикат append.
Предикат append(L1,L2,L3) принимает значение “истина”, если список L3 получается путем приписывания все элементов списка L2 после последнего элемента списка L1, как показано на рисунке 5.1. Схема отношения этого предиката имеет вид:
append(<список>,<список,<список>).
Декларативное описание предиката append формулируется следующим образом:
При присоединении к пустому списку любого списка результирующий список будет идентичен присоединенному списку. Если первый список не пуст, то он разделяется на голову X и хвост T1, а результирующий список L3 =[X|T3] , где Т3 результат присоединения списка L2 к списку Т1.
Процедура append(L1,L2,L3) состоит из двух правил:
append([],L,L).
append([X|T1],L2,[X|T3]):append(T1,L2,T3).
Рассмотрим пример запроса к процедуре append(X,Y,L).
? append([2,3],[1,4],L3).
ТР: append([2,3],[1,4],L3).
Шаг 1: ТЦ: append([2,3],[1,4],L3).
Пр1: [2,3] не сопоставим [] неуспех
Пр2: append([2|[3]],[1,4],[2|T31): append([3],[1,4],T31).
где L3=[2|T31].
ТР: append([3],[1,4],T31).
Шаг 2: ТЦ: append([3],[1,4],T31).
Пр1: [3] не сопоставим [] неуспех
Пр2: append([3|[]],[1,4],[3|T32]): append([],[1,4],T32).
где T31=[3|T32].
Шаг 3: ТЦ: append([],[1,4],T32).
Пр1: [] сопоставим [] успех
Получается подстановка {T32=[1,4]}.
Переход на шаг 2, и конкретизация переменной T31 значением [3|[1,4]] или [3,1,4].
Переход на шаг 1, и конкретизация переменной L3 значением [2|[3,1,4]] или [2,3,1,4].
ТР: .
Результат вычисления запроса: append([2,3],[1,4],L3). успех при подстановке {L3=[2,3,1,4]}.
Предикат add.
Предикат add(X,Y,Z) истинен, если список Z получается добавлением терма Х в начало списка Y. Схема отношения этого предиката имеет вид:
add(<терм>,<список>,<список>).
Декларативное описание предиката add формулируется следующим образом: Терм X является головой списка Z, а список Y хвостом списка Z.
Процедура add(X,Y,Z) состоит из факта:
add(X,Y,[X|Y]).