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

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

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

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

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

Наприклад:

конкурент(К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).

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

Симетричність і транзитивність

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