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
   20   21   22   23   24   25   26   27   28   29   30