Если обе переменные связаны, то при унификации происходит их сравнение. Если одна из них свободна, то происходит присвоение. Переприсвоение значений переменным не допускается. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Если обе переменные связаны, то при унификации происходит их сравнение. Если одна из них свободна, то происходит присвоение. Переприсвоение значений переменным не допускается.



Это существенно отличает Пролог от прочих языков.

Таким образом, переменной Х, которая пока является свободной, присваивается значение рюрик. После этого унифицируются вторые аргументы,

игорь и святослав. Поскольку это константы, и игорьсвятослав, то унификация предиката parent(рюрик, игорь) и подцели parent(X, святослав) заканчивается неудачей (fail).

Поскольку в базе знаний несколько экземпляров предиката parent, такой предикат называется неоднозначным (non-derministic). Если предикат один, то он называется однозначным (deterministic).

В случае неоднозначного предиката после неудачи выполняется откат - переход к следующему экземпляру предиката. При этом отменяется также присвоение значение переменным, если таковое имело место. Затем выполняется унификация предикатов

parent(ефанда, игорь) и parent(X, святослав).

Очевидно, что результат унификации будет тот же, неудача (fail). При откате на следующий предикат parent(ольга, святослав) картина будет иная: переменной X присвоится значение ольга (Х= ольга), а сопоставление вторых аргументов будет также выполнено: святослав = святослав. Таким образом, первая подцель окажется выполненной. Пролог запоминает, какой экземпляр предиката сработал и устанавливает на следующий предикат указатель отката,после чего перейдет ко второй подцели

parent(Y, X), где X = ольга, т.е.

Пролог ставит себе такую подцель:

parent(Y, ольга).

В поисках родителя Ольги Пролог снова начинает унифицировать этот предикат с начала базы знаний, начиная с parent(рюрик, игорь).

Нетрудно видеть, что на этот раз перебор всех предикатов закончится неудачей, т.е. подцель parent(Y, ольга) не дала положительного решения. В этом случае Пролог откатывается к предыдущей подцели (продвигается назад по списку подцелей) и пытается найти альтернативное решение для parent(X, святослав). При этом X опять становится свободной переменной, а Пролог возвращается к точке отката, то есть к предикату parent (игорь, святослав), сопоставляя его с подцелью parent(X, святослав).

Теперь X = игорь, святослав = святослав, первая цель истинна,указатель отката устанавливается на следующий предикати опять выполняется переход ко второй подцели parent(Y, X), где X = игорь. Пролог снова начинает унификацию подцели parent(Y, игорь) c базой знаний, начиная с первого предиката. В первом предикате происходит унификация константы рюрик и свободной переменной Y.

Происходит присвоение Y= рюрик, затем сопоставляются вторые аргументы. Так как игорь = игорь, сопоставление завершается успешно.

Таким образом, одно решение найдено: Святослав является внуком Рюрика. Но Пролог продолжит поиск решений и сопоставляя подцель parent(Y, игорь) с предикатом parent(ефанда, игорь) найдет еще одно решение Y= ефанда.

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

? parent(X, святослав), parent(Y, X),!.

Заметим, что неудача, которая постигла нас в поисках предков Святослава по материнской линии (Ольги), связана только с неполнотой базы знаний.

Итак, интерпретатор Пролога автоматически выполняет поиск решения. Механизм поиска реализован с помощью отката после неудачи.

Откат происходит на следующий экземпляр неоднозначного предиката. Выполнение программы на Прологе (резолюция цели) заключается в унификации цели с базой знаний.

Факты и правила в Прологе

Описанный выше запрос, устанавливающий отношение типа "прародитель-внук" может потребоваться в дальнейшем неоднократно. В этой связи его целесообразно запомнить в виде правила для дальнейшего использования в других запросах. В базе знаний Пролога можно хранить не только факты, но и правила, т.е. условные отношения. Отношение типа "прародитель-внук" может быть записано следующим образом:

grandparent(X,Y) if parent(X,Z), parent(Z,Y).

Синонимом связки "if" в правиле являются символы ":-", поэтому правило может быть записано в виде.

grandparent(X,Y):- parent(X,Z), parent(Z,Y).

Читать это нужно следующим образом: X является прародителем Y, если X является родителем Z и Z является родителем Y. Предикат grandparent(X,Y) называется заголовком правила, а выражение справа от if – телом правила.

Таким образом, как и в базах данных, в базе знаний Пролога в виде фактов мы храним первичные знания, а производные от них записываем в виде правил, к которым обращаемся так же, как и к фактам.



Поделиться:


Последнее изменение этой страницы: 2017-02-10; просмотров: 127; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.17.128.129 (0.006 с.)