Программирование на языке Пролог для искусственного интеллекта | страница 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, Д).

Разумеется, с таким же успехом можно последнюю цель в третьем предложении заменить двумя: