Программирование на языке Пролог для искусственного интеллекта | страница 59
>X is (5 - 2) - 1
Арифметические операции используются также и при сравнении числовых величин. Мы можем, например, проверить, что больше — 10000 или результат умножения 277 на 37, с помощью цели
>?- 277 * 37 > 10000.
>yes
(да)
Заметьте, что точно так же, как и >is
, оператор '>>
' вызывает выполнение вычислений.
Предположим, у нас есть программа, в которую входит отношение >рожд
, связывающее имя человека с годом его рождения. Тогда имена людей, родившихся между 1950 и 1960 годами включительно, можно получить при помощи такого вопроса:
>?- рожд( Имя, Год),
> Год >= 1950,
> Год <= 1960.
Ниже перечислены операторы сравнения:
>X > Y
X больше Y
>X < Y
X меньше Y
>X >= Y
X больше или равен Y
>X =< Y
X меньше или равен Y
>X =:= Y
величины X и Y совпадают (равны)
>X =\= Y
величины X и Y не равны
Обратите внимание на разницу между операторами сравнения '>=
' и '>=:=
', например, в таких целях как >X = Y
и >X =:= Y
. Первая цель вызовет сопоставление объектов >X
и >Y
, и, если >X
и >Y
сопоставимы, возможно, приведет к конкретизации каких-либо переменных в этих объектах. Никаких вычислений при этом производиться не будет. С другой стороны, >X =:= Y
вызовет арифметическое вычисление и не может привести к конкретизации переменных. Это различие можно проиллюстрировать следующими примерами:
>?- 1 + 2 =:= 2 + 1.
>yes
>?- 1 + 2 = 2 + 1.
>no
>?- 1 + А = В + 2.
>А = 2
>В = 1
Давайте рассмотрим использование арифметических операций на двух простых примерах. В первом примере ищется наибольший общий делитель; во втором — определяется количество элементов в некотором списке.
Если заданы два целых числа X и Y, то их наибольший общий делитель Д можно найти, руководствуясь следующими тремя правилами:
(1) Если X и Y равны, то Д равен X.
(2) Если X > Y, то Д равен наибольшему общему делителю X разности Y – X.
(3) Если Y < X, то формулировка аналогична правилу (2), если X и Y поменять в нем местами.
На примере легко убедиться, что эти правила действительно позволяют найти наибольший общий делитель. Выбрав, скажем, X = 20 и Y = 25, мы, руководствуясь приведенными выше правилами, после серии вычитаний получим Д = 5.
Эти правила легко сформулировать в виде прологовской программы, определив трехаргументное отношение, скажем
>нод( X , Y, Д)
Тогда наши три правила можно выразить тремя предложениями так:
>нод( X, X, X).
>нод( X, Y, Д) :-
> X < Y,
> Y1 is Y - X,
> нод( X, Y1, Д).
>нод( X, Y, Д) :-
> Y < X,
> нод( Y, X, Д).
Разумеется, с таким же успехом можно последнюю цель в третьем предложении заменить двумя: