- •Міністерство освіти і науки, молоді та спорту україни Тернопільський національний технічний університет імені Ів. Пулюя
- •Лабораторне заняття №1 Ознайомлення з мовою програмування Пролог
- •1.1 Загальні відомості про мову Пролог
- •1.2 Елементи мови Турбо-Пролог
- •1.3 Структура програм Турбо-Пролога
- •1.3.1 Секція domains Пролог-програми
- •1.3.2 Секція predicates
- •1.3.3 Секція clauses
- •1.3.4 Секція goal
- •1.3.5 Секція database
- •1.4 Оболонка системи Турбо-Пролог
- •1.5 Налагодження і трасування програм
- •Лабораторна робота №2 Робота з найпростішими програмами в системі Турбо-Пролог
- •2.1 Вступ
- •2.2 Завантаження системи Турбо-Пролог, ввід і запуск програм
- •2.3 Робота з Пролог-програмами в режимі діалогу
- •2.4 Трасування програм у середовищі системи Турбо-Пролог
- •2.5 Робота з програмами, що містять внутрішню мету
- •2.6. Найпростіша програма вводу-виводу даних
- •2.7 Побудова найпростішого інтерфейсу для виводу результатів запитів
- •8. Зміст звіту по лабораторній роботі
- •Лабораторна робота №3 Пролог-програми як найпростіші бази даних і знань
- •3.1 Вступ
- •3.2 Запити до бази даних
- •3.2.1 Прості запити
- •3.2.2 Складені запити
- •3.2.3 Запити з анонімними змінними
- •3.3. Статичні і динамічні бази даних
- •3.4. Явні і неявні бази даних. Правила логічного висновку
- •3.5 Використання структур у якості доменів відношень
- •6. Процедури як елемент представлення знань
- •3.7 Цілісність і несуперечність баз даних і знань
- •3.8. Зміст звіту по лабораторній роботі
- •Лабораторна робота №4. Керування ходом виконання програм у системі Турбо-Пролог
- •4.1 Робота системи Турбо-Пролог при виконанні запитів
- •4.2 Уніфікація термів
- •4.3 Пошук з поверненням при виконанні Пролог-програм
- •4.4 Використання відкату після невдачі при використанні внутрішньої мети для організації найпростішого інтерфейсу виводу
- •4.5 Зміст звіту по лабораторній роботі
- •Лабораторна робота №5 Керування ходом виконання Пролог-програм
- •5.1 Організація повторюваних процесів
- •5.2 Керування пошуком з поверненням
- •5.3 Керування ходом виконання програм з використанням відсікання
- •5.4 Застосування предикату not - заперечення як неуспіх
- •5.5 Використання методу відкату і відсікання
- •5.6 Відкат і відсікання при реалізації відносин типу „один-до-багатьох”
- •5.7 Ступінчаті функції і відсікання
- •5.8 Труднощі у використанні відсікання і заперечення
- •5.9 Зміст звіту по лабораторній роботі
- •Лабораторна робота №6 Рекурсія і рекурсивні процедури в Пролозі
- •6.1 Визначення поняття рекурсії
- •6.2 Склад рекурсивної процедури
- •6.3 Особливості виконання рекурсивних процедур Прологом-системою
- •6.4 Приклад рекурсивної процедури пошуку довжини маршруту на графі
- •6.5 Обмеження і властивості, що забезпечують цілісність відношень
- •6.6 Реалізація циклічних процедур за допомогою бектрекінгу
- •6.6.1. Реалізація ітераційного процесу за допомогою бектрекінгу
- •6.6.2 Дії типу ’до’ і ’після’
- •6.6.3. Застосування бектрекінгу для реалізації циклів
- •6.7 Зміст звіту по лабораторній роботі
- •Лабораторна робота №7 Списки і процедури їх обробки
- •7.1 Списки як рекурсивні структури даних
- •7.2 Використання списків в Пролог-програмах
- •7.3. Найпростіші процедури роботи зі списками
- •7.4 Процедури обробки списків
- •7.5. Компонування даних у список
- •7.6. Зміст звіту по лабораторній роботі
- •Лабораторна робота №8 Способи представлення баз даних у Пролог-програмах
- •8.1 Вступ
- •8.2 Представлення відносин у виді фактів
- •8.3 Представлення атрибутів у виді фактів
- •8.4 Представлення бази даних у виді списку структур
- •8.5 Представлення бази даних у виді лінійної рекурсивної структури
- •8.6 Представлення бази даних у виді двійкового дерева
- •8.7 Порівняння різних видів представлення бази даних
- •Лабораторна робота №9 Динамічні бази даних
- •9.1 Вступ
- •9.2 Прості прийоми роботи з динамічними бд
- •9.3 Зв’язок статичних і динамічних баз даних
- •9.4 Процедура роботи з динамічною бд, що навчається у користувача
- •9.5 Розширення бази даних у файли
- •9.6. Організації файлових бд на основі файлів прямого доступу
- •9.6. Особливості представлення динамічних баз даних у Visual Prolog
- •9.7 Зміст звіту по лабораторній роботі
- •Лабораторна робота №10 робота з складно структурованими базами даних
- •10.1 Опис логічної моделі даних
- •10.3 Отримання структурованої інформації з бази даних
- •10.4 Абстракція даних і побудова баз знань
- •10.5. Зміст звіту по лабораторній роботі
- •Лабораторна робота №11 дослідження методів представлення і обробки знань
- •11.1 Структура експертних систем
- •11.2 Представлення знань
- •11.3 Система інтерфейсу користувача
- •11.4 Експертна система на правилах
- •11.5 Експертні системи, що базуються на логіці
- •11.6 Структура бази знань експертної системи для вибору породи дерева
- •11.7 Зміст звіту
- •Список використаних джерел
- •Додаток а Службові предикати Турбо-Пролога
- •Додаток б Службові предикати Турбо-Пролога для роботи з файлами
- •Додаток в
- •Таблиця в.1 – Варіанти завдань
- •6. До лабораторної роботи №7
- •7. До лабораторної роботи №8
- •8. До лабораторної роботи №9
- •9. До лабораторної роботи №10
- •10. До лабораторної роботи №11
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. Додайте в початкову програму опис нових відносин і сформуйте процедури для їх визначення. До початкової БД додайте ряд фактів для сімей, щоб введені споріднені зв'язки існували, і виконаєте ряд довільних запитів зміст яких і результат виконання привести в звіті по роботі. Розробіть інформаційно-запитальну систему для деякої наочної області (згідно індивідуального завдання). Як зразок можна використовувати приведений в лабораторній роботі опис логічної моделі даних наочної області „сім’я”.