- •Лабораторне заняття № 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 Використання структур як доменів відношень
- •1.6 Процедури як елемент представлення знань
- •1.7 Цілісність і несуперечність баз даних і знань
- •1.8 Зміст звіту з лабораторної роботи
- •Лабораторна робота № 2 Керування ходом виконання програм у системі Пролог
- •2.1 Робота системи Пролог при виконанні запитів
- •2.2 Уніфікація термів
- •2.3 Пошук з поверненням при виконанні Пролог-програм
- •2.4 Використання відкату після невдачі для організації найпростішого інтерфейсу виводу
- •2.5 Організація повторюваних процесів
- •2.6 Керування пошуком з поверненням
- •2.7 Керування ходом виконання програм з використанням відсікання
- •2.8 Застосування предикату not -- заперечення як неуспіх
- •2.9 Використання методу відкату і відсікання
- •2.10 Відкат і відсікання при реалізації відносин типу „один-до-багатьох”
- •2.11 Ступінчаті функції і відсікання
- •2.12 Труднощі у використанні відсікання і заперечення
- •2.13 Зміст звіту з лабораторної роботи
- •Лабораторна робота № 3 Рекурсія і рекурсивні процедури в Пролозі
- •3.1 Визначення поняття рекурсії
- •3.2 Склад рекурсивної процедури
- •3.3 Особливості виконання рекурсивних процедур Прологом-системою
- •3.4 Приклад рекурсивної процедури пошуку довжини маршруту на графі
- •3.5 Обмеження і властивості, що забезпечують цілісність відношень
- •3.6 Зміст звіту з лабораторної роботи
- •Лабораторна робота № 4 Списки і процедури їх обробки
- •4.1 Списки як рекурсивні структури даних
- •4.2 Використання списків у Пролог-програмах
- •4.3. Найпростіші процедури роботи зі списками
- •4.4 Процедури обробки списків
- •4.5. Компонування даних у список
- •4.6. Зміст звіту з лабораторної роботи
- •Лабораторна робота № 5 Способи представлення баз даних у Пролог-програмах
- •5.1 Вступ
- •5.2 Представлення відносин у вигляді фактів
- •5.3 Представлення атрибутів у вигляді фактів
- •5.4 Представлення бази даних у вигляді списку структур
- •5.5 Представлення бази даних у вигляді лінійної рекурсивної структури
- •5.6 Представлення бази даних у вигляді двійкового дерева
- •5.7 Порівняння різних видів представлення бази даних
- •Лабораторна робота № 6 Динамічні бази даних
- •6.1 Вступ
- •6.2 Прості прийоми роботи з динамічними бд
- •6.3 Зв’язок статичних і динамічних баз даних
- •6.4 Процедура роботи з динамічною бд, що навчається у користувача
- •6.5 Розширення бази даних у файли
- •6.6. Організації файлових бд на основі файлів прямого доступу
- •6.6. Особливості представлення динамічних баз даних у Visual Prolog
- •6.7 Зміст звіту з лабораторної роботи
- •Лабораторна робота № 7 створення простої експертної системи
- •7.1 Вступ
- •7.2 Завантаження бази знань і режим консультації
- •7.2 Структура бази знань esta
- •7.3 Формати файлів баз знань в esta
- •7.4 Елементарні прийоми роботи з секціями
- •7.5 Елементарні прийоми роботи з параметрами
- •7.6. Зміст звіту з лабораторної роботи
- •Лабораторна робота № 8 розробка нечітких систем керування з використанням fuzzy logic toolbox математичного пакета matlab
- •8.1 Вступ
- •8.2 Склад графічного інтерфейсу
- •8.3 Редактор бази знань RuleEditor
- •8.4 Вступ Приклад виконання роботи
- •8.5 Зміст звіту з лабораторної роботи
- •8.6 Контрольні питання
- •Лабораторна робота № 9 порівняльне дослідження роботи алгоритмів мамдані та сугено
- •9.1 Вступ
- •9.2 Алгоритм Мамдані (Mamdani)
- •9.3 Алгоритм Сугено (Sugeno)
- •9.4 Порядок виконання роботи
- •9.5 Зміст звіту з лабораторної роботи
- •9.6 Контрольні питання
- •Список використаних джерел
- •Додаток а Службові предикати Пролога для роботи з файлами
- •Додаток б Індивідуальні завдання До лабораторних робіт № 1, 2, 4
- •Додаток в Індивідуальні завдання До лабораторної роботи № 3
- •Додаток г Індивідуальні завдання до лабораторної роботи № 5
- •Додаток д варіанти завдань до виконання лабораторної роботи № 7
- •Тема 11. Експертна система аналізу поточної успішності студентів на факультеті.
- •С.В. Зікратий, х.В. Паньків системи штучного інтелекту лабораторний практикум
6.6. Особливості представлення динамічних баз даних у Visual Prolog
Для опису внутрішньої бази даних у Visual Prolog використовується ключове слово facts, яке визначає початок оголошення розділу 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, при використанні із звичайним (не детермінованим) фактом).
