Помощь в написании студенческих работ
Антистрессовый сервис

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

РефератПомощь в написанииУзнать стоимостьмоей работы

Аналогично предыдущему примеру Пролог унифицирует заголовок правила grandparent (X, Y) и присваивает значение Y = denis. Углубляясь в тело правила, Пролог формирует подцель parent (X, Z). Данная подцель возвращает, как и в предыдущем примере,. Читать это нужно следующим образом: X является прародителем Y, если X является родителем Z и Z является родителем Y. Предикат grandparent (X, Y) называется… Читать ещё >

Факты и правила в прологе (реферат, курсовая, диплом, контрольная)

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

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

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

Примечание: Синонимом связки «if' в правиле являются символы «:

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

Факт — это то, что известно.

Правило—это способ порождения новых фактов на основе имеющихся.

Для родственных отношений мы можем установить множество правил, избавляясь от необходимости вводить дополнительные факты, например, кто кому приходится братом, племянником и т. д. Правило, определяющее отношение брат (сестра):

sibling (X, Y): — parent (Z, X), parent (Z, Y), XoY.

Предикат сравнения XoY нужен для разрешения коллизии типа «сын моего отца, но мне не брат». Правило, определяющее отношение типа дядя, выглядит следующим образом:

uncle (X, Y): — parent (Z, Y), sibling (X, Z).

Когда в ходе резолюции цели Пролог встречает не факт, а правило, то вначале унифицирует заголовок правила, т. е. сравнивает связанные переменные и присваивает значения свободным переменным. В случае успешной унификации аргументов Пролог подставляет значения аргументов из заголовка в первый предикат в теле правила и ставит этот предикат себе в качестве подцели, которую начинает унифицировать с базой знаний. В случае успешной резолюции данной подцели Пролог переходит к следующему условию правила. Если унификация этого предиката условия приводит к неудаче, то Пролог выполняет откат к предыдущему условию правила. Этот откат происходит только в том случае, если этот предыдущий предикат является неоднозначным. Поясним это на примере. Зададимся целью найти, кто является прародителем Кристины:

grandparent (Who, kristina).

Получив такую цель, Пролог начинает унифицировать ее с правилом: grandparent (X, Y): — parent (X, Z), parent (Z, Y). Переменная Who в предикате цели является свободной переменной и ее унификация с переменной X в заголовке правила будет успешной всегда. Следует заметить, что в Прологе все переменные являются локальными, т. е. существует только внутри правила. Мы могли бы использовать X вместо Who, и это были бы разные переменные, которые бы унифицировались точно так же. При необходимости создания глобальных переменных используют динамические факты, которые создаются предикатом assert и уничтожаются предикатом retract или retractall.

Далее унифицируются константа kristina с переменной Y. Поскольку переменные в заголовке правила всегда сначала являются свободными, выполняется присвоение: Y = kristina. Поскольку унификация заголовка правила прошла успешно, Пролог углубляется в тело правила и ставит себе в качестве подцели первый предикат тела правила, подставляя переменные, если они связанные:

parent (X, Z).

Переменные X и Z являются свободными, поэтому успешной будет унификация данной подцели с первым же предикатом parent из базы знаний:

X = boris, Z = alia.

После этого Пролог переходит ко второму предикату в правиле, подставляя значение X и Y:

parent (alia, kristina).

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

Who = X = boris.

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

grandparent (Who, denis).

Аналогично предыдущему примеру Пролог унифицирует заголовок правила grandparent (X, Y) и присваивает значение Y = denis. Углубляясь в тело правила, Пролог формирует подцель parent (X, Z). Данная подцель возвращает, как и в предыдущем примере,.

X = boris, Z = alia.

Пролог переходит ко второму предикату правила, подставляя в parent (Z, Y) значения переменных:

parent (alia, denis).

Пытаясь унифицировать данную подцель, Пролог сопоставляет переменные (alia, denis) с первым экземпляром предиката parent, терпит неудачу, откатывается к следующему экземпляру и так далее. Поскольку факта parent (alia, denis) в базе знаний нет, резолюция данной подцели оказывается неудачной. Следовательно, унификация первого предиката правила значениями X = boris, Z = alia является неверной. Поэтому Пролог выполняет откат к предыдущему условию правила и пытается найти другое решение для подцели parent (X, Z). При этом отменяется присвоение переменных (X = boris, Z = alia). Переменные X и Z вновь становятся свободными. Заметим, что откат здесь возможен только на неоднозначный предикат. Если в цепочке предикатов внутри правила встречаются как однозначные, так и неоднозначные предикаты, то откат после неудачи выполняется на ближайший неоднозначный предикат.

При первой унификации данного предиката Пролог установил указатель отката на следующий экземпляр факта parent:

parent (boris, alia).

> parent (bedros, filipp). parent (edmuntas, kristina). parent (alia, kristina). parent (kristina, denis).

При откате Пролог приступает к унификации данного факта и устанавливает указатель отката на третий экземпляр:

parent (boris, alia), parent (bedros, filipp).

> parent (edmuntas, kristina). parent (alia, kristina). parent (kristina, denis).

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

X = bedros, Z = filipp.

и снова переходит ко второму предикату parent (Z, Y):

parent (bedros, denis).

Очевидно, резолюция и этой подцели завершается неудачей. Пролог снова откатывается к предыдущему предикату правила и к третьему экземпляру факта parent. Успешной окажется только унификация четвертого факта: parent (alia, kristina), в результате чего мы получим.

Who = X = alia.

Так работает интерпретатор Пролога в случае наличия правил в базе знаний. Таким образом,.

Факт — знания, основанные на константах (неизменяемые знания).

Правила — знания, которые выводятся на основании фактов.

Набор фактов и правил не содержит в себе алгоритма.

Правила и факты существуют независимо друг от друга.

Объединение правил для вывода результата происходит в ходе резолюции цели.

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

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

Показать весь текст
Заполнить форму текущей работой