- •Міністерство освіти і науки України, молоді та спорту
- •Розділ ι. Механізм повернення та відсічки в логічному програмуванні
- •Механізм перепогодження цільових тверджень.
- •2. Суть механізму відсічки у логічному програмуванні
- •3. Основні випадки застосування механізму відсічки
- •Розділ ιi. Типові способи використання механізму відсічки та повернення
- •1. Комбінація відсічки та предиката fail
- •Типові випадки використання механізму генерування розв'язків та перевірки
2. Суть механізму відсічки у логічному програмуванні
Слово "відсічка" походить від англійського слова cut, що означає скорочення. Але термін "відсікання" використовувався в перших роботах з логічного програмування і використовується досі.
Можна виділити, принаймні, дві причини, які зумовлюють необхідність використання цього механізму для побудови логічних програм:
-
програма виконуватиметься швидше, якщо не будуть перебиратися розв'язки, про які відомо, що вони не несуть більше ніякої корисної інформації;
-
забезпечується значна економія пам'яті, оскільки немає потреби запам'ятовувати місця погодження цілей, для яких зникає потреба їх перепогоджувати;
-
іноді увімкнення цього механізму означає перехід від непрацюючої програми до працюючої, що має прикладне значення.
Згідно із синтаксисом мови Пролог для введення в програму механізму відсічки використовується предикат !, який не має аргументів. Цей предикат завжди погоджений з базою даних і не потребує порівняння чи повторного погодження. Окрім цього цей предикат має ще й сторонній ефект, який змінює перепогодження цілей. Суть ефекту в тому, що маркери деяких цілей стають недоступними і для них неможливо знайти нове порівняння.
Як приклад розглянемо базу даних на Пролозі, яка містить інформацію про наявність книг, хто і які книги взяв і коли закінчується термін їх повернення. Один із запитів, який можна сформулювати - це які послуги можна надавати читачам. Допустиме користування каталогом та отримання довідок є доступним для кожного читача. Назвемо ці послуги основними. Додаткові послуги, такі, як абонемент та міжбібліотечний абонемент, можна надавати читачам, які не мають боргів. Очевидно, слід сформулювати правило, згідно якого читач, що не повернув книгу в зазначений термін, не може отримувати додаткові послуги доти, доки книга не буде повернена. Частина програми, яка використовує це правило, записана нижче на псевдо-Пролозі:
послуги(Читач,Вид_послуг):-книга_не_повернута (Читач,Книга) , ! ,основніпослуги (Вид_послуг).
послуги(Читач,Вид_послуг):-загальні_послуги (Вид__послуг) .
основні_послуги(користування_каталогом). основні_послуги(користування_довідкою).
додаткові_послуги(абонемент).
додаткові_послуги(міжбібліотечний_абонемент) . загальні_послуги(X):- основні_послуги(Х).
загальні_послуги(X):- додаткові_послуги(X).
книга_не_повернута('Іванов' ,книга54).
……………………………………
читач('Іванов'). читач('Петров').
В першому правилі цієї програми використовується відсічка після погодження цілі книга_не__повернута. З цього моменту всі прийняті рішення з моменту вибору твердження послуги заморожуються і ніяк змінені бути не можуть. Це логічно правильно, бо після цього буде погоджено ціль основні_послуги і більш ніякі інші альтернативні рішення ні до цілі книга__не_повернута, ні до цілі послуги розглядатися не будуть.
Якщо читач не є боржником, ціль книга_не_повернута не може бути погоджена з базою даних і маркер прологівської програми переміститься до другого правила визначення предикату послуги, згідно з яким можуть бути надані всі види послуг.
У розглянутому прикладі відсічка привела до скорочення всіх можливих альтернатив розв'язків (рішень), які прийняті після вибору цільового твердження послуги. Цільове твердження (заголовок правила), яке приводить до використання механізму відсічки називається батьківським. З формального погляду ефект механізму відсічки можна сформулювати так:
за наявності відсічки в ролі цільового твердження система не має можливості змінити рішення, які прийняті з моменту виклику батьківського твердження і всі можливі альтернативи прийнятим рішенням не розглядаються. Отже, спроба перепогодження цільового твердження, що є між батьківською ціллю і власне відсічкою, завжди завершується неуспіхом.
Механізм відсічки можна інтерпретування як деякий кордон, до пересікання якого всі підцілі можуть погоджуватися і перепогоджуватися довільну кількість разів, аналогічно до того, ж це відбувається без предиката!. Але якщо виникає ситуація, при якій відбудеться повернення системи через відсічку справа наліво, то не буде здійснено ніяких спроб до перепогодження цілей ліворуч від відсічки. 6 цьому випадку доведення погодженості кон'юнкції цілей зазнає невдачі
Відзначимо, що в Пролозі є можливість вказувати альтернативні рішення в рамках одного правила, використовуючи вбудований предикат ; (інтерпретується як або). На вибір альтернатив механізм відсічки діє у такий самий спосіб, як і на будь-які інші підцілі. Тобто за наявності відсічки всі зроблені або-вибори фіксуються з моменту виклику правила, яке містить відсічку після повторного переходу через неї справа наліво.
