7.1.1. Предикаты var , nоnvar , atom , integer , atomic
7.1.1. Предикаты var, nоnvar, atom, integer, atomic
Термы бывают разных типов: переменные, целые числа, атомы и т.д. Если терм — переменная, то в некоторый момент выполнения программы он может оказаться конкретизированным или не конкретизированным. Далее, если он конкретизирован, то его значение может быть атомом, структурой и т.п. Иногда бывает полезно узнать, каков тип этого значения. Например, пусть мы хотим сложить значения двух переменных X и Y:
Z is X + Y
Перед вычислением этой цели необходимо, чтобы X и Y были конкретизированы целыми числами. Если у нас нет уверенности в том, что X и Y действительно конкретизированы целыми числами, то перед выполнением арифметического действия нужно проверить это программно.
Для этого следует воспользоваться встроенным предикатом integer (целое). Предикат integer( X) принимает значение истина, если X — целое или если X — переменная, имеющая целое значение. Будем говорить в этом случае, что X "обозначает" целое. Цель для сложения X и Y можно тогда "защитить" такой проверкой переменных X и Y:
..., integer( X), integer( Y), Z is X + Y, ...
Если неверно, что X и Y оба являются целыми, то система и не будет пытаться их сложить. Таким образом, цели integer "охраняют" цель Z is X + Y от бессмысленного вычисления.
Встроенные предикаты этого типа таковы: var (переменная), nonvar (непеременная), atom (атом), integer (целое), atomic (атомарный). Они имеют следующий смысл:
var( X)
Эта цель успешна, если X в текущий момент — не конкретизированная переменная.
nonvar( X)
Эта цель успешна, если X — терм, отличный от переменной, или если X — уже конкретизированная переменная.
atom( X)
Эта цель истинна, если X обозначает атом.
integer( X)
Цель истинна, если X обозначает целое.
atomic( X)
Цель истинна, если X обозначает целое или атом.
Следующие примеры вопросов к пролог-системе иллюстрируют применение этих встроенных предикатов:
?- var( Z), Z = 2.
Z = 2
?- Z = 2, var( Z).
no
?- integer( Z), Z = 2.
no
?- Z = 2, integer( Z), nonvar( Z).
Z = 2
?- atom( 22).
no
?- atomic( 22).
yes
?- atom( ==>).
yes
?- atom( p( 1) ).
no
Необходимость в предикате atom продемонстрируем на следующем примере. Пусть мы хотим подсчитать, сколько раз заданный атом встречается в некоторой списке объектов. Для этого мы определим процедуру
счетчик( А, L, N)
где А — атом, L — список и N — количество вхождений этого атома. В качестве первой попытки можно было бы определить счетчик так:
счетчик( _, [], 0).
счетчик( A, [A | L], N) :- !,
счетчик( A, L, N1),
% N1 - число вхождений атома в хвост
N is N1 + 1.
счетчик( А, [ _ | L], N) :-
счетчик( A, L, N).
Теперь на нескольких примерах посмотрим, как эта процедура работает:
?- счетчик( а, [а, b, а, а], N).
N = 3
?- счетчик( a, [a, b, X, Y], Na).
Na = 3
...
?- счетчик( b, [a, b, X, Y], Nb).
Nb = 3
...
?- L=[a, b, X, Y], счетчик( а, L, Na), счетчик( b, L, Nb).
Na = 3
Nb = 1
X = a
Y = a
...
В последнем примере как X, так и Y после конкретизации получили значение а, и поэтому Nb оказалось равным только 1, однако мы хотели не этого. Нас интересовало количество реальных появлений конкретного атома, а вовсе не число термов, сопоставимых с этим атомом. В соответствии с этим более точным определением отношения счетчик мы должны теперь проверять, является ли голова списка атомом. Усовершенствованная программа выглядит так:
счетчик( _, [], 0).
счетчик( А, [В | L], N) :-
atom( В), А = В, !, % B равно атому А?
счетчик( A, L, N1), % Подсчет в хвосте
N is N1 + 1;
счетчик( А, L, N).
% Иначе - подсчитать только в хвосте
В следующем более сложном упражнении по программированию числовых ребусов используется предикат nonvar.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Предикаты: наборы узлов
Предикаты: наборы узлов Набор узлов (node set), как понятно из названия, представляет собой просто совокупность узлов (и может содержать только один узел). Выражение child::PLANET возвращает набор узлов, состоящий из всех элементов <PLANET>. Выражение child::PLANET/child::NAME возвращает список
Предикаты: числа
Предикаты: числа В XPath числа хранятся в формате числа с плавающей точкой двойной точности. (Технически все числа XPath хранятся в 64-разрядном формате IEEE числа с плавающей точкой двойной точности, floating-point double.) Все числа хранятся как числа с двойной точностью — даже целые
EnumObjects function EnumObjects(DC: HDC, ObjectType: Integer; ObjectFunc: TFarProc; Data:
EnumObjects function EnumObjects(DC: HDC, ObjectType: Integer; ObjectFunc: TFarProc; Data: Pointer):Integer;Пеpечисляет типы объектов, возможные на устpойстве, пеpедавая функции обpатного вызова TLogPen или TLogBrush и Data. Пеpечисление заканчивается, если функция обpатного вызова возвpащает нуль или если пеpечислены все
15.2. RSS и Atom
15.2. RSS и Atom Часто изменяющийся контент распространяется в Интернете с помощью синдицированных каналов, или просто каналов. Обычно данные описываются на некотором диалекте языка XML.Наверное, из всех форматов подобного рода наиболее распространен формат RSS. Эта
INTEGER
INTEGER INTEGER является 4-байтовым целым. В диалекте 1 генераторы (см. разд. "Генераторы" этой главы) генерируют значения типа INTEGER. Вы можете хранить такие целые в столбцах BIGINT без
Предикаты OR в запросах
Предикаты OR в запросах Если вы ожидаете для таблицы частого выполнения запросов, которые используют оператор OR, то лучше создать индексы из одного столбца для каждого условия. Поскольку индексы из нескольких столбцов упорядочены иерархически, запрос, который использует
FERRMA: Atom’ная выставка
FERRMA: Atom’ная выставка Atom’ная выставкаАвтор: Сергей ВильяновОпубликовано в журнале "Компьютерра" N25-26 от 08 июля 2008 годаВ наших репортажах с различных зарубежных мероприятий значительную часть традиционно занимают путевые заметки. Пожалуй, не буду нарушать традицию и я,
Смартфонный Atom: процессор Intel Medfield Олег Нечай
Смартфонный Atom: процессор Intel Medfield Олег Нечай Опубликовано 27 августа 2012 года Бизнес Intel — это универсальные процессоры для настольных и портативных компьютеров разных классов, мощные чипы для серверов и специализированные микросхемы для