- •Часть 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.
- •Список литературы.
5.2 Схема поиска решений в рекурсивных программах.
Для представления формализованной схемы поиска решений будут использоваться следующие обозначения: 1) ТР текущая резольвента. Первой ТР является исходный вопрос. Каждая следующая резольвента ТР получается путем редукции, т. е. замены самой левой цели в предыдущей резольвенте на тело правила, заголовок которого сопоставим с целью, или путем удаления цели. Если цель сопоставима с фактом, и в том и другом случае вырабатывается подстановка и применяется ко всей ТР. 2) Шаг № шаг вычисления. Шагом вычислений будем считать действия, выполняемые после определения ТР и заканчивающиеся построением новой ТР или выводом об успехе/неудаче. 3) ТЦ текущая цель. Текущая цель это цель, подлежащая согласованию на данном шаге. 4) Пр № правило, применимое для редукции на определенном шаге. 5) Успех вывод об успешном вычислении вопроса. Неудача вывод о неуспешном вычислении вопроса. 6) Откат, Возврат. Отказ это отказ пользователя от выданного успешного ответа на вопрос, механизм возврата включается принудительно. Возврат это тупиковая ситуация во время вычисления вопроса, механизм возврата включается автоматически. 7) Так как при рекурсивном обращении к правилу создаются новые экземпляры переменных, будем на каждом шаге добавлять к именам переменных индекс в виде номера шага.
Рассмотрим пример классической рекурсивной процедуры вычисления факториала; эта процедура включает два правила:
fact(1,1).
fact(N,Res):N>1,N1 is N-1,fact(N1,Res1 is N*Res1.
Схема вычисления запроса
? fact(3, Res).
имеет следующий вид:
ТР: fact(3,Res).
Шаг 1: ТЦ: fact(3,Res).
Пр1: 3=1no
Пр2: 3>1,N11 is 3-1, fact(N11,Res11),Res is Res11*3. ТР: fact(2,Res11), Res is Res11*3. Шаг 2: ТЦ: fact(2,Res11).
Пр1: 2=1no
Пр2: 2>1,N12 is 2-1, fact(N12,Res12),Res11 is Res12*2. ТР: fact(1,Res12), Res11 is Res12*2 ,Res is Res11*3. Шаг 3: ТЦ: fact(1,Res12).
Пр1: 1=1yes
{Res12=1}
ТР: Res11 is Res12*2 ,Res is Res11*3.
Шаг 4: ТЦ: Res11 is 1*2.
{Res11=2}
ТР: Res is 2*3. Шаг 5: ТЦ: Res is Res11*3.
{Res=6}
ТР: (пустая резольвента)
{Res=6}
Успех
5.3. Списки и их представление на Прологе.
Основные определения.
В языках, предназначенных для программирования задач искусственного интеллекта, важную роль играют динамические структуры данных, называемые списками. Главное достоинство списков состоит в том, что при их обработке операции вставки, замены и удаления элементов выполняются весьма просто. Списки структуры данных с последовательным доступом, и поэтому основным средством их обработки является рекурсия.
Список в языке Пролог представляет собой заключенную в квадратные скобки [] последовательность термов, разделенных запятыми: [<терм1>,<терм2>,…<термn>]. Список это составной терм или структура, главный функтор которой обозначается символом «.» (точка).
Структура Список может быть представлена в виде так называемой точечной пары (H,T), где Н первый элемент списка, называемый головой списка, а Т все остальные элементы списка, называемые хвостом списка. Голова списка является термом, а хвост списком.
В языке Пролог список, разделенный на головы и хвост, обозначается следующим образом: [H|T], например [a|[d,b,k,l]]. Возможность разделения списка на голову и хвост играет важную роль в программировании рекурсивных процедур обработки списков.
Число элементов в списке называется длиной списка. Длина списка может динамически изменяться в процессе выполнения запроса. Список, не имеющий ни одного элемента, обозначается [] и называется пустым списком. Длина пустого списка равно нулю. Пустой список нельзя разделить на голову и хвост.
Голова и хвост списка могут быть заполнены константами, числами или символьными термами, например [1|[6,8,12,9]] или [a|[r,t,y,u]].
Голова и хвост списка могут быть переменными, например, [H|LT], здесь Нтерм, а LTпеременная, имеющая значение списка.
Переменные в Прологе не типизированы, и поэтому в процессе доказательства вопроса они могут конкретизироваться значениями любого типа. Естественно, что интерпретатор не контролирует соблюдение типов аргументов предикатов, это должен делать программист.
