- •Часть 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.
- •Список литературы.
6.5.2. Ввод/вывод символов.
Для ввода символов (литер), набираемых на клавиатуре, могут использоваться предикаты get(<литера>) и get0(<литера>). Предикат get(X) вводит любую литеру, для которой существует код ASCII, и присваивает ее переменной X. Предикат get0(X) вводит только печатаемые символы, а управляющие символы пропускает X.
Для вывода символов (литер) на экран видеомонитора используется предикат put(<код литеры>). Например, в ответ на запрос
? put(104), put(101), put(108), put(108), put(111).
система выдаст слово hello.
6.6. Стандартные предикаты управления логическим выводом.
Стандартные предикаты fail и cut(!) предназначены для управления процессом логического вывода. Встроенный предикат fail является тождественно ложным предикатом, который включает механизм автоматического возврата. Присутствие этого предиката в правиле вызывает возврат на согласование первой цели в резольвенте.
Предикат fail используется для программирования повторяющихся действий (циклических программ). В общем случае итерационное правило имеет следующий вид:
<заголовок итерационного правила>:<предикаты>,fail.
Рассмотрим пример программы, использующей предикат fail. Пусть программа включает утверждения о столицах различных стран: city(‘Дели’, ’Индия’, ‘Азия’).
city(‘Прага’, ’Чехия’, ‘Европа’ ).
city(‘Лондон’, ’Англия’, ‘Европа’ ).
city(‘Рим’, ’Италия’, ‘Европа’ ).
city(‘Мехико’, ’Мексика’, ‘Америка’ ).
city(‘Пекин’, ’Китай’, ‘Азия’ ).
city(‘Токио’, ’Япония’, ‘Азия’ ). show_cities:city(X,_, ‘Европа’),write(X),nl,fail.
display_cities:write(‘Столицы стран Европы’),nl, show_cities.
На запрос “display_cities.” Прологсистема выдаст следующий ответ: ? display_cities. Столицы стран Европы Прага Лондон Рим no
Предикат отсечения (!) предназначен для запрещения поиска с возвратом. Если существуют два или более взаимоисключающих правила для одного и того же отношения, т. е. при любом запросе успех возможен только в одном из правил, то при успешном согласовании некоторого из правил нет необходимости проверять остальные правила, согласование которых будет заведомо неуспешно.
Допустим, надо написать программу, определяющую значение функции Y по формуле:
В алгоритмических языках в этом случае используется оператор ifthenelse, блоксхема которого показана на рис. 6.2
На языке Пролог в этом случае будет процедура из двух правил: ps(X,Y):p(X),Y is f1(X). ps(X,Y): not(p(X)),Y is f2(X).
Поскольку выше указанные правила взаимно исключают друг друга, используя предикат отсечения процедуру можно представить в следующем виде:
ps(X,Y):p(X),!,Y is f1(X). ps(X,Y): Y is f2(X).
Таким образом, во втором правиле проверка условия “not(p(X))” не нужна.
Рассмотрим другой пример. Пусть требуется вычислить значение функции Y в зависимости от условия:
В этом случае программа будет содержать три правила: ps(X,Y):X=<0,!,Y is 2*X+1. ps(X,Y):X=<2,!,Y is X^2. ps(X,Y): Y is 0.
Использование предиката отсечения «!» сокращает запись правил в Прологе и ограничивает перебор вариантов, в этом случае процедура вычисления запроса выполняется эффективнее.
Кроме предикатов управления логическим выводом fail и cut, в системе Arity Prolog существуют стандартные предикаты true, repeat и not, not(p) отрицание предиката p. Если p истина, то not(p) ложь, и наоборот. Предикат repeat истинен всегда. При бэктрекинге этот предикат вызывает повторное выполнение всех следующих за ним целей. Предикат true тождественно истинный предикат.