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

Методи програмування

Досить часто в програмах необхідно виконувати деякі дії багаторазово. Такі програми прийнято називати циклічними, а фрагменти програми, що організують таке багаторазове виконання – циклами. Для цього в імперативних алгоритмічних мовах існують спеціальні оператори – оператори циклу (наприклад, конструкції типу for ... do ; while ... do або repeat ... until). У крайньому випадку цикли можна організувати за допомогою операторів розгалуження й переходу. Як зазначалося, у ПРОЛОЗі нічого подібного немає. Але в системі ПРОЛОГ існує два інших альтернативних механізми для організації повторення. Це повторення на базі механізму відкоту (повторення) і рекурсії (самовиклику).

Ці методи можуть забезпечити однаковий результат, хоча алгоритми їхнього виконання різні. Кожний із них має свою область застосування і має в конкретній ситуації свої переваги. Рекурсія потребує більше системних ресурсів: при кожному рекурсивному виклику нові копії значень, що використовуються, містяться у стек. Стек використовується для передачі значень між правилами. Це використання стеку буде оправдане, якщо проміжні результати будуть зберігатись для подальшого використання у певному порядку. TP має засоби для автоматичного звільнення частини стеку, що використовується. Але для правил на базі відкоту ці засоби не використовуються: вони не збільшують зайняту частину стеку.

Повторення. Правила повторення мають такий вигляд:

правило_повторення :-

< предикати >,

fail.

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

Рекурсія. Правила рекурсії мають такий вигляд:

правило_рекурсії :-

< предикати >,

правило_рекурсії.

Правила рекурсії мають у тілі виклик себе.

Всі методи програмування можна класифікувати за такою схемою (рис. 13) .

Алгоритми на базі відкоту застосовуються для обробки бази данних ПРОЛОГу, що зберігається у вигляді фактів (див. розд. 4.2.1, 4.2.2). Алгоритми на базі рекурсії можуть використовуватись тільки при обробці рекурсивних структур (списки, дерева та загальні рекурсивні структури (див. розд. 4.2.3, 4.2.4, 4.2.5)). Зв’язок між ними забузпечується убудованим предикатом findall (див. розд. 4.2.7).

Методи програмування

на базі відкоту на базі рекурсії

. findall .

ОПН МБД ПР УПР АС ПСГХ

ПВ ВВ КБД ПП ВРО МП

БВІП ГЗ КСВРО

НРВВГЗ

Рис. 13. Класифікація методів програмування

5.1. Повторення і відкіт (пв)

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

Проаналізуємо поводження ПРОЛОГу при відкоті на прикладі простої бази даних про спортивні уподобання студентів, що містить факти:

грає(сашко, баскетбол).

грає(марія, волейбол).

грає(марія, теніс).

грає(тетяна, волейбол).

грає(сашко, теніс).

грає(тетяна, теніс).

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

Розглянемо поводження інтерпретатора ПРОЛОГу при доведенні цієї цілі (рис. 14).

База даних: Ціль:

грає(марія, Гра), грає(тетяна, Гра).

грає(тетяна, волейбол)

грає(сашко, баскетбол). Невдача і

виконання відкоту

грає(марія, волейбол). Гра = волейбол

^1 грає(марія, теніс). Гра = теніс

^2 грає(тетяна, баскетбол). грає(тетяна, теніс)

грають(сашко, теніс).

грає(тетяна, теніс). Успішне завершення ( інших рішень немає)

Рис. 14. Відкіт при неоднозначному завершенні цілі.

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

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

Друга підціль неуспішна, тому ПРОЛОГ повинний повернутися до обчислення першої підцілі. При цьому змінна “Гра” знову стає вільню і ПРОЛОГ починає пошук твердження для зіставлення з підцілью “грає(марія, Гра)”. Пошук починається з найближчого покажчика відкоту – це покажчик ^1. Наступне придатне твердження – це твердження “грає(марія, теніс)”. Змінна “Гра” одержує значення теніс. Знову покажчик відкоту ^2 установлюється на наступне твердження. Тепер ПРОЛОГ намагається довести другу підціль грає(тетяна, теніс). ПРОЛОГ знаходить у базі даний потрібний факт і фіксує успіх: обидві підцілі успішно доведені при значенні змінної “Гра = теніс”. Це значення і видається користувачу як результат доказу всієї цілі. Більше розв’язків немає і ПРОЛОГ на цьому завершує обробку запиту.

При доказі зовнішньої цілі (цілі у вікні Dialog) ПРОЛОГ шукає всі можливі розв’язки. У даному випадку розв’язок єдиний, тому на цьому обчислення закінчуються. Якби існували інші розв’язки, то ПРОЛОГ видав би знайдений розв’язок користувачу, відмовився б від нього (звільнив змінні), відкотився б до найближчого покажчика відкоту й продовжив пошук інших розв’язків. Для внутрішньої ж цілі процес обчислення зупинився б після першого її успішного обчислення. Для стимулювання ПРОЛОГу до пошуку інших розв’язків довелося б застосувати спеціальні методи.

Відкіт – стандартний механізм, убудований у логіку роботи інтерпретатора ПРОЛОГу. Але цим процесом можна керувати за допомогою убудованих предикатів fail (невдача) і cut (відсікання).

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