- •Міністерство освіти і науки України Дніпропетровський національний університет
- •Програмування мовою пролог
- •Дніпропетровськ
- •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.2. Метод відкоту після невдачі (впн)
Як уже зазначалося, при доведенні внутрішньої цілі вбудовані уніфікаційні процедури ПРОЛОГу зупиняють пошук рішень після першого ж успішного обчислення цілі. Для керування обчисленням внутрішньої цілі при пошуку всіх можливих її розв’язків можна застосувати убудований предикат fail. При виклику він завжди дає відмову й застосовується тільки для ініціювання механізму відкоту. Для ілюстрації цього механізму розглянемо задачу друку спипендіальної відомості деякої студентської групи, що зберігається у вигляді набору фактів:
студент(“ПЗ-98-1”, іванов, 39).
студент(“ПЗ-98-1”, петров, 39).
студент(“ПЗ-99-1”, павлов, 49).
студент(“ПЗ-99-1”, петров, 49).
. . .
студент(“ПЗ-98-1”, сидоров, 79).
друк_групи(Група):-
студент(Група, Студент, Стипендія),
write(Студент,” “,Стипендія), nl,
fail.
При виклику цілі “друк_групи(“ПЗ-98-1”)” обчислення починаються з першої підцілі, що буде мати вигляд “студент(“ПЗ-98-1”, Студент, Стипендія)”. Вона служить для пошуку в базі даних придатного твердження й означування змінних “Студент” і “Стипендія”. Такий запис у базі даних існує (перший) і змінні одержать відповідні значення “іванов” і “39”. Оскільки в базі даних існують й інші твердження, що можуть бути використані для доказу цієї цілі, перед першим із них ПРОЛОГ поставить покажчик відкоту. Потім спрацює підціль “write(Студент, “ ”, Стипендія)” й інформація про знайденого студента групи ПЗ-98-1 і його стипендію буде виведена на екран. Після цього буде переведений рядок і виконається предикат fail.
Предикат fail викликає неуспішне завершення правила (хоча ми зробили з першим студентом усе що нам і було потрібно – вивели його прізвище і його стипендію на екран), внутрішні уніфікаційні процедури виконають відкіт до найближчого покажчика відкоту (до другого запису бази даних) і процес повториться доти, поки не буде оброблене останнє твердження.
Слід зверніти увагу, що будуть надруковані тільки студенти групи “ПЗ-98-1”, тому що для студентів інших груп підціль “студент(“ПЗ-98-1”, Студент)” не зможе узгодитись. У такий спосіб цим методом можна обробляти не всі записи бази даних, а тільки ті, які задовольняють задані умови. Ці умови можна задавати як у самій підцілі, що дістає інформацію з бази даних, так і за допомогою підцілі, що міститься в тілі правила (така підціль буде називатися сторожовою). Визначення предиката “друк_групи”, за необхідності надрукувати список студентів, що одержують підвищену стипендію, буде мати такий вигляд:
друк_групи(Група):-
студент(Група, Студент, Стипендія),
Стипендія > 39,
write(Студент,” “,Стипендія), nl,
fail.
Правила, що застосовують предикат fail у такому вигляді як показано вище, ніколи не можуть завершитися успішно. Тому визначення таких предикатів іноді доповнюється ще одним твердженням, після того як усі альтернативи в базі даних будуть перебрані. Щоб визначення попереднього предиката завжди завершувалось успішно, він повинен мати такий вигляд:
друк_групи(Група):-
студент(Група, Студент, Стипендія),
Стипендія > 39,
write(Студент,” “,Стипендія), nl,
fail.
друк_групи( _ ).
Такий предикат може застосовуватись як підціль у тілі якого-небудь правила в ланцюжку інших підцілей і не викличе ініціювання небажаного відкоту, наприклад:
Обробка(Група):-
друк_шапки,
друк_групи(Група),
підведення_підсумків.