Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
48
Добавлен:
05.03.2016
Размер:
1.28 Mб
Скачать

6.6 Реалізація циклічних процедур за допомогою бектрекінгу

6.6.1. Реалізація ітераційного процесу за допомогою бектрекінгу

Пролог реалізує тільки два типи повторних дій: бектрекінг і рекурсію. В програмі 6.3 показано використання бектрекінгу для реалізації циклу. На поставлений запит будуть друкуватись усі можливі розв’язки.

/*програма 6.3*/

predicates

country(symbol)

print_countries

clauses

country(„Англія”).

country(„Франція”).

country(„Італія”).

country(„Данія”).

print_countries :- country(X), write(X), nl, fail.

print_countries.

Перша фраза говорить: “Знайти розв'язок предикату cоuntry(Х), надрукувати країну Х і перейти на новий рядок.” Потім викликається предикат fail. В цьому випадку fail означає: якщо розв'язок поставленої цілі ще може бути знайдений, тоді повернутись і пошукати альтернативний розв'язок.

Вмонтований предикат fail завжди має хибне значення, але ми могли б форсувати бектрекінг, використавши якийсь інший, завжди хибний предикат типу 10 = 3 + 4, або country(abracadabra) .

Таким чином, будуть надруковані усі країни і процес обробки системою першої фрази завершиться. Після цього, почнеться обробка другої фрази того ж предикату print-countries. Вона нічого не робить, а тільки завершує успіхом роботу системи. Кінцевий результат буде мати вигляд:

Англія

Франція

Італія

Данія

Yes

Якби не було другої фрази, вивід завершився – No, а все інше залишилось без змін.

6.6.2 Дії типу ’до’ і ’після’

Можливо в попередній програмі треба для наглядності зробити наступні зміни:

– надрукувати заголовок;

– надрукувати всі можливі розв'язки запиту;

– надрукувати в кінці заключне повідомлення.

Тоді нам потрібно в попередню програму внести модифікації у визначенні предикату Print-countries.

print_countries:- write("Декілька країн які входять в Євросоюз "), nl, fail.

print_countries:- country(X), write(X), nl, fail.

print_countries:- write("А також є інші."), nl.

6.6.3. Застосування бектрекінгу для реалізації циклів

Розглянемо наступний предикат (знайомий ще з лабораторної роботи №4)

repeat.

repeat:-repeat.

Такий трюк дозволяє реалізувати керуючу структуру, яка забезпечує оримання нескінченної кількості розв’язків. Для прикладу розглянемо наступну програму.

predicates

repeat

typewriter

clauses

repeat.

repeat :- repeat.

typewriter :- repeat, readchar(C), write(C), char_int(C,13).

Ця програма показує як працює repeat. Правило typewriter... описує процедуру, яка отримує символи з клавіатури і друкує їх на екрані, поки не буде натиснута клавіша ENTER (ASCII кoд 13).

Вона працює так:

– виконається repeat (який нічого не робить);

– читається символ в змінну C;

– друкується C;

– перевіряється чи С не дорівнює 13 в коді ASCII.

– якщо так, тоді фініш. Інакше, починається бектрекінг і перегляд альтернатив. Ні write ні readchar не генерують альтернативних розв’язків, тому бектрекінг веде до repeat, котрий дозволяє отримати альтернативні розв’язки.

– тепер обробка може повернутись знову на початок, читати інший символ, друкувати його, перевіряти його код на рівність 13.