- •Основные Элементы ТурбоПролога.
- •Структуры Пролога, разделы программы
- •Способы объявления предикатов в программе Пролог
- •Объявление предикатов
- •Утверждения и правила. Факты и правила.
- •Раздел goal
- •Этапы программирвоания на тп
- •Декларативный и процедурный смысл программы
- •Сопоставление
- •Арифметика в тп
- •Арифметические функции в тп
- •Рекурсия
- •Рекурсия и эффективность
- •Стандартные предикаты
- •Стандартные предикаты ввода-вывода
- •Отсечение
- •Отрицание (not)
- •Использование составных объектов
- •Списки. Описание. Голова и хвост списка.
- •Стандартные предикаты для работы со строками Определение длины строки
- •Конкатенация строк
- •Разделение строки на две части
- •Описание файловых доменов
- •Запись в файл
- •Чтение из файла
- •Дозапись в конец существующего файла
- •Создание меню с помощью окон Определение окна
- •Быстрое переключение между двумя окнами
- •Очистка текущего окна
- •Удаление текущего окна
- •Создание динамических баз данных. Статические и динамические базы данных
- •Способы занесения информации в динамическую базу данных
- •Предикаты для работы с базами данных
Арифметические функции в тп
Предикат |
Описание |
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.