Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
AlgStr / Библиотека / ЛЕКЦИИ / POSIBNIK / ПРОГР НА ПРОЛОГЕ.doc
Скачиваний:
42
Добавлен:
23.03.2015
Размер:
669.7 Кб
Скачать

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 і всі дії повторюються знову.

У даному прикладі цікаво проаналізувати роль відсікань. Вони потрібні тільки в тому випадку, коли за ціллю “дія(Значення)” у процедурі “обробити_значення” може стояти ціль, що дає в деяких випадках відмову. Якби в такому випадку не було відсікання в першому твердженні для процедури “дія”, то при відкоті ПРОЛОГ змушений би був обробляти атом “кінець”, який ніякій обробці піддаватися не повинний. Це відсікання робить процедуру “дія” однократно виконуваною (детермінованою). Тут працює другий побічний ефект предиката “відсікання”.

Відсікання в процедурі “обробити_значення” змушує ПРОЛОГ відмовитися від обробки альтернативних гілок у межах цього твердження, що знаходяться вище відсікання (перший побічний ефект предиката відсікання). За його відсутності, не можливо при відкоті завершити роботу цієї процедури. Відкіт буде зроблений до підцілі, що знаходиться десь перед ціллю “обробити_значення”.

Розглянута структура широко застосовується при організації інтерактивних (діалогових) програм, наприклад програм з використанням меню.

Підсумовуючи вищезазначене, можна зробити такі висновки:

  1. Відсікання являє собою процедурний механізм, що обмежує кількість альтернативних гілок у дереві задачі, але маскує при цьому декларативну інтерпретацію процедури.

  2. Відсікання, роблячи процедуру детермінованою, може запобігти марним спробам пошуку, а також забезпечити взаємовиключальність тверджень.

  3. Правильне розташування відсікання й розміщення тверджень у потрібному порядку дуже істотні для правильного застосування цього предиката.

  4. Альтернатива відсіканню – предикат not , але процедура при цьому може стати менш ефективною.

  5. Альтернатива рекурсії – це спільне застосування fail і repeat. При одержанні результатів за допомогою методу ВПН ставка робиться на побічні ефекти, тобто при поверненні всі конкретизації, застосовані до змінних, анулюються.