- •Государственное образовательное учреждение высшего профессионального образования
- •Арифметические вычисления и сравнения в Прологе
- •1. Цель работы
- •2. Арифметические вычисления и сравнения
- •2.1. Функции и предикаты
- •Для возведения числа в произвольную степень X можно использовать комбинацию функций exp и ln. Например,
- •Тригонометрические функции требуют, чтобы х был величиной, представляющей угол в радианах.
- •2.2. Сравнение
- •3. Предикаты ввода-вывода
- •4. Порядок выполнения работы
- •2.3. Генератор случайных чисел
- •5. Варианты задания
- •6. Контрольные вопросы
- •Литература
- •Содержание
- •Арифметические вычисления и сравнения в Прологе
2.3. Генератор случайных чисел
Для генерации случайных чисел в Visual Prolog предусмотрены два стандартных предиката. Один возвращает случайное вещественное число в диапазоне от 0 до 1, другой возвращает случайное число в диапазоне от 0 до данного числа.
Предикат random/1 возвращает случайное вещественное число RandomReal, удовлетворяющее условию: 0<= RandomReal<1. Формат предиката: random (RandomReal).
Предикат random/2 имеет два аргумента, его формат: random(MaxValaue, RandomInt). Этот предикат ставит в соответствие RandomInt случайное число, удовлетворяющее условию: 0<=RandomInt<MaxValaue. Предикат random/2 работает быстрее, чем random/1, т.к. имеет целочисленную арифметику.
Предикат randominit/1 имеет формат: randominit(Seed). По умолчанию случайное начальное значение генерируется как функция системного времени, а аргумент Seed устанавливает начальное значение. Основное назначение randominit – предоставить повторяемую последовательность псевдослучайных чисел для статистического тестирования.
Целочисленная и вещественная версии random используют одинаковое начальное значение и базовый генератор чисел.
3. Предикаты ввода-вывода
Вывод на экран. Для вывода на экран используется предикат write(). Его синтаксис:
write(список переменных для вывода [управляющие символы]). Переменные разделяются запятыми;
write(“строка для вывода [управляющие символы]”). Управляющие символы – \t, \r, \n и т.д.,
где \t – табуляция;
\r – возврат каретки;
\n – начало новой строки.
Для того чтобы начать вывод в новую строку используется предикат nl – new line.
Пример:
PREDICATES
s(string)
CLAUSES
s("Значение").
GOAL
s(W),
write("\tПрограмма пример\nВторая строка\n"),
write("Ответ =","\t",W), nl,
write("Конец программы"),nl,nl.
После запуска программа выдает следующий результат:
Программа пример
Вторая строка
Ответ = Значение
Конец программы
W=Значение
1 Solution
Последние две строки программа, а точнее утилита Test Goal, выдает автоматически.
Ввод с клавиатуры. Для ввода данных с клавиатуры используются предикаты:
readint(переменная) – ввод одной переменной типа INTEGER;
readreal(переменная) - ввод одной переменной типа REAL;
readchar(переменная) - ввод одной переменной типа CHAR.
Во всех случаях, кроме последнего, ввод необходимо заканчивать нажатием клавиши ENTER.
4. Порядок выполнения работы
1. Составить программу вычисления арифметического выражения.
Варианты заданий приведены в таблице 2.
При создании проекта в окне Application Expert на вкладке Target установить значение UI Strategy в Easywin. После создания проекта необходимо установить требуемые опции компилятора. Для чего открыть пункт меню Options Project ® Compiler Options. В появившемся окне выбрать пункт Nondeterm, снять флажки с пунктов Non Quoted Symbols, Strong Type Conversion Check и Check Type of Predicates.
Структура программы включает разделы предложений, предикатов и целей:
Predicates
/*описываются предикаты (аналоги прототипов функций на С++) с используемыми доменами.*/
result(real, real)
result2(real, real, real, real, real)
Clauses
/*описание правил (аналог описания функций С++). Правило – это конструкция Пролога, которая описывает, что можно логически вывести из других данных. Правило – это свойство или отношение, которое достоверно, когда известно, что ряд других отношений достоверен. Синтаксически эти отношения разделены запятыми.*/
% Например, вычисление суммы 2-х чисел Var1 и Var2
result(Var1, Var2):-
Var=Var1+Var2,
write(Var), nl.
% Вычисление значения выражения A*B/C+D-E
result2(A, B, C, D, E):-
F = A*B/C+D-E,
write(F), nl.
Goal
/* описываются цели. При запуске Пролог автоматически выполняет цель*/
readreal(X) % ввод переменной Х,
result(X, 2),
result2(5, 4, 3, 2, 1).
2. Для каждого задания написать 3 варианта программ:
– с заданием переменных в теле программы;
– с введением данных с клавиатуры;
– с заданием значений переменных с помощью генератора случайных чисел.
3. Используя тригонометрические функции Visual Prolog построить таблицу синусов, косинусов, тангенсов на экране. Левая колонка таблицы должна содержать величину угла в градусах, начиная от 0 до 360 градусов с шагом 60 градусов. Таблица должна иметь название, названия колонок, границы (линии разделяющие колонки и строки). Для формирования границ использовать знаки тире, подчеркивания и вертикальной линии (“–”, “_”, “|”). В результате должно получиться примерно следующее:
Программа пример
--------------------------
| Угол | Sin |
--------------------------
| 60 | 0.8660253949 |
--------------------------
Конец программы
Otvet=0.8660253949
1 Solution
4. Написать программу: В компании из десяти человек выбрать трех, которые побегут за Клинским, чипсами, раками. Определить счастливого обладателя приза BMW.
