- •Міністерство освіти і науки, молоді та спорту україни Тернопільський національний технічний університет імені Ів. Пулюя
- •Лабораторне заняття №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
Лабораторна робота №9 Динамічні бази даних
Мета роботи:
1. Знайомство з призначенням і використовуванням динамічних баз даних (БД).
2. Вивчення правил опису і організації динамічних БД в Турбо-Пролозі.
3. Отримання навиків роботи з динамічними БД.
4. Знайомство з використанням динамічних БД при розробці програм, що навчаються в процесі роботи.
5. Особливості представлення динамічних баз даних у Visual Prolog.
9.1 Вступ
У Пролозі реляційна база даних представляється у вигляді набору фактів, що дозволяє використовувати Пролог, як могутню мову запитів для баз даних. Вбудований в Пролог алгоритм уніфікації автоматично вибирає факти з правильними значеннями для відомих параметрів і уніфікує значення для будь-яких невідомих параметрів. Алгоритм пошуку з поверненням дозволяє знаходити всі рішення для поставлених запитів.
У попередніх роботах розглядалися статичні бази даних, де факти були частиною коду програми і не могли бути змінені під час роботи з програмою. Принциповою відмінністю динамічних баз даних є те, що під час роботи з програмою, з них можна видаляти будь-які твердження, а також додавати нові. Інша важлива особливість динамічної бази полягає у тому, що вона може бути збережена на диск та зчитана з диска в оперативну пам’ять.
Факти, що належать динамічним базам даних, обробляються відмінним від інших предикатів чином з метою прискорення роботи з базами даних великого об’єму. Предикати динамічної БД відрізняються від інших тим, що вони описуються в окремій секції програми – database. Маніпулювання фактами в динамічній БД здійснюється з використанням трьох стандартних предикатів:
– asserta(Term) – додає нові факти в початок динамічної бази даних.
– assertz(Term) – додає нові факти в кінець динамічної бази даних,
– retract(Term) – видаляє факт з динамічної бази даних.
Для модифікації якого-небудь факту в динамічнй БД необхідно спочатку видалити його з неї, а потім додати в зміненому вигляді. Для забезпечують роботи з даними динамічної БД, що знаходяться на жорстоку диску використовуються наступні стандартні предикати:
– save(„file_name”) – збереження динамічної БД в текстовому файлі з ім'ям file_name.
– consult(„file_name”) – завантаження динамічної БД з текстового файлу з ім'ям file_name.
Слід зауважити, що іноді частину інформації бази даних доцільно зберігати у вигляді тверджень статичної БД і заносити ці дані до динамічної БД відразу ж після активізації програми. При цьому предикати статичної БД повинні мати інше ім'я, але ту ж саму структуру даних, що і предикати динамічної БД. Причому опис предикатів динамічної БД здійснюється в секції database, а предикатів статичної БД – в секції predicates.
9.2 Прості прийоми роботи з динамічними бд
У секції database декларуються предикати, що описують динамічну базу даних. Опис предикатів динамічної БД повинен передувати опису всіх звичних предикатів.
У наведеній нижче програмі 9_1 розглянуто приклад використовування явної динамічної бази даних, структура якої відповідає відношенню
Особа(Ім’я, Вік, Стать).
На основі явної динамічної БД, яка допускає модифікацію під час роботи, в програмі за допомогою правил визначені ще три неявні бази даних:
Чоловік (Ім’я, Вік), Жінка (Ім’я, Вік), Дитина(Ім’я, Вік, Стать)
Предикат реrson() можна використовувати так само, як і будь-які інші предикати. Відмінність лише у тому, що для нього, під час виконання програми, можливе додавання і видалення фактів. Факти, що додаються таким чином, зберігаються в ОЗУ ЕОМ. На основі програму 2_1, розглянемо прості прийоми роботи з динамічними БД.
/* Програма 2_1 */
domains
name= string
age = integer
sex = m; f /* домени m і f складаються тільки з одного функтора */
database
реrson(name, age, sex)
predicates
male(name, age)
female(name, age)
child(name, age, sex)
clauses
male(Name, Age) :- person(Name, Age, m).
female(Name, Age) :- person(Name, Age, f).
child(Name, Age, Sex) :- person(Name, Age, Sex), Age<15.
Якщо запустити дану програму на виконання та сформувати до неї запит Goal: реrson(X, Y, Z), то Турбо-Пролог відповість "ні" що викликане відсутністю даних в динамічні БД. Якщо ж тепер ввести послідовно дві цілі:
Goal: asserta(реrson(„Тарас”, 20, m))
Goal: asserta(реrson(„Світлана”, 21, f))
і знову ввести початковий запит, то отримаємо наступну відповідь:
X = „Світлана” Y=21 Z=f
X = „Тарас” Y=20 Z=m
Одержана відповідь характеризує наявність в БД реrson() відомостей про дві особи, їх імена, вік та стать, хоча ніяких додаткових фактів в текст програми не вводилося. У цьому принципова відмінність динамічних БД, які організовуються Турбо-Прологом в пам'яті ЕОМ, окремо від основної Пролог-програми.
Занести інформацію про Тараса і Світлану в динамічну БД нам дозволив предикат asserta(). Особливість його роботи видно із порівняння двох цілей та результату запиту. Дані про Миколу вводилися першими, а потім дані про Світлану. В отриманій відповіді першими наведено дані про Світлану. Це пов'язано з тим, що предикат asserta(реrson(„Світлана”, 21, f)) додав дані про Світлану в початок динамічної БД. Додамо в БД інформацію ще про дві особи, послідовно вводячи ще дві цілі вигляду:
Goal: assertz(реrson(„Степан”, 9, m))
Goal: asserta(реrson(„Ольга”, 8, f))
Якщо тепер сформулювати запит про видачу всієї інформації, що зберігається в динамічній БД person(), то відповідь на нього буде одержана в наступній формі:
Goal: реrson(Name,Age,Sex),
Name = „Ольга” Age=8 Sex=f
Name = „Світлана” Age=21 Sex=f
Name = „Микола” Age=20 Sex=m
Name = „Степан” Age=9 Sex=m
Із співставлення донаних цілей і результатів запиту видно, що один з нових фактів поміщений в початок динамічної БД, а в другій – в кінець, що пов’язане з відмінністю в роботі предикатів asserta() і assertz().
З елементами динамічної БД Пролог може виконувати всі операції, допустимі для фактів аналогічної структури. Їх можна шукати, уніфікувати, використовувати у вигляді підзадач правил і т.д. Так, в програмі 2_1 динамічна БД входить у вигляді підцелі трьох правил формування неявних БД. Використовуючи предикати неявних БД, можна сформувати запити про дані по чоловіках, жінкам або дітям:
Goal: male(Name, Age)
Name = „Тарас” Age=20
Narne = „Степан” Age=9
Goal: female(Name, Age)
Name = „Світлана” Age=21
Name = „Ольга” Age=8
Goal: child(N, A, S)
N = „Ольга” A=8 S=f
N = „Степан” A=9 S=m
Або сформувати на їх основі будь-які інші, прості або складові, запити.
Якщо потрібно буде видалити з динамічної БД який-небудь факт, то для цього слід скористатися предикатом retract(). Наприклад, для видалення відомостей про „Світлану” слід ввести наступну ціль:
Goal: retract(реrson(„Світлана”, _, _))
При необхідності скоректувати який-небудь елемент динамічної БД його слід видалити з бази даних, а потім додати в динамічну БД новий модифікований елемент. Зокрема, для того, щоб змінити вік „Миколи” на один рік, треба ввести наступну складну ціль:
Goal: реrson(„Микола”, OldAge, Sex, Person), retract(реrson(„Микола, _ ,_)), NewAge = OldAge + 1, !, asserta(реrson(„Микола”, NewAge, Sex, Person)),
яка видалить старий факт і додасть в динамічну БД модифікований факт. Результат проведених перетворень БД можна одержати, як відповідь на наступний запит:
Goal: реrson(Name,Age,Sex)
Name = „Микола” Age=21 Sex=m
Name = „Ольга” Age=8 Sex=f
Name = „Степан” Age=10 Sеx=m
Динамічна БД може бути збережена в текстовому файлі за допомогою виклику предиката save() з ім'ям текстового файлу, в якості параметру. Наприклад, після виконання цілі:
Goal: save(„person.dba”)
файл „person.dba” буде схожий на звичайну програму на Турбо-Пролозі з фактами у кожному рядку. Такий файл може бути пізніше знову завантажений в пам'ять, за допомогою предикату consult():
Goal: consult(„person.dba”).
Завантаження виконається успішно лише в тому випадку, якщо програма у файлі не містить помилок. За наявності помилок зчитування даних із файлу до динамічної БД не відбудеться.
Завдання 9.1. Завантажте програму 2_1 та виконаєте всі наведені в даному розділі дії по заповненню і модифікації динамічної бази даних реrson(), а також по запитах до явної динамічної БД і неявним БД. Збережіть результуючу динамічну БД у файлі „person.dba”, а програму у файлі „1аb2_1.pro”. Прогляньте вміст файлу „person.dba”, а потім знову завантажте програмний файл. Запустіть програму на виконання і введіть запит реrson(X, Y, Z). Який вийшов результат і чому? Завантажте динамічну БД з файлу „person.dba” і введіть запит реrson(X, Y, Z). Який в цьому випадку вийшов результат і чому? Створіть власну програму (згідно індивідуального завдання) із застосуванням динамічної бази даних та виконайте дії по її наповненню та модифікації. Результати завдання представте у звіті.
Раніше вже не раз наголошувалося, що будь-яка програма на Пролозі – це набір фактів і правил, які є своєрідною базою даних, на якій Пролог виконує логічний висновок. У свою чергу, динамічні бази даних – це набір фактів, який може змінюватися при роботі програми.
З цих двох умов слідує найважливіший висновок: Пролог допускає зміну програм під час їх виконання! І ці зміни можна виконувати, використовуючи динамічні бази даних.