Шаг 28.
Основы логического программирования.
Сопоставление и унификация

    На этом шаге мы рассмотрим сопоставление и унификацию.

    Рассмотрим программу с точки зрения того, как Пролог будет отыскивать все решения следующей цели:

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

    На следующем шаге мы рассмотрим поиск с возвратом.




Предыдущий шаг Содержание Следующий шаг