- •Часть 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.
- •Список литературы.
Предикат delete.
Предикат delete(X,L,M) принимает значение “истина”, если список M получается в результате удаления первого вхождения терма Х из списка L. Схема отношения этого предиката имеет вид:
delete(<терм>,<список>,<список>).
Декларативное описание предиката next формулируется следующим образом:
Если X голова списка L, то предикат delete(X,L, M) истинен и M есть хвост списка L.
Если X принадлежит хвосту списка, то предикат delete необходимо применить к хвосту списка L.
Если X не принадлежит списку L, то предикат delete(X,L, M) ложен.
Процедура delete(X,Y,L) состоит из двух правил:
delete(X,[X|B],B):!.
delete(X,[Y|L],[Y|M]): delete(X,L,M).
Рассмотрим пример запроса к процедуре delete(X,Y,L).
? delete(3,[1,2,3,4],M).
ТР: delete(3,[1,2,3,4],M).
Шаг 1: ТЦ: delete(3,[1,2,3,4],M).
Пр1: delete(3,[1|2,3,4]],M) неуспех (3 не сопоставимо с 1)
Пр2: delete(3,[1|[2,3,4]],[1|M1]): delete(3,[2,3,4],M1).
M=[1|M1]
ТР: delete(3,[2,3,4],M1).
Шаг 2: ТЦ: delete(3,[2,3,4],M2).
Пр1: delete(3,[2|[3,4]],M2) неуспех (3 не сопоставимо с 2)
Пр2: delete(3,[2|[3,4]],[2|M2]): delete(3,[3,4],M2).
M1=[2|M2]
ТР: delete(3,[3,4],M2).
Шаг 3: ТЦ: delete(3,[3,4],M2).
Пр1: delete(3,[3|[4]], M2) успех (3 сопоставимо с 3)
при подстановке M2=[4]
Переход на шаг 2, и конкретизация переменной M1 значением [2|[4]] или [2,4].
Переход на шаг 1, и конкретизация переменной M значением [1|[2,4]] или [1,2,4].
ТР: .
Результат вычисления запроса: delete(3,[1,2,3,4],M). успех при подстановке {M=[1,2,4]}.
5.4.10. Предикат number_list.
Предикат number_list(L) определяет, является ли список X списком числовых термов. Схема отношения этого предиката имеет вид:
number_list(<список>).
Декларативное описание предиката number_list(L)формулируется следующим образом:
Список L включает один элемент Х. Тогда предикат number_list([X]) истинен, если X числовой терм.
Список L можно разделить на голову Н и хвост Xs. Тогда L есть список числовых термов, если H числовой терм и хвост списка есть список числовых термов.
Процедура number_list(X,Y) состоит из двух правил:
number_list([]): number(X).
number_list(X,[_|T]): number(X),number_list(X,T). Предикат number(X) стандартный предикат системы Arity Prolog, этот предикат истинен, если Х числовой терм.
Рассмотрим пример запроса к процедуре number_list(Х).
? number_list([1,2,3,4]).
ТР: number_list([1,2,3,4]).
Шаг 1: ТЦ: number_list([1,2,3,4]).
Пр1: [X]=[1,2,3,4] неуспех (списки разной длины)
Пр2: number_list([1|[2,3,4]]): number(1),number_list([2,3,4]).
ТР: number(1),number_list([2,3,4]).
Шаг 2: ТЦ: number(1) успех
ТР: number_list([2,3,4]).
Шаг 3: ТЦ: number_list([2,3,4]).
Пр1: [X]=[2,3,4] неуспех (списки разной длины)
Пр2: number_list([2|[3,4]]): number(2),number_list([3,4]).
ТР: number(2),number_list([2,3,4]).
Шаг 4: ТЦ: number(2) успех
ТР: number_list([3,4]).
Шаг 5: ТЦ: number_list([3,4]).
Пр1: [X]=[3,4] неуспех (списки разной длины)
Пр2: number_list([3|[4]]): number(3),number_list([4]).
ТР: number(3),number_list([4]).
Шаг 6: ТЦ: number(3) успех
ТР: number_list([4]).
Шаг 7: ТЦ: number_list([4]).
Пр1: [X]=[4] успех (списки одинаковой длины) при подстановке {X=4}
ТР: number(4).
Шаг 8: ТЦ: number(4) успех
ТР: успех.
Результат вычисления запроса number_list(3,[1,2,3,4]). успех.
