- •Часть 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.6.3. Метод перестановок.
Алгоритм сортировки списка путем перестановки элементов заключается в следующем: для того, чтобы упорядочить непустой список L = [X|T], необходимо:
найти в списке L два смежных элемента X и Y, таких что X>Y,и поменять X и Y местами, получив таким образом новый список L1, затем рекурсивно применить эту процедуру к списку L1;
если в списке L нет ни одной пары смежных элементов X и Y, таких что X>Y, то список L упорядочен.
Процедура sort_p использует процедуру perest, которая переставляет два смежных элемента в порядке возрастания (или убывания).
Предикат perest(L1,L2) истинен, если список L2 получается из упорядоченного списка L1 путем перестановки. Схема отношения этого предиката имеет вид:
perest(<список>, <список>).
В процедуре perest сравниваются числовые термы с помощью операций сравнения чисел >, <, >=, =< или символьные термы с помощью операций сравнения символов (@>, @<, @>=,@=<.
Предикат sort_p(L1,LS) истинен, если список LS получен из списка L1 путем упорядочения списка L1 по возрастанию методом перестановки элементов. Списки L1 и LS являются списками числовых термов.
Процедура sort_p(L1,LS) состоит из следующих правил:
sort_p(L,OL): perest(L,L1),!,sort_p(L1,OL).
sort_p(OL,OL).
perest([X,Y|T],[Y,X|T]): X>Y.
perest([Z|T],[Z|T1]): perest(T,T1).
6. Стандартные предикаты языка Пролог.
Арифметические предикаты.
Пролог рассчитан, главным образом, на обработку символьной информации, при этом потребность в арифметических вычислениях относительно мала. Поэтому и средства для таких вычислений весьма просты. Для выполнения основных арифметических действий можно воспользоваться несколькими предопределенными операторами:
X+Y сложение,
X-Y вычитание,
X*Y умножение,
X/Y деление,
X//Y целочисленное деление ,
X^Y возведение в степень,
X/\Y побитовая конъюнкция (для целых чисел),
X\/Y побитовая дизъюнкция (для целых чисел),
X<<Y побитовый сдвиг влево на Y позиций (для целых чисел),
X>>Y побитовый сдвиг вправо на Y позиций(для целых чисел),
X mod Y остатот от деления X на Y(для целых чисел),
abs(X) абсолютная величина X,
acos(X) арккосинус X,
asin(X) арксинус X,
atan(X) арктангенс X,
cos(X) косинус X,
sin(X) синус X,
exp(X) экспонента X,
ln(X) натуральный логарифм X,
log(X) логарифм по основанию 10,
sqrt(X) квадратный корень X,
tan(X) тангенс X,
round(X,N) округление X до N десятичных знаков (0≤N≤15).
Арифметические термы (выражения) строятся из атомов и переменных с помощью арифметических операций. Допускается инфиксная и префиксная записи арифметический выражений. Арифметические термы без переменных являются константами.
6.2. Предикаты сравнения арифметических выражений и символьных термов.
Рассмотрим встроенные арифметические предикаты для унификации арифметических выражений. Пусть E1 и E2 ─ арифметические выражения. В Прологе существуют следующие встроенные предикаты для сравнения арифметических выражений:
E1>E2 истинно, если Е1 больше Е2,
E1<E2 истинно, если Е1 меньше Е2,
E1>=E2 истинно, если Е1 больше или равно Е2,
E1=<E2 истинно, если Е1 равно или меньше Е2,
E1=:=E2 истинно, если Е1 равно Е2,
E1=\=E2 истинно, если Е1 равно Е2,
E1=E2 истинно, если Е1 и Е2 сопоставимы,
E1\=E2 истинно, если Е1 и Е2 несопоставимы,
X is E истинно всегда, и неконкретизированной переменной присваивается значение Е.
Пусть E1 и E2 ─ символьные термы. Для сравнения символьных термов используются другие встроенные предикаты:
E1@>E2 истинно, если терм Е1 больше терма Е2,
E1@<E2 истинно, если терм Е1 меньше терма Е2,
E1@>=E2 истинно, если терм Е1 больше или равен терму Е2,
E1@=<E2 истинно, если терм Е1 равен или меньше терма Е2.
Символьные термы упорядочены в алфавитном порядке; терм r больше терма a.
Рассмотрим отличительные особенности перечисленных выше предикатов на примерах.
Пример 1.
Оператор унификации “=” Оператор “is”
? – X=1+2. ? – X is 1+2.
X=1+2 -> X=3 ->
YES YES
В случае унификации сопоставляются переменная Х составной терм 1+2, и устанавливается, что Х сопоставима с 1+2 при подстановке {X=1+2}.
Оператор is заставляет систему вычислить значение выражения справа от обозначения оператора, и это значение сопоставить с переменной X.
Пример 2.
? – X is 3/2,Y is 3//2.
X=1.5 ->
Y=1 ->
YES
Различие между операторами унификации “=” и арифметического сравнения “=:=” состоит в том, что при выполнении оператора “=” система не производит вычислений, а оператор “=:=” производит вычисление выражений и сравнение и значений.
Пример 3.
Оператор унификации “=” Оператор сравнения “=:=”
? – 1+2=2+1. ? – 1+2 =:= 2+1.
NO YES
