
- •1.Пролог - мова логічного програмування.
- •1.1.Загальний огляд мови Пролог.
- •1.2.Переваги і недоліки мови Пролог.
- •1.3.Числення предикатів - математична основа мови.
- •1.4.Побудова теорії деякої області знань.
- •1.5.Від формальної логіки до логічного програмування.
- •1.6.Механізм логічного виведення і керування пошуком.
- •2.Основні концепції прологу.
- •2.1.Факти та правила.
- •2.2.Як змінні отримують свої значення.
- •2.3.Анонімні змінні.
- •2.4.Складні цілі: кон`юнкція та диз`юнкція.
- •2.5.Способи Співставлення.
- •3.Структура програми pdc прологу.
- •3.1.Основні розділи програми.
- •3.2 Стандартні домени.
- •3.3.Синтаксис правила.
- •3.4.Директиви комп`ютеру.
- •3.5.Бектрекінг.
- •3.5.1.Бектрекінг з внутрішньою ціллю.
- •4.Контроль пошуку рішень.
- •4.1.Використання предикату fail.
- •4.2.Відміна бектрекінгу.
- •1.Коли ви знаєте попередньо, що певні варіанти ніколи не дадуть поштовху в знаходженні розв'язку, тоді використання cut(зелений cut) відкидає перегляд альтернативних шляхів.
- •2.Коли логіка програми потребує використання cut для відкидання перегляду альтернативних підцілей, тоді його називають червоним відтинанням.
- •4.3.Предикат not - заперечення як неуспіх.
- •4.4.Труднощі у використанні відтинання і заперечення.
- •4.5.Засоби керування.
- •4.6.Узагальнення.
- •5.Прості та складні об'єкти.
- •5.1 Прості дані.
- •5.1.1. Константи як об'єкти даних.
- •5.2.Складні об'єкти даних і функтори.
- •5.2.1.Уніфікація складних об`єктів.
- •5.2.2.Приклад застосування функторів.
- •5.3.Приклад використання складних об'зктів.
- •5.4.Опис доменів складних об'єктів.
- •5.5.Багаторівневі складні об'єкти.
- •5.6.Приклад, який ілюструє задання структури речення англійської мови.
- •5.7.Опис змішаних складних об'єктів.
- •5.7.1.Аргументи, які можуть мати різний тип.
- •5.7.2 Cписковий тип.
- •5.8.Порівняння складних об`єктів.
- •5.9.Узагальнення.
- •6. Ітерація і рекурсія.
- •6.1.Реалізація ітераційного процесу за допомогою бектрекінгу.
- •6.2.Дії типу до і після.
- •6.3.Застосування бектрекінгу для реалізації циклів.
- •6.4.Рекурсивні процедури.
- •6.5.Використання аргументів в якості параметрів циклу.
- •7. Рекурсивні структури даних.
- •7.1.Структура даних типу дерева.
- •7.2.Обходи дерева.
- •7.3.Створення дерева.
- •7.4.Бінарний пошук на дереві.
- •7.5. Сортування по дереву.
- •7.5. Програмна реалізація лексикографічного впорядкування при символьному вхідному потоці.
- •8. Робота з списками в пролозі.
- •8.1.Рекурсивна сутність списку.
- •8.2.Обробка списків.
- •8.2.1.Друк списків.
- •8.2.2.Підрахунок кількості елементів.
- •8.2.3.Іще один варіант підрахунку довжини списку.
- •8.2.4.Модифікація списку.
- •8.2.5.Належність елемента списку.
- •8.3.Використання одного й того ж предикату для вирішення різних задач.
- •8.4. Знаходження зразу всіх розв`язків.
- •8.5.Складні списки.
- •8.6.Реалізація синтаксичного аналізу за допомогою списків.
- •9. Техніка програмування в пролозі.
- •9.1.Принципи побудови експертної системи.
- •9.2. Макетування: задача маршрутизації.
- •9.3.Пригоди в дивних печерах.
- •9.4. Моделювання апаратних засобів.
- •9.5.Задача про ханойські башні.
- •9.6.Ділення слів на склади.
- •9.7. Задача про n королев.
- •10.Особливі технічні прийоми для професіоналів.
- •10.1.Потоковий аналіз.
- •10.2.Керування потоковим аналізом.
- •10.3. Стиль програмування.
9.4. Моделювання апаратних засобів.
Прологівські програми є зручними для моделювання роботи різних складних систем обробки інформації, наприклад радіотехнічних систем. Кожна логічна лінія зв'язку може бути описана відповідним предикатом прологу. Предикат характеризує відношення між сигналами на вході і виході. Базові функції основних компонент об'єктів описують за допомогою таблиць істинності.
Покажемо як це робиться на прикладі моделювання роботи лінії зв'язку типу взаємовиключного АБО, схема якого приведена на малюнку 9.3.
Мал .9.3. Базова лінія зв'язку XOR.
В наступній програмі вона описана предикатом xor.
domains
d = integer
predicates
not_(d, d)
and_(d, d, d)
or_(d, d, d)
xor(d, d, d)
clauses
not_(1, 0). not_(0, 1).
and_(0, 0, 0). and_(0, 1, 0).
and_(1, 0, 0). and_(1, 1, 1).
or_(0, 0, 0). or_(0, 1, 1).
or_(1, 0, 1). or_(1, 1, 1).
xor(Input1, Input2, Output) :-
not_(Input1, N1), not_(Input2, N2),
and_(Input1, N2, N3), and_(Input2, N1, N4),
or_(N3, N4, Output).
Якщо ми задамо ціль :
goal: xor(Input1,Input2,Output)
Проінтерпретуємо отриманий результат як таблицю істинності, тоді ми можемо перевірити, чи наша програма вірно моделює потрібну лінію зв'язку.
9.5.Задача про ханойські башні.
Розглянемо класичну задачу про ханойські башні. Історія цієї задачі базується на старовинній легенді про буддійський монастир у В'єтнамі. Легенда говорить про наступне. В цьому храмі монахи постійно, з давніх часів, виконують таку роботу. Вони переміщують по спеціальному алгоритму шістдесят чотири диски на трьох сердечниках при певних обмеженнях. Як тільки вони закінчать переміщення дисків з першого сердечника на третій, наступить кінець світу.
Уточнимо постановку задачі. Нехай ми маємо три спеціальних сердечники, на яких проходить переміщення дисків. Висота сердечників достатня для того, щоб на ній могли розміститись всі n дисків. Всі диски різного діаметру, а внутрішній отвір більший за діаметр сердечників. Спочатку всі диски розміщені на першому сердечнику в спадному, згідно зовнішнього діаметра, порядку. Їх потрібно перенести на третій сердечник, використовуючи другий сердечник, так , щоб вони розмістились в такому ж порядку, як були на першому сердечнику. При переміщеннях потрібно дотримуватись такого обмеження: ніколи диск більшого диаметра не може знаходитись зверху хоча б над одним диском меншого діаметра.
Для переносу можна запропонувати наступний рекурсивний алгоритм.
* Один диск можна перенести прямо на потрібний сердечник.
* N дисків можна перемістить так:
1.Перемістить останній (N-ий) диск прямо на третій (правий) сердечник;
2.Перемістить N-1 диск на другий (середній) сердечник;
3.Перемістить прямо N-ий диск з третього сердечника на перший (лівий);
4.Перемістить N-1 диск з другого на третій;
5.Перемістить N-ий диск прямо з першого на третій сердечник;
Програма Прологу, яка вирішуз задачу про Ханойські Башні, буде використовувати три предикати:
1. hanoi з одним параметром, який характеризує загальну кількість дисків.
2. move, який описує переміщення N дисків з одного сердечника на інший, використовуючи третій сердечник, як тимчасове місцезнаходження дисків.
3. inform, відображає на екрані дисплею, як проходять переміщення.
domains
loc = right;
middle;
left
predicates
hanoi(integer)
move(integer, loc, loc, loc)
inform(loc, loc)
clauses
hanoi(N) :- move(N, left, middle, right).
move(1, A, _, C) :- inform(A, C), !.
move(N, A, B, C) :- N1=N-1,
move(N1, A, C, B),
inform(A, C),
move(N1, B, A, C).
inform(Loc1, Loc2) :-
write("\nMove a disk from ", Loc1, "to", Loc2).
Для вирішення задачі з трьома дисками, потрібно задати ціль
goal: hanoi(3).