- •Міністерство освіти і науки, молоді та спорту україни Тернопільський національний технічний університет імені Ів. Пулюя
- •Лабораторне заняття №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.5 Розширення бази даних у файли
Розглянутий підхід до запису і зчитування динамічних БД, з використанням save і consult, забезпечує добрі результати при невеликих розмірах БД. Пов’язано це з тим, що факти динамічної БД є частиною Пролог-програми і, отже обмежуються розміром вільної оперативної пам'яті. Для збільшення об’єму інформації, що зберігається, можна організувати базу даних, яка зберігається не в оперативній пам’яті, а у файлах на диску.
Це розширює можливість баз даних, оскільки при їх розміщенні у файлах єдиним обмеженням є розмір вільного дискового простору. Це означає, що бази даних Турбо-Прологу можуть досягати значних розмірів.
Предикат readterm забезпечує доступ до фактів в файлі та має наступний вигляд:
readterm(DomainName, TermRecord),
де DomainName – це ім’я області типів даних, TermRecord – це терм, який зв’язується з заданим об’єктом, за умови узгодження його з описом домену.
Факти, які описують предикати бази даних, можуть бути оброблені так, як якби вони були термами. Це можливо завдяки домену dbasedom, який автоматично декларується системою Турбо-Пролог і утворює ОДНУ альтернативу для кожного предиката бази даних. Він описує кожен предикат бази даних функтором і доменами аргументів даного предиката. Наприклад, нехай в Пролог-програмі є наступні описи бази даних:
database
реrson(name, age, sex)
address(firm, street, house, grоup)
В цьому випадку система Турбо-Пролог автоматично створить відповідний цим описам домен dbasedom:
domains
dbasedom = реrson(name, age, sex); address(firm, street, house, grоup),
який може бути використаний, як і будь-який інший об’явлений домен Пролог- програми.
Розглянемо простий приклад організації бази даних з використанням файлу на диску. За основу приймемо спрощений варіант програми 2_2, в якому база даних address() розміщується у файлі послідовного доступу „adres.dba”.
Даному прикладу відповідає програма 2_3, в якій інтерфейс з явною БД забезпечується з використанням предиката рlасе(), структура якого аналогічна програмі 2_2. Проте процедура, його визначення, відрізняється тим, що в цих правилах передбачено звернення до фактів дискової БД.
/* Програма 2_3 */
/* запитальна система, що навчається, для БД „adres.dba” */
domains
firm, street, group = symbol
house = integer
file = file_bd
database
address(firm, street, house, group)
predicates
place(firm, street, house, group)
my_read(dbasedom)
my_append(dbasedom)
next_rec(file)
clauses
my_read(Record):- openread(file_bd, “adres.dba”), readdevice(file_bd), next_rec(file_bd), readterm(dbasedom, Record).
my_append(Record):- openappend( file_bd, “adres.dba), writedevice(file_bd), write(Record), nl, closefile(file_bd).
next_rec(_).
next_rec(File):- not(eof(File)), next_rec(File).
place(F, S, N, G):- bound(F), my_read(R), R=address(F, S, N, G),!.
place(F, S, N, G):- free(F), my_read(R), R=address(F, S, N, G).
place(F, S, N, G):- bound(F), free(S), free(N), readdevice(key board), write(„введіть для ”, F), nl, write(„назву вулиці: ”), readln(S), write(„номер будинку: ”), readreal(N), write(„групу: ”), readln(G), closefile(file_bd), my_append(address(F, S, N, G)).
Для використання в програмі файлів, слід ввести файловий домен, де визначається логічне ім’я файлу. У нашій програмі таким логічним ім’ям є file_bd. Це ім’я предикатами програми зв’язується з ім’ям файлу БД.
У програмі 2_3 визначені два предикати для читання і додавання фактів у файл БД. Це предикати my_read і my_append. Предикат next_rec по структурі схожий на предикат repeat і служить для переходу від одного запису файлу до іншого, поки не буде знайдено кінець файлу.
У процедурі place() два перші правила, в якості другої підцілі викликають предикат my_read(R), який зв’язує терм R з поточним записом файлу БД.
Третя підмета вказаних правил уніфікує поточний запис з структурою address(F, S, N, G). Якщо уніфікація неможлива, відбувається відкат до предиката my_read(R), який зв’язує змінну R з наступним записом файлу. І так продовжуватиметься до тих пір, поки уніфікація не буде успішною, або поки не буде досягнуто кінець файлу.
Якщо уніфікація завершиться успішно, то змінні F, S, N, G матимуть ті ж значення, що і поля поточного запису БД, а все правило, як і процедура в цілому, буде успішно доведеним. Якщо уніфікація як першого, так і другого правила завершилася невдачею при досягненні кінця файлу, то система перейде до доведення третього правила процедури place().
У процедурі my read() перша підмета зв’язує логічне ім’я file_db з дисковим DOS-файлом „adres.dba” і відкриває його для читання.
Друга підмета об’являє файл з логічним ім’ям file_db стандартним пристроєм вводу. Це означає, що всі предикати типу read, що описані в програмі, виконуватимуть ввід даних з файлу, а не з клавіатури, яка за умовчанням, є стандартним пристроєм вводу.
Третя підмета служить для організації повторного виконання, наступних підзадач при відкатах. Слід зазначити, що предикат next_rec() істинний завжди, якщо не досягнуто кінця (eof()) записів у файлі на диску.
Оскільки стандартним пристроєм вводу попереднім предикатом встановлено дисковий файл, то саме з нього четверта підмета прочитує в змінну Record терм, структура якого відповідає структурі домена бази даних. Інакше кажучи, виконується читання в змінну Record вмісту поточного запису файлу, структура якого повинна відповідати описаній в програмі структурі БД.
У процедурі my арpend() перша підмета зв’язує логічне ім’я file_db з дисковим DOS-файлом „adres.dba” і відкриває його для запису.
Друга підмета призначає файл з логічним ім’ям file_db стандартним пристроєм виводу. Це означає, що всі предикати типу write, що зустрічаються далі, виконуватимуть вивід даних у файл, а не на екран дисплея, який є стандартним пристроєм виводу за замовчуванням.
Третя підмета виводить (додає в кінець файлу) новий запис, значення якого вводиться в дану процедуру через змінну Record.
Після виконання цих дій четверта підмета закриває відкритий для запису файл.
Основним режимом роботи даної програми є режим відповідей на запити, який вимагає постійного доступу до файлу на диску. При цьому за пристрій вводу програма назначає файл БД. Проте за відсутності в БД потрібних даних, програма переходить в режим навчання і вимагає від користувача введення з клавіатури нових даних.
У третьому правилі процедури place() для того, щоб забезпечити можливість вводу даних з клавіатури, використовується предикат readdevice(keyboard) який встановлює як стандартний пристрій вводу клавіатуру. Після цього виконується запит на ввід нових даних. Закривається робочий файл, який був відкритий для читання та виконується додавання нового запису в кінець дискового файлу.
Слід зазначити, що в даному прикладі розглянутий простий випадок доступу до файлових даних. Він приведений з метою ілюстрації принципу побудови динамічних БД і їх розширення у файлові структури.
Завдання 9.4. Завантажте програму 2_3, розберіться в ній і виконайте ряд описаних в попередньому розділі дій по роботі з БД, що збережена у файлі „adres.dba”. Познайомтеся по додатку 1 з предикатами для роботи з файлами. Допрацюйте програму 2_3 так, щоб в ній можна було користуватися неявними базами даних school() і bank(), аналогічно програмі 2_2. Аналогічні дії виконайте для програми згідно індивідуального завдання. Запустіть програму і введіть ряд запитів, зміст яких і результат виконання слід включити в звіт по роботі.