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/0

Формат предиката:

random : () ->uReal RandomReal

Предикат random возвращает случайное вещественное число RandomReal, которое удовлетворяет условию:

0 <= RandomReal < 1.

Пример использования:

X = math::random().

Предикат random/1

Формат предиката:

random : (unsgned MaxValue) ->unsgned RandomInt

Данный предикат генерирует псевдослучайное беззнаковое число RandomInt принадлежащее промежутку 0 <= RandomInt < MaxValue.

Предикат random/2 

Данный предикат 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:(integersymbol)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,NewCountCount-1,rnd_person(NewCount).

clauses 

run():-

console::init(),

rnd_person(3). %Цель – вывести на экран три случайно выбранных имени 

end implement main
goal

mainExe::run(main::run).