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

5.6. Побудова рекурсивних структур методом прогресуючої підстановки (пп)

Задача. Побудувати список , що складається з чисел Фібоначчі.

Числа Фібоначчі визначаються за допомогою такого рекурсивного правила

F0 = 0

F1 = 1

Fn +2 = Fn +2 + Fn +2 для n >= 1

Числа Фібоначчі можна обчислити за допомогою процедури “fib(номер,число)” на основі наявного рекурсивного визначення:

fib(0,0). % Тривіальні

fib(1,1). % розв’язки

fib(N2,FN2):- % Рекурсивний розв’язок

N1=N2-1,

N=N2-2,

fib(N1, FN1),

fib(N, FN),

FN2=FN1+FN.

Для побудови рекурсивної структури (у даному випадку – це список) застосуємо метод прогресуючої підстановки. Побудуємо процедуру poslfib (номер,список).

posl_fib (-1,[ ]). % тривіальний розв’язок

posl fib (N, [FN | SP]):- % рекурсивний розв’язок

fib (N, FN), % обчислюємо чергове число Фібоначчі

N1=N-1, % залишок списку будуємо за допомогою

posl_fib (N1, SP). % рекурсивного виклику

Розглянемо, що буде відбуватися у разі розгортання рекурсії при узгодженні цілі

“posl_fib (4,SP)” (рис. 15).

SP = [5, 3, 2, 1, 1] - остаточний результат

N=4, SP=[FN | SP] - за 2-м правилом процедури

FN=5 SP = [3, 2, 1, 1] – проміжний результат

N=3, SP=[FN | SP] - за 2-м правилом процедури

FN=3 SP = [2, 1, 1] – проміжний результат

N=2, SP=[FN | SP] - за 2-м правилом процедури

FN=2 SP = [1, 1] – проміжний результат

N=1, SP=[FN | SP] - по 2-ому правилу процедуры

FN=1 SP = [1] – проміжний результат

N=0, SP=[FN | SP] - за 2-м правилом процедури

FN=1 SP = [ ] – тривіальне розв’язок Розгортання рекурсії

N=-1, SP=[ ] - за 1-м правилом процедури

Рис. 15. Побудова списку чисел Фібоначчі для рекурсивного виклику posl_fib (4,SP) по нисхідній схемі.

При розгортанні рекурсії в стек додаються всі параметри (N і SP) і локальні змінні (FN). Процес розгортання рекурсії завершується при досягненні тривіального випадку (правило 1). При згортанні рекурсії значення, що були додані до стеку, використовуються для побудови вихідних параметрів ( за правилом SP = [FN | SP] ).

Метод побудови рекурсивної структури складається з декількох етапів:

1. Функтор і розмірність структури, яку необхідно побудувати, визначається в заголовку деякого правила ( [FN | SP] ). Один чи кілька компонентів структури являють собою змінні. Ці змінні передаються як аргументи підцілям, що складають тіло цього правила.

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

3. Прогресія завершується, коли структура в заголовку твердження специфікується константним термом (для списку – це [ ]). Звичайно таким твердженням постає факт ( posl_fib (-1, [ ]). ).

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