
- •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.4.Бінарний пошук на дереві.
Ми описали використання дерева для задання відношень між його елементами. Це не кращий спосіб використання дерева в Пролозі, оскільки люба фраза Прологу може зробити подібну роботу. Але використання дерева має інші переваги. Розглянемо спеціальний тип бінарного дерева, яке називають бінарним деревом пошуку.
Воно будується наступним чином:
1.Якщо поточний вузел є пустим деревом, тоді вставити елемент в нього.
2. В іншому випадку, зрівняти елемент, що вставляється з елементом, який зберігається в поточному вузлі. Якщо значення нового елементу менше, тоді вставити новий елемент в ліве піддерево поточного вузла, а в іншому випадку - вставити в праве піддерево поточного вузла.
Прологівська реалізація побудови бінарного дерева пошуку буде вимагати наявності трьох фраз. Перша
insert(NewItem,empty, tree(NewItem,empty,empty):-!.
позначає, "результатом вставки елементу NewItem в пусте дерево буде дерево tree(NewItem, empty,empty) ".
Друга й третя фрази реалізовують відповідно лівосторонню або правосторонню вставку в не пусте дерево:
insert(NewItem,
tree(Element,Left,Right),
tree(Element,NewLeft,Right):- NewItem < Element, !,
insert (NewItem, Left, NewLeft).
insert(NewItem,
tree(Element,Left,Right),
tree(Element, Left, NewRight)):-
insert(NewItem, Right, NewRight).
7.5. Сортування по дереву.
Якщо бінарне дерево пошуку вже побудоване, дуже просто розмістити всі його елементи в лексико-графічному порядку. Рекурсивний алгоритм буде включати зворотній обхід дерева:
1. Якщо дерево пусте, тоді нічого не потрібно робити.
2. В іншому випадку , переглянути всі елементи лівого піддерева, потім поточний елемент, потім всі елементи правого піддерева.
Або ж в Пролозі:
retrieve_all(empty).
retrieve_all(tree(Item,Left,Right)):- retrieve_all(Left),
do_something_to(Item),
retrieve_all(Right).
Таким чином, використовуючи сортування по дереву, ви можете швидко впорядковувати елементи. Таке впорядкування одне з найкращих. Так, для N елементів, часова оцінка роботи алгоритму буде О(N logN).
7.5. Програмна реалізація лексикографічного впорядкування при символьному вхідному потоці.
В цій програмі ми будемо використовувати вмонтовані предикати Прологу для реалізації введення з клавіатури. Так, предикат READINT вводить цілі, а предикат READCHAR вводить символи. Стандартний предикат EXIT зупиняє процес виконання.
domains
chartree = tree(char, chartree, chartree);
end
predicates
do(chartree)
action(integer, chartree, chartree)
create_tree(chartree, chartree)
insert(char, chartree, chartree)
write_tree(chartree)
repeat
goal do(end).
clauses
do(Tree):-
makewindow(1,7,7,"character tree sort",0, 0, 20, 60),
repeat,
clearwindow,
write("Enter 1 to create a tree\n"),
write("Enter 2 to show tree\n"),
write("Enter 7 to exit\n"),
readint(X),
action(X, Tree, NewTree),
do(NewTree).
action(1, Tree, NewTree):-
write("Enter characters or # toend: "),
create_Tree(Tree, NewTree).
action(2, Tree, Tree):-
write_Tree(Tree),
write("\nPress a key to continue"),
readchar(_).
action(7, _, end):- exit.
create_Tree(Tree, NewTree):-
readchar(C),
C <> 0'#' , !,
write(C, " "),
insert(C, Tree, TempTree),
create_Tree(TempTree,NewTree).
create_Tree(Tree, Tree).
insert(New, end, tree(New, end, end)):- !.
insert(New,
tree(Element, Left, Right),
tree(Element, NewLeft, Right)):-
New < Element, !,
insert(New, Left, NewLeft).
insert(New, tree(Element, Left, Right),
tree(Element, Left, NewRight)):-
insert(New, Right, NewRight).
write_Tree(end).
write_Tree(tree(Item, Left, Right)):-
write_Tree(Left),
write(Item, " "),
write_Tree(Right).
repeat.
repeat:-repeat.
7.1.Написати програму, яка б визначала кількість вершин-листків в бінарному дереві.
7.2.Написати програму, яка створює копію бінарного дерева.
7.3.Написати програму, яка знаходила б висоту бінарного дерева. Висота бінарного дерева Т визначається так:
а)висота пустого дерева Т рівна H(T)=0;
б)висота непустого бінарного дерева Т з коренем к і піддеревами Т1 і Т2 дорівнює H(T)=1+max(H(T1), H(T2)).
7.4.Написати програму, яка визначає кількість вузлів в бінарному дереві.