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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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