Описание правил
Правило формируется в том случае, если некоторый факт зависит от группы других фактов. Правило состоит из заголовка и тела. Они соединяются символом “: -” или “if” (если). Пример: предложение “Виктору нравится любой студент, которому нравится учеба” записывается как “ нравится (виктор, X): -студент(X), нравится(X, учеба) ”.Правило является в большинстве случаев более компактным и очевидным описанием, чем простое множество фактов, подчиняющееся данному правилу. Пример. Пусть имеется программа с базой знаний в виде группы фактов в разделе clauses: отец(павел, юлия). мать(юлия, михаил). Для того чтобы узнать, кто является дедом Михаила по материнской линии, нужно задать вопрос: отец(X, Y), мать(Y, михаил). Ясно, что проще оформить запрос как дед(X, михаил). Тогда в программе нужно сформулировать соответствующее правило: дед(X, Y): -отец(X, Z), мать(Z, Y), которое читается как “X является дедом Y, если X является отцом Z, и Z является матерью Y”. Факты правил сами могут быть раскрыты в виде правил. Рассмотрим следующую программу, содержащую факты и правила: domains имя=symbol predikates отец(имя, имя) супруг(имя, имя) дед(имя, имя) мать(имя, имя) clauses 10 отец(андрей, алексей). 20 отец(федор, мария). 30 отец(алексей, лариса). 40 отец(алексей, владимир). 50 супруг(алексей, мария). 60 дед(X, Y): - отец(X, Z), отец(Z, Y). 70 дед(X, Y): -
примеры наиболее широко используемых критериев. Правила-критерии нечетких выводов для Ì , Ì :
I. Пр1: если есть , то есть Пр2: есть Сл: есть .
II-1.Пр1: если есть , то есть Пр2: есть очень Сл: есть очень .
40b отец(владимир, Y). В третьем цикле предложение 40b не унифицируется ни с одним из пунктов 10, 20, 30. Интерпретатор оказывается в тупике и возвращается к ближайшему состоянию 40a (точка возврата ТВ), из которого был начат последний процесс решения целей, для поиска других вариантов. В четвертом цикле первый литерал в 40a унифицируется уже со следующим после 10 фактом 20: “ андрей ” заменяется на X, “ алексей ” на Z1. Литерал отец(X, Z1) становится конкретным фактом 20. Второй литерал из 40a остается в стеке вопросов: 40c отец(алексей, Y). В пятом цикле литерал 40c унифицируется с фактом 10 и “ владимир ” заменяется на Y. Цель разрешена. После удаления литерала отец(алексей, Y) из стека других целей в нем не оказывается. Найден вариант ответа: X=андрей, Y=владимир. Затем интерпретатор путем возврата в ближайшее состояние 40, из которого был начат весь рассмотренный процесс, пытается другими способами исчерпать стек вопросов путем просмотра других правил после 30. В нашем примере других правил нет, нет и других решений. Поэтому работа программы заканчивается. Предикат “отсечение”. Специальное средство “! ” позволяет обходить при возврате некоторые цели. Пример запроса 1: отец(X, Y),!. Здесь две цели (два подвопроса). Пролог решает первую цель по первому подходящему факту и в соответствии с алгоритмом переходит ко второй цели, которая указывает, что невозможно возвращаться назад и процесс прекращается. Пример запроса 2: цель1, цель2,!, цель3, цель4. Последовательно анализируется одна за другой четыре цели. При поиске решения в случае неудачи возвраты возможны только по цепочке 4-3, но не далее. Пример программы: 10 отец(a, b). 20 отец(b, c). отец(c, d). предок(X, Y): - отец(X, Y). предок(X, Y): - отец(X, Z), предок(Z, Y). Запрос: отец(X, Y),!, отец(Y, Z). Интерпретатор решает первую цель и уже по факту 10 находит X=a, Y=b. Теперь необходимо удовлетворить вторую цель. Так как Y=b, то только факт 20 унифицируется с этой целью: Z=c. Для поиска всех решений надо вернуться по цепочке целей стека вопросов к первой цели. Но перед ней стоит знак “! ”. Возврат запрещен, хотя очевиден другой вариант: X=b, Y=c, Z=d. Таким образом, ответ следующий: X=a,
Объединение È : = Ú = = (, ). Пример:
Алгебраическое произведение × : = = × ). Свойство дистрибутивности для È и ×: Ç ( È )=( Ç )È ( Ç ); È ( Ç )=( È )Ç ( È ); × ( È )=( × )È ( × ); × ( Ç )=( × )Ç ( × ). Алгебраическая сумма + : = + - - × . Дополнение : =1- . Дизъюнктивная сумма: Å =( Ç )È ( Ç ). , ближайшее к : 0, если < 0.5, = 1, если > 0.5, 0 или 1, если = 0.5.
|