йНМЯОЕЙР ОН МЮВЕПРЮРЕКЭМНИ ЦЕНЛЕРПХХ хМФЕМЕПМЮЪ ЦПЮТХЙЮ юПУХРЕЙРСПЮ щбл хМТНПЛЮРХЙЮ Х ХМТНПЛЮЖХНММШЕ РЕУМНКНЦХХ

Предыдущий разделУровень вышеСледующий раздел

Унификация

Унификация есть основной механизм обработки запросов в логическом программировании. После того как пользователь посылает запрос интерпретатору, этот запрос активизируется. Интерпретатор приступает к анализу фраз базы данных в поисках первой фразы, заголовок которой будет унифицироваться с запросом. Для того чтобы запрос унифицировался с заголовком фразы, необходимо совпадение у них имени предиката, количества аргументов и унификация каждого из них.

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

 ?- X=коля. X=коля Yes 
2) Переменная унифицируется с переменной, при этом они обе становятся как бы одной и той же переменной.
 ?- X=Y. X = _G161 Y = _G161 Yes 
3) Анонимная переменная унифицируется с любым термом.
 ?- 
автор(пушкин)=_. Yes 
4) Атом унифицируется с атомом, если они идентичны.
 ?- коля=коля. Yes 
5) Составной терм унифицируется с другим составным термом, если их имена и количество аргументов совпадает, а аргументы поддаются унификации.
 ?- отец(борис)=отец(X). X = борис Yes ?- дедушка(борис, 
Y)=отец(X). No 


Пример
Термы больше(Х, собака) и больше(осел, собака) унифицируются, потому что переменная X может быть конкретизирована атомом осел:

 ?- больше(Х,собака) = 
больше(осел,собака). X = осел Yes 
Рассматриваемый в следующем примере запрос не будет успешным, потому что переменная X не может быть конкретизирована двумя значениями 1 и 2 одновременно.
 ?- p(X,2,2) = p(1,Y,X). No 

Если в этом примере вместо X мы используем анонимную переменную _, то унификация будет возможна, потому что при каждом использовании _ создается новая переменная. Смысл анонимности в том, что мы предоставляем Прологу возможность генерации имени для данной переменной и нам не нужны ни ее имя, ни ее значение. Переменная Y во время унификации конкретизируется значением 2:

 
?- p(_,2,2) = p(1,Y,_). Y = 2 Yes 


Пример
В следующем запросе унификация возможна, хотя и нет специфических переменных, которые могли бы быть связаны или унифицированы (как в предыдущих примерах):

 ?- f(a,g(X,Y)) = 
f(X,Z), Z = g(W,h(x)). X = a Y = h(x) Z = g(a, h(x)) W = a Yes 

Предыдущий разделУровень вышеСледующий раздел

мЮВЕПРЮРЕКЭМЮЪ ЦЕНЛЕРПХЪ Х ХМФЕМЕПМЮЪ ЦПЮТХЙЮ, ОЕПЯОЕЙРХБЮ