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

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)

)

).

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

4.2.6. Порівняння різних виглядів подання бази даних

Найбільш важлива відміність у поданні полягає в тому, що для доступу до даних у кожному випадку потрібний свій алгоритм:

а) перші два методи (4.2.1; 4.2.2) організують доступ за допомогою вбудованого в систему алгоритму пошуку з поверненням (backtracking algorithm);

б) останні три методи (4.2.3; 4.2.4; 4.2.5) вимагають застосування рекурсивного алгоритму.

У разі подання у вигляді двійкового дерева доступ до інформації буде найбільш швидким, тому що для пошуку конкретного запису буде потрібно переглянути менше записів.

4.2.7. Компонування даних у список

У процесі обробки бази даних іноді доцільно переходити від одного способу подання бази даних до іншого. Наприклад, від фактів – до списку. Для цього в системі є вбудований предикат findall. Він має наступний формат:

findall(Змінна, Предикатний_вираз, Список)

У предикатному виразі обов'язково повинна брати участь змінна – перший аргумент предиката findall. Результатом роботи процедури буде список, що складається з тих значень змінної, при яких предикатний вираз успішно зіставляється з одним із тверджень (фактом) бази даних.

Наприклад, нехай у базі даних зберігається інформація про кількість м’ячів, що забиті командами в матчах чемпіонату України:

м’ячі (кривбасс, 43).

м’ячі (дніпро, 49).

м’ячі (динамо, 35).

Необхідно підрахувати сумарну кількість м’ячів, що забиті всіма командами в чемпіонаті:

Сумарні_ м’ячі: -

findall (М’ячі, м’ячі (_,М’ячі), Список_ м’ячів),

сума_списку(Список_ м’ячів, Сума),

write(Сума).

Ця програма працює в такий спосіб: предикат findall будує список м’ячів, передає його процедурі сума_списку, що їх підсумовує, і знайдена сума роздруковується.