дХОКНЛМШЕ ПЮАНРШ, ЙСПЯНБШЕ ОПНЕЙРШ МЮ ГЮЙЮГ, ЙНМРПНКЭМШЕ ПЮАНРШ МЮ ГЮЙЮГ

 

мЮВЕПРЮРЕКЭМЮЪ ЦЕНЛЕРПХЪ оПЮЙРХЙСЛ ОН ПЕЬЕМХЧ ГЮДЮВ цЕНЛЕРПХВЕЯЙНЕ ВЕПВЕМХЕ хМФЕМЕПМЮЪ ЦПЮТХЙЮ еяйд йПЮРМШЕ ХМРЕЦПЮКШ лЮРЕЛЮРХВЕЯЙХИ ЮМЮКХГ лЮРПХЖШ оПЕДЕКШ оПНХГБНДМШЕ бЕЙРНПМЮЪ ЮКЦЕАПЮ хМРЕЦПЮКЭМНЕ ХЯВХЯКЕМХЕ ртйо ъДЕПМЮЪ ТХГХЙЮ щКЕЙРПНЯРЮРХЙЮ лЮЦМЕРХГЛ нОРХЙЮ хМТНПЛЮЖХНММШЕ РЕУМНКНЦХХ

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

Унификация

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

Унификация термов, которыми являются аргументы, описывается приводимыми ниже правилами. В примерах используется предикат =, который пытается унифицировать свои аргументы.
 
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 

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