Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Подготовка к PROLOG.doc
Скачиваний:
1
Добавлен:
27.09.2019
Размер:
154.11 Кб
Скачать

Арифметические функции в тп

Предикат

Описание

bitand (X, Y, Z)

X, Y, Z – целые 16-чные числа

bitor (X, Y, Z)

X, Y – числа над которыми выполняются побитовые операции

bitxor (X, Y, Z)

Z – результат

bitnot (X, Z)

bitleft (X, N, Z)

bitright(X, N, Z)

Сдвиг на N разрядов

X mod Y

Остаток от деления

X div Y

Частное от деления

abs (X)

Модуль X

cos (X)

В радианах

sin (X)

tan (X)

arctan (X), exp (X), ln (X), log (X), sqrt (X), random (X)

Рекурсия

Мощным средством программирования в ТП является рекурсия. Р – определение некоторого отношения через самого себя. Так как в ТП отсутствуют операторы цикла, то Р. служит основным средством программирования циклических процессов.

Пример 1.

предок (X, Z):- родитель (X, Y).

предок (X, Z):- родитель (X, Y), предок (Y, Z).

Пример 2. Вычисление факториала.

domains

n, f = real

predicates

factorial (n ,f)

clauses

factorial (1, 1).

factorial (N, F):- N>0, N1=N-1, factorial (N1, F1), F=F1*N.

Программа демонстрирует другой метод вычисления факториала. Здесь рекурсивный метод заменнен на итеративный. При итеративном вычислении нет обратного хода.

predicates

factorial (integer, real)

factorial_oux (integer, real, integer, real)

clauses

factorial (N, F):- factorial_oux (N, F, 1, 1).

factorial_oux (N, F, I, P):- I<=N, NewI=I+1, NewP=P*I,

factorial_oux (N, F, NewI, NewP).

factorial_oux (N, F, I, F):- I>N.

Рекурсия и эффективность

Вычисление ряда Фибоначчи.

fib (0, 0).

fib (1, 1).

fib (N, X):- N1=N-1, N2=N-2, fib (N1, X1), fib (N2, X2), X=X1+X2.

Более эффективный вариант.

fib1 (0, _, 0).

fib1 (1, 0, 1).

fib1 (N, F1, F2):- N1=N-1, fib1 (N1, F0, F1), F2=F0-F1.

Стандартные предикаты

ТП имеет большой набор встроенных предикатов. Большинство стандартных предикатов выполняют несколько функций в зависимости от ссотояния параметров вхлдящих в предикат. К моменту обращения к предикату каждый отдельный его параметр может быть опредеелн или неопределен. Известные параметры предиката – входные (i), неизвестные – выходные (o). Совокупность входных и выходных параметров определяет работу предиката и называется поточным шаблоном. Не для каждого варианта все возможные варианты поточного шаблона имеют смысл.

Стандартные предикаты ввода-вывода

Служат для организации взаимодейтсвия программы с пользователем.

write (l1, l2, … ) ((i)*)

Запись заданных констант или значений переменных l1, l2, … в активное окно на текстовом устройстве вывода. Аргументы могут быть как константами так и перменными, связанными со значениями стандартных типов данных.

write f (формат, a1, a2, …) (i, (i)*)

Осуществляетяс форматный вывод. Общий вид формата %-m.p,

где % - начальный символ, - – указывает выравнивание по левой границе, по умолчанию – по правой границе, m – минимальная ширина поля вывода (необязательно), p – точность выводимых чисел.

readln (строка) (string) : (o)

Читает строку с текстового устройства ввода и связывает ее с заданной переменной. Конец строки – ввод. Переменная может быть символьного типа.

readint (целочисленная переменная) (integer) : (o)

Читает целое число и связывает его с заданой перменной. Переменная не должна быть определена до вызова предиката.

readreal (вещественная переменная) (real) : (o)

readchar (символьная переменная) (char) : (o)

inkey (символ) (char) : (o)

Читает символ, в отличии от readchar выполнение программы не прерывается. Поэтому применяется для организации циклов ожидания. Предикат inkey не выполняется, если не введен ни один символ.

/* Вычисление факториала */

domains

n, f=real

predicates

factorial (n, f)

result

clauses

factorial (1, 1).

factorial (N, F):-N=0, N1=N-1, factorial (N1, F1), F=F1*N.

result:-write (“Введите N”), nl, write (“N=”),

readreal (N), N=0, factorial (N, F), write (N,”!”,F), result.

goal

write (“Выход из программы при N<=0”), nl, nl, result.