- •Міністерство освіти і науки України Дніпропетровський національний університет
- •Програмування мовою пролог
- •Дніпропетровськ
- •1. Основи мови програмування пролог
- •1.1. Основні поняття
- •1.2. Синтаксис мови пролог
- •1.3. Класифікація даних у пролозі
- •1.4. Приклад доказу в пролозі
- •1.5. Подання задачі у вигляді і-або дерева
- •1.6. Структура програми в системі tp
- •1.7. Убудовані типи даних мови tp
- •1.8. Висновки
- •2. Підстави логічного програмування
- •2.1. Принцип резолюцій
- •2.3. Способи застосування принципу резолюцій
- •2.4. Диз’юнкти хорhа
- •3. Три семантичні моделі пролог-програми
- •4. Подання знань
- •4.1. Процес подання знань
- •4.2. Способи подання бази знань
- •4.2.1. Представлення цілісних інформаційних елементів у вигляді фактів
- •4.2.2. Подання атрибутів у вигляді фактів
- •4.2.3. Представлення знань у вигляді списку структур
- •4.2.4. Подання у вигляді рекурсивних структур
- •4.2.5. Подання у вигляді двійкового дерева
- •4.2.6. Порівняння різних виглядів подання бази даних
- •4.2.7. Компонування даних у список
- •4.3. Використання складених об'єктів
- •4.4. Використання альтернативних доменів
- •4.5. Засоби документування програми
- •4.6. Типи й властивості відношень предметної області
- •4.6.1. Обмеження, що забезпечують цілсність відношень
- •4.6.2. Властивості відношень бази знань і їхня підтримка в програмі на tp симетрія і асиметрія
- •Рефлексивность і нерефлексивность
- •Транзитивність
- •Симетричність і транзитивність
- •Спроба 1
- •Спроба 2.
- •Запам'ятовування списку відвіданих місць
- •4.7. Списки
- •4.7.1. Подання й зображення списків
- •4.7.2. Використання списків
- •4.7.3. Метод поділу списку на голову і хвіст (псгх)
- •4.7.4. Списки списків
- •Методи програмування
- •5.1. Повторення і відкіт (пв)
- •5.2. Метод відкоту після невдачі (впн)
- •5.3. Метод відсікання та відкоту (вв)
- •5.4. Повторення та рекурсія (пр)
- •5.5. Метод узагальненого правила рекурсії (упр)
- •5.6. Побудова рекурсивних структур методом прогресуючої підстановки (пп)
- •5.7. Предикат відсікання
- •5.8. Організація багаторазово виконуваних інтерактивних програм (бвіп)
- •5.9. Метод аналізу станів (ас)
- •5.10. Метод організації висхідних рекурсивних обчислень (вро)
- •5.11. Комбінація спадних і висхідних рекурсивных обчислень (ксвро)
- •5.12. Предикат fail-if (not)
- •5.13. Предикат true
- •5.14. Модифікація бази даних (мбд)
- •5.15. Керування базою даних (кбд)
- •5.16. Глобальні змінні (гз)
- •5.17. Накопичування результатів у базі даних за допомогою вимушеного відкоту і глобальної змінної (нрввгз)
- •5.18. Метапрограмування (мп)
- •Список рекомендованої літератури
- •1. Основи мови програмування пролог 4
- •2. Підстави логічного програмування 14
- •3. Три семантичні моделі пролог-програми 20
- •4. Подання знань 23
- •Програмування мовою пролог
5.3. Метод відсікання та відкоту (вв)
У деяких ситуаціях необхідно мати доступ тільки до деякої частини даних. Метод відсікання і відкоту може бути застосованиq для фільтрації даних, вибраних з бази даних. Зручність цього методу проявляється найбільше при великїй кількості умов для вибірки.
У загальному випадку для реалізації цього методу може знадобитися застосування предиката “відсікання” (“!” або “cut”) (див. розд. 5.7). Цей предикат, обчислення якого завжди завершується успішно, змушує внутрішні уніфікаційні процедури “забути” всі покажчики відкоту, установлені під час спроб обчислити поточну підціль.
Іншими словами, предикат cut установлює бар'єр, що забороняє виконати відкіт до всіх альтернативних розв’язків поточної підцілі. Однак наступні підцілі можуть створити нові покажчики відкоту й тим самим створити умови для пошуку нових розв’язків. Область дії даного предиката cut на них уже не поширюється. Але якщо майбутні цілі виявляться неуспішними, то бар'єр, установлений предикатом cut, змусить механізм відкоту відітнути всі розв’язки в області cut шляхом негайного відкоту до інших можливих рішень поза областю дії cut.
Метод відсікання та відкоту застосовує предикат fail для того, щоб імітувати неуспішне обчислення і виконувати наступний відкіт доти, поки не буде виявлена зазначена умова. Предикат cut служить для усунення всіх наступних відкотів.
Проілюструємо даний метод для попередньої бази даних про студентів факультету, поставивши умову - друк студентів факультету до студента з прізвищем Петров включно:
друк_студентів:-
студент(Група, Студент, Стипендія),
write(Студент,” “,Стипендія), nl,
Студент = петров.
Дія цієї програми основана на тому, що відкоти будуть збуджуватися тільки доти, поки значення змінної “Студент” не буде дорівнювати “петров”. Змінимо частково постановку задачі: необхідно роздрукувати інформацію про призначення стипендії для всіх студентів на прізвище Петров. Для цього необхідно умову перевірки прізвища студента поставити перед предикатом write, а механізм відкоту збудити явно за допомогою предиката fail, без застосування відсікання:
друк_студентів:-
студент(Група, Студент, Стипендія),
Студент = петров,
write(Студент,” “,Стипендія), nl,
fail.
Ускладнимо нашу задачу: необхідно надрукувати інформацію про всі види спорту, у змаганнях з яких бере участь перший зустрінутий у базі даних студент із прізвищем Петров:
друк_студентів:-
студент(Група, Студент, Стипендія),
Студент = петров,
!,
write(Студент,” “,Стипендія), nl,nl,
змагання(Група, Студент, Вид_спорту),
write(“ “, Вид_спорту), nl,
fail.
Відсікання, застосоване в цьому правилі, блокує повернення до пошуку інших студентів на прізвище Петров, але не забороняє перевірити усі види спорту, у змаганнях з яких бере участь даний Петров. Природно базу даних задачі розширити інформацією про змагання:
змагання(“ПЗ-98-1”, іванов, баскетбол).
змагання(“ПЗ-98-1”, петров, волейбол).
змагання(“ПЗ-98-1”, петров, стрільба).
змагання(“ПЗ-99-1”, павлов, теніс).
. . .
змагання(“ПЗ-98-1”, сидоров, шахи).
Якщо застосовувати недетерміновану версію предиката “належить” (див. розд. 5.7), то предикат print_list можна реалізувати в такий спосіб:
print_list(L):-
належить(X, L),
write(X), nl,
fail.
print_list(_).
Тут предикат “належить” застосовується для генерації при відкотах різних значень елементів списку. Предикат write виводить згенеровані значення елементів списку на екран, а fail збуджує відкіт для одержання нових (альтернативних) значень елементів списку. При відкоті всі зроблені в процедурі позначення змінних анулюються, тобто змінна X стає вільною, що нам і потрібно. Результат роботи предиката write не зникає (побічний ефект), і наступного разу друкується нове значення змінної X, згенероване предикатом “належить”. Друге твердження процедури служить для того, щоб процедура print_list завжди завершувалася успішно.
Дана схема організації повторення працює тільки у випадку, коли використовується побічний ефект (вивід на екран монітора, вивід у файл або додавання до внутрішньої бази даних). Якщо для генерації ряду значень використовувати детерміновану процедуру або, наприклад, предикат “читання вхідних даних” (read), то дана програмна структура з предикатом fail працювати не буде.