Page 42 - 4800
P. 42

work1(“Маслов”, 101, “оператор”, 200).
                   work1(“Денега”, 211, “керівник”, 450).
                   work1(“Петренко”, 101, “менеджер”, 300).
                   Запит  work1(Name,  101,  Post,  Salary)  дозволяє  відшукати  всіх  службовців  101
            відділу.

                   5.3 Представлення атрибутів у вигляді фактів

                   Замість того, щоб записувати факти, що містять цілісні інформаційні елементи,
            можна  використовувати  як  факти  окремі  атрибути  (тобто  властивості)  цих
            інформаційних елементів. У разі потреби дані атрибути можна зібрати в єдине ціле за
            допомогою правила. Один з атрибутів повинний виступати в ролі ключа, що поєднує
            всі інші властивості. Атрибут Ім’я_службовця можна використовувати як ключ для БД
            work(). Перший екземпляр об'єкта РОБОТА можна представити в такий спосіб:
                   office(“Петренко”, 101).                   /* відділ */
                   post(“Петренко”, “оператор”).               /* посада */
                   salary(“Петренко”, 250).                    /* оклад */
                   Всі  атрибути  для  конкретного  службовця,  сукупність  яких  являє  собою
            визначений  екземпляр  об’єкта  предметної  області,  можна  об’єднати  за  допомогою
            правила:
                   work2(Name,  Office,  Post,  Salary):-  office(Name,  Office),  post(Name,  Post),  salary
            (Name, Salary).
                   Це правило визначає неявну базу даних того ж виду, що і приведена раніше явна
            база  даних  work1().  Для  цього  правила  можна  скористатися  попереднім  запитом,  що
            дасть ті ж результати, що і раніше.
                   Застосування атрибутів є більш гнучким засобом представлення бази даних, чим
            застосування  цілісних  інформаційних  елементів,  оскільки  нові  атрибути  можна
            додавати без переписування заново всієї існуючої бази даних.
                   Приведемо приклад правила, у якому пропонується видача премії в 100 грн. всім
            службовцям відділу 101. Це можна описати з використанням нового атрибута “премія”,
            предикат для якого можна визначити у вигляді правила:
                   prize(Name, 100):- office( Name, 101).
                   Для  деяких  службовців  можна  ввести  додатковий  атрибут  “стаж_роботи”  і
            новий набір фактів, його що описує:
                   work_time(“Петренко”, 5).
                   work_time(“Маслов”, 3).
                   Додавання  нових  атрибутів  “премія”  і  “стаж_роботи”  ніяк  не  вплине  на
            приведене вище правило work2().

                   5.4 Представлення бази даних у вигляді списку структур

                   Базу  даних  можна  також  вважати  потоком  цілісних  інформаційних  елементів,
            що представляється мовою Пролог у вигляді списку структур. Кожен елемент списку –
            це цілісний інформаційний елемент:
                   [work(“Маслов”, 101, “оператор”, 200), work(“Денега”, 211, “керівник”, 450),
            work(“Петренко”, 101, “менеджер”, 300)]
                   Цікаво  відзначити,  що  при  такому  підході  до  структури  бази  даних  потік
            цілісних інформаційних елементів потрібно включати в поточну програму.  Він може
            існувати  лише  як  аргумент  запиту,  що  входить  у  різні  підцілі,  що  обробляють  цей
            потік.
                   Доступ  до  окремого  інформаційного  елемента  такої  БД  буде  здійснюватися  з
            використанням спеціальної процедури, що містить два аргументи. Вхідним буде другий
            аргумент процедури. Він містить список цілісних інформаційних елементів. Результат
            виконання  процедури  повертається  через  її  перший  аргумент  –  по  одному  цілісному
            інформаційному  елементі  за  одну  відповідь  на  запит  (тобто  по  одному  екземплярі
            об’єкта, або по одному запису).
                   record(work(Name, Office, Post, Salary), [work(Name, Office, Post, Salary)|_]).
                   record(work(Name, Office, Post, Salary), [work(_,_,_,_) | Tail]):-record(work(Name,
            Office, Post, Salary), Tail).





                                                         42
   37   38   39   40   41   42   43   44   45   46   47