Термы бывают разных типов: переменные, целые числа, атомы и т.д. Если терм - переменная, то в некоторый момент выполнения программы он может оказаться конкретизированным или не конкретизированным. Далее, если он конкретизирован, то его значение может быть атомом, структурой и т. п. Иногда бывает полезно узнать, каков тип этого значения. Например, пусть мы хотим сложить значения двух переменных Х и Y:
Z is X + Y
Перед вычислением этой цели необходимо, чтобы Х и Y были конкретизированы целыми числами. Если у нас нет уверенности в том, что Х и Y действительно конкретизированы целыми числами, то перед выполнением арифметического действия нужно проверить это программно.
Для этого следует воспользоваться встроенным предикатом integer (целое). Предикат integer( X) принимает значение истина, если Х - целое или если Х - переменная, имеющая целое значение. Будем говорить в этом случае, что Х "обозначает" целое. Цель для сложения Х и Y можно тогда "защитить" такой проверкой переменных Х и Y:
. . ., integer( X), integer( Y), Z is X + Y, . . .
Если неверно, что X и Y оба являются целыми, то система и не будет пытаться их сложить. Таким образом, цели integer "охраняют" цель Z is Х + Y от бессмысленного вычисления.
Встроенные предикаты этого типа таковы: var
(переменная), nonvar (непеременная), atom
(атом), integer (целое), atomic
(атомарный). Они имеют следующий смысл:
var( X)
Эта цель успешна, если Х в текущий момент - не конкретизированная переменная.
nonvar( X)
Эта цель успешна, если Х - терм, отличный от переменной, или если Х - уже конкретизированная переменная.
atom( X)
Эта цель истинна, если Х обозначает атом.
integer( X)
Цель истинна, если Х обозначает целое.