logo search
TurboProlog / Документация / TOM_2

Процесс унификации

Унификация - это исходное управление языка Пролог; присвоение значе-

ний переменным, предикат member и список среды совершают большую часть

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

термов с целью проверить одинаковы ли они; это происходит только в том

случае, когда две переменные являются не установленными переменными (ины-

ми словами, когда каждый терм - это или не переменная или связанная пере-

менная). Во всех остальных случаях member должен добавить информацию в

среду.

Когда два терма унифицированы, и хотя бы один из них является пере-

менной, предикат member должен проверить, содержится ли в среде эта пере-

менная.

- Если в среде нет такой переменной, то member добавляет ее.

- Если переменная находится в среде, и она связана, то связыва-

ющее значение (терм) будет возвращено туда, где можно прове-

рить, соответствует ли она вызвавшему терму.

- Если переменная находится в среде и она не установленная, то

свободная переменная возвращается туда, где ей может быть при-

писано значение; эта свободная переменная может разделяться

(связана с другой переменной) а позже может быть связаной со

значением.

Вот пример, показывающий как предикат member изменяет среду в раз-

личных случаях:

Если вы начинаете с цели

pl(A, 8, B).

предикат member добавит в среду два элемента:

e("A",_)

e("B",_)

Среда цели преобразуется в:

[e("A",_), e("B",_)|_]

Если у вас в базе данных есть предложение

pl(X, Y,5):- p2(X, Y, Z)

, то member обновит среду цели с помощью

e("B",5)

Среда теперь станет:

[e("A",_), e("B",5)|_].

Когда заголовок предложения p1 унифицируется с целью, и до того, как

будет оценено тело, предикат member добавит в среду для предложения p1:

e("X",_) и e("Y",8)

Среда предложения станет:

[e("X",_), e("Y",8)|_]

Связанной с Х будет свободная разделяемая переменная А, что означа-

ет, что когда Х окажется связанной, то это связывание будет также присво-

ено А в среде цели.

Затем будет оценено следующее тело, а member добавит

e("Z",_)

в среду предложения p1, которая станет такой:

[e("X",_), e("Y",8), e("Z",_)|_].

Теперь если в базе данных есть факт p2

p2(4,8,9)

, то p2 унифицируется с подцелью p2(X, Y, Z), а member обновляет среду

предложения p1 с помощью

e("X",4) и e("Z",9)

Так как переменные "Х" и "А" - свободные разделяемые переменные, то

среда цели тутже будет дополнена посредством

e("A",4).

Результирующими средами теперь окажутся

[e("А",4), e("В",5)|_]

для цели и

[e("X",4), e("Y",8), e("Z",9)|_]

для предложения p1.