- •К.Є. Золотько, д.В. Красношапка
- •1. Теоретичні основи створення систем штучного інтелекту
- •1.1. Методи розв’язання задач
- •Розв’язання задач методом пошуку в просторі станів
- •Загальна схема алгоритму Харта, Нільсона і Рафаеля
- •Розв’язання задач методом редукції
- •Розв’язання задач дедуктивного вибору
- •Розв’язання задач, що використовують немонотонну логіку, імовірнісну логіку
- •1.2. Експертні системи
- •Експертні системи, засновані на правилах (пряме виведення – forward chaining)
- •Експертні системи, що ґрунтуються на логіці (зворотне виведення – backward chaining)
- •Модуль (компонент) пояснення
- •Модуль (компонент) набуття знань
- •Етапи проектування експертної системи
- •Відмінність експертних систем від традиційних програм
- •2. Основи програмування мовою Visual Prolog
- •2.1. Загальний огляд мови Пролог
- •2.2. Основні теоретичні відомості Основні визначення мови Visual Prolog
- •2.3. Структура програми, складеної мовою Visual Prolog
- •2.4. Предикати введення – виведення
- •2.5. Об’єкти даних
- •Завдання 1
- •2.6. Вбудовані механізми мови Пролог. Керування бектрекінгом
- •2.7. Організація циклів. Рекурсія
- •2.8. Використання динамічної бази даних
- •2.9. Рекомендації щодо створення програм мовою Пролог
- •Завдання 2
- •2.10. Рекурсивні структури даних
- •Структура даних типу дерево
- •Обходи дерева
- •Бінарний пошук на дереві
- •Сортування за деревом
- •Лексикографічне впорядкування
- •2.11. Списки
- •Info("Шевченко о.В.", ["Інформатика", "Чисельні методи"]).
- •Info("Нікольський а.С.", ["Комп’ютерна графіка"]).
- •Info("Рябчук м.В.", ["Фізика", "Хімія", "Астрономія"]).
- •Info("Рябчук м.В.", X), write (X), nl.
- •Ігри двох осіб із повною інформацією
- •Мінімаксний принцип
- •Реалізація деяких методів пошуку в просторі станів у мові Пролог
- •Завдання 3
- •Засоби програмування інтерфейсів у Visual Prolog 5.2
- •3.1. Створення найпростішого додатка
- •Додавання пункту меню
- •Додавання речення для реагування на вибір пункту меню
- •Використання діалогових вікон, створених користувачем
- •Завдання 4
- •Варіанти завдань
- •Тема 1. Консультативна інтерактивна експертна система з визначення оптимальної конфігурації пеом
- •Тема 2. Діагностична інтерактивна експертна система пошуку причини й усунення несправності кольорового телевізора lg cf-20f60k
- •Порядок пошуку причини й усунення несправності телевізора lg cf-20f60k
- •Тема 3. Консультативна експертна система для вибору породи собаки
- •Тема 4. Медична консультативна експертна система щодо вибору лікарських трав
- •Тема 5. Експертна система для визначення мінерального добрива
- •Тема 6. Консультативна інтерактивна експертна система, яка допомагає директору фірми в процесі прийняття кандидата на роботу
- •Тема 7. Консультативна експертна система прогнозу повені та необхідності евакуації населення міста
- •Тема 8. Діагностична медична експертна система
- •Список рекомендованої літератури
- •Посібник до вивчення курсу
Бінарний пошук на дереві
Ми описали використання дерева для задання відношень між його елементами. Це не найкращий спосіб використання дерева в мові Пролог, оскільки будь-яка фраза Прологу може виконати таку роботу. Але використання дерева має інші переваги. Розглянемо спеціальний тип бінарного дерева, яке називають бінарним деревом пошуку. Його будують у такий спосіб:
якщо поточний вузол – порожнє дерево, то вставляють елемент у нього;
у противному разі порівнюють вставлюваний елемент з елементом, який зберігається в поточному вузлі. Якщо значення нового елемента менше, то вставляють новий елемент у ліве піддерево поточного вузла, а якщо більше – у праве піддерево поточного вузла.
Для того щоб побудувати бінарне дерево пошуку в мові Пролог, потрібна наявність трьох фраз. Перша з них
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).
Сортування за деревом
Якщо бінарне дерево пошуку вже побудовано, дуже просто розмістити всі його елементи в лексикографічному порядку. Рекурсивний алгоритм буде включати зворотний обхід дерева:
якщо дерево порожнє, то нічого не треба робити;
у противному разі слід переглянути всі елементи лівого піддерева, потім – поточний елемент, потім – усі елементи правого піддерева.
Мовою Пролог вищевказані операції можна записати так:
retrieve_all(empty).
retrieve_all(tree(Item,Left,Right)):- retrieve_all(Left),
do_something_to(Item),
retrieve_all(Right).
Таким чином, застосовуючи сортування за деревом, можна швидко впорядковувати елементи. Таке впорядкування одне з найефективніших. Так, для N елементів часова оцінка роботи алгоритму буде О(N logN).
Лексикографічне впорядкування
У розглядуваній програмі ми будемо використовувати вмонтовані предикати мови Пролог для реалізації введення з клавіатури. Так, предикат READINT вводить цілі, а предикат READCHAR – символи. Стандартний предикат EXIT зупиняє процес виконання.
Domains
chartree = tree(char, chartree, chartree);
end
predicates
nondeterm do(chartree)
action(integer, chartree, chartree)
create_tree(chartree, chartree)
insert(char, chartree, chartree)
write_tree(chartree)
nondeterm repeat
goal do(end).
clauses
do(Tree):-
repeat,
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 . to end: "),
create_Tree(Tree, NewTree).
action(2, Tree, Tree):-
write_Tree(Tree),
write("\nPress a key to continue\n"),
readchar(_).
action(7, _, end):- exit.
create_Tree(Tree, NewTree):-
readchar(C),
C <> '.' , !,
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.