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



Автокран аренда саратов |

Примеры программ


Рассмотрим некоторые программы, демонстрирующие обработку числовых данных. Отметим важную особенность процедур, создаваемых на языке Пролог: они, в отличии от встроенных функций, не могут появляться в арифметических выражениях. Если требуется, например, переменной R присвоить значение, равное умноженному на три большему из двух выражений X и Y, то, используя определенную ниже процедуру максимум, это можно записать так:

максимум(X,Y,Z), R is 3*Z.

(см. примеры 1.1)

Пример 1.1.

(html, txt)

Пример

Написать процедуру, вычисляющую максимум из двух чисел.

максимум(X,X,X). максимум(X,Y,X):- X>Y. максимум(X,Y,Y):- X<Y.

В предикате максимум/3 третий аргумент является максимумом из двух чисел - первого и второго его аргументов. Смысл каждого из правил данной процедуры вполне очевиден. Посмотрим на реакцию интерпретатора Пролога на запросы, содержащие данный предикат.

?- максимум(20,50,X). X = 50 Yes

?- максимум(100,50,X). X = 100 Yes

?- максимум(X,50,100). X = 100 Yes

Последний ответ показывает, что наш предикат позволяет находить ответ на вопросы типа: "Каково должно быть число, чтобы максимум из искомого числа и числа 50 равнялся бы 100?".

Как вы думаете, почему был получен ответ "No" на следующий запрос?

?- максимум(X,50,40). No

Пример

Составьте процедуру гипотенуза/3, которая по двум катетам прямоугольного треугольника вычисляет его гипотенузу.

Воспользуемся теоремой Пифагора и встроенной функцией 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).


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