Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
PROLOG.DOC
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
502.27 Кб
Скачать

7. Рекурсивні структури даних.

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

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

7.1.Структура даних типу дерева.

Серед структур даних типу дерева можна виділити спеціальний клас найбільш вживаних дерев- бінарні дерева. Можна дати наступне рекурсивне визначення бінарного дерева:

1.Пусте дерево- бінарне дерево.

2.Кожний вузел бінарного дерева має не більше одного лівого бінарного піддерева і не більше одного правого бінарного піддерева.

Таку структуру даних в Пролозі можна визначити за допомогою двох предикатів:

treetype = tree(string,treetype,treetype) та empty

Останній використовується для позначення пустого дерева. Тому структура даних для задання бінарного дерева може бути описана наступним чином:

domains

treetype= tree(string, treetype,treetype);

empty

Наприклад, дерево зображене на мал.7.1

c a t h y

/ \

/ \

m i c h a e l m e l o d y

/ \ / \

/ \ / \

c h a r l e s h a s e l j i m e l e o n o r

Мал.7.1.

може бути описане:

tree('Cathy',tree('Michael',tree('Charles',empty, empty),

tree('Hazel' ,empty, empty)),

tree('Melody', tree('Jim',empty, empty),

tree('eleanor' ,empty, empty)))

Відмітимо, що це не є прологівсьгою фразою; це є тільки складною структурою даних.

7.2.Обходи дерева.

Існує багато правил обходу дерев: прямий, зворотній, кінцевий і т.д.. Наприклад, розглянемо алгоритм прямого обходу.

1. Якщо дерево пусте, тоді нічого не робити.

2. В іншому випадку, обробити поточний вузел, потім обійти ліве піддерево обробленого вузла, а потім обійти праве піддерево обробленого вузла.

В Пролозі його можна реалізувати за допомогою двох фраз:

traverse(empty).

traverse(tree(X,Y,Z):- do something with X, traverse(Y),

traverse(Z).

Для того, щоб подивитись на нього в дії, розглянемо програму, зображену на мал.7.2, яка обходить дерево і друкує значення, що містяться в вузлах дерева.

domains

treetype = tree(string, treetype, treetype);

empty()

predicates

print_all_elements(treetype)

clauses

print_all_elements(empty).

print_all_elements(tree(X,Y,Z)):- write(X), nl,

print_all_elements(Y),

print_all_elements(Z).

goal: print_all_elements(tree("Cathy", tree("Michael",

tree("Charles", empty, empty),

tree("Hazel", empty, empty)),

tree("Melody", tree("Jim", empty,

empty), tree("Eleanor", empty,

empty)))).

Мал.7.2.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]