На этом шаге мы рассмотрим сопоставление и унификацию.
Рассмотрим программу с точки зрения того, как Пролог будет отыскивать все решения следующей цели:
written_by(X,Y).
Пытаясь выполнить целевое утверждение written_by(X,Y), Пролог должен проверить каждое предложение written_by в программе. Сопоставляя аргументы X и Y с аргументами каждого предложения written_by, Пролог выполняет поиск от начала программы до ее конца. Обнаружим предложение, соответствующее целевому утверждению, Пролог присваивает значения свободным переменным таким образом, что целевое утверждение и предложение становятся идентичными; говорят, что целевое утверждение унифицируется с предложением. Такая операция сопоставления называется унификацией. Рассмотрим пример pro28_1.pro:
domains title,author=symbol pages=integer predicates book(title,pages) written_by(author, title) long_novel(title) clauses written_by(fleming, "DR NO"). written_by(melville, "MOBY DICK"),. book("MOBY DICK", 250). book("DR NO", 310). long_novel(Title) :- written_by(_,Title), book(Title,Length), Length >300.
Поскольку X и Y являются свободными переменными в целевом утверждении, а свободная переменная может быть унифицирована с любым другим аргументом (и даже с другой свободной переменной), то целевое утверждение может быть унифицировано первым предложением written_by в программе, как показано ниже:
written_by(X,Y). written_by(fleming,"DR NO").
Пролог устанавливает соответствие, X становится связанным с fleming, a Y - с DR NO. В этот момент Пролог напечатает:
X=fleming, Y="DR NO"
Поскольку Пролог ищет все решения для заданной цели, целевое утверждение также будет унифицировано и со вторым предложением written_by:
written_by(melville,"MOBY DICK").
Пролог печатает второе решение:
X=melville, Y="MOBY DICK"
Теперь предположим, что вы задали программе целевое утверждение
written_by(X,"MOBY DICK").
Пролог произведет сопоставление с первым предложением written_by:
written_by(X,"MOBY DICK"). written_by(fleming,"DR NO").
Так как "MOBY DICK" И "DR NO" не соответствуют друг другу, попытка унификации завершается неудачно. Затем Пролог проверит следующий факт в программе:
written_by(melville,"MOBY DICK").
Этот факт действительно унифицируется, и X становится связанным с melville. Рассмотрим, как Пролог выполнит следующее целевое утверждение:
long_novel(X).
Когда Пролог пытается выполнить целевое утверждение, он проверяет, действительно ли обращение может соответствовать факту или заголовку правила. В нашем случае устанавливается соответствие с long_novel(Title).
Пролог проверяет предложение для long_novel, пытаясь завершить сопоставление унификацией аргументов. Поскольку в целевом утверждении X - свободная переменная, то она может быть унифицирована с любым другим аргументом. Title также не является связанным в заголовке предложения long_novel. Целевое утверждение соответствует заголовку правила, и унификация выполняется. Впоследствии Пролог будет пытаться согласовывать подцели с правилом.
long_novel(Title):- written_by(_, Title), book(Title, Length), Length>300.
Пытаясь выполнить согласование тела правила, Пролог обратится к первой подцели в теле правила - written_by(_,Title). Поскольку авторство книги является несущественным, на месте аргумента author появляется анонимная переменная (_). Обращение written_by(_,Title) становится текущей подцелью, и Пролог ищет решение для этого обращения. Пролог ищет соответствие с данной подцелью от вершины и до конца программы.
В результате достигается унификация с первым фактом для written_by, а именно:
written_by(_,Title), written_by(fleming,"DR NO").
Переменная Title связывается с "DR NO", и к следующей подцели book(Title, Length) обращение выполняется уже с этим значением переменной.
Далее Пролог начинает очередной процесс поиски, пытаясь найти соответствие с обращением к book. Так как Title связан с "DR NO", фактическое обращение выглядит как book("DR NO",Length). Процесс поиска опять начинается с вершины программы. Заметим, что первая попытка сопоставления с предложением book("MOBY DICK",250) завершится неудачно, и Пролог перейдет ко второму предложению book в поиске соответствия. Здесь заголовок книги соответствует подцели, и Пролог связывает переменную Length с величиной 310. Теперь третье предложение в теле long_novel становится текущей подцелью:
Length > 300.
Пролог выполняет сравнение, завершающееся успешно: 310 больше, чем 300. В этот момент все подцели в теле правила выполнены, и, следовательно, обращение long_novel (X) успешно. Так как X в обращении был унифицирован с переменной Title в правиле, то значение, с которым связывается Title при подтверждении правила, возвращается и унифицируется с переменной X. Переменная Title в случае подтверждения правила имеет значение "DR NO", поэтому Пролог выведет:
X="DR NO"
B следующих шагах будет показано несколько прикладных примеров унификации. Однако прежде ознакомимся с рядом основополагающих понятий.
На следующем шаге мы рассмотрим поиск с возвратом.