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

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 будує список м’ячів, передає його процедурі сума_списку, що їх підсумовує, і знайдена сума роздруковується.

4.3. Використання складених об'єктів

Розглянемо приклад:

любить(марія, персики).

фрукти(персики).

Функтор “любить” поєднує у відношення “любить” два об'єкти “марія” і “персики”. Об'єкти “марія” і “персики” є прості тому, що вони описують самі себе (атоми). Якщо об'єкт представляє сам себе, то ми його будемо називати простим. Відповідно й структура, що складається з простих об'єктів, буде називатися простою. Але Марія може любити якісь фрукти, книги й т.ін. Те, що персики – це фрукти, ми виразили у вигляді окремого факту. Але це ж можна виразити й безпосередньо в сруктурі відношення “любить”.

любить(марія, фрукти(персики)).

любить(марія, книги(“Три мушкетери”)).

Об'єкт, що представляє інший об'єкт чи сукупність об'єктів, називається складеним, а структура, що його описує, також буде називатися складеною, тому що вона скомпонована зі складених об'єктів. Для полегшення написання тверджень і предикатів із використанням складених об'єктів TP дозволяє описувати складені об'єкти в розділі DOMAINS:

DOMAINS

фрукти = фрукти(symbol)

книги = книга(symbol)

DATABASE

любить(symbol, фрукти)

любить(symbol, книги)

Ім'я “фрукти” представляє одночасно домен, складений об'єкт (як частина структури для екземпляра відношення “любить”) і функтор (але не предикат).

Якщо об'єкти структури належать до того ж самого доменного типу, то ця структура називається однодоменною:

DOMAINS

три_фрукти = фрукти(symbol, symbol, symbol)

DATABASE

любить(symbol, три_фрукти)

CLAUSES

любить(марія, три_фрукти(персики, яблука, апельсини))

Якщо ж структура містить об'єкти різних типів, то вона називається багатодоменною. Застосування доменної структури спрощує визначення предиката. Якщо не застосовувати доменну структуру, то програмі необхідно було б використовувати всі атрибути на одному рівні. Наприклад, предикат “любить”, описаний у попередньому прикладі, мав би такий вигляд:

любить(марія, персики, яблука, апельсини).

Тобто всі атрибути розглядалися б як окремі самостійні сутності.