- •Лабораторне заняття № 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. Експертна система аналізу поточної успішності студентів на факультеті.
- •С.В. Зікратий, х.В. Паньків системи штучного інтелекту лабораторний практикум
2.12 Труднощі у використанні відсікання і заперечення
Виділимо спочатку переваги використання відсікання:
1. За допомогою предиката cut можна підвищити ефективність програми.
2. Використовуючи cut, можна описати взаємовиключні правила, тому є можливість запрограмувати твердження: якщо умова P, тоді розв’язок Q, інакше розв’язок R.
Обмеження на застосування відсікання виходять із декларативної сторони прологової програми. Якщо в програмі немає відсікання, можна міняти місцями порядок речень і цілей. Коли ж предикат cut присутній у програмі, тоді зміна порядку речень у програмі може вплинути на її декларативний зміст (дати інший розв’язок).
Якщо вилучення відсікання з програми не змінює її декларативного змісту, то його називають “зеленим”. В іншому випадку відтинання називають “червоним”.
Працювати із запереченням також треба обережно. Труднощі виникають тому, що заперечення, яке використовується, не повністю відповідає математичному запереченню.
Якщо побудуємо запит системі goal: not(dog(„Шарік”)), вона, можливо, відповість “так”. Але цю відповідь не можна розуміти як повідомлення про те, що “Шарік не собака”, а потрібно трактувати так, що системі не вистачає інформації для доведення твердження “Шарік – собака”. Такий підхід бере свій початок від припущення про замкнутість світу. Відповідно до цього постулату світ замкнутий у тому розумінні, що все існуюче в ньому або указане в програмі, або може бути з неї виведене. І в іншому випадку, коли чогось немає в програмі (не може бути з такої виведено), тоді воно хибне, і відповідно буде істинним його заперечення.
Ми ж традиційно не вважаємо світ замкнутим: якщо в програмі явно не сказано, що dog(„Шарік”), то це ще не означає, що ми хочемо сказати: “Шарік не собака”.
Розглянемо напраклад наступну програму
/* Програма 2.6 */
predicates
r(symbol)
g(symbol)
p(symbol)
clauses
r(a).
g(b).
p(X):-not(r(X)).
На запит g(X), p(X) cистема дасть відповість Х=b, а на p(X), g(X) система дасть відповідь no (ні). Уся різниця в тому, що в першому випадку змінна Х до моменту обчислення Р(X) була вже зв’язана, а в другому цього ще не трапилось.
2.13 Зміст звіту з лабораторної роботи
1. Вказати номер, тему й мету лабораторної роботи.
2. Навести результати дослідження програми 2.3 при наявності і відсутності предиката fail у програмі.
2. Додати процедури подібні до процедури do_answer() в індивідуальному завданні (додаток Б).
3. Вдосконалити розроблену раніше програму з використанням меню для вибору різних варіантів запитів. Організувати повний інтерфейс програми (повторне виконання запитів, вихід з програми по ключовому слові і т.п.).
Лабораторна робота № 3 Рекурсія і рекурсивні процедури в Пролозі
Мета роботи: ознайомитися з рекурсією, як з алгоритмічним методом, та її особливостями в Пролог-програмах вивчити способи побудови рекурсивних процедур та забезпечення цілісності відносин.
3.1 Визначення поняття рекурсії
Рекурсія – алгоритмічний метод, що часто використовується у Пролозі. Рекурсію застосовують для тих самих цілей, що і циклічні конструкції в процедурних мовах. У рекурсивних правилах більш складні вхідні аргументи виражаються через менш складні. Наприклад, рекурсивний набір інструкцій з завантаження контейнерів може мати такий вид:
Для того, щоб завантажити N контейнерів, потрібно:
Якщо N=0, то зупинитися.
Якщо N>0, то завантажити один контейнер, потім завантажити ще N–1 контейнер.
Будемо вважати, що тут дано визначення процедури “завантаження N контейнерів”, де N – аргумент процедури і позначає деяке ціле число.
Дана процедура рекурсивна, тому що останній рядок – “завантажити N–1 контейнер” – є викликом процедурою самої себе. Слід відмітити, що аргумент при рекурсивному виклику простіший, ніж вихідний аргумент N, у тому розумінні, що (N–1) – це число менше, ніж число N. Тому “завантаження N контейнерів” є більш складний випадок, що виражається через менш складний випадок виконання тих же самих дій, тобто через “завантажити N–1 контейнер”.
Класичним прикладом рекурсивного визначення в Пролозі може бути процедура “предок”, що складається з двох правил:
предок(А, Б):-батько(А,Б).
предок(А, Б):-батько(В, Б), предок(А, В)
Сукупність цих правил визначає два способи, відповідно до яких одна особа (А) може бути предком іншої особи (Б). Відповідно до першого правила, А є предком Б, якщо А – батько Б, тобто А є найближчим предком Б (рис. 3.1,а).
Відповідно до другого правила А буде предком Б, якщо є дехто В, що, будучи батьком Б, має своїм предком А. Іншими словами, А – предок Б, якщо А – предок батька Б, тобто А – віддаленим предком Б (рис. 3.1,б). У такий спосіб друге правило залежить від більш простої версії самого себе, тобто від підмети “предок”.
Рисунок 3.1 – Приклади відношення “предок” і його зв'язок з відношенням “батько”: а) А найближчий предок Б; б) А віддалений предок Б; в) приклад схеми програми.
