
- •Часть 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.3. Предикаты определения типов термов.
Программист может предотвратить ошибки Пролога, проверив тип аргумента предиката с помощью следующих встроенных в Пролог-систему предикатов:
integer(X) истинно, если X—целое число;
float(X) истинно, если X—вещественное число;
number(X) истинно, если X— целое или вещественное число;
atom(X) истинно, если X—атом;
atomic(X) истинно, если X—атом или число;
compound(X) истинно, если X—составной атом (структура);
novar(X) истинно, если X—константа;
var(X) истинно, если X—переменная.
string(X) истинно, если X—строка.
6.4. Примеры программ с использованием арифметических предикатов.
Пример 1.
Программа определяет, попадает ли точка с координатами (X,Y) в область D, которая задана графически (рис. 6.1).
Программа 1.
in_area(X,Y):- number(X), number(Y),(X^2+Y^2)=<4.
out_area(X,Y):- number(X), number(Y),(X^2+Y^2)>4.
otvet(X,Y):-in_area(X,Y),write(‘заданная точка принадлежит области D’).
otvet(X,Y):-out_area(X,Y),write(‘заданная точка не принадлежит области D’).
Пример запроса к программе 1.
? — otvet(0.3,-0.1).
заданная точка принадлежит области D
YES
Пример 2.
Программа определяет значение функции y в зависимости от условия по следующим формулам:
Программа 2.
variant1(A,B):- number(A), number(B),A>0,B<0.
variant2(A,B):- number(A), number(B),A>0,B>=0.
variant3(A,B):- number(A), number(B),A=<0.
calc_Y(A,B):- variant1(A,B),Y is A*B^2,write(‘Y= ‘),write(Y).
calc_Y(A,B):- variant2(A,B),Y is A^3,write(‘Y= ‘),write(Y).
calc_Y(A,B):- variant3(A,B),Y is 0,write(‘Y= ‘),write(Y).
Пример запроса к программе 2.
? — calc_Y(0.3,-0.1).
Y=0.003
YES
6.5. Предикаты вводавывода термов и символов.
Предопределенные предикаты стандартного ввода/вывода являются внелогическими, так как выходят за рамки модели логического программирования. Такие предикаты в процессе вычисления запросов порождают побочный эффект. Любой язык программирования должен обеспечивать средства ввода/вывода информации. Однако вычислительная модель Пролога препятствует введению операций ввода/вывода в виде чистых компонентов языка.
В системах программирования на языке Пролог используются предопределенные предикаты для ввода/вывода термов и символов.
6.5.1. Ввод/вывод термов.
Для ввода термов со стандартного устройства ввода ПЭВМ (клавиатуры) используется предикат read(<терм>). Предикат read читает терм, набираемый пользователем на клавиатуре; после вводимого терма должна обязательно следовать точка. Если переменная не конкретизирована, то запрос:
?read(X).
приведет к вводу терма с клавиатуры, и этот терм будет присвоен в качестве значения переменной X.
Для вывода термов на стандартное устройство вывода ПЭВМ (экран видеомонитора) используется предикат write(<терм>). Предикат write выводит терм на экран. В качестве термов могут выдавать на экран константы, значения конкретизированных переменных и составные термы. Если переменная не конкретизирована, то вместо ее значения будет выдано соответствующее переменной ссылочное число.
Предикат nl используется для перехода на новую строку при выдаче данных на экран. Предикат tab(N) используется для выдачи на экран N пробелов. Предикаты nl и tab применяются только совместно с предикатов write.
Примеры программ, использующих предикаты ввода/вывода.
Пример 1. Программа ввода элементов списка заданной длины.
vvlist : write(‘задайте длину списка’), read(N), vvodlist(N,L),
write(‘L= ’), write(L).
vvodlist(0,[]).
vvodlist(N,L) : N>0,write(‘введите элемент списка: ‘), read(X),
N1 is N-1, vvodlist(N1,L1), append(L1,[X],L).
append([],L,L).
append([H|L],M,[H|R]): append(L,M,R).
В ответ на запрос
? vvlist.
система выдаст на экран следующие сообщения:
задайте длину списка
3.
введите элемент списка: a.
введите элемент списка: b.
введите элемент списка: c.
L=[a,b,c]
Пример 2. Программа pech_list выдает на экран длину списка.
pech_list(L) : length(L,N), write(‘Длина списка ‘),
write(L), write(‘=’) , write(N) , write(‘.’).
В ответ на запрос
? pech_list([a,b,c,d]).
система выдаст на экран строку:
Длина списка [a,b,c,d]=4.
Для выдачи на экран списка можно использовать стандартный предикат write(<список>) или написанную пользователем рекурсивную процедуру выдачи на экран элементов списка.
Предикат writelist (X) выдает на экран элементы списка X. Схема отношения этого предиката имеет вид:
writelist(<список>).
Процедура writelist(X) состоит из двух правил:
writelist(X): length(X,N), N=:=0,!, write(‘Список пуст’).
writelist(X): wrl(X).
wrl([]):nl,write(‘Конец списка’).
wrl([H|T]): write(H),write(‘ ‘),wrl(T).