Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основы программирования на языке Turbo Prolog.doc
Скачиваний:
23
Добавлен:
09.11.2019
Размер:
563.2 Кб
Скачать

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 долларов.