Правила, описывающие унификацию термов

Унификация термов регулируется приводимыми ниже правилами. Во всех примерах используется встроенный предикат =, который выполняет попытку унификации своих аргументов.

1) Переменная унифицируется с константой или структурой. В результате этого переменная становится конкретизированной, т. е. она принимает значение этой константы или структуры.

|? - Х=джон.

Х=джон

2) Переменная унифицируется с переменной, при этом обе они становятся одной и той же переменной.

|? -X=Y.

Х=_1

Y=_1

(_1 — это внутреннее имя и переменной X, и переменной Y.)

3) _унифицируется с чем угодно.

|? -джоан =_.

4) Константа унифицируется с константой, если они идентичны.

|? - джоан = джоан.

да

5) Структура унифицируется с другой структурой, если их имена одинаковы, а аргументы поддаются унификации.

|? -отец (джордж) =отец (Х).

Х = джордж

Пример с программой "дядя"

Для того чтобы показать процесс выполнения запроса, воспользуемся простой программой, состоящей из базы данных "отец", базы данных "брат" и правила "дядя".

отец (билл, даниэль).

отец (билл, кеннет).

брат (даниэль, кеннет).

брат (джон, билл).

дядя (U, N): -

брат (U, В),

отец (В, N).

В оставшейся части раздела будем попеременно концентрировать внимание то на общих действиях интерпретатора, то на конкретных событиях, происходящих при обработке запроса к правилу "дядя".

Активация запроса

После того как пользователь введет запрос, этот запрос помещается в вершину стека активных запросов. В этом случае говорят, что запрос активируется. Рассмотрим запрос к программе "дядя":

|? -дядя (джон, W).

Диаграмма, приводимая ниже, служит "моментальным снимком" состояния интерпретатора сразу после активации запроса "дядя (джон, W)".

(1)

Активные запросы - — Фразы программы -

? -дядя (джон, W).

Как только в стеке появится запрос, интерпретатор приступит к поиску множества фраз с тем же самым именем предиката и с тем же количеством аргументов, что и у запроса. Если таких фраз нет, то запрос оказывается неудачным. Диаграмма (2) показывает запрос, указывающий на начало множества фраз "дядя":

(2)

Активные запросы - — Фразы программы -

? -дядя (джон, W). ------> дядя (U, N): -

брат (U В),

отец (В, N).

Унификация запроса

Интерпретатор анализирует первую фразу множества фраз "дядя" и пытается унифицировать каждый аргумент запроса с соответствующим аргументом этой фразы. В нашем случае запрос "дядя" успешно унифицируется с заголовком правила "дядя". В результате унификации конкретизируется переменная U, которая получает значение «джон», а W и N становятся одной и той же неконкретизированной переменной. После того как переменная, расположенная в заголовке правила, будет унифицирована с другим термом, результат выполнения этих действий распространяется на каждый случай использования этой переменной в правиле. Диаграмма (3) показывает состояние интерпретатора сразу после данной унификации.

(3)

Активные запросы — - Фразы программы -

? - дядя (джон, W). ------> дядя (джон, W): -

брат (джон. В),

отец (В, W).

Соседние файлы в папке Гл.0,1,2,3,4,5,Предисловие