printЛогическое программирование

printСопоставление

Сопоставление (унификация) является наиболее важной операцией в языке Пролог. Сопоставление выполняет сравнение двух термов на равенство, при этом неконкретизированные переменные получают значения, при которых термы становятся идентичными. Выполнение сопоставления может производиться либо явно, в теле правила с помощью встроенного предиката X=Y, либо неявно, при сопоставлении цели с фактом или головой правила. Сопоставление реализует основные операции обработки данных в логическом программировании:
  • однократное присваивание,
  • передача параметров,
  • создание структурных объектов,
  • доступ к полям структурных объектов с возможностью одновременного чтения/записи.
Сопоставление выполняется согласно следующим правилам.
  • Неконкретизированная переменная сопоставима с любым объектом и этот объект становится значением переменной (конкретизацией).
  • Числа и атомы сопоставимы только с идентичными числами и атомами.
  • Структуры сопоставимы только, если они имеют одинаковый функтор, одинаковое число компонентов, и соответствующие компоненты сопоставимы друг с другом.
  • Неконкретизированные переменные сопоставимы друг с другом, при этом они становятся сцепленными. Если одна из них получит конкретное значение, то такое же значение получит и другая переменная.
Такой способ сопоставления всегда находит наиболее общую конкретизацию, в наименьшей степени ограничивающую значения переменных. В качестве примера рассмотрим запрос:
?-дата(D,январь,Y)=дата(1,M,Z).
D=1,
M=январь,
Y=Z
Если переменная используется в предложении дважды, причем один раз как аргумент предиката сопоставления, то от явного сопоставления можно избавиться, заменив переменную вторым аргументом предиката сопоставления. Например, следующие два предложения эквивалентны:
список(X):-X=[_|_].
список([_|_]).
В Прологе существует также противоположный предикат X\=Y, который истинен только в случае, если терм X не сопоставим с термом Y. При использовании этого предиката в программе рекомендуется, чтобы все переменные в термах X и Y на момент согласования цели были конкретизированными, иначе результат будет зависеть от порядка целей в программе:[/p]
?-X=a,Y=b,X\=Y.
yes
?- X=a,X\=Y,Y=b.
no
Иногда требуется проверить точное равенство двух термов, включая соответствие расположения и идентичность неконкретизированных переменных. Это осуществляется с помощью встроенного предиката равенства (идентичности) X==Y. Этот предикат не выполняет конкретизации переменных, неконкретизированная переменная не равна никакому объекту, кроме другой неконкретизированной переменной, уже сцепленной с ней. Предикат равенства остается истинным, какое бы значение не получила в ходе дальнейшего вывода неконкретизированная переменная, входящая в терм.
?-f(a,X)==f(a,X).
yes
?-X==a.
no
?-X=a,X==a.
yes
?-X==Y.
no
?-X=Y,X==Y.
yes
Противоположный предикат X\==Y истинен только в случае, если терм X не равен терму Y.
loading