Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
интелектуальные информационные системы.docx
Скачиваний:
5
Добавлен:
01.07.2025
Размер:
1 Мб
Скачать
☆

6.3. Классификация термов

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

var(X)

Целевое утверждение var(X) согласуется с базой данных, если на текущий момент X является неконкретизированной переменной. Таким образом, возможен следующий диалог:

?- var(X).

да

?- var(23).

нет

?- X = Y, Y = 23, var(X).

нет

Неконкретизированная переменная может представлять часть некоторой структуры, которая еще не полностью заполнена. Примерами могут служить неотмеченные клетки на доске для игры в крестики-нолики, рассмотренной в разд. 4.3.3, и незаполненные части упорядоченного дерева, представляющего словарь в разд. 7.1. При работе с такими структурами предикат var очень, полезен при определении, являются ли некоторые части структуры уже заполненными или нет. Это может предотвратить «случайную» конкретизацию переменной при попытке анализа ее значения. Например, при работе со словарем, представленным в виде упорядоченного дерева, может потребоваться узнать, имеется ли уже вход для некоторого ключа, не создавая такой вход в случае его отсутствия. При игре в крестики-нолики может возникнуть необходимость определить, занята или нет некоторая клетка. Попытка сопоставить неконкретизированную переменную с «о» или «х» привела бы просто к тому, что соответствующий символ был бы помещен в клетку, соответствующую переменной.

nonvar(X)

Целевое утверждение nonvar(X) согласуется с базой данных, если X на текущий момент не является неконкретизированной переменной. Предикат nonvar является, таким образом, противоположным по отношению к предикату var. Действительно, он может быть определен на Прологе следующим образом:

nonvar(X):- var(X),!, fail.

nonvar(_).

atom(X)

Целевое утверждение atom(X) согласуется с базой данных, если текущее значение X является атомом в смысле языка Пролог. Как следствие возможен следующий диалог:

?- atom(23).

нет

?- atom(apples).

да

?- atom('/us/qris/pl. 123').

да

?- atom("этo строка").

нет

?- atom(X).

нет

?- atom(book(bronte,w_h,X)).

нет

integer(X)

Целевое утверждение integer(X) согласуется с базой данных, если на текущий момент X обозначает целое число. Этот предикат можно использовать при определении простого предиката для упрощения арифметических выражений, где необходимо знать, является ли выражение целым числом (см., например, разд. 7.12).

atomic(X)

Целевое утверждение atomic(X) согласуется с базой данных, если на текущий момент X обозначает либо целое число, либо атом. Предикат atomic может быть определен через предикаты atom и integer следующим образом:

atomic(X):- atom(X).

atomic(X):- integer(X)