
- •Часть 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.4.11. Предикат sumlist.
Предикат sumlist(L,Sum) определяет сумму элементов числового списка. Схема отношения этого предиката имеет вид:
sumlist(<список>,<целочисленный терм>).
Декларативное описание предиката sumlist формулируется следующим образом:
Сумма элементов пустого списка равна нулю.
Если исходный список состоит L из головы Н и хвоста Т, то сумма элементов списка L равна сумме элементов хвоста списка T плюс Н.
Процедура sumlist(L,Sum) состоит из двух правил:
sumlist([],0).
sumlist([H|T],Sum): sumlist(T,SumT),Sum is SumT+H.
Рассмотрим пример запроса к процедуре sumlist.
? sumlist([1,2,3,4],S).
ТР: sumlist([1,2,3,4],S).
Шаг 1: ТЦ: sumlist([1,2,3,4],S).
Пр1: [1,2,3,4]=[] неуспех (списки разной длины)
Пр2: sumlist([1|[2,3,4]],S): sumlist([2,3,4],ST1), S is ST1+1.
ТР: sumlist([2,3,4],ST1),S is ST1+1.
Шаг 2: ТЦ: sumlist([2,3,4]).
Пр1: [2,3,4]=[] неуспех (списки разной длины)
Пр2: sumlist([2|[3,4]],ST1): sumlist([3,4],ST2),ST1 is ST2+2.
ТР: sumlist([3,4],ST2),ST1 is ST2+2, S is ST1+1.
Шаг 3: ТЦ: sumlist([3,4],ST2).
Пр1: [3,4]=[] неуспех (списки разной длины)
Пр2: sumlist([3|[4]],ST2): sumlist([4],ST3) ,ST2 is ST3+3.
ТР: sumlist([4],ST3),ST2 is ST3+3,ST1 is ST2+2, S is ST1+1.
Шаг 4: ТЦ: sumlist([4],ST3).
Пр1: [4]=[] неуспех (списки разной длины)
Пр2: sumlist([4|[]],ST4): sumlist([],ST4) ,ST3 is ST4+4.
ТР: sumlist([],ST4),ST3 is ST4+4,ST2 is ST3+3,ST1 is ST2+2,
S is ST1+1.
Шаг 5: ТЦ: sumlist([],ST4).
Пр1: []=[] успех при подстановке {ST4=0}
ТР: ST3 is 0+4,ST2 is ST3+2,ST1 is ST2+2, S is ST1+1.
Шаг 6: ТЦ: ST3 is 0+4. успех при подстановке {ST3=4}
ТР: ST2 is 4+3,ST1 is ST2+2, S is ST1+1.
Шаг 7: ТЦ: ST2 is 4+3. успех при подстановке {ST2=7}
ТР: ST1 is 7+2, S is ST1+1.
Шаг 8: ТЦ: ST1 is 7+2. успех при подстановке {ST1=9}
ТР: S is 9+1.
Шаг 8: ТЦ: S is 9+1. успех при подстановке {S=10}
ТР: успех.
Результат вычисления запроса sumlist([1,2,3,4],S). успех при подстановке {S=10}.
5.4.12. Предикат delrepeat.
Предикат delrepeat (L,LS) истинен, если список получается из списка S путем удаления всех повторений элементов. Схема отношения этого предиката имеет вид:
delrepeat(<список>,<список>).
Удаление повторений элементов выполняется процедурой delrepeat с накоплением списка, состоящей из четырех предложений и содержит дополнительный предикат delrep:
delrepeat(S,SF):-delrep(S,[],SF).
delrep([],S,S).
delrep([H|T],S1,SF):-member(H,T),!,delrep(T,S1,SF).
delrep([H|T],S1,SF):-append(S1,[H],S2),delrep(T,S2,SF).
Декларативное описание предиката delrep формулируется следующим образом:
если первый аргумент есть пустой список, то второй и третий аргументы представляют собой один и тот же список;
если первый аргумент непустой список [H|Хs], и голова Н принадлежит хвосту списка T, то процедура delrep рекурсивно вызывается с аргументами T и S1; при этом элемент H не включается в накапливающийся список S1;
если первый аргумент непустой список [H|Хs], и голова Н не принадлежит хвосту списка T, то элемент H включается в накапливающийся список S1 и получается список S2. Затем процедура delrep рекурсивно вызывается с аргументами T и S2.
Процедура delrepeat выполняется следующим образом:
? delrepeat ([1,1,2,3,2,4,3],S).
ТР: delrepeat ([1,1,2,3,2,4,3],S).
Шаг 1: ТЦ: delrepeat ([1,1,2,3,2,4,3],S).
Пр1: delrepeat ([1,1,2,3,2,4,3],S): delrep([1,1,2,3,2,4,3],[],S). успех
ТР: delrep([1,1,2,3,2,4,3],[],S).
Шаг 2: ТЦ: delrep([1,1,2,3,2,4,3],[],S)
Пр2: [1,1,2,3,2,4,3] не сопоставим [] неуспех
Пр3:
delrep([1|[1,2,3,2,4,3]],[],S):member(1,[1,2,3,2,4,3]),delrep([1,2,3,2,4,3],[],S).
ТР: member(1,[1,2,3,2,4,3]),delrep([1,2,3,2,4,3],[],S).
Шаг 3: ТЦ: member(1,[1,2,3,2,4,3]). успех1
ТР: delrep([1,2,3,2,4,3],[],S).
Шаг 4: ТЦ: delrep([1,2,3,2,4,3],[],S).
Пр2: [1,2,3,2,4,3] не сопоставим [] неуспех
Пр3:
delrep([1|[2,3,2,4,3]],[],S):member(1,[2,3,2,4,3]),delrep([2,3,2,4,3],[],S).
ТР: member(1,[2,3,2,4,3]),delrep([2,3,2,4,3],[],S).
Шаг 5: ТЦ: member(1,[2,3,2,4,3]). неуспех
Возврат.
Пр4:
delrep([1|[2,3,2,4,3]],[],S):append([],[1],S2]),delrep([2,3,2,4,3],S2,S).
ТР: append([],[1],S2]),delrep([2,3,2,4,3],S2,S).
Шаг 6: ТЦ: append([],[1],S2]). успех2
S2=[1]
ТР: delrep([2,3,2,4,3],[1],S).
Шаг 7: ТЦ: delrep([2,3,2,4,3],[1],S)
Пр2: [2,3,2,4,3] не сопоставим [] неуспех
Пр3:
delrep([2|[3,2,4,3]],[],S):member(2,[3,2,4,3]),delrep([3,2,4,3],[1],S).
ТР: member(2,[3,2,4,3]),delrep([3,2,4,3],[1],S).
Шаг 8: ТЦ: member(2,[3,2,4,3]). успех
ТР: delrep([3,2,4,3],[1],S).
Шаг 9: ТЦ: delrep([3,2,4,3],[1],S).
Пр2: [3,2,4,3] не сопоставим [] неуспех
Пр3:
delrep([3|[2,4,3]],[1],S):member(3,[2,4,3]),delrep(2,4,3],[1],S).
ТР: member(3,[2,4,3]),delrep([2,4,3],[1],S).
Шаг 10: ТЦ: member(3,[2,4,3]). успех
Шаг 11: ТЦ: delrep([2,4,3],[1],S).
Пр2: [2,3,2,4,3] не сопоставим [] неуспех
Пр3:
delrep([2|[4,3]],[],S):member(2,[4,3]),delrep([4,3],[1],S).
ТР: member(2,[4,3]),delrep([3,2,4,3],[1],S).
Шаг 12: ТЦ: member(2,[4,3]). неуспех
Возврат.
Пр4:
delrep([2|[4,3]],[],S):append([1],[2],S2]),delrep([4,3],S2,S).
ТР: append([1],[2],S2]),delrep([4,3],S2,S).
Шаг 13: ТЦ: append([1],[2],S2]). успех
S2=[1,2]
ТР: delrep([4,3],[1,2],S).
Пр2: [4,3] не сопоставим [] неуспех
Пр3:
delrep([4|[3]],[1,2],S):member(4,[3]),delrep([3],[1,2],S).
ТР: member(4,[3]),delrep([3],[1,2],S).
Шаг 14: ТЦ: member(2,[4,3]). неуспех
Возврат.
Пр4:
delrep([4|[3]],[],S):append([1,2],[4],S2]),delrep([3],S2,S).
Шаг 15: ТЦ: append([1,2],[4],S2]). успех
S2=[1,2,4]
ТР: delrep([3],[1,2,4],S).
Пр2: [3] не сопоставим [] неуспех
Пр3:
delrep([3|[]],[1,2,4],S):member(3,[]),delrep([],[1,2,4],S).
ТР: member(3,[]),delrep([],[1,2],S).
Шаг 16: ТЦ: member(3,[]). неуспех
Возврат.
Пр4:
delrep([3|[]],[1,2,4],S):append([1,2,4],[3],S2]),delrep([],S2,S).
Шаг 17:ТЦ: append([1,2,4],[3],S2]). успех
S2=[1,2,4,3]
ТР: delrep([],[1,2,4,3],S).
Шаг 18: ТЦ: delrep([],[1,2,4,3],S).
Пр2: [] сопоставим [] успех
Получается подстановка {S=[1,2,4,3]}
ТР: .
Результат вычисления запроса: delrepeat ([1,1,2,3,2,4,3],S). успех при подстановке {S=[1,2,4,3]}