VIP имеет полный набор встроенных математических функций и предикатов, которые используют целые и вещественные значения. Полный их список приведен в табл. 8.
Таблица 8. Арифметические предикаты и функции Visual Prolog
Имя |
Описание |
X mod Y |
Возвращает остаток от деления (модуль) X на Y |
X div Y |
Возвращает частное от деления х на Y |
abs (X) |
Если значение X— положительная величина value, abs(X) возвращает это значение; в противном случае — (-1)* value |
cos(X) |
Возвращает косинус своего аргумента |
sin(X) |
Возвращает синус своего аргумента |
tan(X) |
Возвращает тангенс своего аргумента |
arctan(X) |
Возвращает арктангенс вещественного значения, с которым связан X |
exp(X) |
Возводит е в степень X |
ln(X) |
Логарифм X по основанию е |
log(X) |
Логарифм X по основанию 10 |
sqrt (X) |
Корень квадратный из X |
random (X) |
Присваивает X случайное вещественное число; 0 <= X < 1 |
random(X, Y) |
Присваивает Y случайное целое число; 0 <= Y < X |
round (X) |
Возвращает ближайшее целое число(округление в большую сторону) |
trunc(X) |
Возвращает ближайшее к 0 целое число(округление в меньшую сторону) |
Замечание: Для тригонометрических функций значение аргумента X задается в радианах.
Генерации случайных чисел в Visual Prolog выполняется с помощью двух стандартных предикатов random/0,random/1 и random/2. Один из них возвращает случайное вещественное число в диапазоне от 0 до 1, другой возвращает случайное целое число в диапазоне от 0 до заданного числа. Кроме того, случайная числовая последовательность может быть переинициализирована. Рассматриваемые предикаты находятся в классе math, следовательно, обращение в программе к ним осуществляется через оператор '::'.
Формат предиката:
random : () ->uReal RandomReal
Предикат random возвращает случайное вещественное число RandomReal, которое удовлетворяет условию:
0 <= RandomReal < 1.
Пример использования:
X = math::random().
Предикат random/1
Формат предиката:
random : (unsgned MaxValue) ->unsgned RandomInt
Данный предикат генерирует псевдослучайное беззнаковое число RandomInt принадлежащее промежутку 0 <= RandomInt < MaxValue.
Данный предикат random имеет два аргумента, его формат:
random : ( integer MaxValue, integer RandomInt). %(i,o)
Этот предикат назначает Randomlnt случайное целое значение, удовлетворяющее условию: 0 <= Randomlnt < MaxValue.
Замечание:
Предикат random/2 работает значительно быстрее, чем random/1,этот факт связан с тем, что random/2 использует только целочисленную арифметику.
Предикат randominit/1
Предикат randominit инициализирует генератор случайных чисел и имеет формат:
randomInit : (integer Seed) % (i)
По умолчанию случайное начальное значение генерируется как функция системного времени, и аргумент Seed предиката randominit устанавливает начальное значение. Основное назначение randominit – предоставить повторяемую последовательность псевдослучайных чисел для статистического тестирования.
В качестве примера приведем программу, которая использует random/1 для выбора трех имен из пяти случайным образом. Для этого определим три предиката
1. person/2 – задает порядковый номер и имя персоны;
2. rnd_num_1_5/1 – осуществляет случайный выбор порядкового номера от 1 до 5;
3. rnd_person – осуществляет вывод имени выбранной персоны;
implement main
open core,stdio
class predicates
person:(integer, symbol)determ(i,o).
rnd_num_1_5:(integer) procedure (o).
rnd_person:(integer)determ(i).
clauses
person(1,"Fred").
person(2,"Tony").
person(3,"Mary").
person(4,"Dick").
person(5,"George").
rnd_num_1_5(X):- Y=math::random(4),X=Y+1.
rnd_person(0):-!.
rnd_person(Count):- rnd_num_1_5(N),person(N,Name),
write(Name), nl,NewCount = Count-1,rnd_person(NewCount).
clauses
run():-
console::init(),
rnd_person(3). %Цель – вывести на экран три случайно выбранных имени
end implement main
goal
mainExe::run(main::run).