- •Міністерство освіти і науки, молоді та спорту україни Тернопільський національний технічний університет імені Ів. Пулюя
- •Лабораторне заняття №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
8.7 Порівняння різних видів представлення бази даних
Найбільш важливим розходженням між описаними формами представлення БД є те, що для доступу до даних у кожному випадку потрібно свій алгоритм. Так, при представленні БД у виді цілісних інформаційних елементів, що є фактами, або при представленні атрибутів у виді фактів, доступ до БД повинний здійснюватися за допомогою алгоритму пошуку з поверненням (backtracking algorithm), а при використанні рекурсивних структур даних (у тому числі, списків і двійкових дерев) доступ повинний реалізуватися рекурсивним алгоритмом. Правила і запити, приведені в даній роботі, служать простими прикладами цих алгоритмів.
Представлення у виді двійкового дерева має ту перевагу, що час пошуку конкретного запису буде звичайно менше, ніж при інших представленнях. Через те, що деревоподібна структура містить дані у відсортованому виді, процедурі вибору для пошуку заданого запису знадобитися переглянути меншу кількість записів.
8.8. Правила роботи з бінарними деревами
Ефективність роботи з БД у виді двійкових дерев багато в чому визначається знаннями процедур їх створення і перетворення. Розглянемо ряд процедур, що оперують із двійковими деревами, що описуються структурами виду
tree(Left, Root, Right),
де Left – ліве піддерево, кожен елемент якого має структуру, аналогічну tree(), Root – корінь (будь-яким довільним, обумовленим користувачем, структура), Right – праве піддерево, що складається з елементів структури tree().
Побудова бінарного дерева. Задача створення упорядкованого дерева при додаванні деякого елемента Х до впорядкованого дерева може бути сформульована в такий спосіб:
Гранична умова: Додавання Х до порожнього дереву дає tree(end, X, end).
Рекурсивні умови: При включенні Х в tree(Left, Root, Right) треба розглянути два випадки, для того, щоб результуюче дерево було упорядкованим.
1. Якщо Х менше, ніж Root, то Х додається до лівого піддерева.
2. Якщо Х більше, ніж Root, то Х варто додати до правого піддерева.
В обох випадках значення кореня і протилежного піддерева не міняються. Такому формулюванню відповідає процедура insert(), що має вигляд:
insert(end, X, tree(end, X, end)).
insert(tree(Left, Root, Right ), X, tree(LeftNew, Root, Right)) :- X < Root, insert(Left, X, LeftNew).
insert(tree(Left, Root, Right), X, tree(Left, Root, RightNew)) :- X > Root, insert(Right, X, RightNew).
Побудова бінарного дерева зі списку. Процедуру insert() можна використовувати для побудови впорядкованого дерева зі списку. Процедура, що забезпечує перетворення списку в упорядковане дерево, буде мати вигляд:
list_to_tree([], end).
list_to_tree([H | T], AllTree) :- list_to_tree(T, Tree), insert(Tree, H, AllTree).
Побудова відсортованого списку з дерева. Для рішення цієї задачі можна скористатися упорядкованим бінарним деревом і об'єднанням списків.
Гранична умова: Порожнє бінарне дерево (end) приводить до порожнього списку [].
Рекурсивна умова: Відсортований список для упорядкованого бінарного дерева tree(Left, Root, Right), де Left має відсортований список L1, a Right має відсортований список L2, отримується приєднанням [Root | L2] до L1.
tree_to_list(end, []).
tree_to_list(tree(Left, Root, Right), List) :- tree_to_list(Left, L1), tree_to_list(Right, L2), append(L1, [Root | L2], List).
Розглянемо приклад використання цих процедур у Пролозі-програмі, що працює з базами даних різних структур і перетворення цих структур.
/* Програма 1_2 */
domains
worker = symbol
listworker = worker*
tree = tree(tree, worker, tree); end
predicates
db1(tree)
db2(listworker)
record(worker, tree )
append(listworker, listworker, listworker)
insert(tree, worker, tree)
list_to_tree(listworker, tree)
tree_to_list(tree, listworker)
goal1
goal2
goal3
goal4
goal5
goal6
goal7
goal8
clauses
goal1 :- db1(DB), write(DB).
goal2 :- db1(DB), record(R, DB), write(R), nl, fail.
goal3 :- db1(DB), write(„введіть елемент”), readln(E1), insert(DB, E1, DBnew), write(DBnew).
goal4 :- db1(DB), write(„введіть елемент”), readln(E1), insert(DB, E1, DBnew), record(R, DBnew), write(R), nl, fail.
goal5 :- db2(List), list_to_tree(List, Tree), write(Tree).
goal6 :- db2(List), list_to_tree(List, Tree), record(R, Tree), write(R), nl, fail.
goal7 :- db1(Tree), tree_to_list(Tree,List), write(List).
goal8 :- db2(List), write(List), nl, list_to_tree(List, Tree), write(Tree), nl, tree_to_list(Tree, NewList), write(NewList), nl.
insert(end, X, tree(end, X, end)).
insert(tree(L, Root, R), X, tree(LNew, Root, R)) :- X < Root, insert(L, X, Lnew).
insert(tree(L, Root, R), X, tree(L, Root, RNew)) :- X > Root, insert( R, X, RNew).
list_to_tree([], end).
list_to_tree([H | T], AllTree) :- list_to_tree(T, Tree), insert(Tree, H, AllTree ).
tree_to_list(end, []).
tree_to_list(tree(L, Root, R), List) :- tree_to_list(L, L1), tree_to_list(R, L2), append(L1, [Root | L2], List).
record(R, tree(LeftTree, _ ,_)):- record( R, LeftTree).
record(R, tree(_, R, _)).
record(R, tree( _, _, RightTree)):- record(R, RightTree).
append([], L2, L3).
append( [H | L1], L2, [H | L3]) :- append(L1, L2, L3).
db1(tree(tree(end, a, end), c, tree(end, e, end) ) ).
db2([c, e, a]).
Використання описаних вище процедур дозволяє як модифікувати бази даних, так і здійснювати їхні структурні перетворення. Програма 1_2 дає можливість досліджувати найпростіші перетворення над базами даних. У цій програмі використовуються два способи представлення баз даних: у виді списку та у виді двійкового дерева. Причому структури цілісних інформаційних елементів обох баз даних прийняті однаковими і, з метою спрощення, містять у собі усього по одному полю символьного типу.
Обидві бази задаються безпосередньо в програмі за допомогою предикатів db1() і db2(). Найпростіші перетворення над базами ілюструються за допомогою восьми цілей, сформованих безпосередньо в програмі. Кожна з цих цілей може бути викликана з оболонки Турбо-Прологу, як зовнішня мета. Розглянемо призначення кожної зі сформованих у програмі цілей.
Перша ціль (goal1) дозволяє переглянути вміст першої бази даних заданої у виді бінарного дерева.
Друга ціль (goal2) дозволяє послідовно переглянути записи першої бази даних, що досягається виділенням із БД окремих інформаційних елементів за допомогою процедури record().
Третя і четверта цілі (goal3 і goal4) ілюструють можливість модифікації першої БД шляхом додавання в неї нового елемента зі збереженням упорядкованості.
П'ята і шоста цілі (goal5 і goal6) показують, як база даних, задана у виді списку, може бути перетворена в структуру типу бінарного дерева.
Сьома ціль (goal7) ілюструє можливість перетворення впорядкованого дерева у відсортований список.
Восьма ціль (goal8) показує, як подвійне перетворення структури БД дозволяє відсортувати вихідний список. На першому етапі вихідний список перетворюється в бінарне дерево. При цьому забезпечується упорядкованість цього дерева. На другому етапі бінарне дерево перетворюється в список, але тому що дерево упорядковане, то і список виходить відсортованим.
Завдання 8.5. Розберіться з описом структур і предикатів програми 1_2, а також призначенням її процедур. Дослідіть програму, виконавши описані в ній цілі. Сформуйте ряд нових цілей, що дозволяють досліджувати перетворення структур баз даних. У програмі 8_2 використовується найпростіша структура інформаційних елементів. Змініть програму для роботи зі структурами власного типу, розглянутих у попередніх розділах даної лабораторної роботи. Текст програми, запити і відповіді на них привести в звіті.
Усі процедури, використовувані в програмі 1_2, описані в даній роботі. Виключення складає процедура злиття двох списків append(), докладний опис якої приведено в попередній лабораторній роботі, присвяченій роботі зі списками.
8.9. Зміст звіту по лабораторній роботі
Звіт по лабораторній роботі повинна містити:
1. Тексти програм, збережених на диску відповідно до завдань.
2. Запити, сформовані самостійно при вивченні даної роботи, а також результати їх виконання.
4. Результати виконання завдань 1, 2, 3, 4, 5 даної лабораторної роботи (вибір предметної області – згідно індивідуального завдання.).
5. Приведіть чіткий опис кожної з цілей, досліджених при роботі з програмою 1_2.