Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
54
Добавлен:
05.03.2016
Размер:
1.28 Mб
Скачать

10.3 Отримання структурованої інформації з бази даних

Можна створити набір процедур, який зробив би взаємодію з нашою БД зручнішою. Такі процедури можуть бути частиною призначеного для користувача інтерфейсу. Ось деякі корисні процедури для такої БД:

– знаходження визначеної особи:

чоловік(X):- сім’я( X, _, _).

дружина(X):- сім’я (_, X, _).

дитина(Х):- сім’я( _,_, Діти), належить(X, Діти).

належить(X, [X | L ].

належить(X, [Y | L ] :- належить( X, L). /*належність до списку дітей*/

– знаходження будь-якої особи

існує(Член_сім’ї):- чоловік(Член_сім’ї); дружина(Член_сім’ї); дитина(Член_сім’ї).

– визначення дати народження

дата_народження(член_сім’ї(_,_Дата,_), Дата).

– знаходження доходів

дохід(член_сім’ї(_,_,_, працює(_,S)),S):- !. /* Дохід працюючого */

дохід( член_сім’ї( _,_,_,_), 0). /* Дохід непрацюючого */

Цими процедурами можна скористатися, наприклад в наступних запитах в базі даних:

– Знайти імена і прізвища всіх людей з бази даних:

існує(член_сім’ї( Ім'я, Прізвище, _, _)).

– Знайти всіх дітей, що народилися в 1986 році:

дитина(X), дата_народження( X, дата( _,_, 1986)).

– Знайти всіх працюючих дружин:

дружина(член_сім’ї( Ім'я, Прізвище, _, працює(_,_))).

– Знайти імена і прізвища людей, які не працюють і народилися до 1973 року:

існує(член_сім’ї( Ім'я, Прізвище, дата(_,_,Рік), непрацює)), Рік <1963.

– Знайти людей, що народилися до 1970 року, чий дохід менше, ніж 200 грн.:

існує(Член_сім’ї), дата_народження(Член_сім’ї, дата(_,_, Рік)), Рік < 1950, дохід(Член_сім’ї, Дохід), Дохід <1000.

– Знайти прізвища людей, що мають принаймні трьох дітей:

сім'я(член_сім’ї(_, Прізвище,_,_), _,[_,_,_|_]).

Для підрахунку загальною доходу сім’ї корисно визначити суму доходів людей з деякого списку у вигляді відношення з двома аргументами:

загальний( Список_Людей, Сума_їх_доходів).

Для якого можна написати процедуру вигляду:

загальний( [], 0). /* Порожній список людей */

загальний([Людина | Список], Сума):-

дохід(Людина, S), /* S – дохід однієї людини */

загальний( Список, Sn), /* Sn - сума доходів решти*/

Сума = S + Sn.

Тепер загальні доходи всіх сімей можуть бути знайдені за допомогою запиту:

сім'я(Чоловік, Дружина, Діти), загальний([Чоловік, Дружина, Діти], Дохід).

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

сім'я( Чоловік, Дружина, Діти), загальний( [Чоловік, Дружина | Діти], Дохід), довжина([Чоловік, Дружина | Діти], N), Дохід/N < 200.

Завдання 10.1. Напишіть запити для пошуку в БД: а) сімей без дітей: б) всіх працюючих дітей; в) сімей, де дружина працює, а чоловік ні; г) всіх дітей, різниця у віці батьків яких складає не менше 15 років. Запити і результат їх виконання привести в звіті по роботі.

10.4 Абстракція даних і побудова баз знань

Абстракцію даних можна розглядати як процес організації різних фрагментів інформації в єдині логічні одиниці. При цьому кожній такій логічній одиниці надається деяка концептуально осмислена форма. Будь-яка інформаційна одиниця повинна бути легко доступна в програмі. У ідеальному випадку всі деталі реалізації початкової структури повинна бути невидимі користувачу. І найголовніше – дати йому можливість використовувати інформацію не думаючи про деталі її дійсного представлення.

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

У даному прикладі кожна сім'я – це набір деяких фрагментів інформації. Всі вони об'єднані в природні інформаційні одиниці такі, як член_сім’ї або сім'я, і з ними можна поводитися як з єдиними об'єктами.

На базі природних інформаційних елементів можуть бути визначені нові відносини (неявні БД), за допомогою яких користувач може діставати доступ до конкретних компонентів сім'ї, не знаючи деталей, а також одержувати інформацію, яка в явному вигляді відсутня в початковій БД.

Для початкової БД такими новими відносинами (неявними БД) можуть бути:

Батько(),

Мати(Ім’я_дитини, Ім’я_матері),

Сестра-Брат(Ім’я1, Ім’я2) .

Використовуючи ці відносини, а також знання про споріднені зв'язки між людьми в суспільстві, можна сформувати базу знань про родичів, яка, наприклад може містити наступний набір відносин:

Батько(Ім’я_дититни, Ім’я_батька),

Бабуся(Імя_внука, Ім’я_бабусі),

Дідусь(Імя_внука, Ім’я_дідуся),

... Предок(Хто, Чий).

Завдання 10.2. Додайте в початкову програму опис нових відносин і сформуйте процедури для їх визначення. До початкової БД додайте ряд фактів для сімей, щоб введені споріднені зв'язки існували, і виконаєте ряд довільних запитів зміст яких і результат виконання привести в звіті по роботі. Розробіть інформаційно-запитальну систему для деякої наочної області (згідно індивідуального завдання). Як зразок можна використовувати приведений в лабораторній роботі опис логічної моделі даних наочної області „сім’я”.