- •Міністерство освіти і науки, молоді та спорту україни Тернопільський національний технічний університет імені Ів. Пулюя
- •Лабораторне заняття №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
6.3 Особливості виконання рекурсивних процедур Прологом-системою
При використанні рекурсії, при дуже великій кількості рекурсивних викликів, кількість відкладених на виконання підцілей у стеку запитів постійно росте й у деякий момент стек переповниться. На екрані з’явиться повідомлення про помилку. Частково допомогти в цій ситуації може збільшення розміру стека, що може бути змінений за допомогою опції меню системи Установки/Різні – Установки/Розмір стека. Однак, якщо встановлено граничне значення, те це вже не допоможе. Недоліки, у цьому випадку, викликані погано продуманою організацією процедур. Для прикладу, повернемося до процедури “предок” і визначемо її трохи інакше:
предок1(А, Б):-батько(А,Б).
предок1(А, Б):-предок1(А, В), батько(В, Б).
З декларативних позицій зміст процедури “предок1” ідентичний процедурі “предок”, але процедурні трактування істотно відрізняються. У процедурі “предок1” змінна В не конкретизована в момент обробки підмети предок1(А, В). На практиці це означає те, що система, виконуючи запит до процедури “предок1”, спочатку відшукає правильні відповіді, потім буде виконувати рекурсивні дії аж до вичерпання доступного обсягу пам'яті.
Завдання 3.
В програмі “lab6.рго”, замініть в ній процедуру “предок” на “предок1”. Виконаєте ряд запитів і дослідіть результат.
Процедура “предок1” називається процедурою з лівою рекурсією, тому що в другому правилі рекурсивна мета стоїть ліворуч від інших підцілей. Пролог не може надійно обробляти ліворекурсивні процедури, що обумовлено природою стратегії рішення задач, що закладена в Пролог. Тому, будуючи рекурсивні процедури, необхідно це враховувати. Це особливо важливо, так як рекурсія – це основний алгоритмічний підхід побудови Пролог-програм.
6.4 Приклад рекурсивної процедури пошуку довжини маршруту на графі
Розглянута вище рекурсивна процедура “предок” будувалася на основі бінарного відношення Батько(Батько, Дитина), що встановлювало логічний зв'язок між цими двома об'єктами. Разом з тим у практиці часто зустрічаються випадки, коли між об'єктами існує як якісний, так і кількісний взаємозв'язок.
Прикладом такого відношення може бути відношення Дорога(Місто_1, Місто_2, Відстань), яке характеризує не тільки наявність зв'язку між якими-небудь містами, але і відстань між ними.
Використовуючи це відношення, можна сформувати базу даних по транспортних магістралях, з допомогою якої можна виконувати пошук маршруту між двома заданими містами і визначення відстані між ними. Таким чином, постає задача розробки процедури формування нового відношення
Шлях(Місто_1, Місто_2, Довжина_шляху),
на основі вихідного відношення “дорога”. Метод рекурсії, що використовувався при складанні процедури “предок” можна застосувати і в цьому випадку.
/* програма 6.2 */
domains
town = string
distance = integer
predicates
road(town, town, distance)
route(town,town,distance)
clauses
road(„Івано-Франківськ”, ”Львів”, 135).
road(„Івано-Франківськ”, „Тернопіль”, 137).
rоаd(„Луцьк”, „Львів”, 152).
road(„Луцьк”, „Тернопіль”, 163).
rоаd(„Львів”, „Тернопіль”, 127).
route(Town1, Town2, Distance):-road(Town1 ,Town2, Distance).
route(Town1, Town2, Distance):-road(Town1, X, Dist1), route(X, Town2, Dist2), Distance=Dist1+Dist2, !.
У процедурі route() відношення між двома містами буде дотримуватися, якщо існує дорога, по якій можна добратися з одного міста в іншій через ряд населених пунктів.
Кожна пропозиція для предиката road() описує дорогу з одного міста в іншій, що має визначену відстань.
Правила процедури route() указують на можливість як прямого маршруту, так і маршруту через інші міста. Предикат route() визначений рекурсивно.
Якщо маршрут містить тільки одну ділянку дороги, то в цьому випадку відстань між містами дорівнює довжині цієї ділянки.
У випадку, якщо маршрут з Міста_1 у Місто_2 є сумою маршрутів з Міста_1 у Х і з Х в Місто_2, то відстань між Містом_1 і Містом_2 буде дорівнює відстані між Містом_1 і Х плюс відстань між Містом_2 і X, тобто сумі двох відстаней.
Друге правило є рекурсивним. Відношення, записане в заголовку правила, залежить від більш простої версії самого себе. Перше правило визначає граничну умова виходу з рекурсії. Як тільки воно стане істинним, то процес рекурсії припинитися.
Рисунок 6.3 – Симетричне транзитивне відношення
Завдання 4.
Введіть програму 6.2 і дослідіть процес знаходжнення шляху від Івано-Франківська до Львова і до Луцька. Після чого спробуйте визначити маршрут від Львова до Івано-Франківська.
Дана програма не здатна врахувати всі можливі комбінації початкових і кінцевих точок маршрутів, тому що при формуванні процедури не враховані обмеження, що забезпечують цілісність відношень.