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

4.2.4. Подання у вигляді рекурсивних структур

Службовців нашої установи можна подати, наприклад, у вигляді такої рекурсивної структури:

/* Ім'я Відділ Посада Оклад */

рс(іванов, 100, оператор, 200,

рс(петров, 200, керівник, 700,

рс(сидоров, 100, менеджер, 715, end)))

Тут end – це атом, що зображує кінець структури.

Дістати інформацію з такої структури можна аналогічно до попереднього випадку:

один_ц_інф_елемент( сл(Ім'я, Відділ, Посада, Оклад),

рс(Ім'я, Відділ, Посада, Оклад, Залишок)) .

Далі – проігнорувати елемент, розташований на початку структури і викликати цю ж процедуру із залишком як другий параметр для одержання чергового елемента (знову ж за допомогою першого правила цієї процедури):

один_ц_інф_елемент( сл(Ім'я, Відділ, Посада, Оклад),

рс(_, _, _, _, Залишок) ):-

один_ц_інф_елемент( сл(Ім'я, Відділ, Посада, Оклад), Залишок).

Запит про всіх службовців відділу 200 буде мати такий вигляд:

один_ц_інф_елемент( сл(Ім'я, 200, Посада, Оклад),

рс(іванов, 100, оператор, 200,

рс(петров, 200, керівник, 700,

рс(сидоров, 100, менеджер, 715) ) )

).

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

4.2.5. Подання у вигляді двійкового дерева

Перетворення рекурсивної структури на двійкове дерево досягається шляхом введення одного додаткового аргументу. Зміст використання двійкового дерева полягає в тому, щоб зберігати базу даних у відсортованому вигляді. Наприклад, відсортуємо за іменем службовця (рис. 6).

Рис. 6. Подання бази даних у вигляді двійкового дерева

Тепер у структурі буде шість аргументів:

/* Ім'я Відділ Посада Оклад ЛівеПіддерево ПравеПіддерево */

дд(іванов, 100, оператор, 200,

дд(петров, 200, керівник, 700, end, end),

дд(сидоров, 100, менеджер, 715, end, end))

Діставати інформацію з двійкового дерева по одному можна за допомогою наступної процедури:

один_ц_інф_елемент( сл(Ім'я, Відділ, Посада, Оклад),

дд(_, _, _, _, ЛівеПіддерево, _ ) ):-

один_ц_інф_елемент( сл(Ім'я, Відділ, Посада, Оклад), ЛівеПіддерево).

один_ц_інф_елемент( сл(Ім'я, Відділ, Посада, Оклад),

дд(Ім'я, Відділ, Посада, Оклад, _, _)) .

один_ц_інф_елемент( сл(Ім'я, Відділ, Посада, Оклад),

дд(_, _, _, _, _, ПравеПіддерево ) ):-

один_ц_інф_елемент( сл(Ім'я, Відділ, Посада, Оклад), ПравеПіддерево).

Запит про всіх службовців відділу 200 буде мати такий вигляд:

один_ц_інф_елемент(сл(Ім'я, 200, Посада, Оклад),

дд(іванов, 100, оператор, 200,

дд(петров, 200, керівник, 700, end, end),

дд(сидоров, 100, менеджер, 715, end, end)

)

).

Цікавою властивістю постає те, що процедура в такому випадку завжди буде видавати цілісні інформаційні елементи, які утворюють дерево, у відсортованому порядку.