- •Глава 1. Введение в пролог
- •1. Декларативные и процедурные языки программирования
- •2. Пролог и логика предикатов. Внешние цели
- •3. Управление программой. Подцели. Механизм сопоставления
- •4. Внутренние подпрограммы унификации
- •Глава 2. Внутренние цели. Механизм возврата
- •1. Структура пролог-программы
- •2. Использование внутренних целей
- •3. Встроенный предикат fail
- •4. Сокращенные варианты внутренних запросов
- •5. Использование в запросах анонимных переменных
- •6. Механизм возврата
- •Глава 3. Типы данных и арифметика Turbo Prolog
- •1. Стандартные типы данных
- •2. Структуры, простые и составные
- •3. Структурные диаграммы
- •4. Использование в запросах анонимных переменных
- •5. Использование альтернативных доменов
- •6. Арифметика в Turbo Prolog
- •Глава 4. Предикат отсечения (!). Программирование альтернатив. Правила повтора
- •1. Повторения и возвраты
- •2. Отсечение (!)
- •3. Программирование альтернатив
- •4. Правило повтора
- •Глава 5. Методы организации рекурсии
- •1. Простая рекурсия
- •2. Метод обобщенного правила рекурсии
- •3. Граничное условие рекурсии. Нисходящая и восходящая рекурсии
- •4. Программа о подсчете числа точек
- •Глава 6. Списки
- •1. Основные понятия
- •2. Списки и турбо-пролог
- •3. Атрибуты списка
- •4. Внутреннее представление списков
- •5. Применение списков в программе
- •6. Метод разделения списка на голову и хвост
- •7. Поиск элемента в списке
- •8. Присоединение списка
- •9. Добавление и удаление элемента
- •10. Подсписок
- •11. Перестановки списка
- •Глава 7. Сортировка списков
- •1. Разделение списка на два
- •2. Сортировка списков методом вставки
- •3. Быстрая сортировка
- •4. Быстрая сортировка_1
- •5. Компоновка данных в список
- •Глава 8. Программирование алгоритмов с возвратом. Представление графов в turbo prolog
- •1. Задача о весах
- •2. Представление графов в turbo prolog
- •3. Поиск пути на неориентированном графе
- •4. Поиск гамильтоновых циклов
- •5. Поиск пути минимальной стоимости
- •Глава 9. Динамическая база данных
- •1. Турбо-пролог и реляционные базы данных
- •2. Описание предикатов динамических бд
- •3. Встроенные предикаты asserta, assertz, retract, retractall, save, consult
- •4. Создание динамической базы данных
- •5. Обсуждение проекта базы данных
- •6. Создание базы данных
- •7. Написание программных модулей
- •Глава 10. Глобальные переменные в turbo prolog
- •1. Модификация базы данных
- •2. Накопление результатов с помощью вынуждаемого возврата
- •3. Подсчет членов парторганизации
- •4. Поиск пути минимальной стоимости от a до z
- •Библиографический список
- •Оглавление
6. Арифметика в Turbo Prolog
Турбо-Пролог располагает двумя числовыми типами доменов: целыми и действительными числами. Четыре основные арифметические операции — это сложение, вычитание, умножение и деление, а также целочисленное деление div нахождение остатка целочисленного деления mod для целых чисел.
Стандартными математическими функциями являются следующие предикаты:
sin, cos, tan, round, trunc, abs.
/* Программа 3.3 ”Числа”. Назначение: */
/* демонстрация реализации арифметики. */
predicates
add(integer,integer)
substruct(integer,integer)
multiply(integer,integer)
divide(integer,integer)
fadd(real,real)
fsubstruct(real,real)
fmultiply(real,real)
fdivide(real,real)
goal
write(" Results"), nl, nl,
add(44,23),
substruct(44,23),
multiply(44,23),
divide(44,23),
fadd(12.65,7.3),
fsubstruct(12.65,7.3),
fmultiply(12.65,7.3),
fdivide(12.65,7.3), nl,
write(" All done, bye!").
clauses
add(X,Y):-
Z = X + Y, write("Sum = ",Z), nl.
substruct(X,Y):
Z = X — Y, write("Diff = ",Z), nl.
multiply(X,Y):-
Z = X * Y, write("Pro = ",Z), nl.
divide(X,Y):-
Z = X / Y, write("Quo = ",Z), nl.
fadd(P,Q):-
R = P + Q, write("Fsum = ",R), nl.
fsubstruct(P,Q):-
R = P — Q, write("Fdiff = ",R), nl.
fmultiply(P,Q):-
R = P * Q, write("Fpro = ",R), nl.
fdivide(P,Q):-
R = P / Q, write("Fquo = ",R), nl.
/* Конец программы */
Отметим, что деление целого числа на целое может дать десятичную дробь. В этом случае все знаки вплоть до десятого являются верными.
Глава 4. Предикат отсечения (!). Программирование альтернатив. Правила повтора
1. Повторения и возвраты
Очень часто в программах необходимо выполнить одну и ту же задачу несколько раз. В программах на Турбо-Прологе повторяющиеся операции обычно выполняются при помощи правил, которые используют либо механизм возвратов, либо рекурсию.
Итеративное правило имеет следующий вид:
iterative_rule :- % правило повторения
<предикаты и правила>,
fail. % неудача
Встроенный предикат fail(неудача) вызывает возврат, поэтому <предикаты и правила> выполняются до тех пор, пока не будут перебраны все способы их повторного согласования.
Рассмотрим задачу о генерации платежной ведомости почасовых выплат кафедры ВТиПМ (пример 4.1).
Пример 4.1.
Предикат базы данных имеет вид:
/* преподаватель(имя, кафедра, почасовая_оплата, часы) */
prep(name, faculty, pay, hours)
Правило для вычисления выплаты несложно:
culc_sum(Pay, Hours, Sum_pay):-
Sum_pay=Pay*Hours.
Задача правила report (выдать отчет о выплатах) заключается в формировании отчета. Оно вызывает правило culc_sum для вычисления выплат, затем предикат write для печати информации о преподавателе, затем fail инициирует возврат к следующему утверждению prep.
/*Программа 4.1 «Платежная ведомость». Назначение:*/
/*демонстрация метода возврата после неудачи */
domains
name, faculty = symbol
pay, hours, sum_pay = real
predicates
prep(name, faculty, pay, hours)
report
culc_sum(pay, hours, sum_pay)
goal
write("Отчет о выплатах "),
nl, report.
clauses
prep("Иванов ", "ОМД",3.50,40.00).
prep("Петров ", "ВТиПМ",4.50,36.00).
prep("Сидоров ", "ВТиПМ",5.00,40.00).
prep("Данилов ", "ПКиСУ",4.50,25.50).
report :-
prep(N, ”ВТиПМ”, P,H),
culc_sum(P,H,S),
write(N,," $", S),nl,
fail.
culc_sum(P,H,S):-
S = P * H.
/* Конец программы */
Упражнение 4.1.
Для программы 4.1 напишите правило генерации списка всех преподавателей, у которых почасовая оплата 5 долларов.