- •Міністерство освіти і науки, молоді та спорту україни Тернопільський національний технічний університет імені Ів. Пулюя
- •Лабораторне заняття №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.6. Особливості представлення динамічних баз даних у Visual Prolog
Для опису внутрішньої бази даних у Visual Prolog використовується ключове слово facts (це синонім застарілого слова database), яке визначає початок оголошення розділу facts. Розділ facts складається з послідовності оголошень | предикатів, що описують відповідну внутрішню базу фактів. Під час виконання можна за допомогою предикатів стандартних asserta і assertz додавати факти (але не правила) в базу фактів. Або, викликавши стандартний предикат consult, ви можете витягнути факти, що додаються, з файлу на диску.
Слід зазначити наступні два обмеження на предикати, оголошені в розділі фактів:
– дозволяється додавати в базу даних тільки факти, але не правила;
– факти бази не можуть містити вільні змінні.
Допускається наявність декількох розділів facts, але для цього потрібно явно вказати ім'я кожного розділу facts.
facts — mydatabase
myFirstRelation(integer) mySecondRelation(real, string) myThirdRelation(string)
Опис розділу facts з ім'ям mydatabase створює базу даних фактів з ім'ям mydatabase. Якщо не задати ім’я динамічної базі фактів, то за замовчанням їй привласнюється стандартне ім'я dbasedom. Програма може містити локальні безіменні розділи фактів, тільки якщо вона складається з одного модуля, який не оголошений як частина проекту. Візуальне середовище розробки (VDE) компілює програмний файл як єдиний модуль тільки при використанні утиліти Test Goal. Інакше, безіменний розділ фактів повинен бути оголошений глобальним. Для цього потрібно перед ключовим словом facts поставити ключове слово global.
Імена предикатів бази фактів повинні бути унікальними в модулі (початковому файлі); у двох різних розділах facts не можна застосовувати однакові імена предикатів. Аналогічно, не можна використовувати однакові імена предикатів в розділах facts і predicates. Проте імена предикатів, визначених в локальних facts-розділах, є локальними для модуля, де вони оголошені, і не конфліктують з локальними іменами предикатів/фактів, оголошених в інших модулях.
За своєю природою предикати в розділі facts завжди недетерміновані. Оскільки факти можуть бути додані у будь-який момент під час виконання програми, компілятор завжди повинен враховувати, що існує можливість знайти альтернативне рішення в ході пошуку з поверненням. Якщо в розділі facts є предикат, для якого ніколи не буде більше одного факту, то можна декларувати це, написавши перед оголошенням предиката факту ключове слово determ (або ключове слово single, якщо предикат завжди повинен мати один і лише один факт):
facts
determ daylight_saving(integer)
Відповідно, при спробі додати новий факт для детермінованого предиката бази фактів, який вже має факт, завжди виникатиме помилка.
У оголошенні розділу facts можна використовувати наступні необов'язкові ключі виє слова:
facts [– <databasename>]
[nocopy] [{ nondeterm | determ | single }]
dbPredicate ['(' [Domain [ArgumentName]]* ')']
Необов'язкові ключові слова nondeterm, determ і single оголошують режим детермінізму оголошеного предиката бази фактів dbPredicate. Тільки одне з них можна використовувати. Якщо режим детермінізму предиката бази фактів не заданий явно, тоді за умовчанням приймається значення nondeterm. Режим nondeterm для предикатів баз фактів завжди задається за умовчанням, не залежно від установки прапорця Default Predicate Mode в діалоговому вікні Compiler Options VDE.
– nondeterm – визначає, що база фактів може містити будь-яке число фактів для предиката бази фактів dbPredicate. Це режим за умовчанням;
– determ – визначає, що база фактів може містити не більше одного факту для предиката бази фактів dbPredicate;
– single – визначає, що база фактів завжди містить один і лише один факт для предиката бази фактів dbPredicate.
– посору – звичайно, коли предикат бази фактів викликаний для зв’язування змінної з рядковим або складеним об'єктом, викликані дані копіюються з купи (heap) в глобальний стек Visual Prolog (GStack). посору оголошує, що дані не будуть скопійовані, а змінні посилатимуться безпосередньо на дані факту, що зберігаються в купі. Це може значно збільшити ефективність, але якщо копія не була зроблена, після видалення факту змінна указуватиме на якесь „сміття”. Тому використовувати такий підхід слід обережно.
– global – визначає, що база фактів – глобальна. Надійна техніка програмування вимагає, якомога меншого використання глобальні факти. Натомість можна застосовувати глобальні предикати, що працюють з локальними фактами.
Ключове слово nondeterm визначає режим за умовчанням для фактів (предикатів бази фактів), оголошених в розділі facts. Якщо жодне із слів determ або single не використане при оголошенні фактів, компілятор застосовує режим nondeterm. Звичайно за своєю природою предикати бази фактів недетерміновані. Оскільки факти можуть бути додані у будь-який момент виконання програми, компілятор повинен враховувати, що під час пошуку з поверненням можливо знаходження альтернативних рішень.
Ключове слово determ визначає, що база фактів може містити не більше одного факту для предиката бази фактів, оголошеного з цим ключовим словом. По цьому, якщо програма намагається встановити інший такий факт в базі даних фактів, Пролог згенерує помилку. Отже, програмісту слід з особливою обережністю використовувати детерміновані факти.
Оголошення факту детермінованим дозволяє компілятору генерувати ефективніший код, і при виклику таких предикатів не буде генеруватися повідомлення про можливий недетермінований виклик. Це корисно для прапорців, лічильників і інших подібних об’єктів.
Особливу увагу слід звернути на те, що при видаленні факту, який оголошений determ, виклик недетермінованих предикатів retract/1 і retract/2 (де 1, 2 означає кількість аргументів в предикаті) буде детермінованим. Тому, якщо відомо, що у будь-який момент часу база фактів містить не більше одного факту counter, можна написати:
facts
determ counter(integer CounterValue)
goal
retract(counter(CurrentCount)) % Пролог не встановить точку відкату Count= CurrentCount + 1, assert(counter(Count))
замість
facts
counter(integer CounterValue)
predicates
determ retract_d(dbasedom)
clauses
retract_d(X): — retract(X)!. % детермінований предикат
goal
retract_d(counter(CurrentCount)), % Пролог не встановить точку відкату Count= CurrentCount + 1, asserta(counter(Count))
Ключове слово single визначає, що база фактів завжди містить один і лише один факт для предиката бази фактів, оголошеного з ключовим словом single. Тому single (одноразові) факти повинні бути вже відомі, коли програма викликає мету; отже, вони повинні ініціалізуватися в розділах clauses в початковому коді програми. Наприклад:
facts – properties
single numberWindows_s(integer)
clauses
nuraberWindows_s(0).
Одноразові факти не можуть бути видалені. Якщо спробувати видалити одноразовий факт, компілятор згенерує помилку. В більшості випадків компілятор може визначити спробу видалення одноразового факту на етапі компіляції. Оскільки один екземпляр одноразового факту завжди існує, виклик одноразового факту ніколи не завершується неуспіхом, якщо він викликаний з вільними аргументами.
Наприклад, наступний виклик:
numberWindows_s(Num)
ніколи не завершується неуспіхом, якщо Num – вільна змінна. Таким чином, зручно використовувати одноразові факти в предикатах, оголошених з типом детермінізму procedure.
Предикати assert, asserta, assertz і consult, застосовані до факту single, діють аналогічно парі предикатів retract і assert. А саме предикати assert (consult) змінюють існуючий екземпляр факту на вказаний новий.
Використання ключового слова single перед декларацією факту дозволяє компілятору отримати оптимізований код для доступу до одноразового факту і його модифікації. Наприклад, для предикатів assert, застосованих до одноразового факту, компілятор генерує код, який працює ефективніше, ніж пара предикатів retract і assert, застосованих до детермінованого факту (і тим більше, чим пара предикатів retract і assert, при використанні із звичайним (не детермінованим) фактом).