- •Міністерство освіти і науки України Дніпропетровський національний університет
- •Програмування мовою пролог
- •Дніпропетровськ
- •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.8. Організація багаторазово виконуваних інтерактивних програм (бвіп)
Задача. Необхідно організувати програму, яка виконується багаторазово і працює за такою схемою:
ПРОЧИТАТИ ЗНАЧЕННЯ;
ОБРОБИТИ ЙОГО, ОДЕРЖУЮЧИ РЕЗУЛЬТАТ;
НАДРУКУВАТИ ЦЕЙ РЕЗУЛЬТАТ;
і повторити це знову.
Це приклад типової багаторазово виконуваної програми. Перший варіант розв’язння, який приходить на думку – це організувати повторення за допомогою механізму ВПН (див. розд. 5.2):
обробити_значення:-
read(Значення),
обробити(Значення, Результат),
write(Результат), nl, fail.
Слід відзначити, що при відкотах ПРОЛОГ анулює раніше зроблені конкретизації змінних. Ось чому для виведення отриманих результатів ми використовували побічний ефект убудованого предиката write (вивід значення на екран). Без цього ми просто б утратили всі знайдені значення. Але, як виявляється, ця версія процедури не буде працювати багаторазово, тому що після першого ж проходу завершиться. Суть проблеми полягає в тому, що предикат read читає нове значення тільки при першому виклику й не робить цього при відкотах. У результаті предикат “обробити_значення” дає відмову вже після введення й обробки першого введеного значення.
Ці труднощі дозволяє перебороти предикат repeat, що має таке визначення:
repeat.
repeat:-repeat.
Викликаний як ціль, цей предикат завжди узгоджується, навіть при відкотах ( за рахунок другого (рекурсивного) твердження). Із застосуванням предиката repeat дана програма набуде вигляду:
обробити_значення:-
repeat,
read(Значення),
обробити(Значення, Результат),
write(Результат), nl,
fail.
Ця програма буде працювати багаторазово, але вона не матиме завершення. Можна запропонувати таку версію програми, що застосовує відсікання:
обробити_значення:-
repeat,
read(Значення),
дія(Значення),!.
дія(кінець):-!.
дія(Значення):-
обробити(Значення, Результат),
write(Результат), nl,
fail.
Ця програма буде працювати в такий спосіб: уведе “Значення” і передасть його для обробки процедурі “дія”. Процедура складається з двох тверджень: перше твердження перевіряє, чи дорівнює “Значення” спеціальному атому “кінець”; якщо це так, процедура успішно завершується без виконання яких-небудь обчислень. Разом з цим успішно завершується й процедура “обробити_значення”. Якщо введене значення відрізняється від атома “кінець”, то набирає сили друге твердження, яке виконує необхідні дії з обробки введеного значення та друку результата обробки. Це твердження завершується відмовою, що, у свою чергу, збуджує відкіт і в процедурі “обробити_значення”. Відкіт поширюється до предиката repeat і всі дії повторюються знову.
У даному прикладі цікаво проаналізувати роль відсікань. Вони потрібні тільки в тому випадку, коли за ціллю “дія(Значення)” у процедурі “обробити_значення” може стояти ціль, що дає в деяких випадках відмову. Якби в такому випадку не було відсікання в першому твердженні для процедури “дія”, то при відкоті ПРОЛОГ змушений би був обробляти атом “кінець”, який ніякій обробці піддаватися не повинний. Це відсікання робить процедуру “дія” однократно виконуваною (детермінованою). Тут працює другий побічний ефект предиката “відсікання”.
Відсікання в процедурі “обробити_значення” змушує ПРОЛОГ відмовитися від обробки альтернативних гілок у межах цього твердження, що знаходяться вище відсікання (перший побічний ефект предиката відсікання). За його відсутності, не можливо при відкоті завершити роботу цієї процедури. Відкіт буде зроблений до підцілі, що знаходиться десь перед ціллю “обробити_значення”.
Розглянута структура широко застосовується при організації інтерактивних (діалогових) програм, наприклад програм з використанням меню.
Підсумовуючи вищезазначене, можна зробити такі висновки:
Відсікання являє собою процедурний механізм, що обмежує кількість альтернативних гілок у дереві задачі, але маскує при цьому декларативну інтерпретацію процедури.
Відсікання, роблячи процедуру детермінованою, може запобігти марним спробам пошуку, а також забезпечити взаємовиключальність тверджень.
Правильне розташування відсікання й розміщення тверджень у потрібному порядку дуже істотні для правильного застосування цього предиката.
Альтернатива відсіканню – предикат not , але процедура при цьому може стати менш ефективною.
Альтернатива рекурсії – це спільне застосування fail і repeat. При одержанні результатів за допомогою методу ВПН ставка робиться на побічні ефекти, тобто при поверненні всі конкретизації, застосовані до змінних, анулюються.