Бэктрекинг   Рекурсия  

РАЗДЕЛЫ САЙТА


УНИФИКАЦИЯ


Основной механизм Пролога.
Унификация - процесс сопоставления вопроса с фактами и правилами базы знаний.


Разберем простейший пример №1. Пусть задан предикат t с двумя аргументами. К примеру, первый аргумент есть порядковый номер какого-либо объекта, а второй - его величина. В базе есть один факт t(1,2).

DOMAINS

   i = integer

PREDICATES

   t(i,i)

CLAUSES

   t(1,2).

Зададим в окне диалога вопрос этой программе: t(X,Y).
Получим ответ: X=1, Y=2.
Процесс унификации проходил следующим образом.
Для Пролога вопрос есть цель, которую необходимо достичь. Пролог берет вопрос t(X,Y) и начинает последовательно сверху-вниз сравнивать его с фактами и правилами базы знаний. Там где обнаруживается предикат с таким же идентификатором как и у вопроса и с таким же количеством аргументов происходит сопоставление. В данном случае в базе знаний есть только один факт и нет никаких правил. Если в вопросе аргументы ничем не означены (то есть X и Y свободные переменные), то значения из найденного факта присваиваиваются соответствующим переменным.
Зададим другой вопрос: t(1,Y).
Получим ответ: Y=2.
Процесс унификации проходил следующим образом.
Пролог взял вопрос t(1,Y) и последовательно сверху-вниз сравнивая его с фактами из базы знаний обнаружил, что существует предикат с таким же идентификатором как и у вопроса и с таким же количеством аргументов. Так как в вопросе первый аргумент имеет конкретное значение, то Пролог проводит сопоставление сравнивая значение из вопроса и из факта. В данном случае они совпали, поэтому процесс сопоставления переходит на вторые аргументы. В вопросе второй аргумент ничем не означен, поэтому ему передается значение из факта. О чем, собственно, Пролог и сообщает.


Разберем так же простой пример №2. Пусть задан предикат t с двумя аргументами. Он выполняется, если выполнимы две цели, указанные в его теле. Первая цель X=1, а вторая цель 2=Y. Запятая между ними означает, что предикат выполнится только при условии выполнения обеих целей в его теле, то есть запятая имеет смысл "И".

DOMAINS

   i = integer

PREDICATES

   t(i,i)

CLAUSES

   t(X,Y):-

      X=1,

      2=Y.

Зададим в окне диалога вопрос этой программе: t(X,Y).
Получим ответ: X=1, Y=2.
Процесс унификации проходил следующим образом.
По аналогии с описанным выше Пролог берет вопрос t(X,Y) и начинает последовательно сверху-вниз сравнивать его с фактами и правилами базы знаний. В данной программе есть только одно правило. Наткнувшись на него Пролог уясняет, что идентификатор правила и количество его аргументов соответствуют вопросу. После чего Пролог пытается выяснить - выполнимо ли это правило при условиях, указанных в вопросе. В вопросе все переменные свободны, а правило выполнимо при выполнимости двух целей из его тела: X=1 и 2=Y.
В Прологе знак "=" не есть знак присвоения. Его действие зависит от контекста. Только если с одной стороны от знака равенства стоит свободная переменная (то есть не имеющая никакого значения), а с другой стороны расположено какое-либо значение или означенная переменная, тогда действие знака "=" можно считать эквивалентным присвоению. По итогам его выполнения свободная переменная получит значение с противоположной стороны от знака равенства (сторона не имеет значение) и цель признается выполненной.
В данном случае обе переменные свободны, поэтому каждая из целей в теле правила оказывается достижимой с выполнением присвоения соответствующих значений. Обратите внимание, что здесь не имеет значения ни последовательность целей в предложении ни место расположения относительно знака равенства переменной и ее будущего значения.

Зададим другой вопрос: t(X,2).
Получим ответ: X=1.
Процесс унификации проходил следующим образом.
Первая переменная как и ранее означивается "1" - цель №1 достижима. Переходим ко второй цели: Y=2. Здесь перед выполнением цели, переменная уже не была свободной, а имела значение "2". Когда с обеих сторон от знака равенства находятся конкретные значения, тогда знак "=" имеет смысл сравнения. При равенстве обеих сторон - цель признается достижимой. Именно так и произошло в данном случае.

Зададим другой вопрос: t(X,3).
Получим ответ: No Solution.
Процесс унификации проходил следующим образом.
Первая переменная как и ранее означивается "1" - цель №1 достижима. Переходим ко второй цели: Y=2. Здесь перед выполнением цели, переменная уже не была свободной, а имела значение "3". Когда с обеих сторон от знака равенства находятся конкретные значения, тогда знак "=" имеет смысл сравнения. Так как значения сторон отличаются - цель признается не достижимой.
Но в базе знаний может оказаться несколько фактов или правил. Разберем процесс унификации для таких случаев.

DOMAINS

   i = integer

PREDICATES

   t(i,i)

CLAUSES

   t(1,3).

   t(X,Y):-

      X=1,

      2=Y.

Зададим в окне диалога вопрос этой программе: t(X,3).
Получим ответ: X=1.
1 Solution.
Процесс унификации проходил следующим образом.
Пролог последовательно сопоставляет вопрос со всеми фактами и правилами из базы знаний. Очевидно, что один факт и одно правило совместно предоставляют две возможности к унификации исходной цели. Обратите внимание, что в данном случае последовательность предложений в программе не имеет никакого значения. Можно поменять факт и правило местами без изменения смысла программы. Однако в данном случае процесс унификации проходит только на факте. О чем и заявляет Пролог. Но возможна такая постановка вопроса, которая приведет к унификации цели как на факте, так и на правиле.
Зададим такой вопрос: t(X,Y).
Получим ответ:
X=1, Y=3
X=1, Y=2
2 Solutions.




©Copyright 2007 - Беляков Андрей Юрьевич - Про Пролог / proprolog.narod.ru - All Rights Reserved
Hosted by uCoz