Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛабПрактикум(1-5)_ПЗ в ИС_2011 .doc
Скачиваний:
27
Добавлен:
19.11.2019
Размер:
1.56 Mб
Скачать

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

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

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 – телом правила.

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

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

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

Для родственных отношений мы можем установить множество правил, избавляясь от необходимости вводить дополнительные факты, например, кто

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

sibling(X,Y) :- parent(Z,X), parent(Z,Y), X< >Y.

Предикат сравнения X< >Y нужен для того, чтобы Пролог не выводил решения, что каждый сам себе брат или сестра.

Для точного определения брат это или сестра, тетя или дядя, бабушка или дедушка, мать или отец и т.п. необходимо добавить факты полового признака – одноместные предикаты, например, men и women

man (рюрик). man (игорь). man (святослав). и т.д.

woman (ефанда). woman (ольга). и т.д.

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

uncle(X,Y) :- parent(Z,Y), sibling(X,Z), man(X).

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

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

Если в цепочке предикатов внутри правила встречаются как однозначные, так и неоднозначные предикаты, то откат после неудачи выполняется на ближайший неоднозначный предикат.

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

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

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

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

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

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

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