Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
AlgStr / Библиотека / ЛЕКЦИИ / POSIBNIK / ПРОГР НА ПРОЛОГЕ.doc
Скачиваний:
42
Добавлен:
23.03.2015
Размер:
669.7 Кб
Скачать

4.6.2. Властивості відношень бази знань і їхня підтримка в програмі на tp симетрія і асиметрія

Відношення між двома сутностями будуть симетричними, якщо ролі цих сутностей взаємозамінні. Для ПРОЛОГу це значить, що, якщо предикат має властивість симетрії, то порядок задання аргументів у даному запиті не буде мати значення. Наприклад, “брат-або-сестра”.

Нехай у базі даних буде два факти:

брат-або-сестра(василь, тетяна).

брат-або-сестра(тетяна, марія).

Запит:

брат-або-сестра(василь, тетяна).

Так

Але

брат-або-сестра(тетяна, василь).

Ні

Це говорить про те, що yведена тут реалізація відношення “брат-або-сестра” несиметрична.

Існує два шляхи реалізації властивості симетричності в ПРОЛОЗі:

1. До кожного факту виду

ім'я(а, б).

необхідно додавати факт

ім'я(б, а);

2. Написати предикат, що посилається на явну базу даних

брат_сестра(А, Б):-брат_або_сестра(А, Б).

брат_сестра(А, Б):-брат_або_сестра(Б, А).

Зрозуміло, що другий спосіб більш привабливий.

Відношення, що не є симетричним, називається асиметричним, наприклад, “батько-син”.

За умовчанням інтерпретатор ПРОЛОГу вважає, що усі відношення асиметричні.

Рефлексивность і нерефлексивность

Відношення, що завжди дотримується, коли обидва аргументи однакові, називається рефлексивним, наприклад, відношення “рівні”.

Відношення, що порушується, коли обидва аргументи однакові, називається нерефлексивним, наприклад, “вище”.

За умовчанням ПРОЛОГ уважає, що всі предикати рефлексивні.

Наприклад:

конкурент(К1, К2):-

подорож(К1, МістоА, МістоБ, автобус),

подорож(К2, МістоА, МістоБ, автобус).

Тут відсутня умова, яка вказує, що К1 повинно відрізнятися від К2. Тому за умовчанням розуміється, що відношення “конкурент” рефлексивне. Це означає, що можна довести, що деяка транспортна компанія конкурує сама із собою. Тому доцільно переписати це правило таким чином, щоб воно стало нерефлексивним:

конкурент(К1, К2):-

подорож(К1, МістоА, МістоБ, автобус),

подорож(К2, МістоА, МістоБ, автобус),

К1 <> К2.

Транзитивність

Відношення між аргументами називається транзитивним, якщо воно зберігається при переході від прямого відношення до непрямого, наприклад “дорівнює”, “вище”, “предок”.

У мові ПРОЛОГ транзитивне відношення звичайно реалізується за допомогою рекурсивної процедури.

Наприклад, реалізація відношення “предок”. Будемо говорити, що деякий X є предком деякого Z, якщо між X і Z існує ланцюжок людей (можливо, порожній), зв'язаних між собою відношенням “дитина-батько” (рис. 10).

батько

батько предок

батько предок

. . .

Рис. 10. Схема відношень “дитина-батько” і “предок”

Усі відношення можна виразити за допомогою двох правил:

1) безпосередніх предків (найближчих);

2) віддалених предків.

Перше правило легко записати у вигляді

предок(X, Z):-

батько(X, Z).

Друге правило складніше. Можна було б додавати такі правила:

предок(X, Z):-

батько(X, Y),

батько(Y, Z).

предок(X, Z):-

батько(X, Y1),

батько(Y1, Y2),

батько(Y2, Z).

та ін.

Ця програма тривала і працює тільки до певної глибини фамільного дерева (обмеженої максимальною кількістю екземплярів відношення “батько” у визначенні відношення “предок”).

Але є, однак, коректне вдале формулювання відношення “предок”, що буде працювати щодо предків довільної віддаленості. Ключова ідея – визначити відношення “предок” через самого себе:

предок(X, Z):-

батько(X, Y),

предок(Y, Z).

Ці два правила й дають разом визначення процедури “предок”:

предок(X, Z):-

батько(X, Z).

предок(X, Z):-

батько(X, Y),

предок(Y, Z).

Таке визначення, у формулюванні якого було використано саме обумовлене відношення, називається рекурсивним. ПРОЛОГ-система дуже легко обробляє такі визначення. Рекурсія – один із фундаментальних прийомів програмування на ПРОЛОЗі.