Практическая информатика




Примеры программ - часть 2


Воспользуемся теоремой Пифагора и встроенной функцией sqrt для вычисления квадратного корня:

гипотенуза(X,Y,Z):- Z is sqrt(X**2 + Y**2).

Программа корректно вычисляет гипотенузу, но если мы попробуем при ее помощи найти один из катетов, то убедимся, что процедура работает не вполне правильно. Чтобы избежать этого добавим проверку того, что первые два аргумента предиката - положительные числа, для чего используем встроенный предикат number/1 и сравнение с нулем:

гипотенуза(X,Y,Z):- number(X), X>0, number(Y), Y>0, Z is sqrt(X**2 + Y**2).

?- гипотенуза(3,4,X). X = 5 Yes

?- гипотенуза(3,'a',X). No

?- гипотенуза(3,X,5). No

Пример

Напишите предикат, который по двум парам чисел - длинам катетов прямоугольных треугольников - определяет величину меньшей из гипотенуз.

Воспользуемся процедурой гипотенуза/3, разобранной выше, и встроенной функцией min/2:

мин_гип(A1,B1,A2,B2,Min):- гипотенуза(A1,B1,C1), гипотенуза(A2,B2,C2), Min is min(C1,C2).

Запросы к интерпретатору Пролога могут выглядеть так:

?- мин_гип(3,4,8,6,X). X = 5 Yes

?- мин_гип(3,4,Y,6,X). No

Пример

Факториалом натурального числа n называют произведение всех целых чисел от 1 до n включительно. Для записи факториала числа n используют обозначение n!.

n!=n*(n-1)*(n-2)*...*2*1=n*(n-1)!

Следующая процедура вычисляет факториал числа. Обратите внимание на использование рекурсии в данной процедуре:

факториал(1,1). факториал(N,R):- integer(N), N>1, N1 is N-1, факториал(N1,R1), R is N*R1.

Первое правило (так называемый терминальный случай, то есть тот момент выполнения процедуры, когда она перестает вызывать сама себя) гласит, что факториал единицы равен единице. Второе правило есть просто запись определения факториала: результат R получается умножением числа N на факториал числа, на единицу меньшего. Оно будет срабатывать при всех n>1 потому, что интерпретатор Пролога просматривает базу данных сверху вниз и переходит к следующему правилу или факту только в том случае, когда он не может выполнить текущее правило.




Содержание  Назад  Вперед