Page 25 - 4800
P. 25
цьому прізвище цього службовця вводиться, починаючи із символу, наприклад, ’<’.
Вибір цього символу довільний
Перша підмета дасть істинний результат, якщо першим символом Х буде ’<’.
Змінна Z у цьому випадку прийме значення залишку рядка X, починаючи з другого
символу. В інших випадках, підмета завершиться невдачею, викликаючи невдачу і
всього правила. Фактично ця підмета є умовою входу на обробку правила.
Наступні дві підцілі при узгодженні виводять на екран першу пару колег, а
четверта – забезпечує повернення до пошуку наступної пари, якщо прізвище першого з
колег не збігається з введеним з клавіатури. Як тільки ці прізвища співпадуть, тобто
Q=Z стане істиною, виконається відсікання, що не дозволить предикатові fail
забезпечити відкат до пошуку нової пари колег, що викликає закінчення виконання
даного правила.
Наявність у правилі предиката відсікання не тільки обмежує область пошуку в
базі даних заданим прізвищем, але і забезпечує завершення всієї процедури
do_answer(). Завершення процедури приводить до повернення до правила query.
Варто особливо звернути увагу на те, що відкат до пошуку альтернативних
рішень підмети colleague(Q, Y) у даному правилі, на відміну від правил 2 або 5, виконує
не fail, а підмета Q=Z. Тоді, чи потрібний у цьому правилі взагалі предикат fail, а якщо
потрібний, то навіщо?
Уся справа в тому, що процедура do_answer() виконується не сама по собі, а
викликається як остання мета правила query. Тому, крім функцій пошуку даних у базі,
на неї покладена функція керування відкатом до предикату repeat, тобто організація
повторень по вводу даних.
Присутність у правилі 4 предиката fail приводить до того, що незважаючи на
успішно виконаний запит до бази даних, правило закінчується невдачею. Невдачею
завершується і запит з query до процедури do_answer(), що викликає відкат до repeat і
повторення вводу даних.
Якщо в правилі 4 не буде предиката fail, то після виконання пошуку в базі
правило буде успішно виконаним. Успішним буде і звертання з query до процедури
do_answer(), що веде до того, що і правило query стане істинним. Це викликає його
закінчення, а разом з цим і закінчення вводу запитів.
Але тому що ознакою закінчення вводу повинен бути ввід слова „stop”, то
закінчення роботи програми за іншою вимогою було б помилкою, що і вимагає
обов'язкового включення предиката fail у правило 4.
2.10 Відкат і відсікання при реалізації відносин типу „один-до-багатьох”
Облік асоціацій (зв'язків) між об'єктами відносин служить засобом оптимізації
запитів у Пролозі. Розглянемо це на прикладі простого відношення
Батько(Ім’я, Дитина),
яке в програмі визначається набором деяких фактів. Між об'єктами даного відношення
існує асоціація „один-до-багатьох”. Запит до даної бази може полягати:
– або в пошуку батька конкретної дитини (у цьому випадку має місце простий
зв'язок);
– або в пошуку всіх дітей конкретного батька (у цьому випадку має місце
складний зв'язок);
Найбільш примітивний спосіб реалізації простого зв'язку полягає в написанні
правила, що повинне виконати пошук факту, а потім пройти через предикат відсікання.
Для реалізації складного зв'язку необхідний пошук всіх альтернативних рішень у базі
даних. Використання нової процедури parent (батько), що враховує вказані зауваження,
забезпечить інтерфейс роботи з БД father() .
Причому цей інтерфейс враховує наявний зв'язок між об'єктами відносин БД
father() і оптимізує виконання запиту Прологом.
/* програма 2.5 */
domains
nаме, child = symbol
predicates
father(name,child)
25