750
ГЛАВА 13. СЕНТЕНЦИАЛЬНЫЕ МЕТОДЫ
• Если при конкретизации в ходе установления значений переменных
возможны неудачи и возвраты, то при унификации значения перемен-
ных рекурсивно набираются в соответствии с алгоритмом нахождения
унифицирующей подстановки, и неудача этого единственного вариан-
та означает неудачу всей попытки унификации.
Заметим, что логический алгоритм унификации обладает свойством ча-
стичного исполнения: если унифицировать две подструктуры, то затем мож-
но продолжить унификацию остальных подструктур после исполнения уни-
фицирующей подстановки, и результат унификации не изменится. Так что
последовательность выражений может унифицироваться одно за другим
10
.
Второй находкой, перенесенной авторами языка
PROLOG
из специализи-
рованных программ в языки программирования, явилась система обработки
неудач.Успешно произведенная унификация (точно так же,как успешно про-
изведенное отождествление в языке
Рефал
) является разрешением выпол-
нить некоторое действие. После этого действия поле зрения изменяется, и
ищется следующая унификация. Если на некотором шаге унификация невоз-
можна, произошла неудача, и мы возвращаемся к тому последнему моменту,
когда было возможно унифицировать поле зрения несколькими способами.
Мы теперь запрещаем предыдущую успешную модификацию и пытаемся
испробовать другие возможности. Такие возвраты могут происходить один
за другим, при этом, как правило, значения переменных, измененные вви-
ду подстановок, восстанавливаются. Этот метод управления принципиально
отличается от управления в языке
Рефал
. В
PROLOG
неудача глобальна, но
исправима, а в
Рефале
локальна, но фатальна.
10
И, более того, можно было бы унифицировать произвольно выбранные внутренние соот-
ветственные подвыражения в произвольном порядке, лишь бы объемлющие унифицирова-
лись после подчиненных. Авторам неизвестно ни одно использование этого естественного
и многообещающего обобщения алгоритма унификации.
В конкретной первой реализации языка
PROLOG
, основные особенности которой ста-
ли в дальнейшем фактическим стандартом, создатели допустили ошибку в понимании и,
соответственно, в реализации алгоритма унификации, которая, в частности, разрушает это
свойство, и порою может привести к излишней конкретизации, когда можно было бы найти
более общую конкретизирующую подстановку. Эта ошибка несущественна, она не влияет
на подавляющее большинство программ, но иногда она приводит к появлению бесконеч-
ных термов, и некоторые реализаторы языка
PROLOG
с гордостью пишут, что они умеют
печатать и показывать на экране даже такие термы.
Желающие в качестве упражнения выловить ошибку самостоятельно, сравните алгорит-
мы унификации, описанные в книге [79] и в [41].