
- •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. Стиль програмування.
7.3.Створення дерева.
Для багатьох задач виникає потреба створення структури даних типу дерева в пам'яті комп'ютера з подальшою її обробкою.
Створити один вузел дерева тривіально:
create_tree(N, tree(N,empty,empty)).
Цей предикат можна інтерпретувати: "Якщо N є елементом даних, tree(N,empty,empty) є вузлом дерева,який містить цей елемент.
Процес побудови дерева трохи складніший. Розглянемо наступну фразу, яка містить предикат з трьома аргументами типу дерева. Він вставляє перше дерево в якості лівого піддерева другого дерева, використовуючи третє дерево як результуюче.
insert_left(X, tree(A, _ , B), tree(A,X,B)).
Припустимо, наприклад, що ми хотіли б вставити
tree('Michael ' , empty, empty) в якості лівого піддерева
tree('Cathy', empty, empty). Це можна зробити, сформувавши запит:
goal : insert_left(tree('Michael',empty,empty),
tree('Cathy',empty,empty),
T)
де T зразу ж прийме значення tree('Cathy',
tree(Michael',empty,empty),
empty).
Таким чином, ми поетапно можемо побудувати дерево. Програма, зображена на мал.7.3., демонструє використання запропонованого підходу для побудови дерева. На практиці, елементи, які розміщуються в вузлах дерева, майже завжди беруться з зовнішнього файлу.
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Прості процедури побудови дерева. *
* create_tree(A, B) вставляє A в поле даних дерева B *
* insert_left(A, B, C) вставляє A в якості лівого піддерева B, *
* отримуючи дерево C *
* insert_right(A, B, C) вставляє A в якості правого піддерева B, *
* отримуючи дерево С *
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
domains
treetype = tree(string, treetype, treetype);
empty()
predicates
create_tree(string, treetype)
insert_left(treetype, treetype, treetype)
insert_right(treetype, treetype, treetype)
clauses
create_tree(A, tree(A, empty, empty)).
insert_left(X, tree(A, _, B), tree(A, X, B)).
insert_right(X, tree(A, B,_), tree(A, B, X)).
goal :
/* Спочатку створимо вузли (однорівневі дерева)... */
create_tree("Charles", Ch), create_tree("Hazel", H),
create_tree("Michael", Mi), create_tree("Jim", J),
create_tree("Eleanor", E), create_tree("Melody",Me),
create_tree("Cathy", Ca),
/* ... потім встановимо зв`язки */
insert_left(Ch, Mi, Mi2), insert_right(H , Mi2, Mi3),
insert_left(J, Me, Me2), insert_right(E , Me2, Me3),
insert_left(Mi3,Ca, Ca2), insert_right(Me3, Ca2, Ca3),
/* ... і роздрукуємо результат. */
write(Ca3), nl.
Maл.7.3.
Тому, що в Пролозі ми не можемо змінити значення змінної, а можемо тільки зв'язати змінну з якимсь значенням, Програма з мал.7.3 має стільки багато змінних.