
438
Глава 4. Метаязыковая абстракция
При унификации, как и при одностороннем сопоставлении с образцом, нам нужно
принимать предлагаемое расширение кадра только в том случае, когда оно не противо-
речит имеющимся связываниям. Процедура extend-if-possible, используемая при
унификации, подобна extend-if-consistent из сопоставителя, за исключением двух
проверок, отмеченных в программе значком «***». В первом случае, если переменная,
которую мы пытаемся сопоставить, не найдена, но значение, с которым мы ее сопостав-
ляем, само является (другой ) переменной, требуется проверить, нет ли у этой второй
переменной значения, и если да, сопоставить его. Если же обе с тороны сопоставлен ия
несвязаны, мы любую из них можем связать с другой.
Вторая проверка связана с попытками связ ать переменную с образцом, который е е са-
му содержит. Такая ситуация может возникнуть, когда в обоих образцах повторяются пе-
ременные. Рассмотрим , например, унификацию образцов (?x ?x) и (?y hвыражение,
содержащее ?yi) в кадре, где не связаны ни ?x, ни ?y. Сначала ?x сопос тавляется
с ?y, и возникает связывание переменной ?x с ?y. Затем та же переменная ?x со-
поставляется с данным выражением, которое включает ?y. Поскольку ?x уже связана
со значением ?y, это приводит к тому, что с выражением сопоставляется ?y. Если мы
считаем, что унификатор заня т поиском набора значений для переменных, которые де-
лают образцы одинаковыми, то значит, эти образцы содержат инструкции найти такое
значение ?y, что бы ?y был равен выражению, содержащему ?y. Общего метода для
решения таких задач не существует, так что мы такие связывания отвергаем; эти случаи
распознаются предикатом depends-on?
80
. С другой стороны, нам не хочется отвергать
попытки связать переменную саму с собой. Рассмотрим, например, ун ификацию (?x
?x) с (?y ?y). Вторая попытка связать ?x с ?y вызывает сопоставление ?y (стар ое
значение ?x) с ?y (новым значением ?x). Этот случай обрабатывается веткой equal?
внутри unify-match.
80
В общем случае унификация ?y с выражением, содержащим ?y, требует нахождения неподвижной точки
уравнения ?y = hвыражение, содержащее ?yi. Иногда возможно синтаксическим образом создать вы-
ражение, которое кажется решением уравнения. Например, кажется, что ?y = (f y) имеет неподвижную
точку (f (f (f ...))), которую мы можем получить, начав с выражения (f ?y) и систематически под-
ставляя (f ?y) вместо ?y. К сожалению, не у всякого такого уравнения имеется осмысленная неподвижная
точка. Вопросы, возникающие здесь, подобны вопросам работы с бесконечными последовательностями в ма-
тематике. Например, мы знаем, что решение уравнения y = 1 + y/2 равно 2. Если мы начнем с выражения
1 + y/2 и будем подставлять 1 + y /2 вместо y, то получим
2 = y = 1 + y/2 = 1 + (1 + y/2)/2 = 1 + 1/2 + y/4 = ··· ,
что ведет к
2 = 1 + 1/2 + 1/4 + 1/8 + ··· .
Однако если мы попытаемся проделать те же преобразования, использовав тот факт, что решение уравнения
y = 1 + 2y равно -1, то получим
−1 = y = 1 + 2y = 1 = 2(1 + 2y) = 1 + 2 + 4y = ··· ,
что ведет к
−1 = 1 + 2 + 4 + 8 + ··· .
Несмотря на то, что формальные преобразования, ведущие к этим двум уравнениям, одинаковы, первый ре-
зультат является верным утверждением о бесконечных последовательностях, а второй нет. Подобным образом
и при работе с унификациями работа с произвольными синтаксически правильными выражениями может при-
вести к ошибкам.